A fast app launcher for Linux. Written in Zig with Qt6.
Scans your .desktop files from the usual places, shows you everything in a searchable list, and lets you filter through it as you type with fuzzy matching. Built because apparently 50 other launchers weren't enough.
Thanks to rcalixte for libqt6zig, the Zig bindings this project is built on.
- Zig 0.16.0 - the compiler and build system. Download from ziglang.org/download or use your distro's package manager if it has a recent enough version.
- Qt 6.8.2 development libraries (Core, Gui, Widgets) - the GUI toolkit. Install
qt6-base-devor equivalent for your distro. - GCC or Clang - used by Zig to link C++ code (Qt is written in C++).
- libstdc++ or libc++ - the C++ standard library, comes with your compiler.
- pkg-config - helps the build system find Qt headers and libraries.
Zig fetches the following automatically when you run zig build:
zig buildBinary at zig-out/bin/zenkai.
Download the tarball for your architecture from ziglang.org/download, extract it, and put the zig binary somewhere in your PATH. Most distro repositories lag behind and 0.16.0 is required.
sudo pkg install qt6-basesudo apt install gcc libstdc++-14-dev-$(dpkg --print-architecture)-cross qt6-base-devsudo dnf install gcc libstdc++-devel qt6-qtbase-develsudo pacman -S gcc qt6-basesudo zypper install qt6-base-develKick it off:
./zig-out/bin/zenkaiType to filter through your apps. Enter to launch. That's it.
./zig-out/bin/zenkai --theme=dracula
./zig-out/bin/zenkai --theme=./my-custom-theme.qssName one of the 65 built-in themes or point at a .qss file. See screenshots to save yourself the trouble of running each individually.
Dumps every theme name and description to the terminal and exits.
Icon size. Default 32.
Window width. Default 600.
Window height. Default 500.
./zig-out/bin/zenkai --menu="Terminal|alacritty|terminal"Adds a custom entry. Pipe separates name, command, icon. Pass it more than once for more entries. Skips .desktop file scanning entirely.
Skips .desktop file scanning. Use this when you only want plugins or --menu entries.
Skips loading plugins.
./zig-out/bin/zenkai --plugin=calculator
./zig-out/bin/zenkai --plugin=calculator --plugin=notesOnly loads plugins with a matching directory name. Repeatable.
Hides icons in the list.
Hides the bottom bar.
Parses [Desktop Action ...] entries from .desktop files (e.g. "New Window", "New Private Window").
Shows desktop actions in the bottom bar instead of the list.
Closes the launcher when it loses focus.
Keeps the launcher open when it loses focus.
Shows a transparent fullscreen layer behind the launcher. Clicking it closes the launcher.
Pipes content into a command instead of opening it. Hook this up with api.open_url() in plugins.
./zig-out/bin/zenkai --clipboard="xclip -selection c"
./zig-out/bin/zenkai --clipboard="wl-copy"No more xdg-open launching a browser when you just want a URL in your clipboard.
Tells plugins what to run when they want to open a URL. Defaults to xdg-open.
./zig-out/bin/zenkai --url-handler="firefox --new-tab"Makes it talk more.
Makes it talk more and prints how long everything took to start up.
Prints timing for every stage of startup.
Watches .qss files and applies changes on the fly. Needs --debug.
Prints everything you can pass and bails out.
# Everyday launch
./zig-out/bin/zenkai
# Dracula theme, bigger icons, wider window
./zig-out/bin/zenkai --theme=dracula --size=48 --width=800
# Launch with a custom menu, skip .desktop scanning
./zig-out/bin/zenkai --menu="Firefox|firefox|firefox" --menu="Terminal|alacritty|terminal"
# Minimal look, no icons, no bottom bar
./zig-out/bin/zenkai --no-icons --no-bottom-bar
# Copy URLs to clipboard instead of opening them
./zig-out/bin/zenkai --clipboard="wl-copy"
# Quit when clicking outside the launcher
./zig-out/bin/zenkai --close-on-focus-out
# See how fast it starts
./zig-out/bin/zenkai --debug
# Hot-reload a theme you are working on
./zig-out/bin/zenkai --debug --theme-reloader --theme=./my-theme.qss
# Low memory mode (Nvidia or otherwise)
./zenkai.sh
# Plugin-only mode, no desktop apps
./zig-out/bin/zenkai --no-dapps --plugin=calculator
# Calculator with a theme, no icons
./zig-out/bin/zenkai --no-dapps --plugin=calculator --theme=dracula --no-iconsOn Nvidia or if you just want a lighter footprint, the included zenkai.sh wrapper sets some environment variables that bring RAM down to 20-50MB.
Drop a directory into external/plugins/ with a manifest.json and a main.lua and the launcher picks it up automatically. No flags needed.
{
"name": "my-plugin",
"version": "1.0.0",
"main": "main.lua",
"description": "What it does",
"author": "you"
}Hooks are detected automatically from your Lua functions. The available hooks:
on_query(query)- called when the user types, add results withapi.add_result()on_open(id)- called when a result is selected,idmatches whatadd_resultreturned
-- Add a result to the list
-- Returns an id that gets passed to on_open()
api.add_result(title, subtitle, icon_name, result_type)
-- Open a URL when the result is selected
api.open_url("https://example.com")
-- Print to the debug log
api.log("something happened")result_type is optional. Use "NoReturn" to keep the launcher open after selecting the result (like a calculator showing an answer). The default "ExecCmd" closes the launcher and fires on_open.
function on_query(query)
if query == "ping" then
api.add_result("Pong!", "it works", "face-smile", "NoReturn")
end
endSee external/plugins/calculator/ for a full working example.

