Real-time incident tracker for Caddo Parish, Baton Rouge traffic incidents, and Lafayette traffic incidents with an interactive map and live/history views.
Created by Vincent Larkin | LinkedIn | GitHub
- Scrapes the official Caddo 911 Active Events feed, Baton Rouge's traffic incident feed, and Lafayette's traffic feed every cycle
- Displays incidents on an interactive dark-themed map with color-coded markers
- Supports source tabs:
All,Caddo,Baton Rouge, andLafayette (Beta)in both Live and History views - Groups incidents by source in
Allmode (not interleaved) - Filters by agency and urgency/severity
- Caches incidents to SQLite for live + historical views
- Archives older, inactive incidents to monthly archive databases
- Geocodes addresses using source-aware bounds for better placement
- Serves a single-page frontend from
public/(Leaflet map + filters)
- Python 3.10+
- Internet connection
pip install -r requirements.txtpython app.pyThen open http://localhost:3911 in your browser.
This app supports multiple modes depending on what you want to do.
python app.py
# or explicitly:
python app.py --mode servepython app.py --mode gatherpython app.py --mode interactiveWhile running interactive mode:
- Press
2to start the web UI - Press
qto quit
# scrape interval (seconds)
python app.py --mode gather --interval 60
# quiet console output (recommended for gather mode)
python app.py --mode gather --quiet# re-geocode all incidents (improves old coordinates)
python app.py --regeocode
# archive old incidents to monthly DBs
python app.py --archive
# create a one-time DB backup snapshot (main + archive DBs)
python app.py --backup
# backup only the main DB
python app.py --backup --backup-main-onlyCADDO911_DB_PATH(default:caddo911.db)CADDO911_ARCHIVE_DAYS(default:30)CADDO911_BACKUP_DIR(default:<db dir>/backups)CADDO911_BACKUP_RETENTION_WEEKS(default:5, keep the most recent 5 weekly snapshots per DB)CADDO911_AUTH_TOKENorCADDO911_AUTH_USER+CADDO911_AUTH_PASSCADDO911_ENABLE_REFRESH_ENDPOINT(set to1to enable/api/refresh)
Automatic schedules:
- Daily archive:
3:00 AMCentral (--no-auto-archiveto disable) - Weekly backup snapshot:
Sunday 11:30 PMCentral (--no-auto-backupto disable)
See the GitHub wiki page: Self-hosting
This repo also includes wiki pages in wiki/:
- Scraping: Uses source adapters in
sources/(caddo+batonrouge+lafayette) to fetch and normalize incidents into one shared data shape. - Deduplication: Each incident gets a source-aware hash based on source, agency, time, description, and location.
- Geocoding: Cross streets are prioritized over street names for more accurate intersection placement. Uses ArcGIS first and falls back to OpenStreetMap's Nominatim.
- Storage: Incidents stored in
caddo911.db(SQLite) with source, timestamps, and active/inactive status. - Archiving: Inactive incidents older than
CADDO911_ARCHIVE_DAYSmove tocaddo911_archive_YYYY_MM.db. - Backup snapshots: Weekly SQLite-consistent snapshots are written to
backups/(configurable). - Frontend: Single-page app with Leaflet.js map, source tabs, and shared filters for Live + History views.
| Code | Agency |
|---|---|
| CFD1-9 | Caddo Fire Districts |
| SFD | Shreveport Fire Department |
| SPD | Shreveport Police Department |
| CSO | Caddo Sheriff's Office |
| POLICE | Lafayette Police label |
| SHERIFF | Lafayette Sheriff label |
| FIRE | Lafayette Fire label |
This app currently ingests from:
- Caddo Parish 911 Communications District public feed:
https://ias.ecc.caddo911.com/All_ActiveEvents.aspx - City of Baton Rouge traffic incidents page:
https://city.brla.gov/traffic/incidents.asp - Lafayette Parish traffic feed endpoint (beta integration):
https://lafayette911.org/wp-json/traffic-feed/v1/data
| File | Purpose |
|---|---|
app.py |
Flask server, scraper, scheduler |
sources/caddo.py |
Caddo source adapter |
sources/batonrouge.py |
Baton Rouge source adapter |
sources/lafayette.py |
Lafayette source adapter |
public/index.html |
Dashboard UI with map + filters |
public/styles.css |
Frontend styling |
public/images/ |
Logos and agency icons |
caddo911.db |
SQLite database (auto-created) |
caddo911_archive_YYYY_MM.db |
Monthly archive databases (auto-created) |
backups/*.db |
Weekly backup snapshots (auto-created) |
requirements.txt |
Python dependencies |
- Geocoding improves over time: The app stores geocode metadata and can re-geocode low-quality points automatically as new scrapes arrive (no DB wipe required).
- Choose source scope: Use
All,Caddo,Baton Rouge, orLafayette (Beta)to control which feed is visible. - Filter incidents: Use filter buttons to focus on agency types and urgency/severity.
- Historical view: Switch to "History" tab and select a date to browse past incidents
The app now exposes a monthly report endpoint that summarizes:
- the most common incident type for a month
- the densest hotspot for that type within a configurable radius (default
5miles)
Example:
curl "http://localhost:3911/api/reports/monthly?month=2026-02&radius_miles=5&source=all"Example with your hosted domain:
curl "https://your-domain.example/api/reports/monthly?month=2026-02&radius_miles=5&source=caddo"Response highlights:
totalIncidents: all incidents seen in that monthtopIncidentType.description: most common call/incident descriptiontopIncidentType.count: how many times it occurredtopIncidentType.hotspot.incidentCount: how many of that type fell inside the strongest radius clustertopIncidentType.hotspot.center: approximate center point for the hotspottopIncidentType.hotspot.topLocations: most common nearby street/intersection labels in that hotspot
This project is proprietary software owned by Vincent Larkin.
- ✅ Personal and educational use permitted
- ❌ Commercial use prohibited
- ❌ Government use prohibited without authorization
⚠️ Attribution required: "Created by Vincent Larkin" with a link tovincentlarkin.comorgithub.com/vincentlarkin
See LICENSE for full terms.