Skip to content
Simone Russo
All work
Flagship build2026

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
Flagship build2026
C++20 · PipeWire · libpulse

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++
01

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.

02

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.

03

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.

Result

1.2.0 shipped · MIT · 29 test functions in CI

Next projectMarmotta