The record, as data
a public record you can query
One SQLite file holding every edition this paper has published — 110 editions, 281,651 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.gz (12.6 MB, gzipped). over the per-file ceiling; only the gzipped copy is published Open it with any SQLite client — sqlite3 edb-record.sqlite on a Mac or Linux machine, or DB Browser for SQLite. Schema version 2; built 2026-10-19 02:13 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 8,907 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 9 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 4,280 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 6,246 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 328 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 37 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 11,827 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 1,155 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 5,809 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 548 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 110 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 110 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 179,943 rows | Which editions carried which listing (civic = 1 for the civic rail). | edition_id text, row_id text, civic integer |
| events 6,703 rows | Every listing the paper ever printed, content-addressed and never edited, except a Ticketmaster listing, which is removed once its event has passed (their terms bar storing it longer; build_meta.events_withheld_by_retention counts them): 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 814 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 8,859 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 2,346 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 7,043 rows | The sources cited by each item, in order: publication name and URL, and source_id, the record that says why we may read it (/sources/<source_id>). NULL for editions stored before 10 October 2026, which did not record it. | edition_id text, key text, ord integer, name text, url text, source_id text |
| items 5,965 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 15 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 969 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 28 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 9,468 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 13,908 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 237 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 5,017 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 4,310 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 3,009 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 2,496 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;
Alberta mode is a guy from Edmonton commenting on the news, and the guy is a machine. One or two lines an item — what somebody who has lived here his whole life would say reading it out to his mates.
It is not the story. The headline above each comment is the real one, the source link below it goes to the real reporting, and the plain edition is one click away. He is not summarising anything and he is not a reporter; he is the guy at the shop with an opinion about it.
He swears when a sentence wants it. He is rude about council, developers, the province, the weather, the roads and the Oilers, and never about the people in the story. He holds about a dozen opinions that contradict each other and he is fine with that.
Some of it will sit wrong anyway. When it does, that is on us and we would rather hear it than not: corrections@edmontondailybrief.ca, and we will pull the line.
Two things get no comment at all, and they are not negotiable: anyone charged or before a court, who has a trial coming and is entitled to have us stay out of it, and a suicide. Anything you need to ACT on — a tip line, an advisory, an evacuation — keeps its full text underneath the comment, because a phone number does not go behind a joke.
The plain edition is the record, and it is the default. It is one click away and it is where you should check anything before you act on it.