Gabriel Kaszewski ff9b2b5712 fix(review): bugs, arch violations, design smells
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)
2026-03-18 13:45:48 +01:00
2026-03-15 19:03:30 +00:00
2026-03-15 19:03:30 +00:00

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
No description provided
Readme 623 KiB
Languages
Rust 98.4%
Makefile 1%
Shell 0.6%