The record, as data
a public record you can query
One SQLite file holding every edition this paper has published — 28 editions, 70,674 rows across 31 tables — rebuilt from the stored editions on every press. Every row is read from a file the paper has already published; nothing is invented, and the file can be thrown away and rebuilt. Stories, listings, council votes by name, instrument readings as series, road closures, capital projects, and what the paper considered and did not run.
Download: edb-record.sqlite (16.4 MB) · edb-record.sqlite.gz (3.6 MB, gzipped). Open it with any SQLite client — sqlite3 edb-record.sqlite on a Mac or Linux machine, or DB Browser for SQLite. Schema version 1; built 2026-09-07 07:05 UTC.
Identity, once: a story is its source URL; a listing is a content hash of its own text; a vote is the councillor’s name exactly as the minutes wrote it; a reading is (kind, instrument, the time it is for, the time it was taken). What the paper held back, its correspondence and its costs are not in the file.
| Table | What it holds | Columns |
|---|---|---|
| readings_latest view 2,417 rows | View: the most recently taken value for each (kind, instrument, observed_at). | kind text, instrument text, observed_at text, as_of text, value real, unit text, text text, edition_id text |
| build_meta 6 rows | How and when this file was built: schema version, source commit, edition count. | key text, value text |
| capital_projects 42 rows | City capital projects that appeared on the at-risk list: name, ward, neighbourhood, first and last edition seen. | project_id text, name text, ward text, neighbourhood text, first_edition_id text, last_edition_id text |
| capital_snapshots 1,000 rows | The City's own status of each project in each edition: budget, forecast, phase, completion date, and the three RAG statuses. | edition_id text, project_id text, budget real, budget_text text, forecast_budget real, phase text, completion text, budget_status text, schedule_status text, scope_status text, row_json text |
| closure_snapshots 1,497 rows | Which editions carried which closure, with a hash of its wording so a change to the notice can be seen. | edition_id text, closure_id text, content_hash text |
| closures 141 rows | Road closures and roadwork in the City's own wording, with dates, impact, coordinates, and the editions that first and last carried them. | closure_id text, on_street text, where_text text, impact text, is_closure integer, starts text, ends text, details text, why text, kind text, district text, lat real, lon real, first_edition_id text, last_edition_id text |
| councillors 24 rows | Every councillor name string the minutes have used. canonical and ward are NULL until a person fills them in; nothing here is guessed. | name text, canonical text, ward text |
| crime_points 3,153 rows | Generalised crime points from the police open-data map, by category, place and date, with the editions that first and last carried them. | point_id text, category text, kind text, place text, occurred_on text, lat real, lon real, first_edition_id text, last_edition_id text |
| decisions 20 rows | Decisions read from a meeting's recording where minutes were not yet posted: a count, never a name. | meeting_id text, ord integer, item text, outcome text, vote_for integer, vote_against integer, quote text |
| desk_health 253 rows | Per edition and desk: how many sources the desk has, how many answered, how many produced an item, and which failed. | edition_id text, desk text, sources integer, answered integer, produced integer, unpolled integer, silent_total integer, failed_json text |
| division_votes 3,177 rows | How each councillor voted on each division: side is in_favour, opposed or absent. Names are the minutes' own strings. | division_id text, councillor text, side text |
| divisions 301 rows | Every recorded vote: the motion, the outcome, the tally, who moved and seconded. division_id is a content hash of meeting, position and motion. | division_id text, meeting_id text, ord integer, motion text, outcome text, tally_for integer, tally_against integer, moved_by text, seconded_by text |
| edition_runs 28 rows | Every press run of every edition, including runs later replaced by a rebuild (superseded = 1). The live edition is superseded = 0. | edition_id text, generated_at text, sha256 text, superseded integer, file_name text |
| editions 28 rows | One row per stored edition (a press run the site publishes): date, edition, when it was generated, how many items it carried and what it cost to make. | edition_id text, date text, edition text, generated_at text, label text, items_n integer, written integer, held integer, cost_usd real, file_name text |
| event_appearances 38,867 rows | Which editions carried which listing (civic = 1 for the civic rail). | edition_id text, row_id text, civic integer |
| events 3,901 rows | Every listing the paper ever printed, content-addressed and never edited: what, venue, city, when, category, source, and the listing's own URL. | row_id text, what text, venue text, city text, sort_ts text, date_text text, time_text text, url text, source text, category text, civic integer, date_inferred integer, row_json text |
| failures 127 rows | What failed in each edition's build: a collector, a fixture rail, an events venue or a market source, with the recorded error. | edition_id text, kind text, name text, detail text |
| item_areas 2,835 rows | The places an item is about — 'muni:St. Albert', 'ward:Karhiio', 'nbhd:Downtown' — one row per area. | edition_id text, key text, area text |
| item_backlinks 372 rows | Earlier instalments an item points back to, as recorded on the item. | edition_id text, key text, ord integer, back_json text |
| item_sources 2,316 rows | The sources cited by each item, in order: publication name and URL. | edition_id text, key text, ord integer, name text, url text |
| items 1,974 rows | Every story as it ran in each edition: headline, body, why it matters, desk, score, rank, whether it led the front, and any instrument fixture as JSON. | edition_id text, key text, section text, headline text, body text, why_it_matters text, score real, priority text, rank integer, tier text, front integer, templated integer, drafted integer, outcome text, published text, scope text, horizon text, thread_id text, fixture_kind text, fixture_json text |
| licences 0 rows | Keys from the City's licence datasets as they came and went, from the snapshot log: first and last date each key was present. | dataset text, key text, first_seen text, last_seen text |
| meeting_items 333 rows | The agenda items of each meeting, by counter and title. | meeting_id text, key text, counter text, title text, report_codes_json text |
| meetings 15 rows | Council and committee meetings the paper covered: body, date, and the agenda, minutes and video links. | meeting_id text, body text, date text, agenda_url text, minutes_url text, video_url text, transcript_source text, transcript_chars integer, file_name text |
| readings 2,511 rows | Every instrument reading the paper published, one row each: kind (er_wait_minutes, river_level_m, market_price, wx_temp, ...), the instrument, the time the reading is for, when it was taken, and the value. A repeated identical reading is stored once; a revised one is a second row. | kind text, instrument text, observed_at text, as_of text, value real, unit text, text text, edition_id text |
| skipped 3,574 rows | Stories the paper considered and did not run, with the reason recorded at the time — the negative record. | edition_id text, key text, headline text, url text, source text, section text, reason text |
| source_health_log 0 rows | When a source went dark and when it came back, from the poll log. | at text, source_id text, event text, name text, error text, failures integer, last_count integer |
| stories 1,472 rows | One row per story key (the source URL): the first and last edition it appeared in, how many editions carried it, and its thread. | key text, first_edition_id text, last_edition_id text, thread_id text, appearances integer |
| thread_runs 1,160 rows | Each instalment of a thread: date, headline, source URL and desk. | thread_id text, date text, ord integer, key text, headline text, url text, source_name text, section text |
| threads 873 rows | Running stories: a thread's label, its first and last dates, and how many instalments and editions it spans. | thread_id text, label text, first_date text, last_date text, runs_n integer, editions_n integer |
| transit_notices 674 rows | Transit stop closures and detours with a coordinate, per edition. | edition_id text, stop text, header text, stop_name text, lat real, lon real, detail text, routes_json text, starts integer, ends integer, url text |
Every story a desk ran in a week
SELECT edition_id, headline FROM items WHERE section = 'city_hall' AND edition_id BETWEEN '2026-09-01' AND '2026-09-08' ORDER BY edition_id, rank;
How one councillor voted, by motion
SELECT m.date, m.body, d.motion, v.side FROM division_votes v JOIN divisions d USING (division_id) JOIN meetings m USING (meeting_id) WHERE v.councillor = 'K. Principe' ORDER BY m.date;
Everything on at one venue
SELECT sort_ts, what, category FROM events WHERE venue LIKE 'Winspear%' ORDER BY sort_ts;
An emergency room's waits as a series
SELECT observed_at, value AS minutes FROM readings_latest WHERE kind = 'er_wait_minutes' AND instrument = 'Royal Alexandra Hospital' ORDER BY observed_at;
Stories about one ward
SELECT i.edition_id, i.headline FROM item_areas a JOIN items i ON a.edition_id = i.edition_id AND a.key = i.key WHERE a.area = 'ward:Karhiio' ORDER BY i.edition_id;
A capital project's status, edition by edition
SELECT edition_id, budget_status, schedule_status, scope_status FROM capital_snapshots WHERE project_id = 'eB-10109' ORDER BY edition_id;