Under the hood

For developers.

Rust, GTK4 and libadwaita, forked from Euphonica so it installs beside the original. The app ID is io.github.h3303.Flaclify with its own settings, cache and config. The one thing deliberately shared is the MPD password in the keyring, and the sticker keys, so metadata round-trips with other Euphonica clients.

I

The theme engine.

src/theme/mod.rs owns one CssProvider at user priority, installed from the app's startup handler before any window exists. The window's accent provider is added later at the same priority, so it cascades over the theme — that is what lets album-art accents win when a theme allows them.

apply(id) loads the CSS, switches the icon set, forces the colour scheme if declared, saves the id and notifies listeners. The user directory is watched with a debounced GFileMonitor; the settings key is watched so gsettings writes apply live.

II

Icon sets.

apply_icon_set() puts /iconsets/<set>/icons first in the display's icon-theme resource path. Names that Adwaita also provides carry an fl- prefix in the UI files, because the system theme is searched before app resources and an unprefixed override is never picked. Placeholders go through a ThemedPlaceholder paintable that swaps its texture and invalidates itself.

III

Build and run.

meson setup build -Dprofile=dev -Dprefix=$HOME/.local
ninja -C build install
flaclify

gtk4 ≥ 4.18 · libadwaita ≥ 1.7 · meson · gettext · sqlite · pipewire · libsecret · MPD ≥ 0.24 · stable Rust

IV

Adding a bundled theme.

isrc/themes/<stem>.css with the header keys.
iiA <file> entry in the /themes/ block of src/flaclify.gresource.xml.
iiiOwn icons: a new style in gen_icons.py, regenerate, @icons: <style>.
ivRebuild and walk the checklist with the album-art wash on and off.
python3 -m venv build/venv && build/venv/bin/pip install fonttools
build/venv/bin/python tools/gen_icons.py

Screenshots beat trusting CSS. Views can be switched from outside the app over D-Bus (org.gtk.Actions.Activate view-albums on the window object), so a script can walk every theme through every view.