ANU–Civic Loop, live stop board

The ANU system I actually deal with: the free Civic Loop bus runs every 20–25 minutes but has no live tracking, so every wait at a stop is a guess — did it just leave, or is it 20 minutes out? This is the crowd-sourced fix: anyone at a stop taps out what they see (“just left”, “5 min late”, “packed”), it lands in SQLite, and every open tab sees it appear over SSE within a second, no reload needed.

What good looks like here

The real timetable and stop names come from ANU’s own Civic Loop page, committed in src/lib/stops.ts — a wish-list app that invents its own bus schedule proves nothing. The one enforced rule (CLAUDE.md): the core flow (submit a sighting, reload, still there) goes through SQLite, not in-memory state, because “does it survive a reload” is exactly the spec line this build has to satisfy.

What I chose not to build: no login, no per-user identity, no accuracy weighting or moderation of reports — this is a proof-of-life slice, not the finished thing. The map pins are hand-placed approximate coordinates, not surveyed GPS (see the ponytail: comment in stops.ts) — good enough to show which loop segment a stop is on, not for turn-by-turn walking directions.