# Owlry [![AUR](https://img.shields.io/aur/version/owlry?logo=archlinux&label=AUR)](https://aur.archlinux.org/packages/owlry) [![Rust](https://img.shields.io/badge/rust-1.90%2B-orange.svg)](https://www.rust-lang.org/) [![License](https://img.shields.io/badge/license-GPL--3.0-blue.svg)](LICENSE) [![GTK4](https://img.shields.io/badge/GTK-4.12-green.svg)](https://gtk.org/) [![Wayland](https://img.shields.io/badge/Wayland-native-blueviolet.svg)](https://wayland.freedesktop.org/) A lightweight, owl-themed application launcher for Wayland, built with GTK4 and Layer Shell. ## Features - **Modular plugin architecture** — Install only what you need - **Fuzzy search with tags** — Fast matching across names, descriptions, and category tags - **13 native plugins** — Calculator, clipboard, emoji, weather, media, and more - **Widget providers** — Weather, media controls, and pomodoro timer at the top of results - **Filter prefixes** — Scope searches with `:app`, `:cmd`, `:tag:development`, etc. - **Frecency ranking** — Frequently/recently used items rank higher - **GTK4 theming** — System theme by default, with 9 built-in themes - **Wayland native** — Uses Layer Shell for proper overlay behavior - **Extensible** — Create custom plugins in Lua or Rune ## Installation ### Arch Linux (AUR) ```bash # Minimal core (applications + commands only) yay -S owlry # Add individual plugins yay -S owlry-plugin-calculator owlry-plugin-weather # Or install bundles: yay -S owlry-essentials # calculator, system, ssh, scripts, bookmarks yay -S owlry-widgets # weather, media, pomodoro yay -S owlry-tools # clipboard, emoji, websearch, filesearch, systemd yay -S owlry-full # everything # For custom Lua/Rune plugins yay -S owlry-lua # Lua 5.4 runtime yay -S owlry-rune # Rune runtime ``` ### Available Packages | Package | Description | |---------|-------------| | `owlry` | Core binary with applications and commands | | `owlry-plugin-calculator` | Math expressions (`= 5+3`) | | `owlry-plugin-system` | Shutdown, reboot, suspend, lock | | `owlry-plugin-ssh` | SSH hosts from `~/.ssh/config` | | `owlry-plugin-clipboard` | History via cliphist | | `owlry-plugin-emoji` | 400+ searchable emoji | | `owlry-plugin-scripts` | User scripts | | `owlry-plugin-bookmarks` | Chrome, Brave, Edge bookmarks | | `owlry-plugin-websearch` | Web search (`? query`) | | `owlry-plugin-filesearch` | File search (`/ filename`) | | `owlry-plugin-systemd` | User services with actions | | `owlry-plugin-weather` | Weather widget | | `owlry-plugin-media` | MPRIS media controls | | `owlry-plugin-pomodoro` | Pomodoro timer widget | ### Build from Source **Dependencies:** ```bash # Arch Linux sudo pacman -S gtk4 gtk4-layer-shell # Ubuntu/Debian sudo apt install libgtk-4-dev libgtk4-layer-shell-dev # Fedora sudo dnf install gtk4-devel gtk4-layer-shell-devel ``` **Build (requires Rust 1.90+):** ```bash git clone https://somegit.dev/Owlibou/owlry.git cd owlry # Build core only cargo build --release -p owlry # Build specific plugin cargo build --release -p owlry-plugin-calculator # Build everything cargo build --release --workspace ``` **Install plugins manually:** ```bash sudo mkdir -p /usr/lib/owlry/plugins sudo cp target/release/libowlry_plugin_*.so /usr/lib/owlry/plugins/ ``` ## Usage ```bash owlry # Launch with defaults owlry --mode app # Applications only owlry --providers app,cmd # Specific providers owlry --help # Show all options ``` ### Keyboard Shortcuts | Key | Action | |-----|--------| | `Enter` | Launch selected item | | `Escape` | Close launcher / exit submenu | | `Up` / `Down` | Navigate results | | `Tab` | Cycle filter tabs | | `Shift+Tab` | Cycle filter tabs (reverse) | | `Ctrl+1..9` | Toggle tab by position | ### Search Prefixes | Prefix | Provider | Example | |--------|----------|---------| | `:app` | Applications | `:app firefox` | | `:cmd` | PATH commands | `:cmd git` | | `:sys` | System actions | `:sys shutdown` | | `:ssh` | SSH hosts | `:ssh server` | | `:clip` | Clipboard | `:clip password` | | `:bm` | Bookmarks | `:bm github` | | `:emoji` | Emoji | `:emoji heart` | | `:script` | Scripts | `:script backup` | | `:file` | Files | `:file config` | | `:calc` | Calculator | `:calc sqrt(16)` | | `:web` | Web search | `:web rust docs` | | `:uuctl` | systemd | `:uuctl docker` | | `:tag:X` | Filter by tag | `:tag:development` | ### Trigger Prefixes | Trigger | Provider | Example | |---------|----------|---------| | `=` | Calculator | `= 5+3` | | `calc ` | Calculator | `calc sqrt(16)` | | `?` | Web search | `? rust programming` | | `web ` | Web search | `web linux tips` | | `/` | File search | `/ .bashrc` | | `find ` | File search | `find config` | ## Configuration Owlry follows the [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/): | Path | Purpose | |------|---------| | `~/.config/owlry/config.toml` | Main configuration | | `~/.config/owlry/themes/*.css` | Custom themes | | `~/.config/owlry/style.css` | CSS overrides | | `~/.config/owlry/plugins/` | User plugins (Lua/Rune) | | `~/.local/share/owlry/scripts/` | User scripts | | `~/.local/share/owlry/frecency.json` | Usage history | ### Example Configuration ```toml [general] show_icons = true max_results = 10 tabs = ["app", "cmd", "uuctl"] # terminal_command = "kitty" # Auto-detected # launch_wrapper = "uwsm app --" # Auto-detected [appearance] width = 700 height = 500 font_size = 14 border_radius = 12 # theme = "owl" # Or: catppuccin-mocha, nord, dracula, etc. [plugins] disabled = [] # Plugin IDs to disable, e.g., ["emoji", "pomodoro"] # Per-plugin configuration (new in 0.4.0) [plugins.weather] provider = "wttr.in" # or: openweathermap, open-meteo location = "Berlin" # city name or "lat,lon" # api_key = "..." # Required for OpenWeatherMap [plugins.pomodoro] work_mins = 25 # Work session duration break_mins = 5 # Break duration ``` ## Plugin System Owlry uses a modular plugin architecture. Plugins are loaded from: - `/usr/lib/owlry/plugins/*.so` — System plugins (AUR packages) - `~/.config/owlry/plugins/` — User plugins (requires `owlry-lua` or `owlry-rune`) ### Disabling Plugins Add plugin IDs to the disabled list in your config: ```toml [plugins] disabled = ["emoji", "pomodoro"] ``` ### Creating Custom Plugins See [docs/PLUGIN_DEVELOPMENT.md](docs/PLUGIN_DEVELOPMENT.md) for: - Native plugin development (Rust) - Lua plugin development - Rune plugin development - Available APIs ## Theming ### Built-in Themes | Theme | Description | |-------|-------------| | `owl` | Dark theme with amber accents | | `catppuccin-mocha` | Soothing pastel | | `nord` | Arctic blue palette | | `rose-pine` | Natural pine vibes | | `dracula` | Dark vampire theme | | `gruvbox-dark` | Retro groove | | `tokyo-night` | Tokyo city lights | | `solarized-dark` | Precision colors | | `one-dark` | Atom's One Dark | ```toml [appearance] theme = "catppuccin-mocha" ``` ### Custom Theme Create `~/.config/owlry/themes/mytheme.css`: ```css :root { --owlry-bg: #1e1e2e; --owlry-bg-secondary: #313244; --owlry-border: #45475a; --owlry-text: #cdd6f4; --owlry-text-secondary: #a6adc8; --owlry-accent: #f38ba8; --owlry-accent-bright: #f5c2e7; } ``` ### CSS Variables | Variable | Description | |----------|-------------| | `--owlry-bg` | Main background | | `--owlry-bg-secondary` | Secondary surfaces | | `--owlry-border` | Border color | | `--owlry-text` | Primary text | | `--owlry-text-secondary` | Muted text | | `--owlry-accent` | Accent color | | `--owlry-accent-bright` | Bright accent | ## Architecture ``` owlry (core) ├── Applications provider (XDG .desktop files) ├── Commands provider (PATH executables) ├── Dmenu provider (pipe compatibility) └── Plugin loader ├── /usr/lib/owlry/plugins/*.so (native plugins) ├── /usr/lib/owlry/runtimes/ (Lua/Rune runtimes) └── ~/.config/owlry/plugins/ (user plugins) ``` For detailed architecture information, see [CLAUDE.md](CLAUDE.md). ## License GNU General Public License v3.0 — see [LICENSE](LICENSE). ## Acknowledgments - [GTK4](https://gtk.org/) — UI toolkit - [gtk4-layer-shell](https://github.com/wmww/gtk4-layer-shell) — Wayland Layer Shell - [abi_stable](https://crates.io/crates/abi_stable) — ABI-stable Rust plugins - [fuzzy-matcher](https://crates.io/crates/fuzzy-matcher) — Fuzzy search