Edmonton Daily Brief

The record, as data

The record, as data

a public record you can query

EDB · Sections
  1. Front page
  2. Weather & Alerts
  3. City Hall
  4. Public Safety
  5. Development & Business
  6. Courts & Legal
  7. Sports
  8. Schools & Campus
  9. Community & Events
  10. Tech & Research
  11. The Province
  12. What’s On — every listing, weeks ahead
  13. Buses — the live tracker
  14. Search the paper

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.

What is in it

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.

TableWhat it holdsColumns
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

Questions, as SQL

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;