Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

34 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Yeet

License Rust

Hey πŸ‘‹ I'm @1337Hero and this is Yeet! A fast, minimal app launcher for Wayland. That's it.

Yeet!

What Yeet Is

Yeet launches apps. That's it. Desktop entry commands run directly (without shell evaluation), and apps.custom commands run through the shell so it can also act as a command palette.

  • Fast β€” Rust + GTK4, optimized release builds
  • Minimal β€” Single binary, no daemons, no bloat
  • Smart search β€” Substring-first with Skim fuzzy fallback (junk results filtered automatically)
  • Configurable β€” TOML config + CSS theming
  • Wayland-native β€” Layer shell overlay with keyboard grab

What Yeet Isn't

Yeet is not trying to be an all-in-one tool. No clipboard manager, no calculator, no file browser, no emoji picker, no websearch, no plugins. If you want those, check out walker or wofi.

Installation

Arch Linux (AUR)

yay -S yeet-launcher   # latest tagged release
yay -S yeet-git        # build from main

Nix

# Run directly
nix run github:1337hero/yeet

# Install to profile
nix profile install github:1337hero/yeet

From Source

git clone https://github.com/1337hero/yeet
cd yeet
cargo build --release
sudo cp target/release/yeet /usr/local/bin/

Dependencies: GTK4, gtk4-layer-shell

Usage

yeet
  • Type to search
  • Enter β€” Launch selected app
  • Up/Down β€” Navigate results
  • Scroll / Trackpad β€” Navigate results
  • Alt+1-9 β€” Quick launch by position
  • Escape β€” Close

Bind it to a key in your compositor (e.g., Super+Space in Hyprland/Sway).

dmenu mode

Pipe lines into yeet --dmenu and the selection is printed to stdout, so yeet can drive script menus the same way wofi --dmenu or rofi -dmenu do:

# Simple picker
selected=$(echo -e "Firefox\nChrome\nBrave" | yeet --dmenu)

# Keybind viewer
grep "^bind" ~/.config/hypr/hyprland.conf | yeet --dmenu

Exits non-zero when nothing is selected (Escape).

Configuration

Config lives in ~/.config/yeet/. Yeet ships with sensible defaults β€” only override what you need.

config.toml

[general]
max_results = 8       # Max results when searching
initial_results = 8   # Results shown before typing (0 = show all, scrollable)
terminal = "alacritty"

[appearance]
width = 500           # Window width (height auto-sizes)
anchor_top = 200      # Distance from top of screen

[search]
min_score = 30        # Absolute floor for fuzzy fallback
score_threshold = 0.6 # Keep matches within % of best score (0.0-1.0)
prefer_prefix = true  # Prioritize exact prefix matches

[apps]
extra_dirs = []       # Additional directories to scan for .desktop files
exclude = ["Htop"]    # Apps to hide (use display names)
favorites = ["Firefox", "Alacritty"]  # Pin to top (use display names)

# Custom app entries
[[apps.custom]]
name = "My Script"
exec = "/path/to/script.sh"
icon = "utilities-terminal"  # optional, from icon theme
keywords = ["alias", "shortcut"]  # optional, extra search terms

Custom Entries

apps.custom.exec is passed to the shell, so Yeet doubles as a command palette. Anything you can run in a terminal becomes a launchable "app."

Power menu:

[[apps.custom]]
name = "Logout"
exec = "hyprctl dispatch exit"
icon = "system-log-out"
keywords = ["logout", "sign out", "exit", "session"]

[[apps.custom]]
name = "Shutdown"
exec = "systemctl poweroff"
icon = "system-shutdown"
keywords = ["power off", "shutdown"]

[[apps.custom]]
name = "Reboot"
exec = "systemctl reboot"
icon = "system-reboot"
keywords = ["restart", "reboot"]

[[apps.custom]]
name = "Lock"
exec = "hyprlock"
icon = "system-lock-screen"
keywords = ["lock", "screen"]

Browser profiles:

[[apps.custom]]
name = "Chrome - Personal"
exec = "google-chrome-stable --profile-directory=Default"
icon = "google-chrome"
keywords = ["browser", "personal"]

[[apps.custom]]
name = "Chrome - Work"
exec = "google-chrome-stable --profile-directory=\"Profile 1\""
icon = "google-chrome"
keywords = ["browser", "work"]

SSH connections:

[[apps.custom]]
name = "SSH - Production"
exec = "alacritty -e ssh user@prod-server"
icon = "utilities-terminal"
keywords = ["ssh", "prod", "server"]

Projects / dev environments:

[[apps.custom]]
name = "Project - Yeet"
exec = "code ~/projects/yeet"
icon = "visual-studio-code"
keywords = ["dev", "rust", "launcher"]

style.css

Full GTK4 CSS theming. Copy defaults/style.css to ~/.config/yeet/style.css and customize. Default theme is Catppuccin Macchiato with transparency for compositor blur.

/* Use alpha() for compositor blur (Hyprland/Sway) */
.yeet-window {
  background-color: alpha(#1e1e2e, 0.9);
  border-radius: 12px;
}

.yeet-entry {
  font-size: 24px;
  padding: 16px;
  caret-color: #a6e3a1;
}

.yeet-row:selected {
  background-color: #45475a;
}

CSS classes:

Class Element
.yeet-window Main window
.yeet-container Inner container
.yeet-entry Search input
.yeet-list Results list
.yeet-row Result row (supports :selected, :hover)
.yeet-row-content Row inner content
.yeet-icon App icon
.yeet-app-name App name label
.yeet-app-desc App description
.yeet-shortcut Alt+N shortcut badge

Building

Requires Rust 1.85+ and GTK4 development libraries.

# Dev build
cargo run

# Release build
cargo build --release

# Format + lint (mirrors CI)
cargo fmt && cargo clippy --all-targets -- -D warnings

Why "Yeet"?

You yeet apps into existence.

License

GPL-3.0

Releases

Packages

Contributors

Languages