What's New?¶
Edge¶
Track replay¶
- Play back vessel movements — the web viewer gained a replay bar: replay received traffic on the map, scrub the timeline, and vary playback speed from 10× up to 3600×. On by default.
- Two settings control the history —
track_timesets how many seconds of tracks and replay the server serves (default 3600, 0 for no limit), andtrack_memorysets the memory budget in KB that stores them: full detail for roughly the last hour, thinned history beyond it. Both are also in the control panel's Viewer settings. - Vessel shapes during replay — vessels that report their dimensions are drawn as hulls turned to their heading, and keep their marker when too small to make out. Track points now also store course, heading and speed.
Built-in control panel¶
- Configure AIS-catcher from the browser — a new managed mode (
AIS-catcher -E [config file] [address:port]) starts a built-in control panel, by default onhttp://localhost:8118. A setup wizard walks you through input device and output configuration on first use, and the Input and Output tabs let you fine-tune everything afterwards — no config file editing needed. See Managed Mode. - Remote administration with password protection — bind to
0.0.0.0to manage the station from another machine; the panel then requires setting a password on first access. - Managed web viewer — in managed mode the web viewer is started automatically on the port above the control panel (8119 by default).
- Easy install — the install script's new
-M/--managedoption sets up the systemd service in managed mode, and the Windows zip includesstart-GUI.batto launch AIS-catcher with the control panel. - See also the new Quick Start guide on aiscatcher.org — from zero to a running station in six steps.
Database output¶
- Reworked
-Doutput with three backends — one shared 5-table schema written to PostgreSQL, SQLite (-D sqlite:file.db) or CSV files (-D csv:directory), so a database no longer requires a server. Defaults are bounded — latest state per vessel plus hourly reception statistics — and full position/static history is opt-in. See Database output. - Configurable from the control panel — a new Database output channel with a backend selector, and in the config file a single
dbarray with atypefield.
Installation¶
- Fedora support — the install script now detects
dnfalongsideapt, so the same one-line command works on Fedora as well as on Debian, Ubuntu and Raspberry Pi OS. Pre-built RPMs are provided for Fedora 43 and 44 (x86_64andaarch64); other releases build from source. - Docker image on Debian trixie — the published image moved from Debian bookworm to trixie (Debian 13), matching the base image the feeder containers that build on top of it already use.
Web viewer¶
- Refreshed interface — tighter tables, a modern search bar, a redesigned column toolbar on the Ships tab, and smaller map count/measure icons for a cleaner map.
- Redesigned ship card — now split into collapsible sections, with charts of recent speed and reported draught, a scale drawing of the hull marking where the AIS antenna sits, and a timeline of changes to draught, status, name, callsign, destination and ETA (also on
api/changes.json). - Tracks coloured by speed — under Settings → Line Colors, colour tracks by speed instead of ship type, with six palettes and an adjustable scale maximum.
- Vessel filter — narrow the map, the ships table and replay to the vessels you care about: by sender (class A/B, AtoN, base station, SART, aircraft), reported type, speed, distance, navigation status, age of the last message, validation state and whether a repeater passed the message on. Groups can be switched straight from the counters card, which greys out what it is holding back and keeps showing how many vessels that is; everything else lives under Settings → Filter, reachable from the funnel on the map and next to Columns on the Ships tab.
- Vessel type filter covers every class — Class B / pleasure craft got their own entry and "Other / not reported" catches everything without one (aircraft, base stations, AtoN, SART), so selecting Cargo alone hides everything else.
-
New map backgrounds — the CARTO backgrounds (Positron, Dark Matter, Voyager) now require an API key from CARTO and show an "API key required" watermark without one, so they are replaced by OpenFreeMap vector maps: Positron, Bright, Liberty and Dark, with label-free versions of Positron and Dark. These need no key and no account, and are sharper at every zoom level. Anyone who prefers CARTO can get a free key at carto.com/basemaps/apikey and paste it into the
carto_basemapsplugin, which brings all six back. -
Region — the sea, gulf, strait or lake a ship is in now comes from a polygon table instead of a grid.
Places¶
- Editable place catalogue — ports, berths, anchorages and custom geographic features now live in an editable catalogue. A new Places tab in the control panel lets you draw and reshape points and polygons, search, and import/export individual features. Point the server at a catalogue directory with
control.viewer.placesor the standalone viewer setting-N 8100 PLACES /path/to/places; managed installs create one automatically. Ports carry a UN/LOCODE and a size class (small/medium/large) that scales their map marker; berths and anchorages link to a port, and everything else is a custom place with its own category and map glyph. - Visits, not just current location — a ship's stay in a place, current or past, is tracked as a visit and shown in a new Visits section of its history. Clicking a place marker on the map opens a dialog listing ships Inside, recently Arrived/Left, past Visits, and — for ports — Expected, based on matched destination.
HTTP output¶
- Credentials in the URL —
-H https://user:password@host/sends HTTP Basic and-H https://<token>@host/sends a Bearer token, alongside the existinguserpwdsetting. Credentials are kept out of the log and the posted metadata.
Community sharing¶
- Sharing is opt-in — saying nothing on
-Xno longer enables the community feed; a hint in the log encourages-X onwhen there is something to share. Managed mode is unchanged: the config file created by the control panel enables sharing.
Input¶
- Secure WebSocket input —
-t wss://host/pathreads NMEA over WebSocket with TLS (port 443 by default), passing the URL's path and query to the server. Credentials in the URL become anAuthorizationheader —user:password@for Basic, a baretoken@for Bearer — or use theusername/passwordsettings;ssl_verify offaccepts self-signed certificates. Reads the Open Waters NMEA stream directly. See Input over TCP.
Devices¶
- SDRplay RSPduo — tuner selection (
TUNER A/B) and slave mode, so AIS-catcher can run on one tuner while another application uses the other. - SDRplay — no longer crashes or aborts when the SDRplay API v3 service is not running, with more robust device open and antenna validation.
- SDRplay RSP1B and RSPdxR2 — now reported by name instead of as
UNKNOWN. - SDRplay on Windows — pre-built Windows binaries with SDRplay support are no longer published, as the SDRplay API installer can no longer be downloaded from an automated build. v0.70 is the last Windows release that includes them. SDRplay support is unchanged on Linux and macOS, and can still be built from source on Windows.
NMEA 2000¶
- Correct AIS text over N2K — Aid-to-Navigation names, safety-related text, and vessel name/callsign fields are now encoded correctly when output over NMEA 2000.
Version 0.70¶
Networking & stability¶
This release focuses on making the network output more robust under load and on unreliable links.
- Rewritten TCP server: the built-in TCP server now uses
poll()and handles up to 128 simultaneous client connections. - Bounded output queues: the HTTP and TCP output queues now have a fixed size and drop the oldest message when a slow consumer cannot keep up, preventing unbounded memory growth.
- Dropped-message statistic: a new Dropped counter is reported in the output statistics so you can see when messages are being dropped to a slow connection.
- Recovery of wedged sockets: outgoing TCP connections now use
TCP_USER_TIMEOUTand a periodic reset with random jitter, so dead or half-open connections are detected and re-established instead of silently stalling. - Quieter logs: a remote peer closing the connection (
recv()returning 0) is now treated as a clean disconnect instead of being logged as a spuriousrecv() error 0.
Web viewer¶
- The new Dropped message count is shown in the output statistics panel.
- Fixed dragging of right/bottom-anchored stat cards, which now move instead of stretching.
- A more open gear icon for the settings button.
Bug fixes¶
- ADS-B: trailing space padding is now stripped from aircraft callsigns.
- Fixed a CTRL-C hang when replaying from standard input.
- Smoother output during file replay (stdout flushing is deferred while replaying).
Version 0.69¶
ITU-R M.1371-6 alignment¶
The JSON output has been aligned with the 2026 ITU-R M.1371-6 spec.
- Message type 28 (single-slot AtoN report, M.1371-6 §A7-3.26) is now expanded into structured JSON fields. See the type 28 reference.
- Messages 25 and 26: the addressed/broadcast envelope is now exposed in JSON; when the payload carries a recognised
(dac, fid)pair the same ASM fields are emitted as for messages 6 and 8. - Spec field renames in messages 1/2/3, 4/11, 9, 18, 19, 21: bits previously labelled
regional/reservedare now exposed under their M.1371-6 names (power,transmission_control,alt_sensor,aton_status, …). See the JSON reference for the per-message field list. - Type 23:
ship_typeis renamed toshiptypeand now includes ashiptype_textdescription, matching the convention used elsewhere. - New ASM decoder for DAC 366, FID 10 (IALA AtoN monitor; messages 6/8/26).
New ASM decoders¶
A range of widely deployed Application-Specific Messages is now expanded into structured JSON fields:
- IMO Circ.289 (DAC 1) — FID 17 (VTS-generated targets), FID 19 (marine traffic signal), FID 20 (berthing data / port operations), FID 22 (area notice, broadcast), FID 23 (area notice, addressed), FID 24 (extended ship static), FID 25 (dangerous cargo / IMDG), FID 28 (route addressed), FID 32 (tidal window).
- Inland AIS — CCNR VTT 1.2 (DAC 200) — FID 21 (ETA at lock/bridge/terminal), FID 22 (RTA at lock/bridge/terminal), FID 23 (EMMA safety warning), FID 24 (water level gauges, up to four stations), FID 40 (signal station status).
- Sweden STM (DAC 265, FID 1) — Sea Traffic Management route messages, with full waypoint reconstruction from the delta-encoded leg chain.
- Flag-state text telegrams — DAC 210 (Cyprus), 248 (Malta), 353 (Liberia) FID 0 now decode as text.
Inland AIS in the web viewer¶
- Inland ENI (European vessel ID number) is now part of ship static data, shown in the ship card and available as an optional sortable column in the ship table.
- Inland-specific FIDs (10/55) and the blue sign indicator are surfaced on the map and ship card.
- Ship-type details are now reachable from a click popover with the full ITU description, and ERI / inland ship-type tables are complete and labelled correctly.
Web viewer¶
- Box select on the map — drag a rectangle to show tracks for every vessel inside the area at once.
- Reset tracks from now map action — clear historical track points and start fresh from the current time without dropping the vessels themselves.
- GPS-derived station position is marked with a blue border and a tooltip so it is visually distinguishable from configured fixed positions.
- Type 24B transponder details (vendor, model, serial) are now surfaced in the ship card's tech details.
- Text telegrams (safety / broadcast text messages) are now displayed in the web viewer.
Community feed¶
- The community ship overlay has been replaced by a popup pane connected to aiscatcher.org/livemap with two-way view synchronisation (map pan/zoom is shared) and local-vessel push.
- The community-feed icon now indicates sharing state at a glance: red = off, orange = anonymous, green = sharing with UUID.
HTTP API¶
- Per-route CORS allow-origin flag, enabled by default on the
JSON,GeoJSON,KML, andmetricsendpoints so dashboards and external consumers can fetch directly from a browser. CSP also now allowshttp/wsschemes so LAN deployments work without a custom policy.
Input¶
- Lossless mode for file and TCP inputs.
-ga LOSSLESS on/off(FileRAW) and-gt LOSSLESS on/off(RTLTCP) control whether the input blocks or drops samples on overflow. Defaults preserve current behaviour: file replay is lossless (block), live TCP is lossy (drop). The current setting is shown in-voutput. - Simpler inline settings for input flags.
-t,-r,-x,-z,-i,-w, and-enow accept trailing key/value pairs after their positional arguments, so you can write-t HOST PORT lossless oninstead of having to repeat the device subletter via-gt. - New
sensitivity_highconfig option for SDR input selects the higher-sensitivity ("challenger") decoder model — useful when you want maximum decode rate and CPU headroom allows it.
Build and packaging¶
- New CMake option
-DWEBVIEWER=OFFproduces a headless build withoutWebDB/WebViewer/HTTPServer(~1.5 MB smaller binary). The-Nflag and theserverconfig key are gated when the webviewer is disabled. aiscat— Python bindings for the AIS-catcher NMEA decoder are now published on PyPI. The package exposes aDecoderwithdecode()/from_file/from_stdin/from_tcp/from_udphelpers, multiple output formats (dictionary,annotated,json,json_nmea,nmea,nmea_tag,binary), and ships pre-built wheels including armv7l and Windows ARM64. Free-threaded (3.13t / 3.14t) wheels are also published, plus an additional decoder speedup. See Tools → Python for details.
Version 0.68¶
Web Viewer¶
- Fixed vessel track polylines drifting ahead of the ship marker due to an incremental merge bug
- Incremental plane updates now support
?since=with timeout-based cleanup of stale aircraft - RainViewer refresh interval increased from 2 minutes to 10 minutes
- RainViewer updates pause while the browser tab is hidden
- Removed the clouds overlay layer
- Fixed sticky hover suppression after map moves
Data and API Fixes¶
- Fixed MMSI key corruption in path JSON
- Added support for
@filenameresponse files
Service and Packaging¶
- systemd unit no longer uses a
bash -csubshell
Version 0.67¶
New Features¶
HydraSDR Support¶
HydraSDR is now a supported input device. See the HydraSDR input page for details.
Duplicate Removal¶
When combining multiple input streams, overlapping reception can result in duplicate messages. To remove duplicates from output channels, use the unique option. For example, the following removes duplicates from both console and a UDP stream:
AIS-catcher -o 1 unique on -u 127.0.0.1 5012 unique on
In JSON, set the unique key to true (remove duplicates) or false (default). Note that this could come at a performance cost that increases with the number of MMSIs so keep an eye on that.
Downsampling Options¶
Two additional options, position_interval and own_interval, downsample position messages and VDO messages by limiting each MMSI to at most one update per specified interval (in seconds). Both default to 0 or, equivalent, false (disabled).
Example:
AIS-catcher -u 127.0.0.1 5012 position_interval 30
Alternatively, these options are available in the Visual Web Control interface:
Thanks to user Manny for suggesting these options.
Note: These options are intended for users aggregating across multiple receivers to reduce bandwidth, and have not been optimized for large vessel counts.
Serial Device Improvements¶
init_seqnow accepts multiple comma-separated commands- Fixed
init_seqissues on macOS (and Windows buffer flushing during init) - Serial devices supporting AIS-catcher format can now relay warning, info, and error messages through the program
- New
flowcontroloption (hardware/software/none) anddisable_xonoffswitch - Serial port opened in non-blocking mode to avoid DTR hang on some adapters
- New
dump_fileoption to save raw serial bytes for debugging - DC16H frame format support
Zones¶
Support for tailoring routing of messages from receivers to output channels via zones in JSON configuration and Visual Web Control.
Channel Designation (AB/CD)¶
Channel designation is now configurable via JSON config and is shown in model startup output of the Visual Web Control.
Microsecond Timestamps¶
rxuxtime field added to JSON_FULL output, providing microsecond-resolution receive timestamps. NMEA 4.0 tag-block timestamps now use microseconds where available.
Reboot Watchdog¶
A systemd OnFailure watchdog can automatically reboot the host if AIS-catcher stops repeatedly. Configurable burst/interval parameters with a 5-minute grace period after toggling, controlled via the install script.
Output and Configuration¶
- Receiver index is now included in output;
-vapplies to all receivers,-v+to the last one only webcontrol_httpoption for the webviewerssl_verifysetting on HTTP outputs to disable TLS certificate verification when needed- NMEA 4.0 tag blocks now include the group ID only for multi-line sentences
- Default
repeatfor message type 27 is now 3 - Aliases:
rssi/foforsignalpower/ppm;DESCfordescription - Internal settings unified to a key-based API with structured error reporting (
SetKey); legacy aliases kept for backward compatibility - Community feed restricted to local SDR hardware only
Web Viewer¶
Vessel Tracks — Major Overhaul¶
- Incremental (delta) loading: only new path points are fetched on each update
- Tracks capped at 250 points per vessel, consistent between "Show Track" and "Show All Tracks"
Multi-Receiver View¶
A new view in the webviewer lets users see and switch between multiple receivers from a single interface.
Realtime and UI Improvements¶
- Realtime NMEA tab now displays the shipname instead of just MMSI
- Station name passed via
plugins.jsfor immediate tab title display - Community feed gained a binary compact endpoint, sprite-sheet icons, and click-to-livemap
- Dark info panel, darker hover background, fixed truncated SVG flags
- Fixed RainViewer overlay (CORS and API path), MBTiles import, distance charts, "Show all tracks", strict-mode violations, missing planes sprite, ship-shape highlight stuck on hover
- Shrunk
favicon.icofrom 97 KB to 15 KB markedlibrary now bundled (no CDN runtime dependency)
Bug Fixes¶
- Signal level charts: fixed extreme values for UDP/TCP sources
- Static data refreshed correctly when a ship comes back into scope
- HTTP stats fixed under TLS
Performance¶
This release contains a substantial performance overhaul of the I/O hot path. Highlights:
- NMEA parser: zero-alloc split, SWAR scanning, bulk 6-bit decode, line-aware start detection — ~64% fewer instructions
- JSON parser: zero-copy tokenizer, hand-rolled number parsing, flat open-addressing hash table for key lookup, allocation-free steady-state parsing
- JSON Writer: replaces legacy
JSONBuilderand ad-hoc serializers with astd::string-backed writer; ~5–10% faster on-o 0/3/5/7 - AIS::Message: SWAR
getText/getUint, batched 6-bit payload decode (~7–10% faster on-o 5/nmea_refresh) - Lock-free output: thread-local screen buffers, atomic
ByteCounter, DB mutex released before downstreamSendcascade (dual-Nbenchmark: 9.05s → 6.03s) - POSIX
read()for stdin, single newline flush per message (replacing per-messagefflush)
Stability and Networking¶
- TCP: try all
addrinfoentries, connect timeout for blocking mode, guard repeated stop requests - WebSocket/MQTT: handshake fixes, Windows socket check, max frame drop,
PUBRELhandling, buffer-growth fix - Logger: fixed circular buffer and mutex issues
- GPS: fixed use-after-free and JSON memory issue, warn-once on bad data, scan limits
- Postgres/N2K: traffic monitoring extended, empty AIS messages handled, filter shadow fixed (settings now apply to the active filter)
- File input, hybrid config, NMEA RMC parsing, NMEA checksum in
-o 6, timer handling for non-frontend models (NMEA, N2K, ADSB, Export) - Backup writer wrapped in try/catch with additional diagnostics
- Compiler-warning cleanup across the tree; spellcheck CI added (
typos)
Packaging¶
- Debian packages now store HydraSDR and RTL-SDR libraries as DLLs in
/usr/lib/AIS-catcherinstead of statically linking - Switched to debhelper —
dh_shlibdepsauto-resolves correct dependencies per distro/arch - Fixed several
.debpackaging issues (libssl3/t64,ETXTBSY, emptyDependsfield) - Added CI install test covering the full platform matrix
- New Ubuntu ARM64 and ARMhf packages; RPM packages added; Fedora dropped
- Frontend libraries bundled via npm/Vite — no CDN dependencies at runtime. Webassets repo is archived
- Modular CMake dependency management — individual scripts per library
- Install script: parallelized builds, non-root install option, hardened reboot handling, removed Docker support for i386/armel
- Copyright extended to 2026
Version 0.66¶
- Improve documentation for configuration via JSON
- Fix chart colors when running web viewer in iframe on Firefox
- Technical details of equipment added to shipcard (press information icon in sender field)
- CS unit for class B is displayed in shipcard of the web viewer if available
- Serial devices can be initialized with an init sequence
- Remodelling of realtime NMEA tab with options to filter on MMSI and share NMEA lines with decoder tab for message parsing
- Option to track NMEA in webviewer for a specific ship or station
- Shortcut to measure distance between two objects or points is now SHIFT-CLICK to select the first point. This should improve behaviour for devices that cannot distinguish between a left and right mouse click.
Version 0.64 - 0.65¶
Various updates to improve stability, security and minor bug fixes.
Version 0.63¶
Enhanced Features¶
- NMEA 4.0 Tag Blocks: support for NMEA tag blocks (
msgformat nmea_tagfor networking or-o 7for screen).
Version 0.63¶
Enhanced Features¶
- Data throughput: significant reduction in data throughput to community hub
- Online NMEA decoder: Built-in NMEA decoder in the local webviewer
- Kiosk Mode: Full-screen display mode for dedicated monitoring setups
- MSGFORMAT Configuration: Flexible output format definitions for customized data presentation. Introduction of msgformat binary_nmea to save on bandwidth
- Extended Binary Messages: Additional binary message types now decoded and displayed
- Verbose JSON Output (
-o 6): Enhanced JSON format with detailed field descriptions (WIP) - Debian Trixie Support: Compatibility with Debian 13 (Trixie)
- Filesystem-based Map Tiles:
# Serve map tiles from filesystem AIS-catcher -N 8100 FSTILES /path/to/tiles # Filesystem overlay maps AIS-catcher -N 8100 FSOVERLAY /path/to/overlay
For complete edge changes, see the commit history.
Version 0.62¶
ADSB Integration¶
Connect to ADSB feeds to visualize aircraft alongside vessels:
# Beast format
AIS-catcher -t beast localhost 30003 -N 8100
# BaseStation format
AIS-catcher -t basestation localhost 30002 -N 8100
Binary Message Decoding¶
The WebViewer now decodes and displays regional binary AIS messages (availability varies by location).
Offline Mapping¶
# MBTiles format support
AIS-catcher -N 8100 MBTILES map.mbtiles
# Or as overlay
AIS-catcher -N 8100 MBOVERLAY map.mbtiles
RTL-SDR V4 Support¶
Debian packages now include statically-linked RTL-SDR library with V4 dongle support.
AIS-catcher for Android¶
- Auto-start decoding when USB device connects
- Built-in webviewer on configurable port
Version 0.61¶
MQTT Integration¶
# Publish messages
AIS-catcher -Q mqtt://127.0.0.1:1883
AIS-catcher -Q wsmqtt://127.0.0.1:1883
AIS-catcher -Q mqtt://127.0.0.1:1883 admin MSGFORMAT JSON_FULL TOPIC data/ais
AIS-catcher -Q mqtt://username:password@127.0.0.1:1883 admin CLIENT aiscatcher
# Subscribe to messages
AIS-catcher -t mqtt://username:password@127.0.0.1:1883
Protocol Expansion¶
- WebSocket text transmission (
ws://) - SDR data streaming (
sdr://) - Text over TCP (
txt://) - GPSD integration (
gpsd://) - RTL_TCP support (
rtltcp://) - Raw IQ data (
tcp://)
Web Viewer Improvements¶
- Map-first default view
- Enhanced color palette
- Draggable ship information cards
- Context-aware card positioning
- Configurable vessel track display (on hover/selection)
Configuration¶
- NMEA2000 settings in JSON configuration
- System daemon auto-restart (10s interval)