Open-source Linux driver and tools for Universal Audio Apollo Thunderbolt and USB interfaces
Open Apollo brings Linux support to Universal Audio's Apollo audio interfaces. Built through clean-room reverse engineering, this community-driven project provides a native kernel driver for Thunderbolt models and a pure-userspace stack for USB models, along with a mixer daemon and system tray indicator.
⚠️ Experimental — This project is under active development and not yet ready for production use. Expect rough edges, kernel stability issues on some configurations, and incomplete features. We're shipping early to get community feedback and testing across different Apollo models.
- Full duplex audio — 4 analog inputs + 6 analog outputs verified (24/22 total ALSA channels exposed; S/PDIF, ADAT, and virtual channels are unverified)
- All sample rates — 44.1, 48, 88.2, 96, 176.4, 192 kHz
- Preamp control — gain, 48V phantom power, PAD, low cut, phase invert, mic/line switching
- Monitor control — volume, mute, dim, mono, talkback, headphone routing
- DSP mixer — input faders, pan, sends (AUX1/AUX2, CUE1/CUE2), solo, mute
- PipeWire virtual I/O — named Mic 1-4, Line In 3+4, Monitor L/R, Line Out devices
- Desktop audio — YouTube, system sounds, GNOME volume control all work through Apollo Monitor
- WebRTC capture — clean audio in Chromium-based browsers (webcam mic tests, Discord web)
- pw-record/pw-play — zero-dropout capture and playback verified
- Guided installer —
sudo bash scripts/install.shwith hardware validation gates + audio test - System tray indicator — real-time hardware status
Confirmed working on Ubuntu Studio 24.04 / Intel Tiger Lake-H by contributor @stoneiboyz-sys:
- 6ch playback — S32_LE 48kHz, confirmed on Ubuntu Studio 24.04 (Intel) and CachyOS (AMD)
- 10ch capture — confirmed working; one-shot
usb-full-init.py(38 packets, includes DSP program load), thenmodprobe snd_usb_audio - PipeWire capture — mic input working end-to-end; Discord voice calls,
pw-record, browser tabs confirmed - Hardware monitoring — mic → headphones simultaneous with active PipeWire streams
- Preamp control — gain, 48V phantom power, mic/line switching via vendor control
- Monitor control — level, mute, mono
- PipeWire playback — browser audio, system audio, DAWs all work
- Patched snd-usb-audio — four out-of-tree patches (fixed-rate quirk, implicit feedback skip, endpoint compat bypass, IFACE_SKIP_CLOSE)
- Automatic init via udev — firmware upload + full DSP init on device plug-in; no daemon required
| Issue | Status | Notes |
|---|---|---|
| Full init crash at packet 28 | Known | Some firmware builds crash on IIR biquad SRAM write (address mismatch); observed on CachyOS/AMD (@ariahello) with a different Cauldron build. Playback still works |
| Intel xHCI EP6 flood | Resolved | One-shot usb-full-init.py stabilizes device; EP6 drain daemon removed from stack |
| PipeWire capture zeros | Fixed | Resolved by QUIRK_FLAG_IFACE_SKIP_CLOSE patch (quirks.c, patch 4) — prevents snd-usb-audio from resetting Interface 3 on stream close |
| DSP init ordering | Documented | usb-full-init.py runs before modprobe snd_usb_audio; reversed from previous documentation |
{% callout type="note" %}
USB support uses sudo bash scripts/install-usb.sh. See USB Quick Start below.
{% /callout %}
| Issue | Severity | Workaround |
|---|---|---|
Firefox Snap crashes — kernel hrtimer lockup when using WebRTC capture |
Critical | Use Chromium or Firefox .deb instead of Snap |
| Raw pro-audio node crash — apps selecting "Apollo x4 Pro" (22ch) as input can hang the system | Critical | Default source is set to Mic 1; avoid selecting the raw multichannel device |
| WebRTC capture pitch drift — brief pitch wobble (~1-3s) when browser capture starts; stabilizes automatically. This is normal PipeWire DLL lock-in behavior affecting all pro-audio interfaces through the PulseAudio bridge. | Minor | Normal — wait for it to stabilize. Native PipeWire apps (pw-record, Ardour, OBS) have zero drift. |
| Apollo hot-unplug — powering off Apollo while driver is loaded | Fixed | Shutdown guards prevent crash; system stays stable (#22) |
| Ardour JACK routing — Ardour via JACK can steal ALSA device from PipeWire | Moderate | Launch with pw-jack ardour7; restart PipeWire if audio stops |
| Audacity ALSA-only — Ubuntu's Audacity package lacks PipeWire backend | Minor | Install Audacity via Flatpak for PipeWire support |
| GNOME Sound Settings — input level meter may not show activity | Cosmetic | Audio works; meter is a GNOME UI limitation with pro-audio devices |
| Warm reboot requires Apollo power cycle — rebooting Linux while Apollo stays powered leaves firmware in a stale state; audio won't work until Apollo is power-cycled | Moderate | After reboot: turn Apollo off, wait 5s, turn back on. Hot-replug auto-recovers within ~7s. Cold boot (Apollo powered on after Linux) works without issues. |
| App | Status | Notes |
|---|---|---|
| Chromium / Chrome | Verified | Recommended browser for WebRTC capture |
| Firefox .deb | Untested | Should work; Snap version crashes (see Known Issues) |
| Discord .deb | Verified (USB) | Voice calls with mic input confirmed on Apollo Solo USB (Ubuntu Studio 24.04) |
| OBS Studio | Untested | Should work natively with PipeWire |
| Ardour | Partial | Use pw-jack ardour7; don't let it grab ALSA directly |
| Audacity | Partial | Flatpak version only (Ubuntu .deb lacks PipeWire backend) |
| pw-record / pw-play | Verified | Zero-drift, cleanest capture path |
| REAPER | Untested | Expected to work via pw-jack |
Recommendation: Use Chromium-based browsers for WebRTC. Use native PipeWire apps (pw-record, Ardour, OBS) for studio-quality recording with zero clock drift.
Virtual/monitor loopback, console UI, multi-device support, plugin chain (UAD plugins require PACE licensing — not planned)
| Device | Status |
|---|---|
| Apollo x4 | Partially Verified — analog I/O (Mic 1-4, Monitor, Line Out), preamps, gain, DSP settings. S/PDIF, ADAT, virtual channels untested. |
| Apollo x4 Gen 2 | Needs Testing |
| Apollo x6 / Gen 2 | Needs Testing |
| Apollo x8 / Gen 2 | Needs Testing |
| Apollo x8p / Gen 2 | Needs Testing |
| Apollo x16 / Gen 2 | Needs Testing |
| Apollo x16D | Needs Testing |
| Apollo Twin X / Gen 2 | Needs Testing |
| Apollo Solo (Thunderbolt) | Needs Testing |
| Apollo 8P (original) | Needs Testing |
| Arrow | Needs Testing |
All Thunderbolt Apollo models share the same register map and protocol — the driver includes device detection and channel configuration for every model listed above. We need community testers to verify each one.
| Device | Status |
|---|---|
| Apollo Solo USB | Verified — USB, playback + capture, preamp control, PipeWire integration |
| Apollo Twin USB | Needs Testing |
| Apollo Twin X USB | Needs Testing |
Older Apollo models with Thunderbolt 2 connections (Apollo Twin, Apollo 8, Apollo 16, Apollo Duo, Apollo Quad) are not expected to work, even with an Apple Thunderbolt 2 → 3 adapter.
The issue is not the driver — it's that Linux does not enumerate Thunderbolt 2 PCIe devices in most configurations. The Apollo will not appear in lspci output, so the driver has nothing to bind to. This has been confirmed by a community member testing an Apollo Twin (TB2) with an Apple adapter on a Linux laptop with Thunderbolt 3 ports — the install completed successfully but the device was never detected.
If your Apollo uses a Thunderbolt 2 connector (Mini DisplayPort-shaped, not USB-C), you will likely hit this limitation. This project targets Thunderbolt 3/4 Apollo models (USB-C connector) on systems with native Thunderbolt 3 or 4 ports.
- Ubuntu 24.04+, Fedora 40+, Arch, openSUSE Tumbleweed, Linux Mint 22, Pop!_OS 24.04, Manjaro
- Linux kernel 6.8+ with headers installed (required — uses
hrtimer_types.hintroduced in 6.8) - Thunderbolt 3 or 4 connection (see Thunderbolt 2 note below)
- GCC, Make
- Python 3.10+ (for mixer daemon)
iommu=ptkernel parameter required on most systems (see below)
git clone https://github.com/rolotrealanis98/open-apollo.git
cd open-apollo
sudo bash scripts/install.shThe installer is a guided walkthrough that:
- Installs dependencies, builds the driver, sets up DKMS
- Deploys PipeWire/WirePlumber/UCM2 configs
- Guides you through an Apollo power cycle for clean Thunderbolt initialization
- Loads the driver, verifies DSP handshake, sets up virtual I/O devices
- Starts the mixer daemon and tray indicator
- Plays a test tone so you can verify audio output
Add to your flake.nix inputs:
inputs.open-apollo.url = "github:rolotrealanis98/open-apollo";Then in your configuration.nix:
imports = [ inputs.open-apollo.nixosModules.default ];
hardware.ua-apollo.enable = true;Run nixos-rebuild switch — the module handles the kernel module build, iommu=pt, Thunderbolt (bolt), PipeWire, and required packages.
sudo bash scripts/uninstall.shRemoves driver, DKMS, all configs, services, and guides you through Apollo power-off for clean module unload.
If audio stops working after using a JACK app (Ardour, etc):
systemctl --user restart pipewire wireplumber pipewire-pulse
apollo-setup-ioAfter running apollo-setup-io, these devices are available in PipeWire:
| Device | Type | Channels |
|---|---|---|
| Apollo Mic 1 | Source (capture) | Mono |
| Apollo Mic 2 | Source (capture) | Mono |
| Apollo Mic 1+2 | Source (capture) | Stereo |
| Apollo Mic 3 | Source (capture) | Mono |
| Apollo Mic 4 | Source (capture) | Mono |
| Apollo Line In 3+4 | Source (capture) | Stereo |
| Apollo Monitor L/R | Sink (playback) | Stereo |
| Apollo Line Out 1+2 | Sink (playback) | Stereo |
| Apollo Line Out 3+4 | Sink (playback) | Stereo |
git clone https://github.com/rolotrealanis98/open-apollo.git
cd open-apollo
sudo bash scripts/install-usb.shThe installer handles dependencies, firmware setup, kernel module build, DSP initialization, and PipeWire configuration. You'll need the Apollo firmware file from UA's website — the installer will prompt you if it's missing.
After install, the following PipeWire devices are available:
| Device | Type | Channels |
|---|---|---|
| Apollo Solo USB Mic 1 | Source (capture) | Mono |
| Apollo Solo USB Mic 2 | Source (capture) | Mono |
| Apollo Solo USB Mic 1+2 | Source (capture) | Stereo |
| Apollo Solo USB Monitor | Sink (playback) | Stereo |
| Apollo Solo USB Headphone | Sink (playback) | Stereo |
cd mixer-engine
python3 ua_mixer_daemon.py -vThe daemon exposes TCP:4710, TCP:4720, and WS:4721 for mixer control from any client application.
┌──────────────┐ ┌──────────────┐
│ Control App │ │ Control App │
│ (TCP:4710) │ │ (TCP:4720) │
└──────┬───────┘ └──────┬───────┘
│ │
└────────┬─────────┘
│
┌────────▼────────┐
│ Mixer Daemon │
│ (Python) │
└────────┬────────┘
│ ioctl
┌────────▼────────┐
│ Kernel Driver │
│ (ua_apollo.ko) │
└────────┬────────┘
│ MMIO
┌────────▼────────┐
│ Apollo Hardware │
│ (BAR0 regs) │
└─────────────────┘
| Component | Path | Description |
|---|---|---|
| Driver | driver/ |
Linux PCIe kernel module — DMA, ALSA, DSP ring buffer, preamp control |
| Mixer Daemon | mixer-engine/ |
TCP:4710 + TCP:4720 + WS:4721 daemon — state tree, hardware routing, metering |
| Configs | configs/ |
PipeWire, WirePlumber, and UCM2 configuration profiles |
| Tools | tools/contribute/ |
Device probe and capture scripts for community contributions |
Full documentation at open-apollo-docs.pages.dev, including:
- Installation guide — build, install, configure
- Supported devices — model compatibility table
- Architecture overview — how the pieces fit together
- Register map — BAR0 hardware register documentation
- DSP protocol — ring buffer commands and settings batch protocol
- How to contribute — testing, device captures, code contributions
Documentation content lives in the docs/ directory of this repo. Edit the
Markdown files there and submit a PR — changes are automatically deployed to the
docs site.
We welcome contributions of all kinds — from device testing reports to driver code. See CONTRIBUTING.md for details.
The most impactful thing you can do right now is test on your hardware. If you own any Apollo model besides the x4, your testing report directly enables support for that device.
- Build and load the driver
- Run
./tools/contribute/device-probe.sh - Submit a device report
This project is licensed under the GNU General Public License v2.0.
See NOTICE.md for information about trademarks and intellectual property.