Awari is a Wayland launcher. Built with GPUI and fff search.
By separating a tiny, GPU-free background daemon from a warm GPU overlay, Awari pops onto your screen in an unnoticeable instant while maintaining a lean idle footprint. For ultra-low-spec hardware, it can easily drop down to a pure on-demand mode to free up every megabyte of RAM.
![]() |
![]() |
![]() Verdant |
![]() Ember |
![]() Paper |
![]() Tokyo Night |
![]() Mono |
![]() Nord |
![]() Apps category |
![]() Files category |
Most launchers fork a search tool every keystroke (fd, fzf, rg) or spin up a web
runtime just to draw a box, with files as an afterthought. Àwárí runs file search
in-process via fff-search and ranks windows, apps, and files together, so there's
no subprocess per character and you get whichever you meant. A GPU-free
shell opens the overlay with a socket message; by default it's kept alive (hidden)
for instant re-opens, or torn down with keep-alive = false
/ --no-keep-alive for the leanest idle footprint (the interface rebuilds on
the next open).
Bind a key to awari toggle-launcher and press it to open. Type to filter; the
top match stays selected. Enter activates and closes; Escape or a background
click dismisses; Up/Down move the selection. Tab ghost-completes the
selected match (or fills the box); Shift+Up/Down recall past queries.
Alt+Enter opens a per-row menu (Open, Show in Folder, Copy Path, Run in
Terminal, Run).
Query modes:
- Path-shaped (
~,/,., or contains/) browses the filesystem;*.pdf,!node_modules/constrain,../goes up. o:<path>lists a path's entries as you type.r:<regex>filters files by regex.> <command>runs a shell command in a terminal.- An arithmetic query shows its result;
Entercopies it.
Category chips (All, Apps, Files, Commands, Windows) narrow the source.
The same binary doubles as its own daemon control. Run from a shell or bind any of them to a key:
awari toggle-launcher— show/hide the overlay.awari open-launcher/awari close-launcher— explicit open or close.awari restart— stop the GUI and re-exec the shell daemon so a changedconfig.kdltakes effect (the hidden overlay is re-spawned too). If no daemon is running (e.g. drop mode), it simply starts one.awari ping— exits 0 when the daemon is up; useful for health checks.
Config is read at daemon start — there is no hot reload — so edits (including
keep-alive) apply on the next awari restart or daemon start.
- Lightweight: GPU-free background daemon; overlay kept alive hidden for instant re-opens, or dropped entirely for the leanest idle footprint.
- In-process search: fff-search ranks by frecency with no per-keystroke
subprocess;
matchqscores windows/apps without per-keystroke allocation. IPC read-to-damage is under 2 ms p99. - Bounded: LRU-capped per-directory indexes; idle CPU ~0 (sustained >1% is a bug).
- One suggestion: inline ghost-text completion; full alternates only on ↓.
- Wayland-native: one binary for any Wayland compositor. Overlay uses
wlr-layer-shell(niri, Hyprland, sway, river, labwc); on GNOME/Mutter it falls back to a normal window for apps/files/commands. - Unified results: windows (focus), apps (
.desktop), and files in one fuzzy/frecency list. Apps always indexed; files and windows toggleable. - Query power:
>commands,o:<path>browse,r:<regex>, arithmetic, path navigation with constraints. - Theming: KDL hex tokens (no CSS/fetch); ten presets, per-token overrides,
aliases (
select,hover/surface,fg,muted,faint); bundled JetBrains Mono typeface by default (font "default"restores the system UI font), font-size in px. - Action menu, category chips, calculator, monitor-aware, lockfiles hidden.
Linux + Wayland compositor (best on niri, Hyprland, sway, river, labwc via
wlr-layer-shell; GNOME/Mutter falls back to a window).
# Debian/Ubuntu
sudo apt install libwayland-dev libegl-dev pkg-config
# Fedora
sudo dnf install wayland-devel mesa-libEGL-devel
cargo test
cargo run -p awari
awari ping| Distribution | Install |
|---|---|
Fedora 43 / 44 / rawhide |
sudo dnf copr enable borngraced/awarisudo dnf install awari |
| Debian / Ubuntu | sudo add-apt-repository ppa:borngraced/awarisudo apt install awariPPA coming soon |
| Arch | sudo pacman -U awari-0.1.0-1-x86_64.pkg.tar.zst |
| Any Linux | Prebuilt .deb, .rpm, Arch package and raw tarballs on releases |
awari isn't on crates.io because it depends on a vendored, patched GPUI under
.third_party/zed (a local [patch] can't be published). Install from git:
cargo install --git https://github.com/borngraced/awari awariThis builds GPUI from source, so the Build dev libraries are required. Then run it as a background service and bind a key.
systemctl --user enable --now ~/.config/systemd/user/awari.serviceniri (~/.config/niri/config.kdl):
spawn-at-startup "awari"
binds {
Mod+D { spawn "awari" "toggle-launcher"; }
}Hyprland (~/.config/hypr/hyprland.conf):
exec-once = awari
bind = SUPER, D, exec, awari toggle-launcherGNOME / KDE / other desktop shells: run awari as a systemd user service so it starts with your graphical session. Create the unit manually, then register and enable it:
# ~/.config/systemd/user/awari.service
[Unit]
Description=Awari Wayland launcher
PartOf=graphical-session.target
After=graphical-session.target
[Service]
Type=simple
ExecStart=%h/.cargo/bin/awari
Restart=on-failure
RestartSec=1
[Install]
WantedBy=graphical-session.targetsystemctl --user daemon-reload
systemctl --user enable --now awari.serviceenable --now starts it now and on every login. The unit targets
graphical-session.target, which both GNOME and KDE start. awari must run under
your user session (not root) — it's a Wayland client, so WAYLAND_DISPLAY /
XDG_RUNTIME_DIR must be available.
KDL at ~/.config/awari/config.kdl. Unknown keys ignored; no
exec/scripts/shell interpolation; every block/token optional. Copy-pasteable
full file: contrib/config.kdl.
theme {
name "catppuccin" // presets: awari (default) · ash · ember · verdant
// paper · mono · nord · tokyonight · catppuccin · gruvbox
// font "Inter" // default is the bundled JetBrains Mono; any fontdb family
// // override; "default"/"" = GPUI system UI font
// font-size 14 // px, clamped to 8..=64
accent "#cba6f7" // = select
accent-dim "#cba6f733"
bg "#11111b"
panel "#1e1e2e"
raise "#313244" // = hover = surface
border "#45475a"
text "#cdd6f4" // = fg
text-dim "#a6adc8" // = muted
text-faint "#9399b2" // = faint
scrim "#08080ce6"
}
files {
roots "~/Documents" "~/Downloads" "~/code" // omit/empty = XDG user dirs
index_lockfiles false // show Cargo.lock, *.lock, …
regex false // file queries as regex (r: prefix forces it)
max-results 50 // max file rows shown
}
fff {
watch true // background file watcher
fs-root-scanning true // allow indexing the filesystem root
mmap-cache false // mmap pre-warm for top-frecency files
content-indexing false // content index for content-aware filtering
follow-symlinks false // index through symbolic links
}
sources {
windows true
files true
}
keep-alive true // GPU overlay stays in memory between uses (default); false = exits on dismiss
// apps is always indexed and cannot be disabled
motion {
reduced false // disable animations
duration-ms 140 // open/close length, clamped to 0..=1000
}Colors are hex: #RGB, #RRGGBB, or #RRGGBBAA. In place of the canonical
token names you can also use these aliases:
| Alias | Sets |
|---|---|
select |
accent-dim |
hover, surface |
raise |
fg |
text |
muted |
text-dim |
faint |
text-faint |










