A Neon Genesis Evangelion desktop for Hyprland.
Quick start · Features · Install · Configuration · Other apps · Lock and login · FAQ · Contributing
eva-desk is a daemon that runs next to Hyprland and draws the desk: a bar, a launcher, a screenshot tool, wallpapers, and Unit-01 standing behind your windows. The look comes from the show's title cards and computer screens: heavy mincho type, monospace readouts, purple and acid green on black, hazard stripes when something is wrong. Nothing animates for long. Every effect is a single cut or pulse, then the picture holds still.
It needs Hyprland's Lua config (hyprland.lua). It does not work with the classic hyprland.conf.
git clone https://github.com/Singularitty/eva-desk && cd eva-desk
./install.sh --extras all --lock --gtkHyprland reloads and the daemon starts. Then:
| key | |
|---|---|
Super+Space |
launcher |
Super+Return |
maximise the window, Unit-01 behind it |
Alt+Tab |
window switcher |
Super+M |
power menu |
Print |
screenshot |
Super+D |
dock a window into the figure's space |
Everything is in ~/.config/eva-desk/eva.toml; eva-ctl apply after editing. ./uninstall.sh puts things back.
The figure. Unit-01 stands to the right of your windows, on a hexagon field. It appears when the first
window on a workspace opens, then stays still. Super+D docks a window into its space; eva-ctl figure off hides it.
Maximise. Super+Return fills the screen with the window, and a large Unit-01 fades in behind it.
Launcher (Super+Space). Type to search apps. The query is set large, matches are listed below it, the
selected one gets a detail card on the right.
Alt+Tab. Window switcher. One card per window, most recent first, with the workspace number. Release Alt to jump.
Power menu (Super+M). Lock, sleep, log out, reboot, shut down. Shutting down and logging out ask twice.
Bar. Workspace tags, window title, clock, tray, now playing, CPU / RAM / network, date, volume. When a workspace is urgent or the CPU is pegged it gets an orange warning strip (second row).
Sound (click VOL on the bar, or eva-ctl panel sound). Outputs, inputs, app streams and recordings on four screens with level bars; arrows move and set, m mutes, d makes a device the default, Enter moves a stream to another device, 1 2 3 toggle do-not-disturb, night light and the power profile. While open it holds the keyboard; Esc or a click outside it closes it, and so does opening the launcher, the power menu or Alt+Tab. This replaces the old eww osettings window, which is no longer needed.
Night light starts wlsunset with no location; to give it one (or any other wlsunset arguments), set EVA_NIGHT_ARGS in the daemon's environment, e.g. env = EVA_NIGHT_ARGS,-l 39.9 -L 116.3 in your Hyprland config.
Workspace switch. A card with the workspace number shows for a moment, then fades.
Screenshots (Print). The screen freezes, you pick a region or a window, it goes to the clipboard and
to ~/Pictures/Screenshots.
Lock screen for hyprlock. One background per monitor, rendered at its size.
Login screen for greetd with ReGreet.
And the rest, in short:
- Wallpapers: one per workspace, shuffled from a pool of your own images. None are bundled; the show's artwork is easy to find (wallhaven's "evangelion" tag has ultrawide and portrait pieces).
- Windows: square corners, a thin purple border, a hard purple shadow, bone corner brackets, the app name and
workspace number as a tag, and a LOCK readout on the focused window. The border gradient no longer rotates
(
border_speed = 100under[hyprland]brings it back). - Small things: a critical notification shows a warning band under the bar. A new window gets one hexagon pulse. The clock digits slide at the minute. After thirty seconds of a maxed-out CPU the stage turns orange until it cools down.
Your own keybinds are left alone. eva-desk adds Super+Return and Super+D, and takes
over your launcher key, Print, Alt+Tab and Super+M. All of them can be changed or turned off.
There is a PKGBUILD in packaging/, so the whole thing can be a pacman package:
cd packaging && makepkg -si
eva-desk-setup --extras all --lock --gtkThe package puts the program in /usr/share/eva-desk and the fonts in /usr/share/fonts/eva-desk.
eva-desk-setup does the per-user part: it writes ~/.config/eva-desk/eva.toml and adds the dofile line to
your hyprland.lua. It takes the same --theme, --extras, --lock and --gtk flags as the script below.
git clone https://github.com/Singularitty/eva-desk
cd eva-desk
./install.sh --extras all --lock --gtkThis copies the program to ~/.local/share/eva-desk, links eva-desk, eva-ctl and eva-extras into
~/.local/bin, downloads the fonts to ~/.local/share/fonts/eva-desk, writes ~/.config/eva-desk/eva.toml
and adds one line at the end of ~/.config/hypr/hyprland.lua (a backup is kept):
dofile(os.getenv("HOME") .. "/.local/share/eva-desk/hypr/eva.lua")Hyprland picks the change up on its own and the daemon starts. If you already run a bar or a wallpaper
script, turn them off, or disable eva-desk's with [bar] enabled = false and [wallpapers] enabled = false.
| flag | |
|---|---|
--extras all |
also theme kitty, starship, Neovim and the shell. A list works too: --extras kitty,starship |
--lock |
set up hyprlock: a background per monitor and a hyprlock.conf |
--gtk |
build the GTK 3 / 4 theme and icon theme. Thunar gets its own stylesheet. Needs an Everforest GTK theme installed to recolour |
--link |
run from the git checkout instead of a copy, handy for hacking on it |
--no-hypr |
do not touch hyprland.lua |
--no-fonts |
skip the font download |
Hyprland 0.56 or newer with the Lua config, Python 3.11+, PyGObject, pycairo, GTK 4, gtk4-layer-shell.
Optional: awww or swww for wallpapers, wpctl for volume, playerctl for now playing, grim and
wl-copy for screenshots, hyprlock for the lock screen, Pillow for rendering the lock and login backgrounds.
The sound panel reads and sets audio with pactl (libpulse) and gojq, finds app icons with geticons;
its quick toggles use dunstctl (dunst, do-not-disturb), wlsunset (night light) and powerprofilesctl
(power-profiles-daemon). Without pactl or gojq the panel shows NO SIGNAL; a missing toggle tool only
disables that toggle.
The fonts (Shippori Mincho B1, Share Tech Mono, Rubik, Doto) are downloaded by the installer.
# Arch
sudo pacman -S --needed python-gobject python-cairo gtk4 gtk4-layer-shell awww grim wl-clipboard playerctl hyprlock
# Debian / Ubuntu
sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-4.0 gir1.2-gtk4layershell-1.0
# Fedora
sudo dnf install python3-gobject python3-cairo gtk4 gtk4-layer-shellEverything is sized from the monitor it is drawn on, so 16:9, 16:10, ultrawide, HiDPI and portrait screens all work, and so do several monitors at once.
[general] main_monitorslists the monitors that get the bar, the figure and the wallpapers, by output name or a part of the description. Leave it empty to use the largest one. Other monitors only get a static wallpaper.- The space kept free for the figure defaults to
"auto": 30 % of the width on ultrawides, 24 % on 16:9 and 16:10, 20 % on squarer screens. Put a number there to override it. - Wallpapers can be any size; they are centre-cropped to the monitor.
- Lock screen backgrounds are rendered per monitor. Run
tools/hyprlock_setup.pyagain if you change your setup.
Everything lives in ~/.config/eva-desk/eva.toml. config/eva.example.toml lists
every option with its default. After editing, run eva-ctl apply.
eva-ctl figure toggle # the figure and its space
eva-ctl impact figure # replay the entrance
eva-ctl herald # replay the maximise backdrop
eva-ctl eyecatch 3 PROJECTS # try the workspace card
eva-ctl alarm "text" # try the EMERGENCY band
eva-ctl alttab # the window switcher
eva-ctl power # the power menu
eva-ctl panel sound|close # the sound panel, or close whichever panel is open
eva-ctl status | reload | quitThe sections you will probably touch:
| section | |
|---|---|
[figures] |
which workspaces get the figure, how much space it takes, the maximise backdrop, window classes to ignore (games) |
[wallpapers] |
the pool, a fixed wallpaper per workspace, named workspaces, other monitors |
[bar] |
height, number of tags, the readouts, now playing, tray, what clicks do, extra buttons |
[overlays] |
the workspace card, the EMERGENCY band, Alt+Tab, the power menu, the pulses, the berserk threshold, and switches for the window frame and the sound panel |
[frame] |
which pieces of the window frame draw: the corner brackets, the app/workspace tag, the LOCK readout |
[power] |
the commands behind lock / sleep / log out / reboot / shut down |
[hyprland] |
the keybinds, gaps, border style and speed |
The palette and fonts are defined once, by role, in eva_desk/themes.py. Everything else reads from
there, including the GTK theme generator, the eww palette file and the app themes below. If you want a
different colour scheme, copy the eva entry, change the values, put your own figure and wallpapers in
assets/themes/<name>/, and switch with eva-ctl theme <name>. Files you list under [theme] retheme_files
are rewritten colour by colour on a switch.
The figure was generated locally with stable-diffusion.cpp. The scripts are in tools/gen/ if you want
to make your own: sil.py cuts a silhouette, rig.py builds the arm rig for the maximise figure,
build_theme_assets.py packs it all.
eva-extras install kitty starship nvim shell, or all, writes matching themes for:
| what | needs | |
|---|---|---|
| kitty | colours and a tab bar with numbered title blocks | include ./eva.conf and tab_bar_style custom in kitty.conf |
| starship | a prompt in the same style: git branch, command time, clock, and a warning block after a failed command | starship |
| nvim | colorscheme, status line, tab colours and dashboard | AstroNvim with heirline and snacks, or just the colorscheme |
| shell | zsh highlighting colours and a vivid theme for ls |
source the file from .zshrc |
Every file it writes gets a backup next to it.
hyprlock. ./install.sh --lock (or tools/hyprlock_setup.py) renders a background for each monitor and
writes ~/.config/hypr/hyprlock.conf. Your old file is backed up. The power menu's LOCK runs hyprlock;
pair it with hypridle if you want it on idle.
ReGreet. tools/login_screen.py renders the background and greeter/regreet.css styles the form.
sudo greeter/install-greeter.sh copies both into /etc/greetd and /usr/share/backgrounds, with backups.
Measured on the daemon at idle with a 3440x1440 main monitor:
| CPU, idle | about 0.4 % of one core (the bar's readouts refresh every 2 s; nothing else runs between events) |
| CPU, during an effect | a short spike while a texture renders, then back to idle. Animations run on the GPU through GTK |
| RAM | about 270 MB resident: GTK, the fonts, and the figure's backdrop kept ready at your monitor's size. Overlays and the launcher render when they open and are dropped when they close |
| GPU memory | about 100 MB at rest; a full-screen effect adds one texture while it is on screen |
| Disk | 9 MB for the program and pictures, plus 30 MB of fonts |
The daemon is a single Python process. It wakes up on Hyprland events (workspace, window, focus) and on the readout timer, and draws nothing while the picture is still.
Can I use it with hyprland.conf? No. The border styles, workspace rules and binds are done through
Hyprland's Lua config.
Something looks wrong on my screen. eva-desk --render /tmp/eva writes PNGs of exactly what the daemon
draws. If those look right, the problem is in Hyprland; if not, open an issue with the PNG. The log is at
~/.local/state/eva-desk/eva-desk.log.
The figure takes too much room. eva-ctl figure off hides it. figure = 0 under [figures] removes it, and
stage = 0.2 makes it narrower.
Too much movement. [overlays] has a switch for each motion. eyecatch_style = "cut" is a louder
version of the workspace card, "soft" the default, eyecatch = false turns it off. berserk = 0 stops the
stage reacting to load. frame = false under [overlays] drops the brackets, tag and LOCK readout around
the focused window entirely; sound = false drops the sound panel.
My game is on the figure's workspace. Fullscreen games are ignored: the classes in
[figures] ignore_classes never get a figure, an eye-catch or a pulse.
Uninstall. ./uninstall.sh. Add --purge to also delete the config and fonts.
python3 -m unittest discover -s tests # logic tests, no compositor needed
eva-desk --render DIR # every scene, overlay, the bar and the launcher as PNGs
HL_VERIFY=1 Hyprland --verify-config -c ~/.config/hypr/hyprland.luaPython, GTK 4 and gtk4-layer-shell. Drawing is cairo, animation is done with GTK snapshots on the GPU.
Issues and pull requests are welcome. Some things that would help:
- Screenshots of your setup. Open a discussion or an issue with a picture; other monitors and other wallpapers show what the theme can do better than mine can.
- Other figures and palettes. A theme is one entry in
eva_desk/themes.pyplus a figure cutout and wallpapers inassets/themes/<name>/. Unit-02, Unit-00, or something that is not Evangelion at all. - A
hyprland.confport. The Lua hook does border styles, workspace rules and binds; most of it could be generated as classic config too. - Packages for other distributions. The Arch PKGBUILD in
packaging/shows what goes where.
Before sending code, run the tests and eva-desk --render DIR and look at the PNGs.
Fonts from Google Fonts: Shippori Mincho B1, Share Tech Mono, Rubik, Doto (OFL). The GTK and icon themes are recoloured copies of the Everforest GTK theme and the Everforest (Suru++) icon theme. The figure was generated with stable-diffusion.cpp and Z-Image-Turbo.
Neon Genesis Evangelion belongs to Hideaki Anno, Gainax and Khara. This is a fan project.
MIT licence.











