Skip to content
backslash-appPublic

About

The Raycast Clone Your Linux Desktop Deserves 🐧✨

Topics

Resources

Contributing

Stars

273 stars

Watchers

6 watching

Forks

Repository files navigation

Backslash

A fast, keyboard-first launcher for Linux, with extensions you can write in five minutes.

Write an extension · Architecture · Roadmap · Discord

Backslash

Important

Backslash 0.3 is a ground-up rewrite (Rust + GTK4, Deno extensions). It is young: expect rough edges, and see the roadmap.

Why Backslash

  • Native and instant. One small Rust binary, GTK4, GPU-rendered. It stays in the background and opens with no delay, on Wayland and X11.
  • Made for Linux. Applications come straight from your system (Flatpak and Snap included), icons from your icon theme, light/dark from your desktop.
  • Extensions that cannot hurt you. Each extension declares what it needs (net = ["api.github.com"], run = ["git"]), you approve it once, and the runtime enforces it. Tokens go to your system keyring. Each command runs in its own process: a buggy extension can't freeze or crash the launcher.
  • Extensions that are easy to write. TypeScript, no build step, no node_modules. Describe a list, the launcher does the rest: fuzzy search, keyboard navigation, action panel, cancellation of slow requests.
  • Useful out of the box. Calculator and unit/currency conversions as you type, clipboard history, file search with previews, window switcher, quicklinks and snippets.
  • Scriptable. Every command also runs from a terminal: backslash run npm/search react --json | jq.
  • Yours. Open source (MIT), no account, no telemetry, no paywall. Config and theme are plain files you can keep in your dotfiles.

A complete extension

backslash.toml:

[extension]
id = "npm"
title = "npm"

[permissions]
net = ["registry.npmjs.org"]

[[commands]]
name = "search"
title = "Search npm Packages"

commands/search.ts:

import { copy, list, open } from "@backslash/api";

export default list({
  placeholder: "Search npm packages…",
  async search(query, { signal }) {
    const res = await fetch(`https://registry.npmjs.org/-/v1/search?text=${query}`, { signal });
    const { objects } = await res.json();
    return objects.map(({ package: pkg }) => ({
      title: pkg.name,
      subtitle: pkg.description,
      tags: [`v${pkg.version}`],
      actions: [open(pkg.links.npm), copy(`npm install ${pkg.name}`, "Copy Install Command")],
    }));
  },
});

That's it. backslash new <name> scaffolds one, backslash dev loads it with logs in your terminal and reloads it when you save. backslash publish prepares its registry entry. Read the extension guide.

Extensions

Open Browse Extensions (or backslash search, backslash install github). The registry lists extensions that live in their authors' repositories, each pinned to a reviewed commit with a checksum: you see exactly what an extension may do before installing, and Backslash refuses any file that differs from what was reviewed. First-party extensions: GitHub, Packages (apt/dnf/pacman/zypper/Flathub), Services (systemd), Containers (Docker/Podman), Emoji & Symbols.

Install

Backslash needs GTK 4.14 or newer: Ubuntu 24.04+, Debian 13+, Fedora 40+, Arch, openSUSE Tumbleweed and other recent distributions.

Distribution How
Debian, Ubuntu sudo apt install ./backslash_<version>_amd64.deb from the latest release
Fedora, openSUSE sudo dnf install ./backslash-<version>-1.x86_64.rpm from the same page
Arch the backslash package from the AUR (packaging/aur/PKGBUILD)
Anything else tar -xzf backslash-<version>-x86_64.tar.gz -C ~/.local

Extensions written in TypeScript run in Deno. If it isn't installed, Backslash offers to download it the first time you need it (or run backslash install-runtime); it comes from Deno's official npm package and is checked before use. backslash doctor checks that everything is in place.

Build from source
# Debian/Ubuntu: sudo apt install libgtk-4-dev    Fedora: sudo dnf install gtk4-devel    Arch: sudo pacman -S gtk4
git clone https://github.com/backslash-app/backslash && cd backslash
make && sudo make install          # or: make install PREFIX=~/.local

make dist builds the release files in dist/ (it needs nfpm for the .deb and .rpm). Pushing a tag such as v0.3.0 builds them for x86_64 and aarch64 and publishes a release.

Why no Flatpak? A launcher has to start other apps, read the list of installed ones, watch the clipboard and run the tools extensions ask for. Inside the Flatpak sandbox all of this goes through flatpak-spawn --host, which gives the whole system away anyway while making everything slower and harder to debug. Extensions get their own, finer sandbox from Deno instead.

