How the matrix is made
A requirements matrix is the table a proposal team builds on day one: every obligation in the solicitation, one per row, with the page it sits on. Building it is called the shred. Shallsheet does it in two steps, and prints what each step could not settle beside what it did.
The index, which runs before you pay
The index reads the PDF's text layer page by page with pdf.js, in your browser, and cuts it into sentences: at a full stop followed by a capital, at a blank line, at a numbered item such as L.3.2 or (a), and at a heading set in capitals. It keeps every sentence that carries one of shall, must, will, required, submit, attach, no later than, page limit, due, deadline, font, margin, as a whole word in any case. Each one is stored with its page and its byte offset in that page's text, exactly as extracted: no spelling fixed, no line break removed. The same code runs on the server after payment, so the count you are quoted is the count you are sold.
No model is involved in the index. The same file gives the same sentences every time, and the page count picks the price: $79 up to 150 pages, $149 up to 400.
What the index misses
It reads sentences. An obligation that no sentence states is invisible to it, and a solicitation has several kinds of those:
- A table of deliverables, such as a CDRL list, where each row is an obligation and no row is a sentence with a trigger word.
- Section M weights written as a grid of factors and points.
- A scanned page. Nothing here reads images: a PDF with more than half its pages lacking a text layer is refused with that count, before any money moves.
- Text the PDF stores out of reading order. Fill-in forms, two-column pages and running headers can join two boxes or split one sentence. The row still quotes the text layer exactly, and it can read oddly; the sample's first two pages show it.
A matrix is a start. The unresolved list is the part a person has to read, and it is the part a reviewer at a seat vendor is paid for.
The typing step, which runs after you pay
The indexed sentences go to Claude Haiku 4.5 (claude-haiku-4-5-20251001) in windows of 20 pages, one call per window, at most six at a time. The call sends the sentences and their pages, never the whole PDF, and asks for JSON in a fixed shape: page, span, kind, section. The model labels; it is never the source of a row.
Every row it returns is checked with indexOf against the text of the page it names. A span found there byte for byte becomes a row. Anything else goes to the unresolved list with one of six reasons, and the receipt counts them:
| Reason | What happened |
|---|---|
| span not found on page | The model returned words that are not on the page it named. Shown without the highlighter, because they are not a quote. |
| not typed | The index found the sentence and the model gave it no kind. Often right: "the Government will evaluate" asks nothing of you. Read it and decide. |
| span under 8 characters | Too short to prove where it came from. |
| the model call for this window failed | The API refused or timed out for those 20 pages; every sentence in them is listed. |
| the run reached its time limit before this window | A run stops waiting after 100 seconds and delivers what came back. |
| window over the input cap | More than 240,000 characters of sentences in 20 pages; the rest wait here. |
The page then prints three numbers in the same type: sentences seen, rows typed, unresolved. A vendor who sells review by the seat has every reason to print the second number large and leave the third out. Here the third is the work you still have, and it gets the same size.
The kinds
| Kind | A row of this kind tells you |
|---|---|
| Requirement | A shall, must or will the contractor or offeror carries. |
| Attachment | A form, certification, letter or schedule to include. |
| Format | Page limits, fonts, margins, file types, copies, volume structure. |
| Deadline | When the offeror must submit or do something. |
| Eligibility gate | Who may submit: set-asides, SAM registration, licences, bonds. |
| Evaluation factor | How offers are scored and weighted. |
| Key date | A date that is not your deadline: a site visit, a period of performance. |
| Clause | A FAR, DFARS or agency clause incorporated or cited. |
Controlled markings
Before anything is sent, the text is scanned for CUI banners, ITAR and EAR export warnings, classification markings, limited distribution statements B to F and FOUO. A document carrying any of them is quoted free like any other, and the paid run never sends its text to the model: it delivers the index-only matrix, and the receipt names the marking and its page. The scan works by pattern on the text layer. A controlled document with no marking on its text is not caught, and your own judgement carries that weight.
What it costs elsewhere
| Substitute | Price, as published | Read |
|---|---|---|
| DeepRFP Pro | "$89 per user, per month. Cancel anytime!" | deeprfp.com/pricing, 2026-10-09 |
| WinifyAI Starter | $49.99 per month, one RFP a month up to 150 pages [[UNVERIFIED]] | A search summary of its Capterra listing, 2026-10-09; the vendor page refused a direct read |
| Responsive | Sells "document shredding" inside its platform; no price is published | help.responsive.io, 2026-10-09 |
| By hand | A highlighter, a spreadsheet and the evening the solicitation drops |
Three solicitations a year do not need a subscription. Shallsheet sells one document at a time.
Limits
- 400 pages per document, and 4 MB of text per run. Past either, the quote says so and the till stays shut.
- Three runs per purchase, counted on the Stripe payment. A run is counted when it starts.
- PDF only. A DOCX solicitation has to be exported to PDF first.
- In the CSV, a cell that starts with
=,+,-or@gets a leading apostrophe, so a spreadsheet reads it as text. The JSON keeps the exact bytes.