About & sources

Where every figure on this site comes from, and what it does not do.

Fare model

Every current-era GoCard trip is billed at the post-2024-Aug SEQ 50-cent flat fare. The /savings pre-cap panel estimates what the same trips would have cost before the cap using Translink zone-1 adult one-way rates (train $3.50, bus $2.80, ferry $3.20), sourced from translink.com.au fare history. Trips with a missing tap-off are treated as default-fare penalties ($3.00) rather than legitimate trips.

Fuel prices

Live prices come from the Queensland Fuel Price Reporting (FPQ) feed, cached for one hour in Cloudflare KV and refreshed daily by a scheduled worker. Historical prices are backfilled from the data.qld.gov.au CKAN Fuel Price Reporting dataset, which publishes monthly (typically two days after month-end). When FPQ is unavailable the site enters an explicit "fuel data unavailable" state rather than silently falling back to CKAN, because a stale "today" figure is a worse failure than an honest empty one. Attribution: State of Queensland (Department of Energy, Mines and Resources), CC BY 4.0.

Distance model

Driving distance is the haversine great-circle distance between origin and destination multiplied by a 1.3 road factor. This is not a routing engine. The estimate is surfaced next to every cost figure rather than hidden behind a routing API that could be wrong in its own interesting ways; the user can override the auto-computed value at any time.

Driving cost model

Default fuel economy is 8 L/100km, a typical sedan figure the user can override. Parking is a user-entered per-day rate that defaults to $0. Depreciation, insurance, maintenance, and tolls are deliberately excluded; the site only counts costs the user pays at the pump or the meter on a given trip.

Stop coordinates

Stop positions come from a GTFS-derived Brisbane reference table seeded by scripts/seed-stops.ts. On production D1 the table is applied via bunx wrangler d1 execute gocard-insights-db --remote --file=drizzle/seed-stops.sql. Stops that do not match the reference table fall back to fuzzy name matching, and unmatched trips are excluded from the map rather than placed at a wrong location.

Tech stack

SvelteKit 2 and Svelte 5 (runes only) with TypeScript 6, TailwindCSS v4 for layout, and CSS custom properties for theming. The database is Drizzle ORM against Cloudflare D1 (SQLite). Charts render with Chart.js, the map with MapLibre GL JS, and the Translink PDF importer uses Tesseract.js for OCR. The site is deployed on Cloudflare Pages.

Data privacy

All trip data lives in the per-environment D1 database and no trip data leaves the deployment. There are no third-party analytics, no trackers, and no PII retained beyond the rows the user imports. On a private deployment the "Clear Data" control wipes every trip at any time; on the public demo it is intentionally disabled so the shared dataset stays intact. See the Privacy page for the full notice.