OpenHotSprings as a source-first civic records system.
OpenHotSprings reflects a different kind of technical problem: civic information is often public, but still hard to discover, track, and understand. Civic technology is not just publishing data. It is designing a path from scattered public records and meeting information to something a resident can actually use.
The architecture combines a React, TypeScript, and Vite frontend with a FastAPI backend. The backend is designed around official-source ingestion from City of Hot Springs records, Agenda Center pages, RSS feeds, city calendar and department pages, bid and purchasing pages, FOIA records, official City YouTube streams, and public contact records. The production model separates the public React site from server-side scanning so residents see processed records, source links, update timestamps, and clear status labels instead of internal mechanics.
The backend exposes civic-record endpoints for health and status checks, source probes, packet records, discovered records, official contacts, meetings, projects, contracts, budgets, and search. Optional PostgreSQL storage tracks discovered-record metadata such as source, URL, first-seen and last-seen times, download status, storage keys, content hashes, video IDs, transcript status, and candidate recording-match state.
The ingestion design is careful about evidence. City packets can be downloaded, hashed, and served back through the API. YouTube captions and transcript files can be normalized from VTT or SRT-style cues, while timestamped description lines can provide section navigation when captions are unavailable. Recording matches stay candidate-only until official records, transcripts, minutes, or packet text support the public claim.
On the frontend, the goal is not to overwhelm residents with raw municipal data. OpenHotSprings uses compact browsing patterns for meetings, tracked topics, source records, and expandable details. The user should be able to see what an item is, why it matters, where it came from, and what source document supports it before choosing to go deeper.
| Layer | Technical Role |
| Frontend | React, TypeScript, and Vite interface for browsing meetings, topics, records, contacts, and source-backed civic information. |
| Backend | FastAPI application providing status, source, discovered-record, meeting, contact, project, contract, budget, and search endpoints. |
| Storage | PostgreSQL-backed metadata for discovered records, scan runs, source health, analytics events, content hashes, transcript status, and review state. |
| Records Processing | Official-source scanning, packet download, transcript handling, content hashing, candidate matching, and source-link preservation. |
| Trust Model | Public claims stay tied to official sources, timestamps, document links, evidence status, and visible uncertainty when a record is still pending. |