Skip to main content

obd-tui
obd-tui

Terminal dashboard for real-time OBD-II vehicle diagnostics.

CI Codecov PyPI License: MIT Python uv

obd-tui turns any ELM327-compatible OBD-II adapter into a live terminal dashboard. It auto-detects the adapter on the serial bus, asks the vehicle which commands it actually supports, and streams the readings into a tabbed Textual UI - engine, turbo/air, EGR, diagnostics, fault codes, and the full PID catalogue.

The engine panel of obd-tui

No adapter at hand? obd-tui --demo runs the whole dashboard against a simulated vehicle.

Documentation

The project site is published from main to GitHub Pages: https://goabonga.github.io/obd-tui/.

Requirements

  • Python 3.11+
  • An ELM327-compatible OBD-II adapter on a serial port (USB or Bluetooth RFCOMM)
  • uv for development

Install

pip install obd-tui      # or: uvx obd-tui

On Ubuntu 24.04 LTS and 26.04 LTS, from the PPA:

sudo add-apt-repository ppa:goabonga/obd-tui
sudo apt install obd-tui

Usage

obd-tui                       # launch the dashboard
obd-tui --port /dev/ttyUSB0   # skip auto-detection and connect at once
obd-tui --demo                # simulated vehicle, no hardware needed
obd-tui --record drive.jsonl  # log every sweep as JSON Lines
obd-tui --units imperial      # °F, mph, psi
obd-tui --version

Keys: c connect · d disconnect · 1–7 panels · p PID catalogue · x clear DTCs · e engine · r report · q quit. Panels taller than the window scroll with the wheel, the arrows or PgUp/PgDn.

Features

  • Demo mode - --demo drives the dashboard from a simulated vehicle, so the UI can be tried, screenshotted and tested with nothing plugged in.
  • Trends - RPM, coolant and MAF are charted above the engine readings from a five-minute rolling history.
  • Recording - --record FILE appends every sweep to a JSON Lines file, flushed as it goes, ready for jq or pandas.
  • Adapter auto-detection - scans serial ports for known OBD-II adapters (vLinker / FTDI 0403:6015, and any port whose product or manufacturer string looks like an OBD adapter), falls back to bound Bluetooth RFCOMM nodes, and takes --port to override.
  • Metric or imperial - --units imperial for °F, mph and psi; only the display changes, recordings stay in the units the vehicle reports.
  • Configuration file - port, units, sweep period and reconnect interval in ~/.config/obd-tui/config.toml, overridden by the command line.
  • Clear DTCs - x sends mode 04 after a confirmation dialog spelling out what it resets, then reads the codes back.
  • Adaptive polling - readings are swept at three cadences, and whatever the open panel shows is read every sweep. A vehicle that stops answering is detected and the session drops to LINK LOST instead of hanging.
  • Capability discovery - queries the vehicle for its supported commands across modes 01–09 plus the ELM adapter commands, so panels only show data the ECU can actually produce.
  • Tabbed dashboard - Engine, Turbo/Air, EGR, Diagnostics, Faults, Exhaust, DPF and the PID catalogue, refreshed once per second while connected.
  • Exhaust gas temperatures - every bank and sensor the vehicle answers, from PIDs 0x78 and 0x79, which python-obd does not define; a sensor far from the others is pointed out, for chasing codes like P2033. Capabilities resolve standard first, then through a manufacturer profile, so a make never leaks into the panels.
  • Diesel particulate filter - differential pressure, temperatures and regeneration status from the standard PIDs 0x7A, 0x7C and 0x8B, the soot load from a manufacturer profile when one exposes it, and derived rows - restriction per unit of air flow, time since the last regeneration - marked as such. Described, never judged: elevated, not clogged.
  • Manufacturer profiles - recognised from the VIN, bound to the engine you declare with --engine or pick with e, answering only what the standard cannot and only for engines they have a cited table for. Suzuki's is empty so far.
  • Reports - r saves everything the session knows, dated to the second: the vehicle as recognised, the codes, every panel as it stands, the supported commands, the latest readings and their recent history, as Markdown to read and JSON to keep.
  • Reconnects on its own - a missing adapter, a port that refused to open or a vehicle that went quiet is retried every few seconds, until d says the link is to stay down.
  • Live connection status in the footer: state, port, and adapter VID:PID.
  • Tabs stay disabled until a device is connected, and disable again on disconnect.

Getting started (development)

git clone https://github.com/goabonga/obd-tui.git
cd obd-tui
uv sync
uv run pre-commit install
uv run ruff check src tests
uv run mypy src
uv run pytest

Versioning and release

Versions are bumped from Conventional Commits by multicz. On every push to main, CI computes the bump, writes the changelog, tags, and publishes the wheel to PyPI through Trusted Publishing. Maintainers do not bump versions or edit the changelog by hand.

Stability and deprecation policy

obd-tui follows Semantic Versioning and the standard Python n + 2 deprecation cadence (announce + warn in one release, remove in the release after the next). Full policy: docs/stability.md.

Contributing

See CONTRIBUTING.md for the workflow, the commit-message convention, and the test/lint expectations. By participating you agree to the Code of Conduct.

Security issues: please follow the disclosure process in SECURITY.md.

License

Distributed under the MIT License.

Metadata

Release files for obd-tui 0.5.1

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

Source distribution (sdist)

Source distribution for obd-tui 0.5.1
File Size Uploaded
obd_tui-0.5.1.tar.gz 275.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for obd-tui 0.5.1
File Interpreter ABI Platform
obd_tui-0.5.1-py3-none-any.whl Python 3 none any Details

Total release size: 361.0 kB

Release files / obd_tui-0.5.1.tar.gz

Download URL obd_tui-0.5.1.tar.gz
Size 275.5 kB
Tags Source
SHA-256 checksum
How to use checksums
0d7f8732aab05ad458574ee47e6467c41ae7b5a19bfa38ba4f7623ecd8b1962f
BLAKE2b-256 checksum
How to use checksums
266fbc287e666d1219927c7a944123ab6ef3769cae87352f78b8f8a23cbb5ff8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Sep 10, 2026.

Transparency log

Release files / obd_tui-0.5.1-py3-none-any.whl

Download URL obd_tui-0.5.1-py3-none-any.whl
Size 85.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
87a8f3bf605d0bd6e3c369c9226d6feb58f6a7e5a1db3c98f075f7c83c6fe75a
BLAKE2b-256 checksum
How to use checksums
37d05a3f4f930483bb21924bff54063d860d690ae39e8bb73657175bba85490b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Sep 10, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.5.1 This release

2 release files

0.5.0

2 release files

0.4.0

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

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