A personal, opinionated, vibecoded rice for the lilith Wayland window manager.
Made for one machine: a Lenovo ThinkPad X1 Carbon Gen 7 (Intel i7-8565U, UHD 620) on Void Linux (glibc, runit).
This is my own custom rice, built around one laptop: a Lenovo ThinkPad X1 Carbon Gen 7 with an Intel CPU and integrated Intel graphics. It is opinionated and vibecoded (written together with an AI assistant), so expect my taste, not a general-purpose distribution. It will probably run on other Void glibc machines, but the power, firmware and driver choices are tuned for this one.
It stands on the shoulders of three projects. Thank you:
| @ohto121 | lilith: the Wayland compositor with the infinite canvas that everything here is built on |
| @ceapeapea | lilith-dotfiles: the lilith rice this one is based on |
| @ceapeapea | vxwm-dotfiles: the bar-centred design: the bar, its proportions, and menus that look like the bar |
- Bar-centred. The bar is the heart of the desktop, copied from vxwm-dotfiles: compact, floating, 30 px tall, 8 px above the bottom edge, 57 % of the screen wide (550 px side padding on a 2560 px panel). Menus look like it. Volume and brightness show on the bar with an icon and a percentage, never as popups.
- Minimal and brutalist. Square corners, double borders, no gaps, no blur, no transparency, one font.
- Terminal-style. foot + zsh, a pixel font (Gallant Raster Term), menus that are just lines of text.
- No idle, no lock screen, no notifications. Open the lid and you are back in your session.
- Lightweight. Aiming for 1 GB of RAM or less at idle. No display manager, no heavy daemons.
- One source of truth. Colours, font, UI scale and wallpaper live in one file:
palette.conf. - Readable and safe. Every file starts with a header saying what it is and how to reload it. The installer is idempotent, backs up what it replaces, and verifies itself.
| Job | App |
|---|---|
| Browser | Zen Browser (Super+F) |
| File manager | Strata (Super+E), with yazi in the terminal (Super+Shift+E) |
| Editor | Zed (Super+T) |
| Terminal | foot (Super+Q), greeting with fastfetch and a Void logo without the word |
| Shell | zsh with syntax highlighting, autosuggestions, history search, fzf, completions, git-aware prompt |
| Launcher, menus | wmenu, styled like the bar (see below) |
The bar sits at the bottom: tags, then cpu, ram, temperature, brightness, volume, battery, and a status text
(lilith | Sun 08 Nov 19:20). While you record the screen a bright red REC badge appears in it.
Menus open on the bottom edge in the bar's colours and font:
| Menu | Key | What it does |
|---|---|---|
| App launcher | Super+R |
Every program in your PATH |
| Clipboard history | Super+V |
Text and images (cliphist) |
| Power menu | Super+Escape |
One line: Exit · Suspend · Reboot · Poweroff (no lock) |
| Key cheatsheet | Super+/ |
Every key binding, searchable |
| Font picker | Super+Shift+T |
Sets the font for terminal, bar and menus |
| Wallpaper picker | Super+Shift+W |
Choose from ~/Pictures/Wallpapers |
| Wi-Fi | Super+N |
NetworkManager networks (new secured networks open nmtui) |
| Bluetooth | Super+Shift+N |
Power, scan, connect and disconnect |
Print dims the screen and lets you drag an area (accent-coloured outline); Shift+Print captures everything.
Files go to ~/Pictures/Screenshots and the clipboard. Super+Print records an area, Super+Shift+Print the screen;
press again to stop. Files go to ~/Videos/Recordings.
Gallant Raster Term is the default everywhere (terminal, bar, menus, GTK, fontconfig). Also installed: JetBrains Mono (code in Zed), Space Grotesk, Terminus, and Symbols Nerd Font (the bar icons).
| Session | runit + elogind only (seat, lid, power button, suspend). No acpid, no seatd, no idle daemon |
| Network | NetworkManager + nmtui. wpa_supplicant is disabled, not removed (NetworkManager needs it) |
| Bluetooth | bluez + bluetoothd, your user in the bluetooth group |
| Audio | PipeWire + WirePlumber + alsa-pipewire, wired as the Void handbook describes |
| Graphics | Mesa (iris), Vulkan, Intel VA-API (iHD), Wayland-native session |
| Power | tlp + thermald, charge capped at 80 %, Intel microcode (nonfree repo, enabled for you) |
| Brightness | brightnessctl (your user in video), keys show on the bar |
Change one line: scale=1 in ~/.config/lilith-rice/palette.conf (try 1.25 or 1.5), then lilith-theme
and restart the session.
All of these are installed for you. Void packages (glibc, x86_64):
sudo xbps-install -y base-devel git pkg-config make gcc wlroots0.19-devel \
wayland-devel wayland-protocols libinput-devel libxkbcommon-devel libdrm-devel \
fcft-devel pixman-devel xcb-util-wm-devel xorg-server-xwayland bluez dbus elogind \
NetworkManager foot foot-terminfo zsh zsh-syntax-highlighting zsh-autosuggestions \
zsh-completions zsh-history-substring-search yazi fzf fastfetch wmenu wl-clipboard \
cliphist grim slurp wf-recorder curl brightnessctl pipewire wireplumber \
alsa-pipewire fontconfig dejavu-fonts-ttf terminus-font unzip xz mesa-dri \
vulkan-loader mesa-vulkan-intel intel-media-driver linux-firmware-intel sof-firmware \
tlp thermaldStrata runtime libraries: see packages/void-strata.txt. Zen runtime libraries: packages/void-zen.txt.
Downloaded (not in Void's repos): Gallant, JetBrains Mono, Space Grotesk, Symbols Nerd Font, Strata, Zen, Zed.
lilith-rice packages checks that every package name exists before you install anything.
Finish a normal Void installation, connect to Wi-Fi (wpa_supplicant), and make sure your user is in
wheel, audio, video and network. Then:
sudo xbps-install -Syu # update the system (xbps first if it asks)
sudo xbps-install -y git
git clone https://github.com/imnalo/lilith-dots ~/lilith-dots
cd ~/lilith-dots
./lilith-rice install # everything except the network switch
./lilith-rice network # LAST: wpa_supplicant -> NetworkManager, then run nmtui
rebootLog in on tty1: the desktop starts by itself. Press Super+/ to see every key.
If something prints FAIL, read the hint next to it; ./lilith-rice verify shows the whole picture.
Every step in detail: docs/WHAT-IT-DOES.md.
| Command | What it does |
|---|---|
install |
deps, services, bluetooth, fonts, wallpapers, source, config, build, strata, zen, zed, verify |
deps |
System update, nonfree repo, every package one by one, Intel microcode |
packages |
Checks that every package name exists in the Void repos (installs nothing) |
services |
Enables dbus, elogind, bluetoothd, tlp, thermald |
bluetooth |
Bluetooth group and rfkill |
fonts |
Gallant, JetBrains Mono, Space Grotesk, Symbols Nerd Font (checksums pinned where possible) |
wallpapers |
The eight wallhaven wallpapers to ~/Pictures/Wallpapers |
source / config / build |
Fetch lilith, link dotfiles and system files, compile lilith |
strata / zen / zed |
Install the apps from their official releases |
network |
Switch Wi-Fi to NetworkManager (asks first) |
theme |
Re-apply palette.conf |
verify / update |
Check everything / pull and rebuild |
Everything the script does, by hand, as your normal user (sudo where shown).
1. Update, enable the nonfree repo, install packages
sudo xbps-install -Syu
sudo xbps-install -y void-repo-nonfree && sudo xbps-install -Sy
sudo xbps-install -y base-devel git pkg-config make gcc wlroots0.19-devel \
wayland-devel wayland-protocols libinput-devel libxkbcommon-devel libdrm-devel \
fcft-devel pixman-devel xcb-util-wm-devel xorg-server-xwayland bluez dbus elogind \
NetworkManager foot foot-terminfo zsh zsh-syntax-highlighting zsh-autosuggestions \
zsh-completions zsh-history-substring-search yazi fzf fastfetch wmenu wl-clipboard \
cliphist grim slurp wf-recorder curl brightnessctl pipewire wireplumber \
alsa-pipewire fontconfig dejavu-fonts-ttf terminus-font unzip xz mesa-dri \
vulkan-loader mesa-vulkan-intel intel-media-driver linux-firmware-intel sof-firmware \
tlp thermald
sudo xbps-install -y intel-ucode && sudo xbps-reconfigure -fa # Intel microcode (nonfree)2. Services (runit)
for s in dbus elogind bluetoothd tlp thermald; do sudo ln -s /etc/sv/$s /var/service/$s; done3. Get this repo and the compositor
git clone https://github.com/imnalo/lilith-dots ~/lilith-dots
git clone https://github.com/ohto121/lilith ~/.local/src/lilithlilith is not packaged for Void, so it is compiled from source as your normal user. Sources live in
~/.local/src/lilith, the result is one binary, installed to ~/.local/bin/lilith. All build libraries came with
the -devel packages above (notably wlroots0.19-devel; lilith needs wlroots 0.19, not 0.20).
4. Fonts (into ~/.local/share/fonts/lilith)
mkdir -p ~/.local/share/fonts/lilith /tmp/fonts && cd /tmp/fonts
curl -fsSLo gallant.tar.gz https://codeload.github.com/NanoBillion/gallant/tar.gz/v0.1
echo "bb5477bb2b0c2e06b0242d1c6da17d957d78654fb4df9374dc49862b67b75c40 gallant.tar.gz" | sha256sum -c - # must say OK
tar -xzf gallant.tar.gz && cp gallant-0.1/gallant.ttf ~/.local/share/fonts/lilith/
curl -fsSLo jb.zip https://github.com/JetBrains/JetBrainsMono/releases/download/v2.304/JetBrainsMono-2.304.zip
echo "6f6376c6ed2960ea8a963cd7387ec9d76e3f629125bc33d1fdcd7eb7012f7bbf jb.zip" | sha256sum -c - # must say OK
unzip -q jb.zip -d jb && cp jb/fonts/ttf/JetBrainsMono-{Regular,Bold,Italic,BoldItalic}.ttf ~/.local/share/fonts/lilith/
curl -fsSLo sg.zip https://github.com/floriankarsten/space-grotesk/releases/download/2.0.0/SpaceGrotesk-2.0.0.zip
unzip -q sg.zip -d sg && find sg -name '*.ttf' -exec cp {} ~/.local/share/fonts/lilith/ \;
curl -fsSLo nerd.zip https://github.com/ryanoasis/nerd-fonts/releases/latest/download/NerdFontsSymbolsOnly.zip
unzip -q nerd.zip -d nerd && cp nerd/SymbolsNerdFont-Regular.ttf ~/.local/share/fonts/lilith/
fc-cache -f && fc-list | grep -i "gallant" # shows the real family name of the Gallant fileTerminus comes from the terminus-font package. If the Gallant family is not called Gallant Raster Term,
put its real name in font= in palette.conf (the script does this for you).
5. Wallpapers (wallpapers/wallhaven.txt; tries .jpg, then .png)
mkdir -p ~/Pictures/Wallpapers && cd ~/Pictures/Wallpapers
for id in 0qy157 g8kyj3 zpvdzv 39lg2d 90kkr1 2166q9 qrpp7d og7rj9; do
p=$(echo $id | cut -c1-2)
curl -fLO "https://w.wallhaven.cc/full/$p/wallhaven-$id.jpg" || curl -fLO "https://w.wallhaven.cc/full/$p/wallhaven-$id.png"
doneThe default wallpaper is 39lg2d.
6. Palette, compositor config, build
mkdir -p ~/.config/lilith-rice ~/.local/bin
cp ~/lilith-dots/theme/palette.conf ~/.config/lilith-rice/palette.conf
cp ~/lilith-dots/lilith/config.h ~/.local/src/lilith/config.h
cp ~/lilith-dots/lilith/config/*.h ~/.local/src/lilith/config/
ln -sf ~/lilith-dots/bin/lilith-theme ~/.local/bin/lilith-theme
~/.local/bin/lilith-theme --no-build # writes theme.h, foot and Strata colours
make -C ~/.local/src/lilith # compile
install -Dm755 ~/.local/src/lilith/lilith ~/.local/bin/lilith7. Dotfiles and scripts
for f in ~/lilith-dots/bin/*; do ln -sf "$f" ~/.local/bin/$(basename "$f"); done
ln -sf ~/lilith-dots/lilith-rice ~/.local/bin/lilith-rice
mkdir -p ~/.config/{foot,yazi,fontconfig,fastfetch,gtk-3.0,gtk-4.0,zed}
ln -sf ~/lilith-dots/config/foot/foot.ini ~/.config/foot/foot.ini
ln -sf ~/lilith-dots/config/yazi/yazi.toml ~/.config/yazi/yazi.toml
ln -sf ~/lilith-dots/config/fontconfig/fonts.conf ~/.config/fontconfig/fonts.conf
ln -sf ~/lilith-dots/config/fastfetch/config.jsonc ~/.config/fastfetch/config.jsonc
ln -sf ~/lilith-dots/config/gtk-3.0/settings.ini ~/.config/gtk-3.0/settings.ini
ln -sf ~/lilith-dots/config/gtk-4.0/settings.ini ~/.config/gtk-4.0/settings.ini
ln -sf ~/lilith-dots/config/zed/settings.json ~/.config/zed/settings.json
ln -sf ~/lilith-dots/config/zsh/zshrc ~/.zshrc
ln -sf ~/lilith-dots/config/zsh/zprofile ~/.zprofile
sudo usermod -s "$(command -v zsh)" "$USER"8. System files, power menu, audio
sudo install -Dm644 ~/lilith-dots/system/etc/elogind/logind.conf.d/10-lilith.conf /etc/elogind/logind.conf.d/10-lilith.conf
sudo install -Dm644 ~/lilith-dots/system/etc/tlp.d/10-x1c7.conf /etc/tlp.d/10-x1c7.conf
# power menu: let wheel suspend/reboot/poweroff without a password (check the paths with: command -v zzz reboot poweroff)
echo '%wheel ALL=(root) NOPASSWD: /usr/bin/zzz, /usr/bin/reboot, /usr/bin/poweroff' | sudo tee /etc/sudoers.d/10-lilith-power
sudo chmod 0440 /etc/sudoers.d/10-lilith-power && sudo visudo -c
sudo mkdir -p /etc/pipewire/pipewire.conf.d /etc/alsa/conf.d
sudo ln -s /usr/share/examples/wireplumber/10-wireplumber.conf /etc/pipewire/pipewire.conf.d/
sudo ln -s /usr/share/examples/pipewire/20-pipewire-pulse.conf /etc/pipewire/pipewire.conf.d/
sudo ln -s /usr/share/alsa/alsa.conf.d/50-pipewire.conf /etc/alsa/conf.d/
sudo ln -s /usr/share/alsa/alsa.conf.d/99-pipewire-default.conf /etc/alsa/conf.d/9. Bluetooth
sudo usermod -aG bluetooth "$USER" && sudo rfkill unblock bluetooth10. Strata, Zen, Zed
sudo xbps-install -y bubblewrap ffmpeg ffmpegthumbnailer gstreamer1 gst-libav \
gst-plugins-base1 gst-plugins-good1 gtk4 gtksourceview5 gvfs poppler-glib \
adwaita-icon-theme
# Strata: download the x86_64-unknown-linux-gnu archive + .sha256 from https://github.com/lgse/strata/releases/latest
sha256sum -c strata-*-x86_64-unknown-linux-gnu.tar.gz.sha256 # must say OK
tar -xzf strata-*-x86_64-unknown-linux-gnu.tar.gz && install -Dm755 strata-*-x86_64-unknown-linux-gnu/strata ~/.local/bin/strata
# Zen:
sudo xbps-install -y gtk+3 dbus-glib alsa-lib libXtst pciutils
curl -fsSLO https://github.com/zen-browser/desktop/releases/latest/download/zen.linux-x86_64.tar.xz
mkdir -p ~/.local/opt && tar -xJf zen.linux-x86_64.tar.xz -C ~/.local/opt && ln -sf ~/.local/opt/zen/zen ~/.local/bin/zen
# Zed:
curl -fsSL "https://cloud.zed.dev/releases/stable/latest/download?asset=zed&arch=x86_64&os=linux&source=docs" -o zed.tar.gz
tar -xzf zed.tar.gz -C ~/.local && ln -sf ~/.local/zed.app/bin/zed ~/.local/bin/zed11. Switch Wi-Fi to NetworkManager (last)
sudo rm /var/service/wpa_supplicant /var/service/dhcpcd # only the service links; the packages stay
sudo ln -s /etc/sv/NetworkManager /var/service/NetworkManager
nmtui # activate a connection, enter the passwordwpa_supplicant stays installed because NetworkManager uses it as its Wi-Fi backend; only its service would clash.
12. Reboot and log in on tty1.
Super is the main modifier. The original lilith bindings are kept; I only added new ones. Every binding lives in
lilith/config/config_keys.h, and Super+/ lists them on screen.
| Keys | Action |
|---|---|
Super+Q / Super+Enter |
Terminal |
Super+F / Super+E / Super+T |
Zen browser / Strata / Zed |
Super+Shift+E |
yazi |
Super+R |
App launcher |
Super+V |
Clipboard history |
Super+Escape |
Power menu |
Super+/ |
Key cheatsheet |
Super+Shift+T / Super+Shift+W |
Font picker / wallpaper picker |
Super+N / Super+Shift+N |
Wi-Fi menu / Bluetooth menu |
Print / Shift+Print |
Screenshot: area / whole screen |
Super+Print / Super+Shift+Print |
Record: area / whole screen (again to stop) |
Super+C |
Close window |
Super+Shift+F |
Fullscreen |
Super+1…9 |
View a tag; +Shift send the window there; +Ctrl toggle it |
Super+0 |
Show all tags |
Super+W/A/S/D |
Focus the window above / left / below / right |
Super+Tab / Super+K |
Next / previous window, centred |
Super+Shift+Tab |
Centre the focused window |
Super+Z |
Zoom out to fit all windows |
Super+= / Super+- |
Zoom in / out |
Super+Home |
Return the canvas to home |
Super+Shift+Arrows |
Pan the canvas |
Super+B |
Show / hide the bar |
Super+Shift+Q |
Quit lilith |
| Volume / brightness keys | Change them; the bar updates |
Mouse: drag empty canvas to pan · scroll over the canvas to zoom · Super+left-drag moves a window ·
Super+right-drag resizes it · right-click empty canvas for a terminal.
lilith's original animations are kept untouched (lilith/config/config_animation.h), as in its developer's demo.
| I want to change… | Edit | Then |
|---|---|---|
| Colours, font, scale, wallpaper | ~/.config/lilith-rice/palette.conf |
lilith-theme, restart the session |
| Bar layout and text | lilith/config/config_bar.h |
lilith-rice build, restart the session |
| Borders / animations / keys / touchpad | lilith/config/config_*.h |
same |
| Packages | packages/*.txt |
lilith-rice deps |
| zsh, foot, yazi, fastfetch, Zed | config/<app>/… |
open a new window |
Working: everything above. Not built yet (docs/ROADMAP.md): instant recolouring from the wallpaper
(colours are set in palette.conf for now), menus that slide up at bar width (today they span the bottom edge), and the
rope-corner screenshot selector (today: dimmed screen and an accent-coloured outline).
lilith-rice the installer (one command)
bin/ lilith-session · autostart · status · menu · theme · shot · record
lilith/ compositor config (config.h + config/*.h), copied into the lilith source tree
config/ foot · zsh · yazi · fontconfig · fastfetch · gtk · zed (symlinked into ~)
system/ files installed to /etc (elogind, tlp)
packages/ package, service and download lists
wallpapers/ wallhaven IDs (no images in the repo)
theme/palette.conf colours, font, scale, wallpaper
docs/ WHAT-IT-DOES.md · ROADMAP.md
lilith is by @ohto121; the files under lilith/ are derived from its configuration and
keep its licences. Design and many ideas from @ceapeapea. Strata
is by lgse. Everything else here is MIT.