🔥 About this app
A live tool that aggregates fire-department news across six states —
California, Oregon, Washington, Arizona, Colorado, and Utah —
by city and county.
You choose what to track, click Run Scrape, and the app pulls fresh coverage from
Google News, auto-categorizes each story, and lets you filter, search, and export it.
Architecture at a glance
Browser UISingle-page vanilla HTML / CSS / JS — no framework
→
FastAPI · UvicornPython REST API + background scraper
→
Google News RSSPublic search feeds, queried per place
SQLiteStores articles, de-duplicated by URL
JSON configEditable city & county lists (persist across redeploys)
What happens when you scrape
1
Kick offClicking Run Scrape starts a background job on the server — the UI stays responsive and shows a live progress bar.
2
Query the newsFor every city and county on your lists, it runs six targeted Google News searches (budget, staffing, leadership, incidents, and more).
3
CategorizeEach headline is tagged by keyword rules into Budget/Funding, Staffing/Labor, Incident/Disaster, and other categories.
4
StoreResults are de-duplicated by URL and written to SQLite, so re-running a scrape only adds genuinely new articles.
5
ExploreSwitch between Cities and Counties profiles (or save your own), filter and search, sort columns, and export the current view to CSV or Excel.
The stack
FrontendVanilla HTML/CSS/JS served as static files — fast, dependency-free.
BackendFastAPI on a Uvicorn ASGI server (Python).
StorageSQLite file database + JSON config for place lists.
Data sourceGoogle News RSS — no API keys or paid services.
Deployment
Docker container→
DigitalOcean droplet→
Caddy + HTTPS→
Your browser
The whole app ships as one Docker image. A persistent volume keeps the database and your
city/county lists intact across redeploys.