# Muted Tune on Linux: install with your package manager

Copyright © 2026 Turbulent.net Inc. All rights reserved.

Three packages:

- **mutedtune-desktop**: everything for a computer with a desktop in ONE file: the window and the runner. This is the file the setup page offers to download and double-click (`https://mutedtune.com/downloads/mutedtune_latest_amd64.deb`, `.../mutedtune-latest.x86_64.rpm`), so it depends only on the distribution's own libraries. Installing it also adds the signed repository (below), the way Google Chrome's package does. It replaces `mutedtune` and `mutedtune-runner` (it conflicts with both and counts as both). `x86_64` only.
- **mutedtune**: the runner (command line program that watches your export folder and uploads). All Linux, `x86_64` and `aarch64`. Static, so it needs no other packages.
- **mutedtune-runner**: the Muted Tune window and tray icon. `x86_64` only. It needs the `mutedtune` package and the system's GTK 3, WebKitGTK 4.1 and Ayatana AppIndicator libraries, which the package manager installs for you.

Updates come through the package manager (`apt upgrade`, `dnf upgrade`). The runner's own `mutedtune update` stands down on a packaged install and says "Updates are managed by your system."

**The window's Update now works on these installs.** When `/usr/bin/mutedtune` is owned by one of our packages (`dpkg -S` / `rpm -qf`), the window runs `pkexec /usr/lib/mutedtune/update-helper`: the system's own password dialog, then a root helper that takes no arguments and only upgrades `mutedtune-desktop`/`mutedtune`/`mutedtune-runner` (apt: refreshes only `mutedtune.sources`; dnf: `dnf upgrade` of those packages). Polkit action `com.mutedtune.update` (`/usr/share/polkit-1/actions/`) binds to that one file. Afterwards the window offers **Restart Muted Tune**, which restarts the user unit and reopens the window; the same button appears when the system's updater installed the new version first. The package's upgrade step also `try-restart`s `mutedtune.service` for every logged-in user.

**Automatic updates.** On Debian-family systems with `unattended-upgrades` installed, the package writes `/etc/apt/apt.conf.d/52mutedtune-unattended` (`Origins-Pattern` `origin=Muted Tune,codename=stable`, which is what our Release file declares). Delete the file to opt out; it is not written again, and it is removed with the package only if the package wrote it. On Fedora, nothing is forced: install `dnf-automatic` and enable `dnf-automatic-install.timer` if you want unattended updates.

## Install

The repository is signed. Its public key is `https://mutedtune.com/repo/mutedtune.asc` (armored) / `mutedtune.gpg` (binary).

**Easiest, no terminal:** download the `.deb` (Debian, Ubuntu, Mint, Pop) or `.rpm` (Fedora) from the band's "Set up a computer" page and double-click it. Underneath that is `sudo apt install ./mutedtune_latest_amd64.deb` or `sudo dnf install ./mutedtune-latest.x86_64.rpm`. The package's install step writes `/etc/apt/sources.list.d/mutedtune.sources` and `/etc/apt/keyrings/mutedtune.gpg` (deb), or `/etc/yum.repos.d/mutedtune.repo` and imports the key (rpm), unless a file already points at the repository. Removing the package removes exactly what it added (a marker in `/var/lib/mutedtune/` says which), never a source added by hand.

**Debian, Ubuntu and relatives, from the command line (22.04 and newer, Debian 12 and newer):**

    sudo install -d -m 0755 /etc/apt/keyrings
    sudo curl -fsSL https://mutedtune.com/repo/mutedtune.gpg -o /etc/apt/keyrings/mutedtune.gpg
    sudo curl -fsSL https://mutedtune.com/repo/mutedtune.sources -o /etc/apt/sources.list.d/mutedtune.sources
    sudo apt update
    sudo apt install mutedtune-desktop      # or just mutedtune on a computer with no desktop

**Fedora and relatives:**

    sudo curl -fsSL https://mutedtune.com/repo/mutedtune.repo -o /etc/yum.repos.d/mutedtune.repo
    sudo dnf install mutedtune-desktop      # or just mutedtune on a computer with no desktop

(openSUSE: the `.rpm` lists the openSUSE library names as alternatives, but it has not been tested there.)

**NixOS / home-manager:** see "Nix" below.

## After installing: connect this computer to your band (you do this, once)

**With the window (no terminal):** the window opens by itself right after the install (the package starts it, as you, in your desktop session; on a computer with no desktop session nothing opens, and the menu entry and the next login do it). If you closed it, open **Muted Tune** from the applications menu. The window starts the runner by itself and shows a short code straight away; there is nothing to press first. On the band's "Set up a computer" page, in a browser, type the code in "Enter the code shown on the computer". The computer joins at once, the window asks which program records your practice, and once paired Muted Tune starts at every login (the window turns on the user's `mutedtune` systemd unit through `systemctl --user enable`, only if it saw this computer go from unpaired to paired). The steps below are the same thing done by hand.

