PipeDuck
Automatic audio ducking for PipeWire. Born from a small annoyance, now at v1.2.0.
- Client
- Personal project
- Role
- Creator, everything
- Year
- 2026
- Status
- Shipped
Proof
- v1.2.0
- Release · Oct 2026
- 29
- Test functions · 431 assertions
- 4
- Build jobs · compiler × GUI matrix
- 86
- Tracked files · ~368 KB of C++
The opening
Every call starts the same way: somebody speaks, the music is too loud, you fumble for the volume slider and miss the first sentence. Existing tools either duck too aggressively or snap back to full volume like nothing happened. I wanted one that behaves like a hand on a fader: down fast, back smoothly, and only when it matters.
The middle game
PipeDuck is a C++20 reimplementation of pw-duck with different priorities. It subscribes to libpulse once and reacts to stream events instead of polling pactl. Fades are smoothstep ramps driven by the control tick, so new speech interrupts a return fade immediately. Routing goes through a temporary virtual sink that is restored automatically — and if something fails, the sink stays alive instead of killing your application audio. On top of the daemon: a StatusNotifier tray with live status, a GTK4 tuner, a terminal tuner and a CLI.
The endgame
Version 1.2.0 is tagged, MIT-licensed, built by CI on every commit across gcc and clang with the GUI both on and off, and it has been running on my machine since before it had a name. The interesting part was never the DSP — it was making audio routing state safe to touch.
1.2.0 shipped · MIT · 29 test functions in CI