This site is now up

A first post, to confirm everything works end to end, and to say what this site is for.

This is a placeholder, written so that every part of the site can be checked before any real writing goes on it. Replace or delete it once the first proper essay is ready. The file is content/essays/11-09-2026-hello.md.

Everything below exists to prove that a particular feature works.

What this site is for

To make economic information usable by people who are not economists. Public finance in India is not short of numbers. It is short of numbers anyone can find, check and reuse.

A table, to check it behaves on a phone

Fiscal tables are wide, and a wide table is the usual reason a page drags sideways on a phone. On this site a table scrolls inside its own box while the page stays still. Narrow the window until this one scrolls, and confirm the page itself does not.

YearVintageReceiptsExpenditureDeficit
2023-24Actuals27,88,87244,42,54216,53,670
2024-25Revised Estimates30,87,00047,16,00016,29,000
2025-26Budget Estimates34,20,40950,65,34516,44,936

Figures are illustrative and should not be cited. The Vintage column is the point: Budget Estimates, Revised Estimates and Actuals for the same year are three different facts, not one figure corrected twice. Conflating them is the most common error in Indian fiscal datasets, and it quietly corrupts every comparison built on top.

A quotation, to check the callout style

Design the files as though they were already database tables, and the database becomes an implementation detail you can adopt whenever you like, or never.

A list, to check spacing

  1. The domain is permanent.
  2. The repository is permanent.
  3. The hosting is disposable, and the design makes that cheap rather than tragic.

Some code, to check it scrolls

# Rebuild a clean table from the untouched source files.
# This must produce identical output every time it runs.
import pandas as pd

raw = pd.read_csv("raw/expenditure-2025-26.csv")
print(f"Loaded {len(raw):,} rows")

clean = raw[raw["vintage"].isin(["BE", "RE", "Actuals"])]
clean.to_csv("clean/expenditure.csv", index=False)
print(f"Wrote {len(clean):,} rows")

Things to check on this page

  • The page does not scroll sideways at 360 pixels wide
  • The table above scrolls inside its own box
  • Pressing Tab reaches every link, and the focus ring is always visible
  • The theme toggle works, and reloading keeps the theme you chose
  • At 200% zoom nothing disappears or overlaps
  • The tags at the foot lead to working tag pages