spend.json of 2026-08-28. Every figure below is from that file or the app code.The pipeline, the map, the coverage floor, and the Treasury toggle are done and done well. The gap is not more rows. The gap is that verified rows do not yet become things a person can trust at a glance, discover without a question in mind, and send to someone else.
These are the things a journalist or a sceptical resident hits before they have scrolled once.
Ranked by last-12-months total, the live export puts a 215k-resident borough second in England and a 157k-resident district sixth. These are almost certainly duplicated publications or pass-through flows, not spending.
| Council | Type | Residents | Last 12 m | £ / resident |
|---|---|---|---|---|
| Essex | County | 1.56m | £2.98bn | £1,909 |
| North Tyneside | Met borough | 215k | £2.84bn | £13,207 |
| Surrey | County | 1.25m | £2.25bn | £1,803 |
| Lancashire | County | 1.29m | £1.84bn | £1,422 |
| Birmingham | Met borough | 1.18m | £1.71bn | £1,441 |
| Tendring | District | 157k | £1.68bn | £10,723 |
Leeds, Stoke-on-Trent, Northumberland, Torbay, Wrexham, Rutland and 14 others have no rows inside the Aug 2025 to Jul 2026 window. Their latest published month is earlier. Today they render as a blank card and a grey polygon with no reason.
latest_month per council; app falls back to the last published 12 months with a visible caveat, and drops the council from cross-council rankings for the live window. Never a silent zero. Effort: small.No hash routing, no pushState, no Open Graph tags. Every discovery dies in the tab it was made in. For a product whose growth loop is "look at this", this is the cheapest 10x on the page.
S to the hash on every update(), restore on load, add a Share button (navigator.share with clipboard fallback). OG images need a tiny pre-render step at export time (one PNG per council, category, and top supplier). Effort: small for URLs, medium for OG images.The whole repository is built on manifests with source URLs, thresholds, and periods. The app shows none of it. A Sources section turns "trust us" into "check for yourself", and closes the open item in todo.md under coverage.
sources block per council from the manifests (family, cadence, first/last period, file count, row count, URL, gap list). Add a short "How this works" page. Effort: small to medium. All the data exists."#4 of 299" compares Birmingham with Rutland. "#4 of 36 met boroughs" is fair. The compare view should suggest peers, not ask the user to pick from a list of 319.
Some councils have records since 2009. The app shows 12 bars. "Is it going up?" cannot be answered. Five annual totals per category series is a small export change (about +5 numbers per series) with a large effect.
fy arrays (last 5 financial years) to cats series; skip for sup to protect file size, or include for the top 15 per council only. Effort: small export, small app.Agency staff, consultants, energy, hotels, food. The most emotionally charged resident questions live here, and the taxonomy already has the dimension (spend_category, 24 categories). It stays gated on ~60% coverage of the seven salient categories, but it belongs as the third tab, not a footnote.
Small things that stop the product feeling finished:
| Today | Proposed |
|---|---|
| "No card-spend retailer data available" on every empty supplier list (legacy copy) | "No published payments to companies in this period" |
| "records since 202" and "since 1899" on some cards (bad source dates) | Clamp display to the first plausible year; keep the raw fact in Sources |
| Grey polygon, no reason on hover | Tooltip states one of: not yet collected, under review, not published for period, category coverage too low |
| Supplier page with no "what they do" | One line from types.csv: "Outsourcing and facilities company" |
| No methodology anywhere | "How this works" page: sources, thresholds, what is excluded, versions |
The app answers "how much". People come for "what is notable". Three additions change what the product is.
Six auto-generated, neutral, factual sentences at the top of every council card. Each links to the view that proves it. No adjectives. The user judges. This gives every user type a reason to scroll.
Everything in the app is an aggregate. The thing residents and journalists actually want is a row. The top 25 payments per council and per published supplier is a few hundred KB, and each row links to the raw source file, which is the strongest trust signal you have.
top_payments (date, recipient, department, purpose, amount, source file id) for each council and each published supplier. Reuse the manifests for the file link. Effort: small to medium export, small app. Values shown are illustrative.Today a supplier page shows totals and rivals. A profile should answer: what do councils buy from them, how many councils, the trend, and who they are (Companies House, charity register). This is Phase 4 of the naming review, and it is where the map becomes a reference.
spend_category split per supplier from the classifier; 5-year series for the top 400. Effort: medium data, small app.Journalists build stories on CSVs, and each story links back. The API already runs on the Mini (query/api_server.py); the export can also write one CSV per council to static hosting today.
The data work has earned this. The gap now is not more rows; it is turning verified rows into things a person can see, trust, and send to someone else.