The Basket

The Basket is the kind of automation that should feel like a person keeping a notebook: every month it pulls the actual prices Statistics Canada recorded for a real Toronto grocery basket, adds up the total, and writes a plain-spoken note about what moved and why it matters — then it publishes the whole thing, numbers and all.

Open the basket →

What it is

One page, updated monthly:

  • A real basket. Milk, eggs, bread, butter, ground beef, chicken, apples, coffee, canola oil, laundry detergent, and Toronto regular gas — 19 items with their real monthly average prices from Statistics Canada (table 18-10-0245-01, Ontario, plus 18-10-0001-01 for Toronto gas).
  • A monthly note. The narration is written from the numbers by an LLM with strict rules: facts only, exact figures, two to four sentences, no filler. If the basket barely moved, it says so. If eggs ate the budget, it says that too.
  • An archive. Every note stays on the page. The basket builds a memory of itself.

Why it doesn't feel robotic

Dashboards feel robotic because they're certain and they never change their mind. The Basket is monthly, sourced, and honest about its limits: Statistics Canada publishes on a lag, so the page says what month the data is from. Beer and electricity aren't in yet — the LCBO has no public price feed and IESO's open reports moved behind a login — so the caveats are listed in the open instead of hidden.

The automation is the log: the pipeline fetches, the note is written, the page rebuilds. The voice stays human because the rules are strict — exact numbers, plain words, no invented reasons.

How it works

  • basket/pipeline.py — stdlib-only Python: downloads the two Statistics Canada CSVs, filters to Ontario (Toronto for gas), and writes site-html/basket/basket.json with prices, deltas, and 13 months of history.
  • basket/narrate.py — writes the month's note (DeepSeek, temperature 0.3) with a deterministic fallback if the API is unavailable.
  • site-html/build.py — renders /basket/ from the committed JSON, so the page builds anywhere.
  • A monthly cron re-runs the pipeline, rebuilds, and redeploys.

Data license: Statistics Canada Open Licence. No personal data, aggregates only.