Isla
A Dynamic Island for my Linux desktop. A shell for Hyprland that fits in one black pill at the top of the screen.
Isla is the shell I built for my desktop, Hyprland on NixOS. One black pill hangs from the top of every screen and opens into whatever I need right then: a launcher, notifications, Spotify, WhatsApp, Slack, a file manager. Then it goes back to being a pill.
Why I built it
I wanted the desktop to have one place. A bar, a launcher, a notification center, volume and Wi-Fi popups, and a Spotify window kept open just to skip a track: each lived in its own corner of the screen, each with its own look. The iPhone’s Dynamic Island showed that a single object can handle all of that, as long as it knows how to change shape.
Isla started as a motion experiment and became my working environment. I use it every day, on 155 Hz and 240 Hz monitors.
What it replaces
- Spotify. A native client inside the pill, with search, playlists, the queue, devices and synced lyrics. Sound comes from spotifyd, a daemon written in Rust; the official app never has to be installed.
- WhatsApp and Slack. They run inside the shell, not in a browser window. Isla repaints WhatsApp in true black with the theme’s accent, and drops the banners and promos.
- The file manager. Isla Files grows out of the pill into a full window: Quick Look on the space bar, search by name and by content, and network printers and scanners that work with no drivers.
- The bar, the launcher and notifications. The launcher doubles as a window switcher, and notifications arrive as Live Activities with the app’s own actions.
Slack and Spotify in the pill, at less than half the memory.
With both open, Isla's Slack and Spotify take about 540 MB. Slack's desktop app and Spotify in Chrome take about 1,220 MB, and that is before Spotify in Chrome is even signed in.
- Slack ~430 MB
- Spotify with spotifyd ~105 MB
- Slack desktop app ~655 MB
- Spotify in Chrome ~570 MB
How it is built
Written in QML on Quickshell, with a Rust core for files. Each state of the pill is an Activity with a priority, and the highest one that wants the screen gets it. Width, height and radius each follow a damped spring solved in closed form against the real frame time, so the motion is the same at 155 Hz and at 240 Hz. The whole thing is declared in my NixOS configuration: a rebuild brings the shell back on any machine.
The demo up there uses the same springs, baked into CSS linear() curves,
and runs no JavaScript at all: the states are a radio group, and each one is
a :has() selector.
Isla has its own site with the full tour: the launcher, notifications, Spotify, WhatsApp and Isla Files, running in the browser.