A pipeline you can read end to end.
Forked from the OpenHNW codebase and re-pointed: the watchlist-scoped feed layer is flipped to capture-all, and resolve-misses become classified, registered newcomers.
Capture all
Area-scoped ADS-B and global AIS adapters pull every contact in range — not just known identifiers. Commercial traffic is dropped at the gate.
Resolve & classify
Each fix resolves to a known asset by hex/IMO, or auto-registers — placed in the taxonomy by AIS ship type, broadcast ICAO type, or call sign.
Persist & derive
Every fix reaches the live bus at full fidelity; the local archive is thinned by distance, heading and heartbeat deadbands so a capture-all feed stays searchable. The movement engine derives stops, legs and dark spans over 35 days of retention.
Map, TUI, API
The dashboard, the terminal console and the JSON/WebSocket API all read the same read-models — including timeframe, zone-of-interest and playback over the thinned archive.
Timeframe, zones, and playback.
When the global picture is too wide, the dashboard narrows it: a 5m–24h span slider (default last hour), zones of interest drawn on the map (≥1 nm), roster and path filtering by zone+time, and multi-asset replay that interpolates only between fixes the archive actually kept.
- +Zone list — fast-switch between saved zones from the roster rail.
- +CSV import — upload assets from a spreadsheet; curated rows always win.
- +No fabrication — replay fills gaps between recorded fixes, never across a dark span.
Honest auto-discovery into the taxonomy.
A newcomer is never just a dot. Vessels are classified from their AIS ship type, aircraft from the broadcast ICAO type and operational call sign — into major category → subcategory → platform class. A Chinook becomes a military helicopter, an MQ-9 a military UAV, a King Air air-ambulance fixed-wing — automatically, the first time it is seen.
- +Platform-correct — helicopter, fixed-wing, UAV, vessel and satellite are never conflated.
- +State-only gate — commercial cargo, tanker, passenger and private traffic is filtered at ingest.
- +Curated override — a watchlist entry always wins over a live guess.
- +New-type alerts — the first sighting of a new asset type can notify you by ntfy or email.
Curated in the open, by the community.
The reference dataset is a public GitHub repository under CC-BY-SA. Anyone can propose an addition by pull request; CI validates every row against the schema and the scope rules, and scope-sensitive categories route to a designated reviewer.
- ›Aircraft, vessels, satellites — three datasets, one schema discipline.
- ›Provenance required — every entry carries a primary source and confidence.
- ›Scope discipline — assets, not individuals; no minors; enforced in CI.
- ›Contribute from the console — the inspector drafts a valid entry for you.
The identity layer, refreshed monthly.
Community pull requests curate the canonical spine; a built-in cross-reference ingest keeps it broad and current. Once a month it pulls identity and inventory data from ~26 free public datasets, normalises each into one shape, classifies it into the same taxonomy the live feeds use, and records every source's licence on the row. Run it on demand with opentac refresh.
- +~26 sources — plane-alert, CelesTrak, Wikidata, OpenSky and more; keyless ones run with zero setup.
- +Canonical-wins — an automated source may enrich a row but never overwrites human-curated data.
- +Polite & fail-soft — conditional GET means unchanged sources cost nothing; one source failing never aborts the run.
- +Licence-clean export —
opentac export --profileemits permissive / share-alike / internal CSVs by filtering on each source's licence.
Two optional layers. Off by default.
Both sit beneath the contacts on the same map, both respect the no-telemetry stance, and neither touches the position audit record.