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
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
Android
Follow the instructions here:
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:
- A sixel-capable terminal like kitty or WezTerm is recommended for macOS.
- 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.
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
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
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
Windows (MSYS), The preferred way for windows
Follow the instructions here:
Windows (WSL)
Install through package manager:
-
Install Windows Subsystem for Linux (WSL).
-
Run these commands:
sudo apt update
Install Kew:
sudo apt install kew
kew
Install from source:
-
Install kew using the instructions for Ubuntu.
-
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/
-
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:
SCHED_RRdirectly, which succeeds if kew hasCAP_SYS_NICEor a raisedRLIMIT_RTPRIO.- RTKit over D-Bus, which needs
rtkit-daemonrunning. kew lowers its ownRLIMIT_RTTIMEfirst, since RTKit refuses the request otherwise, and that needs no privileges and no setup on your part. 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/busexists and is owned by you, as is the case with systemd ordbus-user-session, glib finds the bus there and MPRIS keeps working. - If your session bus comes from
dbus-launch, with the socket somewhere in/tmpand 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.