Applications
Every window on the desk wears the palette, not only the shell’s. Most take
it on their own the next time they open a window. What a few need beyond a
file, ./setup install sets up once, and Spotify takes it at its next start.
| Application | Follows on its own | Set up once by install | Takes a new palette |
|---|---|---|---|
| GTK windows: satty, file-roller, pavucontrol, gimp | yes | dark, with the impasto icons | the next window |
| Qt and KDE windows | yes | nothing; qt6ct is in the package list | the next window |
| Thunar | colours and folders | its settings and right-click menu | the next window |
| Zen | yes | named for web pages and PDFs | the next window |
| Vesktop | yes | its theme ticked | at once |
| VSCodium | the theme, the font and the extensions’ colours | its extensions and settings | the next window |
| Spotify | once patched | the patch | its next start |
| imv | yes | named for pictures | the next picture opened |
| The Open dialog, the screen-share picker | yes | nothing | the next dialog |
A program that is open while install runs, or a Spotify never started, is
skipped with the reason and set up by the next install or update. After
that install leaves them alone, so what you change in them stays; each has a
verb of its own that sets it up again (The setup script).
Making the rest of the machine agree
Section titled “Making the rest of the machine agree”What opens a file, whether GTK windows are dark and which icons they draw are
the machine’s settings, not files the desk carries, so install sets them
once, with ./setup defaults:
| Files | Open in |
|---|---|
| Pictures: JPEG, PNG, GIF, WebP, SVG | imv |
| Text and JSON | neovim |
| Folders | Thunar |
| Web pages, links and PDFs | Zen |
A line is left alone when ~/.config/mimeapps.list already names a default for
any of its types, so a browser or a viewer you chose stays chosen, and a
program that is not installed is skipped. Then GTK is set dark, and its icon
theme to impasto, which is what gives Thunar’s folders the wallpaper’s
colour. Without the first, GTK windows come up light with the palette’s
colours on them.
The GTK settings hold only when set inside the session. Run from a TTY, the
verb says so, and the next install or update from a terminal in Hyprland
sets them.
Every palette change writes gtk.css into ~/.config/gtk-3.0/ and
~/.config/gtk-4.0/. The ground is the palette’s background tinted with the
accent; header bars, cards, popovers and sidebars sit on the raised surface; the
accent fills selections and colours links. Only colours change: the theme stays
Adwaita, and every widget keeps Adwaita’s shape.
- GTK reads the sheet when an application starts, so a window already open keeps its old colours.
- The type is Adwaita Sans 11, from the
settings.inithe desk carries. The shell’s font setting does not reach GTK. - satty, the annotator the capture hands a picture to, is one of these windows, and so is every Open and Save dialog.
Qt and KDE
Section titled “Qt and KDE”Qt windows take the palette through qt6ct, in Qt’s Fusion style. The session
names qt6ct as the platform theme, and every palette change writes its colour
scheme to ~/.config/qt6ct/colors/impasto.conf. KDE applications, such as
gwenview, spectacle and the polkit password dialog, read ~/.config/kdeglobals
instead, so the push merges its colours into that file too and leaves everything
else in it alone.
- A window already open keeps its colours; the next one comes up in the new palette.
- Leave qt6ct’s own window alone: what you save there is replaced at the next palette change.
- Without qt6ct installed, plain Qt windows come up in Breeze’s light grey. KDE applications still follow.
- Qt 5 applications, VLC among them, are not themed.
- Merging into
kdeglobalsdrops any comments in it.
Thunar
Section titled “Thunar”SUPER E opens Thunar, a GTK window that takes its
colours from the same gtk.css as the rest.
The folders are the wallpaper’s colour. Every palette change writes an icon
theme, impasto, in ~/.local/share/icons/: Papirus-Dark’s icons, with the
folders pointed at whichever of Papirus’s twenty-five folder colours is nearest
the accent. A folder is a drawing, so it lands on the nearest swatch rather than
on the accent exactly. GTK draws it once its icon theme is impasto, which
install sets (above), in every GTK application started afterwards.
./setup thunar sets everything that is not a colour, and install runs it
once. Thunar writes its settings back as it exits, so an open Thunar is
skipped and set up by the next install or update, and the verb on its own
refuses while Thunar runs. It sets:
- one bar instead of two, with the menu behind a button;
- thumbnails for local files, folders before files, sorting that ignores case;
- dates as
2026-09-13 18:30, and sizes in binary units; - the image preview inside the side pane;
- double click to open;
- a Delete that skips the bin, beside Move to Trash, with the confirmation kept;
- a shell script opened rather than run on a double click.
And five entries on the right-click menu:
| Entry | Does | On |
|---|---|---|
| Open Terminal Here | kitty, in that folder | folders |
| Open yazi Here | yazi in kitty, in that folder | folders |
| Open in the Editor | VSCodium | folders, text and other files |
| Set as Wallpaper | that picture as the wallpaper, and the palette from it | pictures |
| Copy Path | the full path, to the clipboard | everything |
A setting you change later in Thunar’s own preferences stays until you run the verb again. The row with the path in it stays on the window’s plain background: it is the one part of Thunar the stylesheet cannot reach.
Zen needs nothing. Every palette change writes userChrome.css into the
profile Zen opens, under ~/.config/zen/, and a user.js with the one
preference that makes Zen read it. The toolbar sits on the raised surface, the
sidebar on the background, and the accent is Zen’s primary colour; the frame is
dark under every palette.
userChrome.cssis read when a window opens anduser.jswhen Zen starts, so the first time needs Zen restarted. After that, each new window takes the palette.- The page area of an empty tab is Firefox’s own dark grey, not the palette’s.
Vesktop
Section titled “Vesktop”Vesktop follows the palette once its theme is ticked, and install ticks
it. Every palette change writes ~/.config/vesktop/themes/impasto.css, and
Vencord repaints a running Vesktop the moment the file changes. The tick goes
into Vencord’s own settings, with everything else in them kept. Vencord
rewrites that file while it runs, so an open Vesktop is skipped and ticked by
the next install or update, or by ./setup vesktop once it is closed.
Unticked by hand, under Vesktop’s settings → Themes, it stays unticked.
- Your Quick CSS is left alone.
- Nitro’s purple stays Discord’s.
- The theme sets Discord’s own colour variables and names no class. A Discord update that renames those variables leaves the theme loading without error and changing less.
Spotify
Section titled “Spotify”Spotify wears the palette from its next start. spicetify does not theme
Spotify, it patches it: the colours are compiled into /opt/spotify, and
nothing is read while it runs. ./setup spotify is the patch, and install
runs it. After that, every palette change writes
~/.config/spicetify/Themes/impasto/color.ini and rewrites the stylesheets
inside the patched client, restarting nothing, so a Spotify that is playing
keeps the old colours until it starts again.
Before the first patch:
-
Use the
spotifypackage from the AUR, notspotify-launcher, which updates itself on every start and takes the patch with it.spotifyandspicetify-cliare both in the package list. -
Open Spotify once, and close it: spicetify needs the settings Spotify writes on its first start.
-
Run
./setup update, or./setup spotify. It asks to make Spotify’s folder writable, selects the theme, and patches it.
A Spotify update takes the patch away, because it rewrites /opt/spotify.
The next ./setup update sees that and patches it again, with the player
closed; ./setup spotify does it at once, and restarts Spotify.
VSCodium
Section titled “VSCodium”The colour theme is written as an extension, in
~/.vscode-oss/extensions/impasto/, on every palette change, with nothing to
install. A window already open keeps its colours; Developer: Reload Window,
or a new window, takes the new ones.
./setup vscodium does the rest, and install runs it once. It installs
four extensions from Open VSX — Material Icon Theme, Fluent Icons, Error Lens
and indent-rainbow — and merges into your settings.json: the Impasto theme
and the two icon themes selected, the shell’s monospace font with ligatures at
14, the activity bar along the top, and no minimap, breadcrumbs or command
centre. Everything else in the file stays; comments in it do not survive the
merge. An extension that cannot be fetched leaves the verb to the next
install or update.
- The font and the palette keep up on their own. A change of the shell’s
monospace font, or of the palette, rewrites just those values in
settings.json— the fonts, the folder icons’ colour and indent-rainbow’s colours — in place and only where they are set, so comments and every other key survive, and a key you delete stays deleted. - Without the verb, pick the theme yourself: CTRL K, then CTRL T, then Impasto.
- Error Lens and indent-rainbow draw nothing in a folder until you trust it.
imv opens floating over the windows, centred at seven tenths of the screen,
whether the picture comes from yazi, Thunar or a photo on the desktop. Its
whole configuration is written by the palette push: the picture sits on the
terminal’s tinted background, and the overlay, shown with d, is in
the palette. A picture already open keeps its colours. Because the push owns
~/.config/imv/config, anything else you write there is replaced at the next
palette change.
The portals
Section titled “The portals”When an application asks for a file or for the screen, the dialog that answers
already wears the palette. The Open and Save dialogs come from
xdg-desktop-portal-gtk and are GTK windows; the screen-share picker comes from
xdg-desktop-portal-hyprland and is a Qt window. Both are in the package list
and need no configuration.
