House AU · UK · US

What this is

A federal Australian sister to House (UK), built for Guardian Australia journalists who need to triage Hansard and Senate Estimates faster than the official tools allow. Three surfaces: Search across spoken contributions, questions on notice and ministerial statements; Deep Dive for plotting a term over time as a party-stacked timeline; Estimates for searching twice-yearly Senate hearings by round, committee, witness and senator. The third is the headline AU surface — UK House has no equivalent because the UK Parliament has no equivalent.

Use cases that drove the shape: a defence correspondent reading everything said about AUKUS in a single sitting fortnight; a political reporter tracking how a junior minister has answered Estimates questions over a year; an investigations editor scanning every Estimates exchange about robodebt or sports rorts; a tech reporter pulling every Estimates appearance from a specific department secretary.

How it’s made

Vanilla JavaScript on GitHub Pages, no proxy, no live API. UK House leans on UK Parliament’s live, CORS-friendly endpoints; aph.gov.au doesn’t expose an equivalent. So House AU inverts the architecture: a nightly GitHub Action walks the latest sitting days, fetches contribution JSON via parliament’s own internal transcript endpoint, parses it into speaker-attributed rows, and commits a tiered set of static shards back to the repo — per-month for the live two years, gzipped per-quarter for the older archive. The browser fetches the manifest, picks the shards overlapping the user’s date range, and searches them client-side. The cost is a ~24-hour lag, which matters less than it sounds because Hansard itself runs about a day behind the chamber.

Senate Estimates runs through a parallel pipeline because the data shape is different: each fragment covers an entire department’s grilling for one day rather than a single speaker turn, and the editorially useful unit is the section (department) rather than the turn. Same harvester architecture, different parser, separate per-round shards.

Built with Claude Code, internal newsroom tool, currently hosted on my personal GitHub. The Parliament of Australia publishes its material under CC-BY-NC-ND 4.0 — non-commercial, no derivatives. Counsel are relaxed about the framing because this is a research surface for journalists, not a public republication of a derivative work. The expectation is it moves to the Guardian stack behind authentication once it’s doing useful work.

What it doesn’t do

It doesn’t mirror UK House’s Committees and Transcripts surfaces. UK Parliament’s Committees API exposes oral evidence transcripts as searchable text; aph.gov.au doesn’t, and the underlying ParlInfo XML sits behind an Azure WAF that blocks automated requests. Building it for AU would have meant a third parallel harvester pipeline fighting the source at every step, with most of the editorially interesting committee work already covered by Senate Estimates. Cut on purpose.

Also not in here: alerts, saved searches, cross-state coverage, the New Zealand sister tool somebody will eventually ask about. Federal first; widen the scope only if the narrow version actually gets used.

Diary

May 2026

Cut Committees and Transcripts; settled on three surfaces

The original plan had House AU mirror UK’s five-surface shape. Built Search, Deep Dive and Estimates — all working, journalistically useful. Started on the committee transcripts pipeline and discovered aph.gov.au doesn’t expose oral evidence transcripts the way UK Parliament’s Committees API does. The ParlInfo XML sits behind a JS-challenge WAF; the public-facing inquiry pages load their content from a JS endpoint we’d have to chase. Several days of fighting the source for a feature that’s mostly covered by what Estimates already does.

So: cut. Removed the Committees and Transcripts tabs, the empty stub pages, the unused JS modules, the Committee chip in the Sources filter (it filtered everything out anyway). Three surfaces: Search, Deep Dive, Estimates. Each fully populated, no “coming soon” debt in the nav. AU’s thinness is appropriate: where UK Parliament publishes live APIs, ours has to harvest, so every surface is real maintenance.

May 2026

Senate Estimates, the headline AU surface

The shape that doesn’t exist in UK House. Twice-yearly hearings where senators question departmental officials over budget allocations — the densest accountability surface AU produces. Different data shape from chamber Hansard (each fragment covers a whole department’s grilling, not a single speaker turn), so a parallel pipeline: discovery from the schedule page, fetcher reusing the same JSON endpoint we use for chamber, parser splitting TalkText into per-section rows, per-round shards, dedicated UI with round + committee filters and Q+A speaker chips. 555 sections across 70 sessions, 4 rounds.

May 2026

Party enrichment + nightly harvester

Mapped the 324 active MPIDs to party + chamber by scraping each parliamentarian’s profile page, joined to contributions at render time so the result rows now carry party chips and Deep Dive’s timeline finally stacks by party. Plus a nightly GitHub Action that does the whole pipeline overnight and commits the diff — an “Index updated X” stamp on Search goes amber if the date is more than 7 days old, so a stalled harvester is visible at a glance.

May 2026

Scaffold from House UK, palette swapped to AU green and gold

Cloned the four-page structure from House (UK), dropped the Cloudflare Worker, replaced the oxblood accent with Pantone 348C green for focused states and active filters, and reserved Pantone 116C gold strictly as the search-match highlight fill. Gold on cream paper is 1.3:1 contrast — totally illegible as foreground — so it only ever appears as a background under dark text, never as a link or button colour. Looks good in a brand spec, fails the moment a reader needs to read; flag it loudly so I don’t regress to it later.

Reps and Senate replace Commons and Lords on the house chips. Footer attributions point at aph.gov.au and ParlInfo. The data layer is stubbed — every search returns empty results, intentionally, so pages render their natural empty state instead of crashing on UK Parliament endpoints. The console logs a one-line scaffold-mode notice so it’s obvious what’s happening.

Next: the harvester that actually fetches Hansard XML from aph.gov.au and writes the JSON shards the search will read. That’s the first ‘shows real data’ commit and the architectural heart of the divergence from House UK.