MANUAL-INSTALL-INSTRUCTIONS.md

September 7, 2026 ยท View on GitHub

Manually Installing kew

Debian/Ubuntu

Install dependencies:

sudo apt install -y pkg-config libfaad-dev libtag1-dev libfftw3-dev libopus-dev libopusfile-dev libvorbis-dev libogg-dev git gcc make libchafa-dev libglib2.0-dev libgdk-pixbuf-2.0-dev

Install kew

Arch Linux

Install dependencies:

sudo pacman -Syu --noconfirm --needed pkg-config faad2 taglib fftw git gcc make chafa glib2 opus opusfile libvorbis libogg

FreeBSD

sudo pkg install pkgconf faad2 taglib fftw3 opus opusfile libvorbis libogg git gcc gmake chafa glib gdk-pixbuf2

cd kew

gmake -j

sudo make install

NetBSD


sudo pkgin install pkgconf faad2 taglib fftw opus opusfile libvorbis libogg git-base gcc gmake chafa glib2 gdk-pixbuf2

cd kew

gmake -j

sudo make install

Install kew

Android

Follow the instructions here:

ANDROID-INSTRUCTIONS.md

macOS

Install git:

xcode-select --install

Install dependencies:

brew install gettext faad2 taglib chafa fftw opus opusfile libvorbis libogg glib pkg-config make

Notes for mac users:

  1. A sixel-capable terminal like kitty or WezTerm is recommended for macOS.
  2. The visualizer and album colors are disabled by default on macOS, because the default terminal doesn't handle them too well. To enable press v and i respectively.

Install kew

Fedora

Install dependencies:

sudo dnf install -y pkg-config taglib-devel fftw-devel opus-devel opusfile-devel libvorbis-devel libogg-devel git gcc make chafa-devel libatomic gcc-c++ glib2-devel

Option: add faad2-devel for AAC, M4A support.

sudo dnf install faad2-devel faad2

Install kew manually/Build an RPM package

OpenSUSE

Install dependencies:

sudo zypper install -y pkgconf taglib fftw3-devel opusfile-devel libvorbis-devel libogg-devel git chafa-devel gcc make glib2-devel faad2 faad2-devel gcc-c++ libtag-devel

Install kew

CentOS/Red Hat

Install dependencies:

sudo dnf config-manager --set-enabled crb

sudo dnf install -y pkgconfig taglib taglib-devel fftw-devel opus-devel opusfile-devel libvorbis-devel libogg-devel git gcc make chafa-devel glib2-devel gcc-c++

Option: add faad2-devel for AAC,M4A support (Requires RPM-fusion to be enabled).

Enable RPM Fusion Free repository:

sudo dnf install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm

Install faad2:

sudo dnf install faad2-devel

Install kew manually/Build an RPM package

Void Linux

Install dependencies:

sudo xbps-install -y pkg-config faad2 taglib taglib-devel fftw-devel git gcc make chafa chafa-devel opus opusfile opusfile-devel libvorbis-devel libogg glib-devel

Install kew

Alpine Linux

Install dependencies:

sudo apk add pkgconfig faad2-dev taglib-dev fftw-dev opus-dev opusfile-dev libvorbis-dev libogg-dev git build-base chafa-dev glib-dev

Install kew

Windows (MSYS), The preferred way for windows

Follow the instructions here:

WINDOWS-INSTRUCTIONS.md

Windows (WSL)

Install through package manager:

  1. Install Windows Subsystem for Linux (WSL).

  2. Run these commands:

sudo apt update

Install Kew:

sudo apt install kew

kew

Install from source:

  1. Install kew using the instructions for Ubuntu.

  2. If you are running Windows 11, Pulseaudio should work out of the box, but if you are running Windows 10, use the instructions below for installing PulseAudio: https://www.reddit.com/r/bashonubuntuonwindows/comments/hrn1lz/wsl_sound_through_pulseaudio_solved/

  3. To install Pulseaudio as a service on Windows 10, follow the instructions at the bottom in this guide: https://www.linuxuprising.com/2021/03/how-to-get-sound-pulseaudio-to-work-on.html

Install kew {#install-kew}

Download the latest release (recommended) or, if you are feeling adventurous, clone from the latest in main:

git clone https://codeberg.org/ravachol/kew.git
cd kew

Then run:

make -j
sudo make install

Uninstalling

If you installed kew manually, simply run:

sudo make uninstall

If you want, you can also delete the settings files:

Linux: ~/.config/kew/ macOS: ~/Library/Preferences/kew/

Then delete the kewstaterc and library.dat files:

Linux: ~/.local/state/kew/ macOS: ~/Library/Application Support/kew/ Windows: %AppData\Local\kew

Faad2 is optional

By default, the build system will automatically detect if faad2 is available and includes it if found.

Real-time scheduling and CAP_SYS_NICE

kew asks for real-time scheduling (SCHED_RR at a low priority) for its decoding thread, which helps prevent buffer underruns. It tries three things in order and uses whichever works first:

  1. SCHED_RR directly, which succeeds if kew has CAP_SYS_NICE or a raised RLIMIT_RTPRIO.
  2. RTKit over D-Bus, which needs rtkit-daemon running. kew lowers its own RLIMIT_RTTIME first, since RTKit refuses the request otherwise, and that needs no privileges and no setup on your part.
  3. setpriority(), which is not real-time but keeps playback working.

So on a typical desktop with rtkit-daemon installed there is nothing to configure. Which path was taken ends up in error.log, look for a line containing decode_loop: thread priority.

If step 2 fails with AccessDenied: Operation not permitted even though rtkit-daemon is running, check that polkit was built with a session backend. RTKit asks polkit whether your session is active, and a polkit built without elogind or systemd support cannot answer that, so it denies the request. On Gentoo that means the elogind USE flag on sys-auth/polkit. You can verify with:

pkcheck --action-id org.freedesktop.RealtimeKit1.acquire-high-priority --process $$

Silence means allowed, Not authorized means polkit cannot see the session.

Granting CAP_SYS_NICE at install time

make install does not grant the capability by default, and with RTKit in place you usually do not need it. If you want it anyway, run:

sudo make install ENABLE_CAP_SYS_NICE=1

which adds cap_sys_nice+ep to the installed binary.

Be aware of one side effect before enabling it. A binary carrying file capabilities is started by the kernel with AT_SECURE=1, and in that mode glib ignores $DBUS_SESSION_BUS_ADDRESS and refuses to autolaunch a session bus. Which means MPRIS support depends on how your session bus was set up:

  • If $XDG_RUNTIME_DIR/bus exists and is owned by you, as is the case with systemd or dbus-user-session, glib finds the bus there and MPRIS keeps working.
  • If your session bus comes from dbus-launch, with the socket somewhere in /tmp and its address only in $DBUS_SESSION_BUS_ADDRESS, glib has nothing left to fall back on. kew then reports:
Cannot spawn a message bus when AT_SECURE is set

Note that dbus-launch kew and dbus-run-session kew do not help, because both only set the environment variable that glib is ignoring.

If you hit this, either install without ENABLE_CAP_SYS_NICE=1, or drop the capability from an already installed binary:

sudo setcap -r /usr/local/bin/kew

One more way to get real-time scheduling, if RTKit is not an option, is to raise RLIMIT_RTPRIO through PAM limits, which is what JACK and PipeWire rely on. On most distributions that means adding a line like this to /etc/security/limits.conf (or a file under /etc/security/limits.d/) and logging back in:

@audio - rtprio 95

Your user needs to be a member of the group you name there. This satisfies step 1 above and keeps AT_SECURE=0, so MPRIS is unaffected.