The first time it opens, Backslash shows a short welcome checklist: the shortcut (with the steps for your desktop when it can't register one itself), theme, launch at login, clipboard history, the overlay on Wayland, and the extension runtime. Open it again any time with Welcome to Backslash.

Open it with a shortcut

Backslash asks your desktop for Super+Space through the GlobalShortcuts portal (KDE Plasma, GNOME 48+, Hyprland…): confirm it once when asked. Change it with hotkey = "Ctrl+Space" in config.toml.

Without the portal, bind a key to the command backslash (running it again toggles the window):

Desktop Where
GNOME Settings → Keyboard → Custom Shortcuts → command backslash
KDE Plasma System Settings → Shortcuts → Add New → Command backslash
Hyprland bind = SUPER, SPACE, exec, backslash
Sway / i3 bindsym $mod+space exec backslash

On Sway, Hyprland, KDE and other wlroots-style compositors, install gtk4-layer-shell and Backslash opens as a true overlay, with no window rules needed. Without it, make the window float: windowrulev2 = float, class:^(app\.backslash\.Backslash)$ (Hyprland) or for_window [app_id="app.backslash.Backslash"] floating enable (Sway).

Run the Enable Launch at Login command so Backslash is always ready.

Using it

Key Action
type search apps and commands; math and conversions are computed as you type
Tab filter: All, Apps, Commands
↑ ↓ / Ctrl+N P move
Enter / Ctrl+Enter primary / secondary action
Ctrl+K all actions
Esc / Backspace on empty search back, then close

Results learn from you: what you pick for a given query comes first next time.

Any app or command can get an alias and its own global shortcut: Ctrl+K on it, then Set Alias… (type ff, Firefox comes first) or Set Hotkey… (e.g. Super+V for the clipboard history). Without the shortcuts portal, bind backslash open builtin:clipboard (or app:…, cmd:extension/command) to a key in your desktop settings.

Built in:

  • Calculator and conversions: 12*(3+4), 5 km in miles, 72 f to c, 2 GiB en MB, 20 € en $ (European Central Bank rates, cached).
  • Clipboard History: searchable, with pins; Enter pastes into the app you were in (xdotool on X11, the desktop's permission once on GNOME and KDE, wtype on Sway/Hyprland/niri). Recorded in the background on wlroots compositors, KDE and Hyprland (install wl-clipboard) and on X11; on GNOME, each time Backslash opens. Password managers' copies are skipped.
  • Search Files: in your home folder (fd if installed), recent files first, with a preview.
  • Switch Windows: Hyprland, Sway, niri, KDE Plasma (through a KWin script, nothing to install), GNOME (through a tiny Shell extension the launcher installs for you, or "Window Calls") and X11.
  • Change Theme: light, dark, or following the system.

Script commands

Any script can be a command, in any language, without the SDK. Put it in ~/.config/backslash/scripts/ (or run Create Script Command), make it executable, and describe it in its first comment lines:

#!/bin/bash
# title: Restart Wi-Fi
# description: Turns Wi-Fi off and on again
# icon: 📶
# mode: silent
nmcli radio wifi off && nmcli radio wifi on
Key Meaning
title Required: what you search for
mode silent (runs in the background, tells you only if it fails), output (shows what it prints), list (one item per printed line, to paste or copy), paste (pastes what it prints)
argument Asked before running, passed as $1, $2…: # argument: name Placeholder, or name? when optional; repeatable
description, icon, keywords Shown and searched
confirm A question asked before running

// and -- comments work too (Node, Lua…). Script commands get aliases and hotkeys like everything else. They run as you, unsandboxed: they are your own files.

Make it yours

Everything is in the Settings command: theme, shortcut, launch at login, clipboard history, extensions (enable, see their permissions, configure them), quicklinks, snippets and hidden apps. It all lives in plain files, so you can also edit them by hand or keep them in your dotfiles.

~/.config/backslash/config.toml:

theme = "system"          # "light", "dark" or "system"
hotkey = "Super+Space"
hidden_apps = ["org.gnome.Tour.desktop"]

[[quicklinks]]            # type "gh tokio" to search GitHub
name = "Search GitHub"
url = "https://github.com/search?q={query}"
keyword = "gh"

[[snippets]]              # {date}, {time} and {clipboard} are expanded
name = "Email signature"
text = "Best,\nSteven"
keyword = "sig"

[extensions.npm]
enabled = true

[aliases]                 # type "ff" to get Firefox first
"app:org.mozilla.firefox.desktop" = "ff"

[hotkeys]                 # global shortcuts that open an item
"builtin:clipboard" = "Super+V"
"cmd:github/pull-requests" = "Super+G"
  • ~/.config/backslash/style.css: override any style or color, e.g. @define-color bs_accent #c2410c; (see style.css and the palettes in theme.rs).
  • ~/.local/share/backslash/extensions/: drop extension folders here.
  • backslash doctor shows what works on your desktop.

Contributing

See CONTRIBUTING.md. Bundled extensions in extensions/ are good examples to start from.

License

MIT

About

The Raycast Clone Your Linux Desktop Deserves 🐧✨

Topics

Resources

Contributing

Stars

273 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages