See your neighborhood sharper
Vertex is a local-first, real-time situational awareness dashboard. It fuses aircraft, vessel, weather, traffic, emergency alert, and P25 radio data into a single map-centric interface — running on hardware you own, in your home.
Part of the Sovereign Watch family of local intelligence tools.
| Panel | What you see |
|---|---|
| Map | Live aircraft positions and vessel tracks on a MapLibre GL map |
| Infrastructure | ODOT CCTV camera thumbnails, real-time road speeds, traffic incidents |
| Environment | NWS weather observations, active alerts, AQI, radar overlay |
| Community | Emergency alerts aggregated from FlashAlert, county EM, and city feeds |
| Tactical Audio | Live P25 trunked radio stream via configurable remote sources |
Geofences trigger entry/exit events. All entity positions are stored for 30-day trail history.
Five containers — minimal footprint, runs on a Raspberry Pi 5:
| Container | Role |
|---|---|
db |
PostgreSQL 16 + PostGIS |
redis |
Hot state cache + pub/sub event bus |
backend |
FastAPI REST + WebSocket API |
poller |
All background data pollers |
frontend |
React + MapLibre GL, served by Nginx |
Radio streams, news feeds, and other data sources are configured via config/sources.yml, editable at runtime without restarting containers.
- Docker and Docker Compose
- x86_64 or ARM64 (all images build native for both — no emulation on Pi 5)
cp .env.example .env
# Fill in API keys (see Configuration below)
cp config/sources.example.yml config/sources.yml
# Edit config/sources.yml to add radio streams, news feeds, and other sources
docker compose up -dOpen http://localhost (or your Pi's IP).
Copy .env.example and fill in your values. Data sources (radio streams, news feeds, alert zones, poller URLs) are configured in config/sources.yml — see config/sources.example.yml for the full schema.
| Key | Source | Required |
|---|---|---|
ODOT_API_KEY |
developer.odot.state.or.us — free, instant activation | Traffic feeds |
AISSTREAM_API_KEY |
aisstream.io — free tier | Vessel tracking (if no local AIS-catcher) |
AIRNOW_API_KEY |
airnowapi.org — free | AQI display |
Aircraft tracking via OpenSky Network requires no key (rate-limited). A local Ultrafeeder removes that dependency entirely.
The default region is the Tualatin/Portland metro (45.38°N, 122.76°W). To relocate, update these vars in your .env file:
REGION_LAT=45.3842
REGION_LON=-122.7635
REGION_ALT=100ft
REGION_NAME=Tualatin Valley
BBOX_MIN_LAT=44.8
BBOX_MAX_LAT=45.9
BBOX_MIN_LON=-123.5
BBOX_MAX_LON=-121.8NWS zone codes (NWS_ZONE, NWS_ALERT_ZONES) will also need updating for a different region. Alert zone RSS feeds and news sources are managed via config/sources.yml. Full regional portability is a planned milestone.
All public, free, and operator-run. No cloud lock-in.
| Feed | Source | Interval |
|---|---|---|
| Aircraft | OpenSky Network or local Ultrafeeder | 5 s |
| Vessels | AISstream.io or local AIS-catcher | WebSocket |
| Weather | NWS api.weather.gov |
5 min |
| Weather alerts | NWS CAP (multi-county) | 5 min |
| Traffic incidents | ODOT TripCheck API | 60 s |
| Traffic cameras | ODOT TripCheck API | on demand |
| Traffic flow | ODOT Traffic Detector API | 60 s |
| Emergency alerts | FlashAlert, WashCo EM, City RSS | 60 s |
| P25 audio | Configurable remote stream URLs (sources.yml) | live stream |
| Mesh nodes | Configurable remote MeshCore endpoints (sources.yml) | WebSocket |
- RAM budget at idle: ~520 MB (redis 50 + postgres 150 + backend 200 + poller 100 + nginx 20)
- Storage: Mount
db_dataandredis_datavolumes on SSD, not SD card - Cross-compile:
docker buildx build --platform linux/arm64from an x86 dev machine for fast Pi builds
GPL-3.0 — see LICENSE.