I use Arch, btw. Since my system is as minimalist as possible, I had to ditch some standard UI tools for practical reasons. I don't run waybar (or any equivalent), which frees up a ton of screen real estate for my apps, but it deprives me of a convenient way to check the date, time, battery percentage, or manage notifications. And constantly typing date, cal -m, btop, etc., in the terminal isn't always the best UX.
So, I decided to kill several birds with one stone. I didn't spend much time thinking of a name, but I made up for it with its functionality and aesthetics. It’s a launcher, similar to wofi/rofi, but written in Rust and much better (at least for my specific workflow). Under the hood, it uses relm4 (GTK4) and gtk4-layer-shell.
Besides looking great, I added the ability to manage notifications, check the date, time, and calendar, and get detailed hardware info about the battery state. As a bonus, it natively integrates with libqalculate, allowing you to quickly calculate, convert, and manipulate various units right from the search bar.
- Smart Launcher: Fast search through
.desktopfiles. Applications are sorted by launch frequency first, and alphabetically second. - Seamless Calculator: The moment you type a query that matches no apps, the interface automatically falls back to an advanced calculator mode (powered by
qalc). - Status Bar Replacement:
- Time & Calendar: Current time, date, and a handy drop-down calendar.
- Battery: Detailed stats (Status, Charge %, Consumption in Watts, Time until empty/full).
- Notifications: Quick toggles for "Do Not Disturb" and clearing all notifications (via
dunstctlby default).
- Keyboard Navigation: Full arrow key control,
Tab/Shift+Tabsupport, and closing viaEscor clicking outside the window.
To build and run Launchpad properly, you will need:
- Rust / Cargo (for building)
- GTK4 and gtk4-layer-shell (for rendering the UI as an overlay)
- qalc (
libqalculatepackage) for the built-in calculator engine. - dunst (optional, command can be swapped out) for notification management.
Building and installing the project is automated via the Makefile.
- Clone the repository:
git clone https://github.com/tebryaev/launchpad cd launchpad - Build and install system-wide:
This command builds the release binary and copies it to
make install
/usr/bin/launchpad.
If you ever want to remove the application, simply run:
make uninstallLaunchpad is designed to be triggered by a hotkey. Here is how you can bind it in popular Wayland compositors:
Hyprland (~/.config/hypr/hyprland.conf):
bind = $mainMod, Space, exec, launchpad
Sway (~/.config/sway/config):
bindsym $mod+space exec launchpad
Niri (~/.config/niri/config.kdl):
binds {
Mod+Space { spawn "launchpad"; }
}The tool is highly flexible. By default, the launcher uses the Nord color palette because that's what I personally use.
You can override all settings and styles locally:
- Configuration:
~/.config/launchpad/config.toml - Styles (CSS):
~/.config/launchpad/style.css
You can grab the default config.toml and style.css directly from the root of this repository and copy them to your local ~/.config/launchpad/ directory.
You can change the application search paths, hide specific apps, change your battery device name, and override the commands used for notifications and the calculator:
cache_file = "~/.cache/launchpad.cache"
# Ignored applications (matched by the "Name" field in the .desktop file)
ignored_apps = [
"xterm",
"uxterm",
]
# Paths where the launcher looks for .desktop files
app_search_paths = [
"/usr/share/applications",
"~/.local/share/applications",
"/var/lib/flatpak/exports/share/applications"
]
[battery]
# Device name in /sys/class/power_supply/
device = "BAT0"
[notifications]
# Commands for managing notifications (using dunst as an example).
# Passed as arrays: ["command", "argument1", "argument2"]
status_cmd = ["dunstctl", "is-paused"]
mute_cmd = ["dunstctl", "set-paused", "true"]
unmute_cmd = ["dunstctl", "set-paused", "false"]
clear_all_cmd = ["dunstctl", "close-all"]
[calculator]
# Command for calculations. The result is expected in stdout.
# '--' is used so qalc doesn't interpret the expression as its own flags.
command = ["qalc", "-t", "--"]Right now, the project is strictly in the "works perfectly for me" stage. But if there's actual demand from the community, I'm completely open to improving the installation process, expanding the feature set, and adding more configuration flexibility. Pull requests and issues are highly welcome!
