ff9b2b571222f5ceb5629b1f889e44bf350b818b
P1 bugs: - unix_launcher: shell_split respects quoted args (was split_whitespace) - plugin-host: 5s timeout on external plugin search - ui: handle engine init panic, wire error state - ui-egui: read window config instead of always using defaults - plugin-url: use OpenPath action instead of SpawnProcess+xdg-open Architecture: - remove WindowConfig (mirror of WindowCfg); use WindowCfg directly - remove on_select closure from SearchResult (domain leakage) - remove LaunchAction::Custom; add Plugin::on_selected + SearchEngine::on_selected - apps: record frecency via on_selected instead of embedded closure Design smells: - frecency: extract decay_factor helper, write outside mutex - apps: remove cfg(test) cache_path hack; add new_for_test ctor - apps: stable ResultId using name+exec to prevent collision - files: stable ResultId using full path instead of index - plugin-host: remove k-launcher-os-bridge dep (WindowConfig gone)
k-launcher
A lightweight, GPU-accelerated command palette for Linux (Wayland/X11). Zero Electron — every pixel rendered via WGPU. Async search that never blocks the UI.
Quick Start
git clone https://github.com/GKaszewski/k-launcher
cd k-launcher
cargo build --release
./target/release/k-launcher
Keybinds
| Key | Action |
|---|---|
| Type | Filter results |
↑ / ↓ |
Navigate |
Enter |
Launch selected |
Escape |
Close |
Compositor Setup
k-launcher uses a normal window; configure your compositor to float it.
Hyprland (~/.config/hypr/hyprland.conf):
windowrule = float, ^(k-launcher)$
windowrule = center, ^(k-launcher)$
bind = SUPER, Space, exec, k-launcher
Sway (~/.config/sway/config):
for_window [app_id="k-launcher"] floating enable, move position center
bindsym Mod4+space exec k-launcher
Built-in Plugins
| Trigger | Plugin | Example |
|---|---|---|
| (any text) | Apps | firefox |
| number/expression | Calc | 2^10 + 5 |
> prefix |
Shell | > echo hello |
/ or ~/ |
Files | ~/Documents |
External Plugins
Drop in community plugins — any language, no recompilation. Plugins are executables that communicate over stdin/stdout JSON:
# ~/.config/k-launcher/config.toml
[[plugins.external]]
name = "my-plugin"
path = "/usr/lib/k-launcher/plugins/my-plugin"
See Plugin Development for the full protocol.
Docs
Description
Languages
Rust
98.4%
Makefile
1%
Shell
0.6%