zunder

zunder · v0.2.6 · MIT

One prompt for your apps and your windows. A launcher and ALT+TAB window switcher for Hyprland that looks like a terminal.

curl -fsSL https://raw.githubusercontent.com/elyesghazel/zunder/main/get.sh | sh

Linux. Also on macOS and Windows, with fewer features.

❯

This one runs in your browser. Try , , , , .

What it is

zunder runs as a small daemon. A keybind sends it a word over a unix socket, and it puts an overlay on top of everything: one prompt, results grouped in sections, monospace, colored app icons.

Open windows, apps, a calculator, a world clock, clipboard history, shell commands, power actions and your own scripts all live in the same list. ALT+TAB shows a live screenshot of each window, even ones on other workspaces.

ALT+TAB with window previews, then the launcher.

Features

Window switcher
ALT+TAB as a grid of live window thumbnails, from any workspace.
App launcher
Every .desktop app, flatpak too, fuzzy matched on name, keywords and binary.
Start screen
Favorites, open windows, your most used apps. Never empty.
Favorites
Ctrl+F pins any result to the start screen.
Global shortcuts
Ctrl+B gives any result a system-wide Hyprland keybind.
History
history lists everything you ever launched. It is never cleared.
World clock
time in ny, time in 2h in tokyo, 3pm ny in zurich.
Calculator
2^10/3, sqrt(2)*pi. Enter copies the result.
Conversion
5 km in mi, 30c, 100 usd in chf. Units and 160 currencies.
Files
Files from your home folder appear as you type. Images get a preview.
Clipboard
clip searches your cliphist history, text and images.
Emoji
fire already shows 🔥. :heart opens the picker.
Shell
> cmd runs in your terminal or in the background.
System
Lock, suspend, reboot, shut down, log out.
Plugins
Any executable that prints lines, in any language.
Themes
12 built in, or your own file of nine colors.

How it works

keybind ─► zunder switch ─► $XDG_RUNTIME_DIR/zunder.sock ─► daemon
                                                              │
                     hyprctl clients -j ◄─────────────────────┤ on open
                     .desktop files     ◄─────────────────────┤
                     grim -T <window>   ◄─────────────────────┘ ALT+TAB only, in threads
  1. The daemon stays loaded. GTK and the app index are kept in memory, so the CLI only has to write one word to a socket. Opening is a matter of milliseconds.
  2. The overlay is a layer-shell surface. It covers the whole screen with exclusive keyboard focus, through gtk4-layer-shell, so it sits above fullscreen windows and bars.
  3. Results come from providers. Each provider is one Rust file in src/providers/. Windows, apps, math, time, files, clipboard. Adding one is about 30 lines.
  4. Nothing is polled. The window list follows Hyprland's event socket, apps are rescanned only when an applications/ folder changes, and unchanged rows are reused.

Measured on a laptop, release build, with ZUNDER_TIMING=1:

StepTime
open, start screen unchanged3–8 ms
open, start screen changedabout 25 ms
search, per keystroke0.3–2.6 ms

Plugins

A plugin is any executable in ~/.config/zunder/plugins/. Header comments configure it, and every line it prints becomes a result.

#!/bin/sh
# @zunder.name   Notes
# @zunder.prefix note
grep -ri -- "$1" ~/notes | head -50

Typing note groceries runs the script with "groceries" on each keystroke. For more control, print JSON lines with an action: run, term, open, copy, focus or fill.

{"title": "zen-bin", "subtitle": "pid 4242", "hint": "6%", "action": {"run": "kill 4242"}}

Themes

Twelve color schemes are built in. Click one, it applies to this page the same way it applies to zunder.

Your own theme is a file in ~/.config/zunder/themes/ with one @define-color line per color. Anything beyond colors goes in style.css.

Setup

zunder setup asks a few questions and writes the keybinds, autostart and theme into your Hyprland config. It takes over from vicinae, rofi or wofi, and --dry-run shows the changes first. By hand it is four binds:

-- hyprland.lua
hl.exec_cmd("zunder server")
hl.bind("ALT + TAB",         hl.dsp.exec_cmd("zunder switch"))
hl.bind("ALT + SHIFT + TAB", hl.dsp.exec_cmd("zunder switch-prev"))
hl.bind("ALT + SPACE",       hl.dsp.exec_cmd("zunder toggle"))
hl.bind("SUPER + V",         hl.dsp.exec_cmd("zunder show 'clip '"))

The classic hyprland.conf works too. Everything is stored in ~/.config/zunder/config.toml, and zunder settings opens a settings window for it.

Install

Linux · Hyprland

curl -fsSL https://raw.githubusercontent.com/elyesghazel/zunder/main/get.sh | sh

On Arch it installs the release package with pacman, elsewhere the binary goes to ~/.local/bin. Needs GTK 4.14+ and gtk4-layer-shell. Updates show up on the start screen.

macOS · Apple Silicon

The .dmg from the latest release. Drag it to Applications, then right-click → Open the first time.

Windows

zunder-windows-setup.exe installs for your user, no admin. ALT+SPACE opens it.

LinuxmacOSWindows
launcher, search, math, time, files, plugins, themes✓✓✓
apps✓✓✓
open with a key✓planned✓
ALT+TAB switcher and previews✓⌘Tab is built inAlt+Tab is built in
tray icon✓✓ menu bar✓
global shortcuts✓plannedplanned
clipboard history✓plannedplanned