How it works

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.

01 · ingest

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.

02 · classify

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.

03 · archive

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.

04 · surface

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.

OpenTAC Current Known Locations view: the roster switched to Locations mode listing every tracked asset's last fix, beside the live map.
The Current Known Locations surface — every tracked asset's last fix, read back from the local archive.
Investigate

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.
Classification

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.
OpenTAC inspector on a military helicopter (IN773, a Black Hawk): the Classification block shows Military · Military helicopter · Helicopter, with type, operator, identifiers and live position.
What the operator sees — a military Black Hawk auto-classified to Military · Military helicopter · Helicopter, with type, identifiers and provenance.
The watchlist

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.
Cross-reference ingest

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 exportopentac export --profile emits permissive / share-alike / internal CSVs by filtering on each source's licence.
Overlays

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.

Overlay 01 · Weather

Weather, for context

A precipitation raster over the map, so a holding aircraft or a lifeboat that hasn't launched reads in its meteorological context. Keyless RainViewer tiles, proxied through your own tile cache.

◌ off by default · /weather on
Overlay 02 · Satellites

Satellites, honestly

Ground tracks and overhead passes for military and reconnaissance satellites, propagated from public CelesTrak elements. Every position is an explicit prediction — the inspector says so, every time.

◌ off by default · /satellites on