Walker is a highly extendable application launcher that doesn't hold back on features and usability. Fast. Unclutters your brain. Improves your workflow.
(default style)
(horizontal example)
- 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
- runner
- parses your shell config for aliases
- exlusive list or all binaries
- ignore-list
- generic runner
- semi-smart:
shu now
=>shutdown now
- 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_hosts
andconfig
files
- 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
- 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
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>.default
toenvironment.systemPackages
orhome.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="];
};
The config can be written json, toml or yaml. Default values will be used, so you only have to overwrite.
Default config will be put into $HOME/.config/walker/
.
See config/config.default.json
and ui/style.default.css
. Styling is done via GTK CSS.
You can start walker with explicit modules by using the --modules
flag. F.e:
walker --modules applications,ssh
Will tell Walker to only use the applications and ssh module.
Modules can define a special_label
which is used for AM. It only really makes sense, if a module returns one entry. This could be used to f.e. always have the websearch result have the same label, so you can activate it with the same label every time, even if you don't see it.
Format for custom special labels is: "<entry label>;<entry sub>": "<special label>"
.
Example:
{
"special_labels": {
"discord;internet messenger": "1"
}
}
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 |
--style , -s |
Style file 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 |
start AM |
in AM: <label> |
activate item |
in AM: Hold Shift+<label> |
activate item (don't close) |
in AM: Escape |
stop AM |
Activation-Mode can be triggered by holding LCtrl
. 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.