What was built, and what was wrong with it.
A site whose only asset is being believed should show its corrections as prominently as its features. Every fix listed below is a real defect that shipped into a working build before something caught it.
Map display fix, and a few loose ends
The India map was rendering slightly larger than the space around it on some screen widths, cropping its edges instead of shrinking to fit — the sizing now follows the same rule everywhere on the site: fit the container exactly, never overflow it. The contact address is now support@meratax.fyi.
Fields you can fill in, a map you can hover, and a proper footer
Name, email and phone are now visible on the allocation result — optional, and clearly separated from the four demographic dropdowns above them. Hovering the India map now shows the figure right where your cursor is, instead of in a caption below the map; the same map component is now reused on the Empty Chair pages for every state-level cadre. The site also has a proper footer, with every page linked from it — two pages had quietly gone unlinked.
Ministry spending, year by year
A fourteen-year view of what six ministries actually spent — Defence, Education, Health, Home Affairs, Road Transport, Rural Development — in rupees, alongside the existing share-of-GDP view. Built from the Union Budget’s own documents (2012-13 to 2016-17) and PRS Legislative Research’s annual analyses (2017-18 onward). Each source document states its own year on its cover page, and the extraction now reads that directly rather than assuming it — the same normalisation the rest of the pipeline already applies to ministry names, which have changed more than once over fourteen years (Human Resource Development became Education in 2020, for instance, and the figures are matched across the rename). Two years, 2015-16 and 2016-17, have no ministry-level breakdown available from any document this site could reach — the budget documents for those years turned out to cover only economic totals, not a ministry-by-ministry split — so those two points are left open on the chart rather than estimated.
Health, and closing the gaps left by the previous week
Specialist doctors at rural Community Health Centres joins the Empty Chair — 67.9% of sanctioned posts vacant, the strongest single figure on this site, recovered from the Ministry's own Rural Health Statistics 2020-21 after the Ministry's current servers stopped serving it. Also: the open API now serves the vacancies, targets and map datasets it was already claiming to (previously it stated the principle and broke it); llms.txt and the changelog itself now cover Phases 14-17; the India map's 410 KB of geometry moved out of the client JavaScript bundle and into server-rendered markup, cutting the states page's first-load JavaScript from 243 KB to 109 KB; and a Lighthouse run surfaced two accessibility defects — no <main> landmark anywhere on the site, and a legend caption whose contrast failed WCAG — both fixed.
- The government's own published national total for the health cadre does not satisfy its own arithmetic: 13,637 sanctioned minus 4,405 in position is 9,232, not the 9,268 the same table states as vacant, because its footnote excludes surplus states from one figure and includes two states with no published sanctioned count in the other. Publishing that pairing would have failed this site's own build-time check, so the national total shown is a reconciled sum over the same rows the sanctioned figure came from, with the government's original headline kept alongside for anyone checking against the PDF.
- A vacancy value was being clamped to zero for states with more staff in position than posts sanctioned (a surplus) — Arunachal Pradesh has 17 sanctioned, 19 in position. Clamping broke the sanctioned-minus-in-position-equals-vacant identity every other cadre on the site is required to satisfy, and the build now refuses to ship a cadre whose own arithmetic does not hold.
- Haryana reports zero sanctioned specialist posts but 22 people in position — a genuine anomaly in the source, not a parsing error — and was being counted in the national total while being excluded from the state table, which meant the two could never agree. Both now come from the same filtered set.
The India map, on Survey of India geometry
A real choropleth of India, alongside the population cartogram rather than replacing it. Boundaries are the Survey of India's own Administrative Boundary Database, free, converted from the projected shapefile with no third-party GeoJSON anywhere near the pipeline — those carry international boundaries and depict Jammu & Kashmir, Ladakh and Arunachal Pradesh differently from the Government of India.
- The browser saved the portal's product page instead of the map data on the first attempt — the Download control stays disabled until the account is approved, so a "save" produced 7.7 MB of HTML with a plausible filename. The build script now detects this explicitly.
- The RAR extractor (bsdtar, bundled with macOS) cannot read this archive's compression filter. It wrote the shapefile at exactly the right size, filled entirely with zeros, while the small supporting files extracted correctly — so the failure looked like success until the coordinates were checked.
Thirteen years, and identity that asks nothing by default
States' education and health spending as a share of GDP, 2011-12 to 2023-24 from the 16th Finance Commission's own table — deliberately not a rupee chart, because ministry-level rupee figures cross two definitional breaks in this window (Plan/Non-Plan abolished, the Railway Budget merged into the Union Budget, both 2017-18). Also added optional name/email/phone capture, built but switched off: nothing client-supplied can mark a submission as verified, secrets for the verification codes are hashed at rest, and the retention period for any raw request metadata is enforced by a database expiry rule rather than a promise on a page.
The Empty Chair: funded posts, nobody in them
Sanctioned strength against people actually in position — elementary teachers, state police and High Court judges. A vacancy is a harder claim than underspending: the post exists and the money was voted. Also reordered the homepage to lead with this and with the government's own spending targets, and demoted government advertising to a single sentence stating its own scale (₹654.9 crore, 0.0122% of the budget) rather than a section implying it was the main story.
- The police extractor initially locked onto the wrong page of a two-page table — an "All India" total-matching regex matched digits inside a larger figure on page one, whose columns mean something different. Caught because the build now refuses to ship unless the extracted rows reconcile exactly with the source's own published total.
- That same reconciliation caught a wrapped state name: "Dadra and Nagar Haveli and Daman and Diu" is long enough that the PDF-to-text conversion splits it across three lines, leaving one row's serial number with no name attached to it — and it was silently dropped, 1,396 sanctioned posts short.
Distribution: share cards, an open API, and a daily question
Every dataset the site is built on is now served as open JSON under /api/v1 — CC BY 4.0, CORS open, no key. Added 1080×1350 share cards sized for WhatsApp rather than a landscape OG card that gets letterboxed in a chat, an llms.txt and sitemap generated from one shared page list so they cannot drift, and a daily budget question.
Submissions, and a crowd median that refuses to appear early
You can now submit a budget. The median stays hidden until 200 real people have written one — below that the API returns an empty result and the page shows the true count, including zero. No IP is stored: the only identifier is a salted daily hash, and without a salt the endpoint fails closed rather than pretending.
The promise gap
₹1,31,114 crore across 12 schemes was budgeted for 2025-26 and revised away in the same year. Jal Jeevan Mission went from ₹67,000 crore to ₹17,000 crore. Framed as budgeted-vs-revised rather than a verdict — a revised estimate can mean re-phasing or delay, not only a broken promise.
- A version number in a scheme name — "POSHAN 2.0" — was being parsed as that row's first data value, silently shifting every column by one. Figures in these tables are right-aligned, so the extractor now requires two-plus spaces before a number.
The state layer
Every state's share of the ₹15,26,255 crore devolution, taken from the Sixteenth Finance Commission's own report rather than a news summary. The map is a cartogram, not a choropleth: a coloured map of India sizes states by land, and land is not people. Added a Centre / State / Combined toggle, because Union health spending quoted alone understates what governments spend by roughly ten times.
- Per-capita devolution was computed from the unrounded amount but displayed next to the rounded one, so anyone checking the arithmetic on Arunachal, Meghalaya or Goa would have found it wrong.
- The Finance Commission formula weights parsed to 182.5% — the extractor grabbed the "Total" row as a criterion and missed "Population (2011)" because the label pattern disallowed digits.
The contribution engine
Only 6.68% of Indians file an income tax return and most of those owe nothing, so a calculator built on income tax speaks to under 2% of the country. This one estimates what anyone puts in — income tax plus the Centre's half of GST plus fuel excise — as a range, never a single confident number. The methodology page was written before the calculator.
The allocation board
The board is the homepage: no hero, no nav, you land on ₹53,47,315 crore and a decision. The committed 46% is shown first and locked, because that is the lesson. Overspend and the meter shows the deficit rising and next year's interest growing — permanently.
- The sticky meter pinned to the viewport for the whole section and covered the heading beneath it.
- A narrow-phone media block sat above the rule it was meant to override, so it lost the cascade and the mobile layout silently did nothing.
- Share links did not restore when pasted into an already-open tab, because the restore only ran on mount.
The data layer, and a build that refuses bad numbers
Budget data is versioned JSON in the repository rather than a database, so every figure is diffable and provenance is a build artifact. The figures are transcribed by hand and then cross-checked against an independent extraction of the same PDF, so a mistyped digit fails the build instead of shipping.
- The plan used a 1.45 billion population. The World Bank series ends at 2024, so a 2026-27 budget needs the 2026 projection — which moves spending per person from ₹100.97 to ₹99.28 a day.
- Gross tax revenue minus devolution does not equal net tax revenue; there is a ₹10,909 crore gap for cost of collection. Presenting it as a subtraction would have been wrong.
Known problems
- The income tax slabs come from a secondary source and have not been checked against the Finance Act itself. Flagged as unverified in sources.
- Fuel excise moves far more often than the budget does. The figure carries an “as of” date and needs re-checking against PPAC regularly.
- Per-state figures divide by the 2011 Census, because India has had no census since. They are per 2011 person.
- The crowd median has no crowd yet. It stays hidden until 200 real people have written a budget, and it will not be seeded.