Sources
100+ public sources in every format: web pages, scanned PDFs, meeting minutes and meeting recordings.
Mo HelmyPublic-sector seller. Partner strategist. Coach. Builder of AI systems.Press kit
An independent research and engineering project that reads municipal documents, public meeting records and local government budgets at scale and shows what a municipality is planning, funding and leaving unfunded, with the source and the date on every line, across 1.9M+ public funding records.
Independent work, built on my own time from public records.
What a municipality is planning is public, but it is scattered across thousands of agency websites, scanned PDFs, meeting recordings and dozens of funding programs, and most people only find out once a decision has been announced.
Research software that reads what a municipality publishes, budgets, council minutes, meeting recordings, grant awards and announcements, and shows its strategic goals, what it is funding and what it is not. It joins what an agency needs, the money it has and the people who decide into one cited record, for anyone who wants to understand what their municipality is doing.
One record puts an agency's stated need, the money behind it and the people who decide into a single view, with the source and date on every line, so whoever is reading can check the evidence before acting on it. A funding award, a budget line and a grant the agency might qualify for are three different things; the record keeps them apart, and it says whether a connection is documented or inferred.
Design rule: Every claim points to a public source and a date. What you see is the raw evidence, dated: name, role, department, source. There are no confidence scores and no fit scores, because a score hides the reasoning you need to check.
Example Township
Municipality · Example County
These figures count funding records, sources and seeded municipalities, not users or customers, and seeded is not the same as fully processed.
Why it's hard: The sources come in 100+ different formats, the records don't share identifiers, a lot of it is scanned paper or audio that has to be read or transcribed before it means anything, and a whole state has to be rebuildable on demand. I built it end to end, with AI coding agents writing most of the code under my direction.
Python and FastAPI on the back end, PostgreSQL with pgvector (managed in production), Next.js in front. Search works by meaning and by keyword at the same time, and every result carries where it came from. Each workspace can see only its own rows, and operators get a read-only MCP server.
AI coding agents built most of it, under written architecture decisions and verification gates. The simplest of those gates: every database write gets read back before the job counts as done.
Five decisions in the running system, each made on cost, on whether I can audit it afterward, and on quality.
| Job | Choice | Why | Effect |
|---|---|---|---|
| Ingesting 1.9M+ records | No LLM | WhyMust be deterministic, auditable and cheap to re-run. | EffectThe full dataset re-runs the same way every time. |
| Transcription and speaker diarization | Local GPU | WhyPer-minute API pricing adds up at volume. | EffectNo per-minute API fees. |
| Agent reasoning | Hosted + local | WhyA hosted frontier model does the thinking: it plans, reviews, edits and evaluates. Local models do the volume work, inside harnesses, evals and tests that run on my own machine. | EffectFrontier model for planning and review; local models for the volume. |
| Embeddings | Full precision | WhyI don't trade retrieval quality for storage savings. | EffectUsed for every embedding. |
| Statewide runs | 500+ workers | WhySerial runs are too slow for statewide coverage. | EffectA whole state seeds in one run. |
The concept, the requirements and the architecture are mine, and so are the checks that decide whether a job's output is good enough. AI coding agents did most of the implementation under my direction. What I brought that an engineering team alone would not have is years of working with government: I know what a reader needs to see in a record, and what a wrong inference costs them.
Email is the best way to reach me.
GitHub
github.com/MoHelmyNYX
@MoHelmyNYDurham, NC · Remote, with occasional travel
Hover, focus or tap a hatched state.
100+ public sources in every format: web pages, scanned PDFs, meeting minutes and meeting recordings.
No model is involved here, on purpose: this part has to be deterministic, auditable and cheap to run again. 500+ workers launch every county at once.
Scanned pages get read with OCR. Recordings get transcribed, each speaker identified, on a GPU in my office, so there are no per-minute fees.
Stitches records that share no identifier into one picture: what the agency needs, the money, and the people who decide.
Search by meaning and by keyword at once, on full-precision embeddings in PostgreSQL with pgvector, and every hit carries where it came from.
What you see is the raw, dated evidence: name, role, department, source and date, with no scores attached.
Six steps, top to bottom. The drawing follows the list as you scroll.
Trace a field back to its source
Need comes from two public sources: the council minutes, read with OCR, and the meeting recording, transcribed. Both are dated.Funding comes from one public source, the state grant program record, cited and dated like the others.Decision-maker comes from two public sources: the township's staff directory page and the council minutes. They share no identifier, so Unify joins them into the record.Pick a field to see where it comes from.
Illustrative. The drawing shows how one record moves, not how many there are. The 100 source slots and 500 worker cells are drawn at the floor of the counts above.