A fast application launcher and window switcher for Linux Wayland, built with GPUI.
zlaunch.mp4
- Application launching — Fuzzy search through desktop entries with icons
- Window switching — Switch between open windows (Hyprland)
- Calculator — Evaluate math expressions and copy the result to clipboard
- Web search — Search Google, DuckDuckGo, Wikipedia, YouTube, and more
- Emoji picker — Searchable emoji grid
- Clipboard history — Browse and paste from clipboard history
- AI mode — Query local or cloud LLMs with streaming responses
- Theming — 15 bundled themes plus custom theme support
- Daemon architecture — Runs in the background for instant response
- Hyprland, Niri — Window switching via IPC socket, clipboard fully supported
- Other wlr-based compositors — Untested, should work with clipboard history, windows switching not implemented
- KDE / KWin — WIP, window creation buggy, blur not supported, clipboard not working
- GNOME — Not supported (and not planned)
Available on the AUR as
A nix flake is available to run zlaunch. You can test it out with,
nix shell github:zortax/zlaunch/0.4.0
zlaunch & bg # Run the daemon
zlaunch toggle
or add it to your system configuration,
{
inputs = {
zlaunch.url = "github:zortax/zlaunch/0.4.0";
};
}
The package is now available as zlaunch.packages.${pkgs.system}.default, and can be added to your system/user packages.
cargo build --release
If you have Nix installed, you can enter a preconfigured development shell with all the dependencies and toolchains:
nix develop
cargo build --release
The binary will be located at:
./target/release/zlaunch
Start the daemon:
zlaunch
Toggle the launcher (bind this to a key):
zlaunch toggle
Control the daemon via CLI (use these commands in your key bindings):
zlaunch toggle # Toggle visibility
zlaunch show # Show launcher
zlaunch hide # Hide launcher
zlaunch quit # Stop daemon
zlaunch reload # Restart daemon (useful after config updates)
The launcher supports different modes that determine what content is shown. By default, the launcher opens in combined mode, showing all enabled modules together. You can also open specific modes directly or configure multiple modes to cycle through.
Use the --modes flag to open directly into specific mode(s):
# Open directly in emoji picker
zlaunch show --modes emojis
# Open directly in clipboard history
zlaunch toggle --modes clipboard
# Open with multiple modes (use Ctrl+Tab to switch)
zlaunch show --modes combined,emojis,clipboard
Available modes: combined, applications, windows, emojis, clipboard, actions, search, calculator, ai, themes
Mode aliases are supported: apps, app, emoji, calc, action, theme, window
When multiple modes are configured, use keyboard shortcuts to switch:
Ctrl+Tab— Next modeCtrl+Shift+Tab— Previous mode
Configure default modes in config.toml (see Configuration section).
Use the built-in theme selector in the UI, or via CLI:
zlaunch theme # Show current theme
zlaunch theme list # List available themes
zlaunch theme set NAME # Set theme by name
| Key | Action |
|---|---|
↑ / ↓ |
Navigate items |
Tab / Shift+Tab |
Navigate grid |
Ctrl+Tab |
Next mode |
Ctrl+Shift+Tab |
Previous mode |
Enter |
Execute selected item |
Escape |
Back / Hide launcher |
Config file location:
~/.config/zlaunch/config.toml
By default, zlaunch will not persist changes in the UI (theme) or auto-create the config file. Create the config file manually, after that in-UI theme changes will be persisted.
theme = "one-dark"
launcher_size = [800.0, 500.0]
hyprland_auto_blur = false
enable_transparency = false
# Modes to cycle through with Ctrl+Tab (optional)
default_modes = ["combined", "emojis", "clipboard"]
# Modules to show in combined view, in display order (optional)
combined_modules = ["calculator", "windows", "applications", "emojis", "clipboard", "actions", "themes", "ai", "search"]
[[search_providers]]
name = "Brave"
trigger = "!br"
url = "https://search.brave.com/search?q={query}"
[[search_providers]]
name = "YouTube"
trigger = "!yt"
url = "https://youtube.com/search?q={query}"
icon = "youtube-logo"
theme— Theme name (default, a bundled theme, or a custom theme file)launcher_size— Launcher panel size as[width, height]. Default:[600.0, 400.0]enable_backdrop— Show transparent backdrop with click-outside-to-close. Default:true. Whenfalse, the window is just the launcher panelwindow_size— Explicit window buffer size as[width, height]. Only used whenenable_backdrop = true. Reduces VRAM usage compared to compositor defaults (8K on most compositors, 1920x1080 on KDE)enable_transparency— Enable transparent background. Default:truehyprland_auto_blur— Attempt to apply Hyprland blur rules. Default:truedefault_modes— List of modes to cycle through with Ctrl+Tab. Default:["combined"]combined_modules— Ordered list of modules to include in combined view. Omit to show all modulessearch_providers— Custom web search providers
calculatorwindowsapplicationsemojisclipboardactionsthemesaisearch
The order in combined_modules determines the display order of sections in combined view.
Note: The
disabled_modulesoption is deprecated. Usecombined_modulesinstead to specify which modules to include (and in what order).
The fuzzy search can be fine-tuned via the [fuzzy_match] section:
[fuzzy_match]
show_best_match = true # Promote highest-scoring item to top (default: true)
exact_match_bonus = 100000 # Bonus for exact name match
prefix_match_bonus = 50000 # Bonus when query matches start of name
word_prefix_bonus = 25000 # Bonus when query matches start of a word
contiguity_bonus = 10000 # Bonus for consecutive character matches
description_penalty = 0.3 # Multiplier for description-only matches (0.0-1.0)
action_score_multiplier = 0.8 # Score multiplier for action items
submenu_score_multiplier = 0.9 # Score multiplier for submenu items
Best match feature: When enabled, the highest-scoring search result is promoted to the top of the list regardless of module order. This ensures the most relevant match is always visible first in combined mode.
Each provider supports the following fields:
name— Display nametrigger— Search trigger (e.g.!g,!ddg)url— URL template containing{query}icon— Optional icon name; defaults tomagnifying-glassif the field is missing, empty, or invalid
The icon field accepts the following kebab-case names that map to the embedded Phosphor icons:
powerrebootmoonlocksign-outsmileyterminalclipboardclipboard-textfilefile-textfile-imageimagemagnifying-glassglobebook-openyoutube-logobrainpalette
Example:
[[search_providers]]
name = "YouTube"
trigger = "!yt"
url = "https://youtube.com/search?q={query}"
icon = "youtube-logo"
ayu-darkcatppuccin-lattecatppuccin-mochadraculaeverforestgruvbox-darkkanagawamaterialmonokainordone-darkrose-pinesolarized-darksynthwavetokyo-night
Place custom themes in:
~/.config/zlaunch/themes/
Theme files use TOML format.
Supported color formats:
- Hex:
"#3fc3aa"or"#3fc3aa80" - RGBA:
{ r = 255, g = 128, b = 64, a = 255 } - HSLA:
{ h = 0.5, s = 0.8, l = 0.6, a = 1.0 }
See assets/themes/ for examples.
Because zlaunch uses a wlr layer-shell window, blur is not supported on most compositors.
On Hyprland, zlaunch attempts to apply blur automatically via IPC (WIP). This may fail on some systems.
Disable auto-blur:
hyprland_auto_blur = false
Manual Hyprland rules:
layerrule = blur on,match:class zlaunch
layerrule = blur_popups on,match:class zlaunch
layerrule = ignore_alpha 0.35,match:class zlaunch
Set the following environment variables:
OLLAMA_URL— e.g.http://127.0.0.1:11434OLLAMA_MODEL— e.g.llama3.2:latest
Example:
OLLAMA_URL="http://127.0.0.1:11434" \
OLLAMA_MODEL="llama3.2:latest" \
zlaunch
Set one of the following API keys:
GEMINI_API_KEYOPENAI_API_KEYOPENROUTER_API_KEY
For OpenRouter, you can also set:
OPENROUTER_MODEL
MIT