Installing never connects anything and never starts anything by itself.

1. Connect to your band. `SERVER` is your band's Muted Tune address, for example `https://yourband.mutedtune.com`:

        mutedtune pair --server SERVER --name "Rehearsal PC"

   It prints a short code. A band member opens `SERVER/pair`, enters the code and approves this computer. Then the runner asks you to confirm the band name once. Nothing uploads before you do. (Alternative: a setup token from the band's "Set up a rehearsal computer" page, saved to a file only you can read: `mutedtune pair --server SERVER --token-file FILE --consume-token-file`.)
2. Tell it where your recording program exports: `mutedtune setup` helps you find the folder; then `mutedtune watch add ~/Practice` (use your folder).
3. Start it, and have it start at every login:

        systemctl --user enable --now mutedtune

   The unit is `/usr/lib/systemd/user/mutedtune.service` and runs `/usr/bin/mutedtune run`. Without a systemd user session, start `mutedtune run` yourself. To keep it running while nobody is logged in: `sudo loginctl enable-linger $USER`.
4. The window: "Muted Tune runner" is in the applications menu. At every login it starts hidden in the tray (`/etc/xdg/autostart/mutedtune-runner.desktop` runs `mutedtune-runner --background`; delete or override that file to stop it) and comes up on its own only when this computer is not connected yet or something needs you.

Check on it any time: `mutedtune status`, `journalctl --user -u mutedtune`.

If you used the per-user installer script (`install.sh`) before: its copy in `~/.local/bin` comes first on PATH and its unit in `~/.config/systemd/user` overrides the packaged one. To move to the packages, run `systemctl --user disable --now mutedtune`, delete `~/.local/bin/mutedtune*` and `~/.config/systemd/user/mutedtune.service` and `~/.config/autostart/mutedtune*.desktop`, then follow the steps above. Your pairing (`~/.config/mutedtune`) is kept, so skip step 1.

## What the server's setup page needs to show (server change, not done in this repo)

On "Set up a rehearsal computer", next to the one-line installer, add an "Install with your package manager" choice with:

- the apt block and the dnf block above, verbatim (the URLs are the public `https://mutedtune.com/repo/...` ones, the same for every band);
- the pairing command for that band, with the band's own address filled in: `mutedtune pair --server <this server's public base URL> --name "<computer name>"`, and a line saying a band member approves the code at `<base URL>/pair`;
- a note that updates then come from `apt upgrade` / `dnf upgrade`, and the "Updates are managed by your system" message is expected.

It also needs the server to serve the repository files; see "Serving the repository".

The runner's "new system parts" path (a new window release that needs libraries the installed window lacks) does not apply to packaged installs: the package manager pulls in the dependencies when the new `mutedtune-runner` package is upgraded. Keep `depends:` in `packaging/nfpm-mutedtune-runner.yaml` in step with `GUI_DEPS` and `window_packages()` in `contrib/install.sh` (`contrib/build-packages.sh` checks the generation number).

## Serving the repository

`contrib/build-packages.sh` writes `dist/pkg/repo/`. It is static files; serve it unchanged as `https://mutedtune.com/repo/` (files must be served as-is, with no auth, no redirect to a login page and no rewriting; HTTP range and conditional requests are fine). For nginx on the server:

    location /repo/ { alias /srv/mutedtune-repo/; autoindex off; }

with `dist/pkg/repo/` synced to that directory. Publish order: the `pool/` and `rpm/*/*.rpm` files first, then `dists/` and `rpm/*/repodata/`, so clients never see an index that names a missing file.

## Release steps

    contrib/build-release.sh          # static binaries, window, SHA256SUMS (see that script)
    contrib/build-packages.sh         # .deb/.rpm and the signed repos into dist/pkg/
    contrib/e2e-packages.sh           # install from the local repo on Debian 12, Ubuntu 22.04 and Fedora

The repository signing key is the `sec` secret `api/mutedtune/repo-signing-key`; the public half is committed as `contrib/repo-signing-pub.asc`. Re-packaging the same version: `PKG_RELEASE=2 contrib/build-packages.sh`.

## Nix

The repo is a flake (`flake.nix`): `packages.<system>.mutedtune` (x86_64 and aarch64), `packages.x86_64-linux.mutedtune-runner` (the window), `nixosModules.default` and `homeManagerModules.default`. Both modules use `services.muted-tune`.

    # flake.nix inputs
    muted-tune.url = "git+<this repository>";
    muted-tune.inputs.nixpkgs.follows = "nixpkgs";

    # NixOS configuration
    imports = [ muted-tune.nixosModules.default ];
    services.muted-tune = { enable = true; user = "alice"; };

    # home-manager instead
    imports = [ muted-tune.homeManagerModules.default ];
    services.muted-tune.enable = true;

Pairing is still the same user step (`mutedtune pair ...`). Nix store paths count as package-managed, so `mutedtune update` stands down here too.
