OCTAVE Wiki
Guides and reference for the Open-source Cross-platform Telematics for Augmented Vehicle Experience. Learn how to use, build, and extend OCTAVE, with details for the C++ backend and the QML frontend.
What is OCTAVE?
OCTAVE is an open-source (GPLv3) car head unit / infotainment system you run on your own hardware. It pairs a C++ / Qt 6 backend — the shipped binary on every platform — with a QML frontend. It plays local music, reads live data from the car over OBD-II, mirrors an Android phone over USB or Wi-Fi, shows a live 3D model of the vehicle from an IMU, and recolours its interface to match the album art. It runs on Windows, macOS, Linux, Raspberry Pi / Orange Pi class boards, and Android (iOS is planned but not built yet).
Until October 2026 OCTAVE also had a Python / PySide6 backend. It is frozen on the
python-final branch,
which carries its own wiki describing that backend as it stood.
The typical installation is a single-board computer behind the dash, a touchscreen, a power source and a 3D-printed mount (the author daily-drives it in a 2003 Jeep TJ on an Orange Pi 5 Plus with a 10.1-inch 1280×800 touchscreen). Development and testing can happen on any desktop OS.
This reference describes the checked-out source and its build workflow. Released packages can differ, and optional hardware or Qt modules affect feature availability. Platform differences are called out in the detailed pages.
Core Features
Platform Support
| Platform | Status | Shipped artefact | Notes |
|---|---|---|---|
| Linux (Debian/Ubuntu/Arch/Fedora) | Build target | OCTAVE-<v>-linux-x86_64.AppImage |
Primary development target. I²C hardware needs an accessible bus; Android Auto has capture limitations. |
| Raspberry Pi / Orange Pi (Linux aarch64) | Build target | OCTAVE-<v>-linux-aarch64.AppImage |
The in-vehicle target. I²C sensors and the ESP32 knob supported. Google ships no aarch64 adb, so the distro adb is used for phone mirroring. |
| Windows 10+ | Build target | OCTAVE-<v>-windows-x86_64.exe (Inno Setup) |
I²C hardware (BerryIMU, gesture sensor) is unavailable. DHU window discovery is not implemented. |
| macOS (Intel and Apple Silicon) | Build target | OCTAVE-<v>-macos.dmg |
I²C hardware is unavailable and DHU window discovery is not implemented. CI builds on macOS 14 against Qt 6.7.3; verify the bundle frontend layout before distribution. |
| Android (arm64-v8a, Android 11+) | Sideload | OCTAVE-<v>-android-arm64-v8a.apk |
Local media, OBD over BLE, dashboards, IMU view from the device's own sensors. Phone mirror, Android Auto, ESP32 and I²C sensors are excluded. The workflow uses a persistent release signing key when its secrets are available; builds without those secrets use a temporary key and cannot update a differently signed install. |
| iOS | Planned, not built | — | No CMake toolchain wiring and no CI job yet (see BUILD.md, "iOS build"). |
Wiki Sections
Getting Started
- Installation & First Run — Pre-built binaries, building from source, requirements, directory layout
- Architecture Overview — C++ backend and QML frontend, manager pattern, startup order, threading, volume, video paths, logging, design decisions
Backend Deep Dives
- Settings Manager — Central settings store, property system, coalesced JSON persistence
- Media Manager — Local audio playback, library scanning, album art and colours
- OBD Manager — ELM327 protocol, supported parameters, threaded worker, Android BLE, black box trip recorder
- Network Manager — WiFi status, update checking, self-update
- Hardware Managers — ESP32 knob, BerryIMU, gesture sensor
- Phone Mirror & Android Auto — Built-in scrcpy-protocol client, the forked phone server, bundled adb, DHU
- Audio Analyzer — FFT waveform visualisation
- Utilities — Clock, logging and crash handlers, DiagnosticsManager, UI watchdog, VolumeController, performance monitor, command server
Frontend Deep Dives
- Frontend Overview — QML architecture, Main.qml, page routing
- Pages & Views — Every page in the application, including the 3D CarMenu
- Bottom Bar — Navigation and volume control
- Theme System — Dynamic theming, design tokens
- Settings UI — Settings framework, layout engines, components
- Components — Reusable QML components
- Gauges & Dashboards — Gauge primitives, JSON dashboards, the in-app editor
Reference & Guides
- Settings Reference — Defaults, persisted keys, and platform differences
- Signals & Slots API — Every manager's QML-accessible API
- Writing a Frontend — Drive OCTAVE from your own screen, phone, script or web page over the service API
- Service API Reference — Generated from the C++: every object a frontend can drive, its types, and the parameter catalog
- Hardware Setup — Wiring, firmware, 3D printed mounts
- Building & CI/CD — CMake targets, AppImage / DMG / EXE / APK packaging, GitHub Actions
- Development — Dev mode, mock data, MCP server, profiling, screenshots
- Troubleshooting — Common issues, log locations, debugging
Tech Stack
| Component | Implementation |
|---|---|
| Language / toolchain | C++17, Qt 6.7.3, CMake 3.21+ (Ninja recommended) |
| Frontend | QML (Qt Quick, Qt Quick Controls "Basic" style, Qt5Compat.GraphicalEffects, QtQuick.Effects, Qt Quick 3D for the vehicle view) loaded from frontend/ at runtime |
| Audio playback / tags | QMediaPlayer + TagLib |
| Waveform FFT | QAudioDecoder + in-house radix-2 FFT on QtConcurrent |
| OBD-II | QSerialPort + own ELM327 protocol (elm327protocol.cpp); Android: native BluetoothGatt via JNI (OctaveOBDBridge.java) |
| I²C sensors | /dev/i2c-N + ioctl; Android: QtSensors (accelerometer, compass, pressure) |
| ESP32 serial | QSerialPort |
| Phone mirror | QTcpSocket + libavcodec (FFmpeg, optional at build) → QVideoSink; QAudioSink |
| Phone side | phone_server/ — OCTAVE's fork of the scrcpy server (v3.3.4, Apache-2.0), prebuilt jar in tools/phone-server/; bundled Google platform-tools (adb) |
| Logging | QLoggingCategory + src/util/logger.cpp rotating files, signal crash handlers |
| Tests | QtTest suite in tests/cpp/, run by ctest |
| Build & CI | GitHub Actions: compile check, QtTest suite and qmllint on every push; Windows / macOS / Linux x86_64 / Linux aarch64 / Android on tags |