Skip to main content

pgntui

Cross-platform TUI for NMEA 2000 with canboat decoding.

Read live N2K frames through pluggable drivers, decode them with the canboat PGN database, and route values into JSON-defined dashboards. Record sessions to .pgnlog and replay them later — no boat required.

pgntui dashboard

Expand any signal ([+]) to reveal its sparkline; set the sparkline height from the Settings menu, and browse/play recordings from File → Open recording.

Settings menu Open recording
Settings menu Open recording

Install

The easiest path is pipx:

pipx install pgntui

Don't have pipx? Install it with pip, then make sure it is on PATH:

python -m pip install --user pipx
python -m pipx ensurepath

Open a new terminal afterwards so the PATH change takes effect. On Debian/Ubuntu you can use sudo apt install pipx instead, and on macOS brew install pipx.

If your system Python is older than 3.11, point pipx at a newer interpreter:

pipx install --python python3.12 pgntui

Or run in a project venv:

python3 -m venv .venv && . .venv/bin/activate
pip install pgntui

Standalone single-file binaries for macOS (arm64, x86_64), Linux (x86_64) and Windows (x86_64) are attached to each GitHub release.

Quickstart

Scaffold the example workspace and launch:

pgntui --example      # writes the example workspace at the OS default location
pgntui                # opens the TUI; no driver yet, debug tab will be empty

Replay a recording:

pgntui replay path/to/session.pgnlog

Run with a real driver — pgntui picks the driver named in config.toml:

pgntui                # uses driver.name from <workspace>/config.toml

Workspace layout

pgntui reads everything from a workspace directory. By default the location follows platformdirs.user_config_dir("pgntui"):

OS Default workspace
Linux ~/.config/pgntui
macOS ~/Library/Application Support/pgntui
Windows %LOCALAPPDATA%\pgntui\pgntui

(On Windows platformdirs nests <appauthor>\<appname>, so the path segment pgntui appears twice — e.g. C:\Users\you\AppData\Local\pgntui\pgntui.)

Override with --workspace <path> on the command line.

Layout:

