Skip to main content

Compass

Alpha

A keyboard-first launcher for Linux, rewritten in Rust from Vicinae.

Compass puts applications, commands, clipboard history, snippets, files, a calculator, emoji, windows and extensions behind one search field. It is a hard fork of Vicinae with the engine and interface rewritten in Rust and Iced, it draws on Wayland only, and it ships as a Flatpak on the TunaOS remote.

RustLanguage
Iced · wgpuToolkit
VicinaeForked from

See it in action

Compass searching applications and commands for "term"
Compass searching applications and commands for "term"
The calculator converting sqrt(2) * 12 kg to pounds in the search field
The calculator converting sqrt(2) * 12 kg to pounds in the search field
The emoji picker searching for heart
The emoji picker searching for heart
The settings view, General page
The settings view, General page

Features

One search field

Applications, commands, clipboard history, snippets, file search, a calculator, an emoji picker and a window switcher. Matching is fuzzy, so fox finds Firefox.

Raycast extensions

Runs Raycast extensions written in TypeScript and React through its extension host, and installs them from the Raycast Store or the Extension Store. raycast:// sign-in links come back to the extension that asked.

Scripts

Raycast-style script commands in any language, and Rhai scripts that declare the capabilities they need. A Rhai script you add yourself gets none of them until you allow it.

Made for Wayland

A layer-shell surface on Sway, Hyprland and niri; a normal window on GNOME, with the GNOME Shell extension for window switching and clipboard. On GNOME the hotkey comes from the GlobalShortcuts portal.

Follows the desktop

Draws light or dark to match the system setting, and changes when you switch it.

Says what works

doctor reports the session, portals, engine and index state on your machine, and names what is missing.

Why Compass over Vicinae

Compass is a hard fork of Vicinae, and it exists because of the work of Vicinae's maintainers and contributors. Vicinae's C++ engine and its extension ecosystem are the behavioural reference for the port. These are the differences.

Faster, and lighter

Measured head-to-head on the same machine, the engine is ready to answer in 96 ms against Vicinae's 1.7 s, the launcher is populated in under a second against 2.3 s, and results follow a keystroke in 56 ms against 153 ms, with less memory and a third of the shared libraries. See the table below.

Memory-safe Rust

The engine, the interface and the extension host are Rust, with unsafe_code = "forbid" across the workspace. The only exceptions are three small binding crates, for SQLCipher, the Wayland protocols and the bridge that puts blur behind the launcher.

No Qt

The interface is drawn with Iced on wgpu. The Flatpak contains no Qt, no C++ and no CMake build, and it runs on org.freedesktop.Platform instead of the KDE runtime.

Wayland-native

On compositors with wlr-layer-shell (Sway, Hyprland, niri) the launcher is a layer surface on the top layer, the way a launcher is meant to appear. There is no X11 code path, and the Flatpak asks for no X11 socket.

A Flatpak with an extension sandbox

Extensions run in a Node worker behind Landlock and a seccomp filter. An extension can write only its own directories, it reads a short allowlist of $HOME, and it cannot run a file it wrote. When an extension needs a program on the host, Compass asks first: Raycast's Brew extension gets "Allow Brew to run brew?" with Allow Once, Always Allow or Deny, and Script Permissions takes the grant back. The engine refuses to run extensions if the sandbox helper is missing.

Raycast extension compatibility

Extensions built for Raycast install from the Raycast Store and run through the same TypeScript API that Vicinae exposes, including OAuth sign-in through raycast:// links. Where an extension assumes macOS, Compass maps it to Linux: open goes to xdg-open, pbcopy and pbpaste to the clipboard, and Homebrew to Linuxbrew. AppleScript is refused by name rather than failing obscurely.

Full feature parity

Every Linux feature of the C++ engine has a row in the parity ledger, and all 152 are implemented in Rust and covered by tests. Where Compass behaves differently on purpose, the ledger says so and why.

Performance

Both launchers were measured head-to-head by the same script on the same machine: Compass against the unmodified Vicinae 0.29.0 AppImage, cold-starting on headless Sway with software rendering, medians of five alternating runs. The machine was shared with other builds, so compare the ratios rather than the absolute times. Per core, Compass's fuzzy scorer is slower than Vicinae's; spread across cores it roughly evens out. Method, raw data and the command to reproduce it.

MeasurementCompassVicinae 0.29.0
Engine ready to answer96 ms1,746 ms
Launcher populated on screen0.9 s2.3 s
Keystroke to updated results56 ms153 ms
Idle memory (PSS, all processes)218 MiB263 MiB
Shared libraries loaded46136
Program files on disk72 MB310 MB

Get started

Flatpak (TunaOS remote)
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --if-not-exists tuna-os https://tunaos.org/flatpak/tuna-os.flatpakrepo
flatpak install tuna-os org.tunaos.compass
Start it, and check your desktop
flatpak run org.tunaos.compass start
flatpak run org.tunaos.compass doctor
Run from source
git clone https://github.com/tuna-os/compass.git
cd compass
cargo run -p compass -- ui