Arch Linux · Hyprland · a whole desktop

A rice you can read.
And one you can wear.

Not a theme pack — the compositor config, the bars, the launcher, the notification daemon, the session manager and the tools that draw them. Published straight out of the repository that keeps one machine alive, with everything identifying that machine removed by an allowlist.

Hyprland 0.56 · Quickshell + Rust · Catppuccin Mocha · GNU GPLv3-or-later

A drawing of the bar, not a screenshot
01 / THE BARS

Written in QML.

Quickshell, not Waybar: one panel per output, a Rust daemon behind them answering what Hyprland’s IPC will not, and a fullscreen mode that relocates a whole cluster to another screen rather than hiding it.

02 / THE LAUNCHER

Seven modes, one key.

Apps, windows, files, games, settings, run, ssh — tabbed behind a single bind. The settings tab is a live toggle board calling the same helpers the bar’s own clicks call, so the two cannot drift.

03 / THE SESSION

It comes back.

Every window’s workspace, geometry, group and command line, snapshotted on a timer and at shutdown, laid back out at the next login — matched by address, never by title or PID.

The bars

Nothing on the bar is allowed to block.

The desktop surfaces are Quickshell: QML, one process, drawing Wayland layer surfaces. There is no bar binary with a config file — there is a QML tree, and shell.qml is its root. Bar.qml is the entire layout, and which modules appear is one shown: expression per module, evaluated against the monitor that instance of the bar is on.

Anything that touches the network prints a cache and forks a refresh behind it. The update pill is the model: it returns whatever the cache last said and, if that is stale, forks a rescan and returns the stale numbers anyway. checkupdates and yay -Qua take seconds; a module that waited for them would stall every other module with it. Press play on the drawing above to watch a workspace switch, a rescan, the DEV row pin itself and the blur come on.

Workspaces switching and the windows retiling under them, the DEV row pinning itself, and the glass coming on — recorded from the published tree, in a nested session on a headless output.recorded · 22s · no sound
ModuleWhat it does
Workspace tabsNamed and renameable in place, icons derived from the windows on them, drag a tab to another monitor
DEV rowA second strip under the main bar: workspaces bound to F1F12 by position, so the row reads like a tab bar and the keys never drift
Agent columnLive badges for terminal coding agents, their quota meters, and the local models loaded in Ollama
UpdatesPending pacman and AUR counts, cross-referenced against unread Arch news — the package named in the news is the one that will need a hand
AudioThe group follows whichever DAC is awake: per-application volume, microphone, headset battery
KillswitchOne pill that freezes every local agent and stops the model server
A tiled Hyprland desktop with grouped windows, the group bar tabs coloured per window
Grouped windows. The tab colours come from the same daemon that drives workspace attention, so a group’s palette matches the bar’s.
The launcher

Seven modes behind one keybind.

SUPER + D opens on apps; Shift + Right/Left walks the tabs. The apps tab is combi wrapping drun alone, which looks redundant and is not: plain drun accepts unmatched text only on Ctrl+Return while combi accepts it on Return, so the launcher doubles as a command bar.

The rofi launcher open over a blurred desktop, showing the apps tab
Apps mode. Matching is prefix, so every token must start a word — the cost is that substring search is gone.
The launcher's settings mode, a list of toggles each showing its current state
settings — a live toggle board. Each row shows its state, and toggling redraws the list instead of closing.
The launcher's games mode listing installed games with cover art
games — Steam manifests across every library, Lutris through a cached listing, plus any Categories=Game desktop entry.

Windows mode uses hyprctl rather than rofi’s built-in window modi, which talks EWMH over xcb — absent on Wayland, so the list comes up empty. hyprctl also knows about special workspaces, so the scratchpad is reachable.

Notifications

Cards that do the thing they are about.

swaync, themed to match, with actions wired to the subject of the notification: a finished download opens the file, a screenshot opens the screenshot, a failed unit offers its journal. The bell in the bar toggles the sidebar.

Notification toasts in the corner of the desktop with action buttons
Toasts, with their actions attached.
The swaync sidebar open, listing recent notifications and control widgets
The sidebar, opened from the bell.
The session

A power cut should cost you nothing.

hypr-session snapshots every window — workspace, geometry, group membership, and the command line that produced it — on a timer and at shutdown, and lays it back out at the next login.

Windows are matched back by address, never by title or PID: titles change while you work, and PIDs get reused.

Terminal output of the hypr-session tool restoring a saved layout
The restore, as it actually reports itself.
The theme

Catppuccin Mocha, and real blur under it.

GTK 3 and 4, Qt 5 and 6, the cursor, the icon folders, bat, btop, cava, mpv, the launcher, the bars, the lock screen and the shell. The “glass” is Hyprland’s own blur under layer rules, toggled at runtime — the bar asks the compositor for it rather than faking it in CSS, which is why it is one IPC call and not a config edit.

The hyprlock screen, blurred wallpaper behind a clock and password field
hyprlock, over the wallpaper it was already showing.
The VaporWall wallpaper manager, showing per-monitor wallpaper selection
Wallpapers are wpaperd, driven by VaporWall — a separate project, not part of this repository.
Neovim and the yazi file manager side by side in kitty terminals
kitty, NvChad and yazi on the same palette.
A two-column fastfetch panel
fastfetch cannot draw columns, so the panel is a Python script it shells out to.
Run it yourself

Dry run first. It prints everything it would touch.

--apply backs up anything it replaces to ~/.vaporos-backup/<timestamp>/, substitutes the placeholder home and account name the export writes, and then prints the steps it deliberately will not take for you: installing packages, building the Rust daemon, enabling units, and one optional polkit rule.

git clone https://git.coolhole.net/aestheticjmack/VaporOS.git vaporos
cd vaporos
./install.sh              # dry run: prints every file it would write
./install.sh --apply

Read docs/adapting.md before your first login. Monitor names are hardcoded — as they are in any Hyprland setup — and the four places that name them are listed there in the order they will bite you.

How it is published

An allowlist, and a gate that fails the build.

This is an export. The repository it comes from holds one machine’s entire state — /etc, package sets, monitor EDIDs, mount points, and a homelab of private services — and is not public. Three rules decide what crosses.

AllowlistA file is published only if the export names it. Anything new is absent by default — a forgotten allowlist entry is a missing feature, a forgotten scrub rule is a leak.
ScrubRewrites what is structurally unavoidable. A home directory has to be some path; the export writes a placeholder, and the installer writes yours.
Leak gateEvery output file is grepped for the user name, the domains, the host names, any address literal and key material. One hit deletes the tree and exits non-zero, so a bad build cannot be committed by accident.

The documentation is treated the same way: pages that only describe that one machine are not published at all, and whole paragraphs naming the homelab are dropped from the pages that are — with the code example under them. Nothing is rewritten to hide anything; the removal is whole paragraphs, not edits inside them.

A few things are therefore inert. The workspace tabs can show an icon for a running self-hosted service, and the list of those services is not published — so that reader finds nothing and the tabs simply show no service icons. It is left in place because deleting it would mean rewriting the modules that call it.

Take what you want.

Free software under GNU GPLv3 or later. Third-party assets — the Catppuccin palettes, the bundled btop themes, the Nerd Font glyphs — keep their own licenses.