<workspace>/
  config.toml            # driver + theme + paths
  signals/*.json         # signal definitions (PGN -> field -> widget)
  containers/*.json      # dashboard layouts (tab -> grid of signals)
  recordings/            # .pgnlog files written by the R hotkey
  logs/                  # CSV exports

Run pgntui --example to drop a working sample inside this directory.

JSON library

library/ in the repo ships ready-made signal + container sets for one tab per NMEA Simulator page — GPS, Environmental, Boat, Batteries, Engine (main / status / transmission), Tanks, Binary, DC and Charge, AC, Windlass, Thruster. Copy the pages you want into your workspace:

cp library/gps/signals/*.json      <workspace>/signals/
cp library/gps/containers/*.json   <workspace>/containers/

See library/README.md for the page list and unit conventions.

Drivers

Built-in driver entry points (pgntui.drivers):

  • actisense-ngt1 — Actisense NGT-1 USB serial gateway (pyserial)
  • file-replay — replay an Actisense .pgnlog capture

Pick one in config.toml:

[driver]
name = "actisense-ngt1"
port = "/dev/tty.usbserial-XXXX"   # macOS / Linux
# port = "COM4"                    # Windows
baud = 115200

Third-party drivers can register additional entry points under the pgntui.drivers group.

Actisense NGT-1

The NGT-1 is a USB↔NMEA 2000 gateway. The easiest path is the in-app Connection menu — run pgntui, press C (or click Connection in the title bar), pick the port and speed, and press Test to confirm it's receiving. Save writes the choice to config.toml; Connect goes live without a restart.

Prefer the command line? Find the port and test it there:

pgntui --list-ports          # list serial ports
pgntui probe --port COM4     # 2-second connection test + verdict

Then set driver.name = "actisense-ngt1" and driver.port in config.toml (COM4 on Windows, /dev/ttyUSB0 on Linux, /dev/tty.usbserial-XXXX on macOS) and run pgntui — incoming PGNs scroll on the Debug tab and feed the dashboards. The driver speaks the Actisense BST serial protocol (DLE STXDLE ETX framing, 0x93 receive / 0x94 send). Writes (analog_out/digital_out) additionally need --enable-write and app.write_enabled = true.

Signal types

Signal JSON files declare how each PGN field renders:

  • analog_in — gauge / numeric readout (RPM, speed, depth, temperature)
  • digital_in — boolean lamp (alarm, anchor light, bilge pump state)
  • analog_out — write-back analog control (sends an outbound frame)
  • digital_out — write-back toggle (sends an outbound frame)

analog_out and digital_out need --enable-write on the CLI and app.write_enabled = true in config.toml; otherwise they render as read-only.

Themes

Six builtins ship in the wheel:

  • dark (default)
  • light
  • amber-crt
  • green-phosphor
  • mono-ascii
  • rainbow-disco

Custom themes are JSON files referenced from config.toml:

[app]
theme = "dark"

Replay

Replay an Actisense-format .pgnlog:

pgntui replay capture.pgnlog

The replay driver respects the original frame spacing. Press the R hotkey inside the TUI to start/stop recording the live stream to a new .pgnlog file under <workspace>/recordings/.

Hotkeys

Tab / Shift+Tab     next / previous container tab
D                   jump to Debug tab
R                   start / stop recording
C                   open the Connection menu (NGT-1 port / speed / test)
A                   show the About dialog
Q / Ctrl+Q          quit immediately
?                   show help line in status bar

Layout sketch

+---------------------------------------------------+
|  pgntui                                           |
+---------------------------------------------------+
| [Main] [Engine] [Nav] [Debug]                     |
+---------------------------------------------------+
|  RPM     1450    Speed   6.8 kn   Depth 12.3 m    |
|  +----+         +----+           +----+           |
|  |####|         |##  |           |#   |           |
|  +----+         +----+           +----+           |
|                                                   |
|  Bilge OFF     Anchor Light ON                    |
+---------------------------------------------------+
| [Tab] Next  [D] Debug  [R] Rec  [Q] Quit          |
| status: idle                                      |
+---------------------------------------------------+

Status

Early days — expect rough edges. Solid enough to use for real on a boat whose NMEA 2000 network you already trust, or on a test-bench setup.

  • Works: TUI shell, canboat decoder, signal routing, file replay, Actisense NGT-1 driver (read), recording.
  • Partial: NGT-1 write-back is wired but field-tested only against a tiny PGN subset.
  • Not yet: TwoCAN / Yacht Devices native drivers, more layout primitives, per-signal alarm thresholds in the UI.

Bug reports and patches welcome — file an issue at https://github.com/phobicdotno/pgntui/issues.

License

MIT. See LICENSE.

Links

Release files for pgntui 0.6.38

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pgntui 0.6.38
File Size Uploaded
pgntui-0.6.38.tar.gz 558.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pgntui 0.6.38
File Interpreter ABI Platform
pgntui-0.6.38-py3-none-any.whl Python 3 none any Details

Total release size:791.9 kB

Release files / pgntui-0.6.38.tar.gz

Download URL pgntui-0.6.38.tar.gz
Size 558.0 kB
Tags Source
SHA-256 checksum
How to use checksums
aa57dbca03d52e14c5fa7d991458e866b6975921d8f722cf7a055bdfcff15666
BLAKE2b-256 checksum
How to use checksums
39ad84987ca00bf91854867f5c0ef05ad440daeb41a1d78e6e783acab5d652bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.

Transparency log

Release files / pgntui-0.6.38-py3-none-any.whl

Download URL pgntui-0.6.38-py3-none-any.whl
Size 233.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
743eaeee29cab3a40b3851451dde9848fa9a87ad5c7c3a897cf79e35d55b18c5
BLAKE2b-256 checksum
How to use checksums
e080b450fd19acd7d85d17dfe863343e1cbac9fe2a0531825553915ece84844a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.38 This release

2 release files

0.6.37

2 release files

0.6.36

2 release files

0.6.35

2 release files

0.6.34

2 release files

0.6.9

2 release files

0.6.8

2 release files

0.6.7

2 release files

0.6.6

2 release files

0.6.5

2 release files

0.6.4

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.3.9

2 release files

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page