bid-deadline-check
Read a government solicitation (RFP, RFQ, IFB; PDF or text) and get back:
- Deadlines with date, time and timezone: questions due, proposal due, site visit, intent to bid, orals
- Page limits per volume
- Format rules: font, margins, paper size, spacing, file format
- Forms and clauses: SF-1449, SF-33, SF-30, FAR 52.xxx, DFARS 252.xxx
- Sections and volumes referenced (L, M, Volume I/II/III)
- Every "shall / must" requirement aimed at the offeror
- A compliance checklist (text, JSON, CSV or Markdown)
- Warnings for what's missing: no proposal due date, a time with no timezone, no page limits
It is deterministic: regex and rules only. No LLM, no network, nothing leaves your machine.
Quickstart
pip install "git+https://github.com/itcustomsolution/bid-deadline-check#egg=bid-deadline-check[pdf]"
# Not published on PyPI yet; install from GitHub as above.
bid-deadline-check solicitation.pdf
bid-deadline-check solicitation.pdf -f csv > compliance-matrix.csv
bid-deadline-check solicitation.txt -f md
bid-deadline-check solicitation.txt -f json
Example output (from tests/fixtures/rfp_sample.txt, a synthetic RFP):
DEADLINES
[questions_due] October 20, 2026 2:00 PM Eastern Time (line 6)
[proposal_due] November 5, 2026 11:00 AM EDT (line 7)
[site_visit] 10/27/2026 10:00 AM local time (line 8)
PAGE LIMITS
Volume I Technical: 20 pages (line 13)
Volume II Past Performance: 10 pages (line 14)
...
--strict exits with code 2 when there are warnings, so you can gate a script on it.
Library
from bid_deadline_check import analyze, read_document
report = analyze(read_document("solicitation.pdf"))
for d in report.deadlines:
print(d.kind, d.date, d.time, d.timezone)
rows = report.checklist() # list of dicts: id, category, item, line, done
Scope and limits
- It finds what is written; it does not interpret it. Always read the solicitation and every amendment yourself. This is a checklist aid, not legal or contracting advice.
- Scanned PDFs without a text layer return no text. Run OCR first.
- Dates are reported as written; no timezone conversion.
- Limits: files and stdin over 50 MB are refused; PDFs over 1000 pages, over 5 million extracted characters, or over 60 s of extraction (checked between pages) are refused. PDF parsing relies on pypdf >= 6.19. A single slow page can still exceed the time budget, so only open solicitations from sources you trust.
- CSV output prefixes cells that start with
=,+,-,@, tab or CR with'. This is a common mitigation for formula injection; it is not tested against any particular spreadsheet application. - Out of scope: scoring, bid/no-bid, writing proposal content.
Development
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
pytest
Fixtures are synthetic. Please don't add real solicitations that carry controlled or proprietary markings.
License
MIT © IT Custom Solution
Metadata
Release files for bid-deadline-check 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| bid_deadline_check-0.1.0.tar.gz | 12.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| bid_deadline_check-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.1 kB
Release files / bid_deadline_check-0.1.0.tar.gz
| Download URL | bid_deadline_check-0.1.0.tar.gz |
|---|---|
| Size | 12.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e539e83cddb049e348e8f5387ac17930ee8987167b523ed325c5db9ec495d91b
|
|
BLAKE2b-256 checksum How to use checksums |
31a2cc6f828288332ec194d01489ba6052bbfa45082cd1a9399cc2859721a39b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|
Release files / bid_deadline_check-0.1.0-py3-none-any.whl
| Download URL | bid_deadline_check-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7a573d4b778f6c52a893241a8e665bcf882cd078d4830c2ca474d9c83964809d
|
|
BLAKE2b-256 checksum How to use checksums |
f68265c0bb597525b4b40f75b43701b7f9eb8e37b1aa9f71b9c28473ae496ce8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|