Product / Live product
JobFilter
A procurement qualification product designed to prefer an honest zero over a noisy list of weak opportunities.

01 / Problem and insight
Start with the constraint, not the stack.
Problem
Small firms miss winnable contracts because notices are scattered across procurement portals and written in inconsistent formats.
Insight
A useful shortlist has to reject weak matches, not merely find keywords. Buyer addresses, stale notices, and adjacent trades cannot be treated as proof.
02 / How it works
A traceable path through the system.
- 01Retrieve
Fetch official Find a Tender OCDS packages with pagination, retry handling, and a cancellable scan.
- 02Reconcile
Normalise notices, merge the latest amendments, and deduplicate releases before scoring.
- 03Qualify
Require trade, CPV, location, deadline, and notice evidence; uncertain inputs fail closed.
- 04Present
Return a short explainable result set—or an honest zero—with live sources available for inspection.
03 / What I built
The implementation in plain terms.
01
Official Find a Tender OCDS retrieval with pagination, retries, and cancellation.
02
Notice normalisation, latest-amendment merging, and release deduplication.
03
CPV-first trade matching with fail-closed location checks.
04
A plain scan flow that can return an honest zero instead of inventing relevance.
04 / Key decisions
Judgment is part of the build.
Treat relevance as a rejection problem
The system earns trust by excluding attractive-looking false matches rather than maximising the number of cards on screen.
Keep the evidence close
Public source data, matching reasons, code, and the migration review make the product inspectable instead of asking visitors to accept a performance claim.
05 / Proof and limit
Evidence without inflated outcomes.
Proof
The live product, public code, and reviewed Find a Tender migration show the retrieval and matching system working end to end.
Current limitation
The official-feed migration works; repeat willingness to pay among small firms is still unproven.