CallDucker sets background applications to a chosen absolute volume while a voice call is active,
then restores every stream to its original per-channel volume. It supports both a native
PulseAudio server and PipeWire's pipewire-pulse compatibility server. The daemon uses libpulse's
GLib main-loop integration; it does not invoke pactl, wpctl, pw-cli, access the network,
collect telemetry, or require a root service.
Version 0.1.1 supports Fedora 43+, current Arch Linux, Debian 13+, Ubuntu 24.04+, and Linux Mint
22+. GNOME, KDE Plasma, and Cinnamon are the tested desktops. A local PulseAudio-compatible server
and systemd user services are required. Pure ALSA, JACK, and PipeWire without pipewire-pulse are
not supported. GTK 4.12 and libadwaita 1.5 remain minimum requirements.
Every release ships an x86_64 package for each supported distribution. Pick the matching asset from the latest GitHub Release:
Only the Fedora package has been tested in real use so far. Every package is built and passes
the full automated test suite on its own distribution, including the PulseAudio integration test.
But the live acceptance test — a real desktop session, real games, and a real voice call, against
both PulseAudio and pipewire-pulse — has only been carried out on Fedora. Treat the Debian,
Ubuntu, Mint, and Arch packages as working but unproven, and please
report anything that misbehaves.
The packages are not GPG-signed, so dnf and apt warn that they are unsigned. Verify the GitHub
build attestation instead. Download SHA256SUMS alongside your package, then, from the download
directory:
gh attestation verify call-ducker* \
--repo UntoastedToast/call-ducker \
--signer-workflow UntoastedToast/call-ducker/.github/workflows/release.yml
sha256sum --ignore-missing --check SHA256SUMSThis needs the GitHub CLI. --ignore-missing checks the assets you
actually downloaded and skips the rest.
Fedora 43 and newer
sudo dnf install ./call-ducker-*.x86_64.rpmdnf resolves the PulseAudio dependency itself. Confirm the unsigned-package prompt.
Debian 13 and newer
sudo apt install ./call-ducker_*deb13_amd64.debUse apt install ./file.deb, not dpkg -i — the leading ./ is what makes apt treat it as a
local file, and only apt pulls in the dependencies. If you already run PipeWire, apt keeps it;
pulseaudio is only installed when no PulseAudio-compatible server is present yet.
Ubuntu 24.04+ and Linux Mint 22+
sudo apt install ./call-ducker_*ubuntu24.04_amd64.debUse apt install ./file.deb, not dpkg -i — the leading ./ is what makes apt treat it as a
local file, and only apt pulls in the dependencies.
Linux Mint 22 is built on Ubuntu 24.04, so it uses the Ubuntu package. There is no separate Mint asset.
Arch Linux
Arch has no binary asset on purpose: Arch is a rolling release, so a package built against one
week's gtk4 or libpulse breaks as soon as those libraries change. Build from the released
PKGBUILD, which downloads and checksums the published source archive:
mkdir call-ducker && cd call-ducker
curl -LO https://github.com/UntoastedToast/call-ducker/releases/latest/download/PKGBUILD
makepkg -simakepkg -s installs the build dependencies and -i installs the finished package.
systemctl --user start call-ducker.serviceOnly needed once — the service starts automatically on later logins. Check it with
systemctl --user status call-ducker.service, then open CallDucker from your application menu.
Every package is built from the published call-ducker-<version>.tar.xz, which contains the
packaging/ directory, so that archive alone is enough to rebuild any of them.
The .deb file names use a dot where the package version uses a tilde, so apt reports
0.1.1-1~deb13 for a file named …-1.deb13_amd64.deb. GitHub rewrites tildes in asset names, and
the tilde has to stay in the version itself because it is what makes a later official Debian
revision sort above this build.
There is no Flatpak, and there will not be one: CallDucker installs a systemd user service and inspects host processes to recognise games launched by Steam, Heroic, or Lutris. A Flatpak sandbox permits neither, so a Flatpak build would install and run but never detect a game.
To uninstall, use sudo dnf remove call-ducker, sudo apt remove call-ducker, or
sudo pacman -R call-ducker.
Fedora 43 and newer:
sudo dnf install gcc meson ninja-build vala glib2-devel pulseaudio-libs-devel \
json-glib-devel gtk4-devel libadwaita-devel desktop-file-utils appstreamArch Linux:
sudo pacman -S --needed base-devel meson ninja vala glib2 libpulse json-glib gtk4 \
libadwaita desktop-file-utils appstreamDebian 13 and newer, Ubuntu 24.04 and newer, or Linux Mint 22 and newer:
sudo apt update
sudo apt install build-essential meson ninja-build valac libglib2.0-dev libpulse-dev \
libjson-glib-dev libgtk-4-dev libadwaita-1-dev desktop-file-utils appstreamBuild, test, and install with the same commands on every distribution:
meson setup build
meson compile -C build
meson test -C build --print-errorlogs
sudo meson install -C build
systemctl --user daemon-reloadIntegration tests are discovered automatically for local builds. Maintainers and CI use
-Dintegration_tests=enabled so configuration fails instead of silently omitting the private
PulseAudio or Xvfb tests when their programs are missing.
call-duckerctl status --json
call-duckerctl list-apps
call-duckerctl preview
call-duckerctl restore
journalctl --user -u call-ducker.serviceOriginal volumes are stored atomically in
$XDG_STATE_HOME/call-ducker/pulse-restore.json, including their channel layouts. An unknown or
corrupt journal is preserved and blocks adjustment instead of risking an incorrect restore.
Read CONTRIBUTING.md for development checks and docs/ARCHITECTURE.md for backend and restore guarantees.
CallDucker is licensed under the GNU GPL v3.0 or later.
Copyright © 2026 UntoastedToast.