Skip to content

v1.2.0

Latest

Choose a tag to compare

@AndrewCTF AndrewCTF released this 22 Oct 04:33
3ca6f03

Minor release. The console now works on a phone, a replay can leave the desk as a link, the archive can live in TimescaleDB, and the globe is a lot faster.

Read "Upgrading" before you pull if you run docker-compose.prod.yml.

Replay any day, and share it

  • Public-archive replay. Aircraft replay from the public readsb heatmap archives for any day since 2024, before your own archive starts. The Play button drives the clock through half-hour chunks with a 24-entry cache, decoded in a Web Worker.
  • Rewind links. A URL opens the map at a place, a contact and a moment.
  • TimescaleDB archive. With HISTORY_PG_DSN set (both compose files now set it), the position archive lives in a compressed Postgres + TimescaleDB hypertable with an hourly rollup. Without it, the backend falls back to SQLite.
  • Projections. GET /api/history/project returns a one-hour cone and chokepoint ETAs from a contact's own track.

On your phone

  • At 767 px and under, the console is a map app: the map takes 93% of the screen, and Layers, Find, Time, Alerts and More open as bottom sheets you can drag.
  • Area alerts push to your phone through ntfy, with "Alert me about this area" on the map.
  • /api/overhead returns the nearest aircraft as small JSON for desk displays.
  • arm64 images are published next to amd64.

Faster globe

Measured A/B on the same backend, headed Chrome on the GPU:

v1.1.0 v1.2.0
all layers on, fps p05 / p50 9 / 50 51 / 91
fly-in to 400 km, worst frame 340 ms 94 ms
boot chunk (gzip) 746 KB 434 KB

Ships

A new AIS pipeline polls ShipXplorer, an OpenWaters sweep and VesselFinder into a freshness-wins store keyed by MMSI, so a cached source can never overwrite a fresher fix.

MCP server

focus_area takes a polygon (one ring of [lon, lat] pairs) as well as a circle. The server is also listed on Glama: https://glama.ai/mcp/servers/AndrewCTF/velocity

Analyst features

  • Clearance is enforced on every ontology read and write through one predicate.
  • Entity-resolution merge candidates go to a review queue; nothing auto-merges.
  • Foundry pulls a named SQL table by cursor and ingests documents (eml, docx, txt, md, pdf).
  • Write-back actions go through the human-in-the-loop proposal queue.

Google Earth 3D basemap (off by default)

A photoreal city mesh with no API key. It reads a private Google endpoint, outside Google's terms, so it stays off unless you set GOOGLE_3D_KEYLESS=true. The licensed ENABLE_GOOGLE_3D stream never turns it on.

Security

Dependency advisories closed in vite, dompurify, vitest, pillow (13.0.0) and certifi. pnpm audit and pip-audit report no known vulnerabilities.

Upgrading

  • docker-compose.prod.yml now runs a TimescaleDB service and refuses to start without TIMESCALE_PASSWORD in .env. It still requires VELOCITY_VERSION; set it to v1.2.0.
  • The dev docker-compose.yml also starts a TimescaleDB service now and points the API at it.
  • Either way, an existing SQLite archive is not copied automatically. To keep it, run scripts/history_migrate_sqlite_to_pg.py once against the new database.

Full changes: #93, #95, #96, #97, #98, #99, #100, #101, #102.