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.