Features

Everything an operator needs on one screen.

The live picture, who operates each contact, where it has been, and the source behind every claim — in a MapLibre dashboard and a terminal console over the same data.

OpenTAC console: world map with colour-coded state-asset markers, roster with zones and timeframe controls, legend, and major-category filter chips.
The console — capture-all, colour-coded by major category, with zones-of-interest and timeframe controls in the roster rail.
LIVE

The live picture

Every state aircraft and vessel in range on one map, updating in real time. Capture-all by default; emergency squawks, AIS distress, SAR search patterns and lifeboat launches surface the instant they happen.

adsb.lol · aisstream · digitraffic · local readsb / ais-catcher · < 500 ms to screen
IDENTITY

The known-assets trail

Click any contact for operator, unit, base and role from a curated, sourced watchlist. Newcomers are auto-classified into the taxonomy and flagged for promotion. The inspector shows the full major → subcategory → platform hierarchy.

stable id: ICAO hex · IMO · NORAD cat №
HISTORY

The movement history

The live picture is full-fidelity; the local archive is thinned so a busy feed stays searchable. Journeys, current known locations, and dark-span detection read back from what was kept — replay interpolates only between fixes the archive actually holds.

PostgreSQL/TimescaleDB · 35-day retention · journeys · dark-span detection
PROVENANCE

Provenance behind every claim

Confidence is a first-class field; every operator/unit/role carries its source. Unknowns are left blank. A gap in a track is shown as a gap.

verified · reported · going-dark · clickable primary sources
CROSS-REFERENCE

The monthly identity ingest

A built-in cross-reference pipeline keeps the identity picture current from ~26 free public datasets — recording each source's licence on every row, never overwriting human-curated data, and emitting licence-clean exports you can safely republish.

opentac refresh · plane-alert · CelesTrak · Wikidata · OpenSky · export --profile
Investigator workflow

Time, zone, and playback — on one map.

When the picture is too wide, narrow it to a place and a window: who was active in the last hour, who crossed a zone-of-interest, and where every in-zone contact was at a chosen moment — without inventing a position the archive never held.

TIMEFRAME

Last hour by default

The map seeds only contacts active inside your chosen span (5m–24h, default 1h). A window-end picker anchors any 24h investigation block; ambient paths reload for the same window.

ZONES

Zones of interest

Draw circular zones (≥1 nm — no residence-sized areas). The left-nav list fast-switches; roster, markers and paths filter to assets with at least one fix inside the zone during the active window.

PLAYBACK

Zone/time replay

Step a virtual clock across the window at 1×/2×/5×/10×. Replay interpolates between sparse archive fixes; a dark span stays a dark span — never papered over.

IMPORT

CSV asset upload

Upload a spreadsheet from the map toolbar. Rows reconcile as manual_upload; human-curated watchlist entries always win. Assets only — not positions.

Honest archive

The gap is still the story.

Investigator tools read the same thinned positions archive the movement engine uses. The live bus and WebSocket stay full-fidelity; replay fills only the space between fixes that passed the deadband — it never fabricates a contact where none was recorded.

  • +Default focus — last-hour-active map on load, not every asset ever seen.
  • +Zone + time — filter roster, markers and ambient paths together.
  • +Curated wins — CSV import enriches the spine; it never overwrites curated rows.
Surfaces & integration

One read-model, three ways in.

DASHBOARD

MapLibre console

The map, roster, inspector, timeline, zones of interest, timeframe controls, zone/time playback, CSV import, weather and satellite overlays — colour-blind-safe encoding, dark / light themes.

TUI

Terminal console

A full Textual TUI over SSH for headless boxes — roster, search, inspect and control without a browser.

API

JSON / WebSocket

Roster, positions, journeys, taxonomy and live updates over a documented local API — script it, pipe it, build on it.

ALERTS

Geofence & new-type

Geofence enter/exit, going-dark, and first-sighting-of-a-new-type notifications by ntfy or email.

Inspect anything

Click a contact, get its classification and provenance.

The inspector resolves any contact into the taxonomy — major category, subcategory and platform — alongside its type, identifiers, live position and sourced operator detail.

OpenTAC inspector on a military fast jet (SNIPR08, an F-5): the Classification block shows Military · Military fixed-wing · Fixed-wing, with identifiers, country and live position.
A military fast jet, auto-classified to Military · Military fixed-wing · Fixed-wing — the same inspector that resolves a Black Hawk to a helicopter or an MQ-9 to a UAV.
Terminal console

The same picture, in a TUI over SSH.

For headless boxes and low-bandwidth links, a full Textual operator console — triage on attach, roster, search, inspect — over the same read-models as the map. No browser required.

The OpenTAC terminal console (TUI): a status banner, a triage rail, the roster/feed listing live auto-discovered contacts, and an inspector showing a selected SAR vessel with its classification, flag and provenance.
The Textual TUI — triage rail, live roster, and an inspector on a selected SAR vessel, all over SSH.

Run the whole thing on your own box.

Loopback-bound, MIT-licensed, zero telemetry.

Get started What it tracks →