Arch Linux + Hyprland desktop: a Quickshell shell with a dynamic island, desktop widgets, notes and tasks, and a one-script installer
See the code
A Hyprland shell whose colours come from a painting.
One black island that changes shape, a desk of widgets under the windows,
and every program around it repainted by whatever wallpaper is up.
Documentation · The island · The bar · The launcher · The desktop · Installation · Keys
The name is the technique the wallpapers are painted in: paint laid on thick
enough to keep the mark of the brush. It is a shell first and a dotfiles
repository second — home/.config/quickshell is most of the code, and the rest
of home/ is the desk around it: the terminal, the prompt, two editors, two
file managers, a browser, a chat client, the login screen. Change the
wallpaper and all of it follows.
The island is one object that changes shape. A black capsule in the middle of the bar rests on the time and turns into everything else: the glance under the pointer, the control centre, the launcher, the overview, a notification, a game — each the size of what is in it, with no title and no close button. What is running sits either side of the time — a countdown, the track, or whatever is using the microphone, the camera or the screen — and every module on the bar opens into the island rather than into a popup of its own. A notification arrives there with its buttons, and stays in the control centre's list.
Three styles, one layout. Pieces are dragged out of a catalogue onto a picture of the bar, then drawn grouped round the island, spread to the edges, or all inside one capsule. A module tells you something and opens its detail; a button opens something — any panel the control centre does, the capture surface, or Settings. Each shows its symbol or its ring, with its figure always, never or under the pointer — two settings for the whole bar, and any piece can have a look of its own. The sides sit in capsules or straight on the wallpaper, the workspace strip is dots, bars, rings or numbers written out, and a tray holds the icons applications put there.
On more than one screen, every screen gets the whole bar, and the island is live on the one you are typing on. Each screen keeps widgets and notes of its own and the dock is on all of them, a workspace number brings that workspace to the screen you are on, and the brightness keys dim that screen — an external monitor over DDC/CI.
The first character says what the field is for. Plain text searches
applications, = calculates, @ finds an open window, ! starts a countdown,
' is the clipboard history, : picks an emoji, and > is the shell itself —
every panel and setting by name. Applications are ranked by what you actually launch.
The dock holds what you pinned, then whatever else is open, and the same pins come first in the launcher. Right-click an icon for its windows by name.
Any module can live on the wallpaper, on a grid, in four shapes: a square, a card, a large square and a band. Right-click the wallpaper to arrange — a card holds every module, a corner is pulled for another shape, and a click opens that widget's own look — for a photo widget, the picture of your own it holds.
Three themes on the same modules: Modern is a figure with a caption, Analogue draws each one as an object, Sticker cuts it out as coloured stickers that sit on the wallpaper without filling their squares, and any of them is a choice per widget. A spectrum of whatever is playing sits on the grid as bare bars, or runs along a whole edge under the windows.
The palette comes out of the painting. Pick a wallpaper and its colours
reach everything at once: the island and the widgets, the terminal and the
prompt, btop, cava, yazi, neovim, VSCodium, the GTK, Qt and KDE windows, Thunar
down to its folders, Vesktop, Zen and Spotify. Or pick one of nine palettes
instead. The desk comes with forty paintings, in the style it is named after,
and a video of your own in ~/.local/share/wallpapers/animated can be the
wallpaper too: it plays under the windows and the palette comes from its first
frame.
In the terminal, the prompt is laid out like the bar, and fa greets you with
fastfetch beside an animated scene drawn in pixel art out of the palette.
A note is paper: a pastel square with a title and the body in handwriting.
SUPER + S opens the deck; on the wallpaper a note sits on a square, or stacks
with others along an edge as tabs that peek out under the pointer.
A board for what has to be done. SUPER + K is to do, doing, done, with
cards dragged between the lanes, and a task's day shows as a dot under the
month wherever a month is drawn.
Eleven small games, played in the island — SUPER + G opens a shelf, and
the island becomes the board. A family of five small creatures lives on the
bar: one out at a time, earning levels from being fed and played with, each
hatched from an egg and drawn in one of four styles. Nothing dies, and a week
away costs nothing.
The shell locks the session itself, over the blurred desk, and the login screen is the same lock with the desk taken away: an SDDM theme with the same island, the same clock and the same pill, over a blurred painting. Both rest on the clock alone. Any key brings in your account and the field, and is already the first letter of your password; Escape sends them away again. The clock is stacked or on one line, in Settings → Session → Lock screen, and the login screen always stacks it. The picture and the name are your account's, and Settings → Session changes them for both screens at once: drop an image on the card and it is made square and kept where the login screen reads it; type a name and it becomes the account's full name.
With an infrared camera, the lock opens for your face. Touch a key or the pointer and the island grows under the camera, a ring turns around its padlock while it looks, closes green, the padlock opens and the blur lifts off the desk. It is its own conversation beside the password, so a face it does not know never costs you a try, and the login screen still asks for the password after a boot. Settings → Session lists the faces it knows, adds another, removes one, and lets you try it without locking.
Settings is the one panel that is not the island — an ordinary window where each option is drawn as the thing it changes, and profiles keep whole desks under names: Moon castle, Fuji and Night bay come with it.
Arch Linux, and Hyprland 0.56 or newer (tested on 0.56.2), configured in Lua. Run it from a terminal, in the Hyprland session or on a console before there is one. The two plugins are built against the compositor that is running, so from a console the first session opens a terminal that builds them:
git clone https://github.com/andreumassanet/impasto.git ~/impasto
cd ~/impasto
./setup install
It installs the packages it is missing — upgrading the system in the same step,
as Arch asks — oh-my-zsh, everything in home/ into your home and everything
in system/ into /, the two Hyprland plugins and the vector cursor, and the
login screen, switched on unless your machine already uses another display
manager. It sets up Thunar, VSCodium, Vesktop and Spotify, dark GTK
applications, and what opens which kind of file — leaving alone any your
machine already has an answer for. Where there is an infrared camera it
installs howdy-next and asks to enrol your face. It asks for your password
through sudo for pacman, for the copy into /, and to let spicetify patch
Spotify. A program that is open, or a Spotify you have never started, is
skipped with the reason and set up by the next update. After that they follow
the wallpaper on their own; Spotify from its next start.
Run ./setup with nothing after it and it asks instead: the verbs on one
screen, and what an install may leave out on the next, which is the flags below
with somewhere to press them.
| Flag | |
|---|---|
--skip-packages | install nothing; copy and build only |
--skip-system | leave / alone — no login screen, and no password for it |
--skip-plugins | no shake to find, no glass |
--skip-extras | leave Thunar, VSCodium, Vesktop, Spotify, GTK and face unlock alone |
--aur-helper yay|paru | which helper builds the AUR half — built from the AUR if you have neither |
--noconfirm | take the default at every question |
-n, --dry-run | say what would happen, and do none of it |
./setup update # git pull, then install again — the same flags
./setup uninstall # remove what it installed, and put back what it moved aside
./setup help # every verb and flag
update follows the branch you cloned: main moves only when a version is
released, and work in progress lives on dev. The version installed is under
Settings → System, with what the branch has waiting since it and a button that
runs update in a terminal.
Nothing is linked: setup copies, and remembers what it wrote. A file of
yours already in the way is moved to ~/.local/state/impasto/backups/ first; a
file you edit afterwards is left alone, with the new version beside it as
<name>.new, and one you delete stays deleted — the wallpapers you do not want,
say. Settings → System lists both, each with a button to put impasto's version
back. Editing the repository itself? ./setup sync copies it onto the
desk, and ./setup sync --watch keeps doing it on every save.
Every package is listed in packages/pacman.txt and packages/aur.txt, grouped
by what it is for; an optional one that is missing takes its own control away
rather than failing.
| 🪟 | Compositor | Hyprland |
| 🖱️ | Shake to find | hypr-dynamic-cursors |
| 🫧 | Glass on the windows | hyprglass |
| 🐚 | Desktop shell | Quickshell |
| 🖼️ | Wallpaper daemon | awww |
| 🖥️ | Terminal | kitty |
| ⌨️ | Interactive shell | zsh · oh-my-zsh |
| ❯ | Prompt | starship |
| 🎨 | Greeting | fastfetch |
| 📊 | System monitor | btop |
| 🎵 | Audio visualiser | cava |
| 📁 | File manager | yazi |
| 🗂️ | File manager in a window | Thunar |
| ✏️ | Editor | neovim |
| 📝 | Editor in a window | VSCodium |
| 🖼️ | Image viewer | imv |
| 🪄 | Annotator | satty |
| 💬 | Chat | Vesktop |
| 🎧 | Player | Spotify · spicetify |
| 🌐 | Browser | Zen |
| 🔆 | Monitor brightness | ddcutil |
| 🔑 | Login screen | SDDM |
| 👤 | Face unlock | howdy-next |
Every key belongs to a profile: Settings → Keys changes any of them, the compositor's included, and switching profile switches them all. A few worth knowing first:
These are worth your time whether or not you use this repository. No code was copied from any of them; what carried over from the shells are ideas — one file per island state, one transient signal for every ephemeral event, input debounced to one frame, and a capture that photographs the screen and draws the selection on the photograph.
Built on Quickshell and Hyprland. The pointer is Bibata, repainted; the folders are Papirus, re-pointed; the type is Inter and JetBrains Mono. Six of the nine palettes are other people's work, carried as they are: Catppuccin Mocha and Latte, Tokyo Night, Gruvbox, Nord and Rosé Pine.
Copyright © 2026 Andreu Massanet — released under the GNU GPL-3.0.
You may use, study, change and share any of it. If you build on it and pass the result on, it stays under the GPL and its source stays available. Keep the header at the top of each file, which carries this repository's address, and a line of credit back here is the kind thing to do.
57 followers · starred Sep 2026
72 followers · starred Sep 2026
Arch Linux + Hyprland desktop: a Quickshell shell with a dynamic island, desktop widgets, notes and tasks, and a one-script installer
See the code
A Hyprland shell whose colours come from a painting.
One black island that changes shape, a desk of widgets under the windows,
and every program around it repainted by whatever wallpaper is up.
Documentation · The island · The bar · The launcher · The desktop · Installation · Keys
The name is the technique the wallpapers are painted in: paint laid on thick
enough to keep the mark of the brush. It is a shell first and a dotfiles
repository second — home/.config/quickshell is most of the code, and the rest
of home/ is the desk around it: the terminal, the prompt, two editors, two
file managers, a browser, a chat client, the login screen. Change the
wallpaper and all of it follows.
The island is one object that changes shape. A black capsule in the middle of the bar rests on the time and turns into everything else: the glance under the pointer, the control centre, the launcher, the overview, a notification, a game — each the size of what is in it, with no title and no close button. What is running sits either side of the time — a countdown, the track, or whatever is using the microphone, the camera or the screen — and every module on the bar opens into the island rather than into a popup of its own. A notification arrives there with its buttons, and stays in the control centre's list.
Three styles, one layout. Pieces are dragged out of a catalogue onto a picture of the bar, then drawn grouped round the island, spread to the edges, or all inside one capsule. A module tells you something and opens its detail; a button opens something — any panel the control centre does, the capture surface, or Settings. Each shows its symbol or its ring, with its figure always, never or under the pointer — two settings for the whole bar, and any piece can have a look of its own. The sides sit in capsules or straight on the wallpaper, the workspace strip is dots, bars, rings or numbers written out, and a tray holds the icons applications put there.
On more than one screen, every screen gets the whole bar, and the island is live on the one you are typing on. Each screen keeps widgets and notes of its own and the dock is on all of them, a workspace number brings that workspace to the screen you are on, and the brightness keys dim that screen — an external monitor over DDC/CI.
The first character says what the field is for. Plain text searches
applications, = calculates, @ finds an open window, ! starts a countdown,
' is the clipboard history, : picks an emoji, and > is the shell itself —
every panel and setting by name. Applications are ranked by what you actually launch.
The dock holds what you pinned, then whatever else is open, and the same pins come first in the launcher. Right-click an icon for its windows by name.
Any module can live on the wallpaper, on a grid, in four shapes: a square, a card, a large square and a band. Right-click the wallpaper to arrange — a card holds every module, a corner is pulled for another shape, and a click opens that widget's own look — for a photo widget, the picture of your own it holds.
Three themes on the same modules: Modern is a figure with a caption, Analogue draws each one as an object, Sticker cuts it out as coloured stickers that sit on the wallpaper without filling their squares, and any of them is a choice per widget. A spectrum of whatever is playing sits on the grid as bare bars, or runs along a whole edge under the windows.
The palette comes out of the painting. Pick a wallpaper and its colours
reach everything at once: the island and the widgets, the terminal and the
prompt, btop, cava, yazi, neovim, VSCodium, the GTK, Qt and KDE windows, Thunar
down to its folders, Vesktop, Zen and Spotify. Or pick one of nine palettes
instead. The desk comes with forty paintings, in the style it is named after,
and a video of your own in ~/.local/share/wallpapers/animated can be the
wallpaper too: it plays under the windows and the palette comes from its first
frame.
In the terminal, the prompt is laid out like the bar, and fa greets you with
fastfetch beside an animated scene drawn in pixel art out of the palette.
A note is paper: a pastel square with a title and the body in handwriting.
SUPER + S opens the deck; on the wallpaper a note sits on a square, or stacks
with others along an edge as tabs that peek out under the pointer.
A board for what has to be done. SUPER + K is to do, doing, done, with
cards dragged between the lanes, and a task's day shows as a dot under the
month wherever a month is drawn.
Eleven small games, played in the island — SUPER + G opens a shelf, and
the island becomes the board. A family of five small creatures lives on the
bar: one out at a time, earning levels from being fed and played with, each
hatched from an egg and drawn in one of four styles. Nothing dies, and a week
away costs nothing.
The shell locks the session itself, over the blurred desk, and the login screen is the same lock with the desk taken away: an SDDM theme with the same island, the same clock and the same pill, over a blurred painting. Both rest on the clock alone. Any key brings in your account and the field, and is already the first letter of your password; Escape sends them away again. The clock is stacked or on one line, in Settings → Session → Lock screen, and the login screen always stacks it. The picture and the name are your account's, and Settings → Session changes them for both screens at once: drop an image on the card and it is made square and kept where the login screen reads it; type a name and it becomes the account's full name.
With an infrared camera, the lock opens for your face. Touch a key or the pointer and the island grows under the camera, a ring turns around its padlock while it looks, closes green, the padlock opens and the blur lifts off the desk. It is its own conversation beside the password, so a face it does not know never costs you a try, and the login screen still asks for the password after a boot. Settings → Session lists the faces it knows, adds another, removes one, and lets you try it without locking.
Settings is the one panel that is not the island — an ordinary window where each option is drawn as the thing it changes, and profiles keep whole desks under names: Moon castle, Fuji and Night bay come with it.
Arch Linux, and Hyprland 0.56 or newer (tested on 0.56.2), configured in Lua. Run it from a terminal, in the Hyprland session or on a console before there is one. The two plugins are built against the compositor that is running, so from a console the first session opens a terminal that builds them:
git clone https://github.com/andreumassanet/impasto.git ~/impasto
cd ~/impasto
./setup install
It installs the packages it is missing — upgrading the system in the same step,
as Arch asks — oh-my-zsh, everything in home/ into your home and everything
in system/ into /, the two Hyprland plugins and the vector cursor, and the
login screen, switched on unless your machine already uses another display
manager. It sets up Thunar, VSCodium, Vesktop and Spotify, dark GTK
applications, and what opens which kind of file — leaving alone any your
machine already has an answer for. Where there is an infrared camera it
installs howdy-next and asks to enrol your face. It asks for your password
through sudo for pacman, for the copy into /, and to let spicetify patch
Spotify. A program that is open, or a Spotify you have never started, is
skipped with the reason and set up by the next update. After that they follow
the wallpaper on their own; Spotify from its next start.
Run ./setup with nothing after it and it asks instead: the verbs on one
screen, and what an install may leave out on the next, which is the flags below
with somewhere to press them.
| Flag | |
|---|---|
--skip-packages | install nothing; copy and build only |
--skip-system | leave / alone — no login screen, and no password for it |
--skip-plugins | no shake to find, no glass |
--skip-extras | leave Thunar, VSCodium, Vesktop, Spotify, GTK and face unlock alone |
--aur-helper yay|paru | which helper builds the AUR half — built from the AUR if you have neither |
--noconfirm | take the default at every question |
-n, --dry-run | say what would happen, and do none of it |
./setup update # git pull, then install again — the same flags
./setup uninstall # remove what it installed, and put back what it moved aside
./setup help # every verb and flag
update follows the branch you cloned: main moves only when a version is
released, and work in progress lives on dev. The version installed is under
Settings → System, with what the branch has waiting since it and a button that
runs update in a terminal.
Nothing is linked: setup copies, and remembers what it wrote. A file of
yours already in the way is moved to ~/.local/state/impasto/backups/ first; a
file you edit afterwards is left alone, with the new version beside it as
<name>.new, and one you delete stays deleted — the wallpapers you do not want,
say. Settings → System lists both, each with a button to put impasto's version
back. Editing the repository itself? ./setup sync copies it onto the
desk, and ./setup sync --watch keeps doing it on every save.
Every package is listed in packages/pacman.txt and packages/aur.txt, grouped
by what it is for; an optional one that is missing takes its own control away
rather than failing.
| 🪟 | Compositor | Hyprland |
| 🖱️ | Shake to find | hypr-dynamic-cursors |
| 🫧 | Glass on the windows | hyprglass |
| 🐚 | Desktop shell | Quickshell |
| 🖼️ | Wallpaper daemon | awww |
| 🖥️ | Terminal | kitty |
| ⌨️ | Interactive shell | zsh · oh-my-zsh |
| ❯ | Prompt | starship |
| 🎨 | Greeting | fastfetch |
| 📊 | System monitor | btop |
| 🎵 | Audio visualiser | cava |
| 📁 | File manager | yazi |
| 🗂️ | File manager in a window | Thunar |
| ✏️ | Editor | neovim |
| 📝 | Editor in a window | VSCodium |
| 🖼️ | Image viewer | imv |
| 🪄 | Annotator | satty |
| 💬 | Chat | Vesktop |
| 🎧 | Player | Spotify · spicetify |
| 🌐 | Browser | Zen |
| 🔆 | Monitor brightness | ddcutil |
| 🔑 | Login screen | SDDM |
| 👤 | Face unlock | howdy-next |
Every key belongs to a profile: Settings → Keys changes any of them, the compositor's included, and switching profile switches them all. A few worth knowing first:
These are worth your time whether or not you use this repository. No code was copied from any of them; what carried over from the shells are ideas — one file per island state, one transient signal for every ephemeral event, input debounced to one frame, and a capture that photographs the screen and draws the selection on the photograph.
Built on Quickshell and Hyprland. The pointer is Bibata, repainted; the folders are Papirus, re-pointed; the type is Inter and JetBrains Mono. Six of the nine palettes are other people's work, carried as they are: Catppuccin Mocha and Latte, Tokyo Night, Gruvbox, Nord and Rosé Pine.
Copyright © 2026 Andreu Massanet — released under the GNU GPL-3.0.
You may use, study, change and share any of it. If you build on it and pass the result on, it stays under the GPL and its source stays available. Keep the header at the top of each file, which carries this repository's address, and a line of credit back here is the kind thing to do.
57 followers · starred Sep 2026
72 followers · starred Sep 2026