Walker is a highly extendable application launcher that doesn't hold back on features and usability. Fast. Unclutters your brain. Improves your workflow.
- plugin support: simple stdin/stdout (external or via configuration, see wiki)
- icons/images
- start as service for faster startup (see benchmarks below)
- run entries via labels (F<1-8> or jkl;asdf)
- non-blocking async handling of results
- typeahead
- start with explicit modules, style or config
- arrow-up history
- drag&drop support
- dmenu-mode
- run as password input
- theming support (global, per module, with inheritance)
- runner
- parses your shell config for aliases
- exlusive list or all binaries
- ignore-list
- generic runner
- semi-smart:
shu now=>shutdown now
- windows
- simple window switcher
- desktop applications
- history-aware
- desktop actions (f.e.
Open a new private window[Firefox]) - puts newly installed applications on top
- context-aware (context = open windows)
- websearch ()
- simple websearch
- google, duckduckgo, ecosia, yandex
- can open websites directly
- clipboard
- simple clipboard history
- with images
- module switcher
- lets you switch to specific modules
- commands (for Walker, f.e. clear cache)
- ssh
- parses your
known_hostsandconfigfiles
- parses your
- finder
- simple fuzzy finder
- drag&drop support
- emojis
- custom commands (for running simple commands)
- lets you define and run simple one-off commands
- f.e.
toggle window floating - no need to create keybinds for commands you don't run often
- catppuccin
- kanagawa
- bare
- gtk4-layer-shell
arch:
yay -S walker-bin
// or to build from source
yay -S walker
Building can take quite a while, be patient
Make sure you have the following dependencies installed:
- go
- gtk4
- gtk4-layer-shell
- gobject-introspection
git clone https://github.com/abenz1267/walker /tmp/walker
cd /tmp/walker
go build -x // the '-x' is for debug output
sudo cp walker /usr/bin/Without these you won't be able to build.
Install using Nix
You have two options of installing walker using Nix.
-
Using the package exposed by this flake
- Add to your flake
inputs.walker.url = "github:abenz1267/walker"; - Add
inputs.walker.packages.<system>.defaulttoenvironment.systemPackagesorhome.packages
- Add to your flake
-
Using the home-manager module exposed by this flake:
- Add to your flake
inputs.walker.url = "github:abenz1267/walker"; - Add
imports = [inputs.walker.homeManagerModules.walker];into your home-manager config - Configure walker using:
- Add to your flake
programs.walker = {
enable = true;
runAsService = true;
# All options from the config.json can be used here.
config = {
search.placeholder = "Example";
ui.fullscreen = true;
list = {
height = 200;
};
websearch.prefix = "?";
switcher.prefix = "/";
};
# If this is not set the default styling is used.
style = ''
* {
color: #dcd7ba;
}
'';
};Additionally, there is a binary cache at https://walker.cachix.org which you can use with the following:
nix.settings = {
substituters = ["https://walker.cachix.org"];
trusted-public-keys = ["walker.cachix.org-1:fG8q+uAaMqhsMxWjwvk0IMb4mFPFLqHjuvfwQxE4oJM="];
};This depends on your system. You simply need to autostart Walker with walker --gapplication-service and it will run in the background. Then just run walker to bring it up.
Example for Hyprland:
exec-once=walker --gapplication-serviceYou can start walker with explicit modules by using the --modules flag. F.e:
walker --modules applications,sshWill tell Walker to only use the applications and ssh module.
If you have typeahead enabled, make sure that your #search has no background, so the typeahead is readable.
If you want to extend walker with your own modules, you can do that in the config.
{
"plugins": [
{
"prefix": "!",
"name": "mymodule",
"src": "node /path/to/myscript.js"
}
]
}See the wiki for more information.
The window and items will have a class based on the source. Selecting an item will change the windows class to the current selections source. Using a prefix will apply that sources classes to the window.
F.e. search = !somecommand => #window.runner
| class | condition |
|---|---|
#window.activation |
AM enabled |
#spinner.visible |
Processing in progress |
#item.<entryclass> |
Always |
Start with walker --gapplication-service to start in service-mode. Calling walker normally afterwards should be rather fast.
| Flag | Description |
|---|---|
--modules, -m |
Run with explicit modules |
--new, -n |
Start new instance ignoring service |
--config, -c |
Config file to use |
--theme, -s |
Theme to use |
--dmenu, -d |
Start in dmenu mode |
--keepsort, -k |
Don't sort alphabetically |
--placeholder, -p |
Placeholder text |
--labelcolumn, -l |
Column to use for the label |
--password, -y |
Launch in password mode |
--forceprint, -f |
Forces printing input if no item is selected |
--query, -q |
To set initial query |
AM = Activation Mode
| Key | Description |
|---|---|
Enter |
activate selection |
Alt+Enter |
activate selection with alternative command. By default: run in terminal |
Shift+Enter |
activate selection without closing |
Ctrl+j (if ActivationMode is disabled), Down, Tab |
next entry |
Ctrl+k (if ActivationMode is disabled), Up, LEFT_TAB (shift+tab?) |
previous entry |
Escape |
close |
Ctrl + Label |
Activate item by label |
Ctrl + Shift + Label |
Activate item by label without closing |
Shift+Backspace |
delete entry from history |
Activation-Mode can be triggered by holding LCtrl ( or LAlt). The window will get an additional class activation you can use for styling. While activated, you can run items by pressing their respective label. This only works for the top 8 items.
System: Arch Linux, Hyprland, Amd 7950x, 32gb DDR5-6000, SSD
Measured time is until telling GTK to show the window.
| Mode | Startup time |
|---|---|
| normal | 23ms - 33ms |
| with service | ~1.8ms |
Make sure to clean the applications cache by either running the "Clear Applications Cache" command from within Walker (using the commands module) or by deleting the applications.json file in $HOME/.cache/walker/.
Additionally you can diasble the cache completely by setting
"applications": {
"cache": false
},in your config.

