A fast, keyboard-first application launcher for Hyprland and other wlroots compositors. Built with GTK4 + libadwaita — looks at home on any GNOME-style desktop and respects your accent color and dark-mode preference.
| Adwaita-native UI | GTK4 + libadwaita; follows your system accent color and dark-mode setting |
| App grid | Discovers .desktop files from all XDG data dirs; live-updates when apps are installed or removed |
| Fuzzy search | Powered by nucleo-matcher; searches name, generic name, keywords, and categories |
| Folders | Drag one tile onto another to group them; rename via the popover header |
| Drag-to-reorder | Drop on a tile's left/right edge to reorder; drop on its center to fold into a group |
| Frecency strip | Top 8 most-launched apps float to the top, scored by launch count with 14-day half-life decay |
| Layer-shell overlay | Runs as a Wayland layer-surface (exclusive keyboard grab) on Hyprland/wlroots; falls back to a normal window where unsupported |
| Single-instance | A second invocation brings the existing window to the front instead of spawning a new one |
| Keyboard-first | Type anywhere to search; arrow keys navigate the grid; Enter launches; Esc clears → closes |
| Hand-editable config | Plain TOML in ~/.config/ali/ — layout and frecency are both human-readable and atomic-written |
- GTK 4.12+
- libadwaita 1.5+
- gtk4-layer-shell 1.0+
- Rust 1.80+
On Arch Linux:
sudo pacman -S gtk4 libadwaita gtk4-layer-shellOn Fedora:
sudo dnf install gtk4-devel libadwaita-devel gtk4-layer-shell-devel# Build a release binary
make build
# Install to /usr/local (default)
sudo make install
# Install to a user-local prefix
make install PREFIX=$HOME/.localThis installs:
alibinary →$PREFIX/bin/alidev.bunniesinc.Ali.desktop→$PREFIX/share/applications/(NoDisplay=true, so ali doesn't appear inside itself)
sudo make uninstallali # layer-shell overlay — intended for keybind invocation
ali --windowed # ordinary window — useful for testing or non-Hyprland sessionsAdd to ~/.config/hypr/hyprland.conf:
bind = SUPER, SPACE, exec, aliALI_NO_LAYER_SHELL=1 ali| Key | Action |
|---|---|
| Any printable character | Focus search and start typing |
Backspace |
Focus search and delete last character |
Enter |
Launch highlighted app |
↓ / ↑ / Tab |
Move focus into the grid |
Esc |
Clear search text, or close the launcher |
All config files live in ~/.config/ali/ and are written atomically.
Controls the grid order and folder definitions. Reorderings via drag-and-drop are written back automatically. You can also edit it by hand:
items = [
{ app = "org.gnome.Nautilus" },
{ folder = "dev-tools" },
{ app = "org.mozilla.firefox" },
]
[folders.dev-tools]
name = "Dev Tools"
app_ids = ["dev.zed.Zed", "com.mitchellh.ghostty"]Launch counts and last-used timestamps. Edited automatically on each launch; you can delete it to reset the frecency strip.
src/
main.rs CLI parsing + tracing init
app.rs adw::Application bootstrap, CSS loading, single-instance guard
persistence.rs atomic TOML read/write for layout, frecency, and app cache
search.rs nucleo-matcher fuzzy ranking with field weights
model/
apps.rs AppIndex — discovers .desktop files, background refresh, GIO monitor
layout.rs grid order + folders, with reconciliation against known apps
frecency.rs half-life-decayed launch scoring
ui/
window.rs LauncherWindow — layer-shell or windowed, search wiring, key handling
grid_item.rs GObject wrapper used by ListStore / GridView
tile.rs tile widget (icon + label, folder thumbnail grid)
dnd.rs DragSource / DropTarget wiring (reorder, fold, drag-from-folder)
data/
style.css scoped visual tweaks on top of Adwaita
dev.bunniesinc.Ali.desktop installed .desktop entry
MIT