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.
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 writessite-html/basket/basket.jsonwith 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.