Documentation menu
Examples & Cookbook
A copy-pasteable gallery of complete quick actions and project templates — commands, selects, forms, splits, and context variables.
A gallery of complete, copy-pasteable examples. Drop a quick action into
~/.config/herdr-plus/quick-actions/, or a project into
~/.config/herdr-plus/projects/ — one file per entry, file name up to you.
Quick actions
A plain command
The simplest action: run a command immediately.
# google.toml
name = "Google"
description = "Open https://google.com"
type = "command"
command = "open https://google.com"
Open a URL
type defaults to command, so you can omit it.
# github.toml
name = "GitHub"
description = "Open https://github.com"
command = "open https://github.com"
Open the current repo on GitHub
Uses the launch context. This opens the origin remote of whatever repo your
pane is in, in your browser.
# open-repo-on-github.toml
name = "Open This Repo on GitHub"
description = "Open the current repo's GitHub page"
type = "command"
command = "open \"$(git -C {{.WorkDir}} remote get-url origin | sed -E 's#git@github.com:#https://github.com/#; s#\\.git$##')\""
A select with grouped options and separators
A second fuzzy list. Headings group the options; a blank separator adds a spacer.
# open-repo.toml
name = "Open Repo on GitHub"
description = "Pick one of our repos and open it"
type = "select"
command = "open https://github.com/cloudmanic/{{.Value}}"
[[options]]
heading = "Apps"
[[options]]
label = "Options Cafe"
value = "options-cafe"
description = "cloudmanic/options-cafe"
[[options]]
label = "Skyclerk"
value = "skyclerk"
description = "cloudmanic/skyclerk"
[[options]] # blank spacer
[[options]]
heading = "Tools"
[[options]]
label = "Herdr Plus"
value = "herdr-plus"
description = "cloudmanic/herdr-plus"
A form with urlquery
Type a query; urlquery escapes it so it’s URL-safe.
# google-search.toml
name = "Search Google"
description = "Type a query and open the results"
type = "form"
command = "open 'https://www.google.com/search?q={{.Value | urlquery}}'"
[form]
prompt = "Search Google for"
placeholder = "e.g. herdr terminal multiplexer"
A “search docs” form
Same idea, pointed at a docs site.
# search-docs.toml
name = "Search herdr Docs"
description = "Open the docs search for a term"
type = "form"
command = "open 'https://herdr.dev/?q={{.Value | urlquery}}'"
[form]
prompt = "Search the docs for"
placeholder = "e.g. keybindings"
Using a context variable
Open the directory you launched from in your file manager.
# reveal-working-dir.toml
name = "Reveal Working Dir"
description = "Open the launch directory in Finder"
type = "command"
command = "open {{.WorkDir}}"
A project-local action that keeps the pane open
For per-project actions (in a repo’s .herdr-plus/quick-actions/), end the
command with a wait so its output doesn’t flash by before the picker pane closes.
The action’s stdin is /dev/null, so the wait must read the terminal directly
via </dev/tty.
# .herdr-plus/quick-actions/make-build.toml
name = "make build"
description = "Build the herdr-plus binary (make build)"
command = 'make build; printf "\n— done · press Enter to close (auto-closes in 30s) —\n"; read -t 30 _ </dev/tty || true'
Keep-open variants you can use in place of the read -t 30 ... tail:
read _ </dev/tty # wait for Enter, then close
read -t 30 _ </dev/tty # ...but auto-close after 30s if you walk away
sleep 5 # simplest: just linger N seconds, then close
The || true keeps a read timeout (or a missing tty) from looking like an error.
Projects
A simple 3-tab dev project
Three tabs, each running a startup command (the last is just an empty shell).
# myapp.toml
name = "My App"
description = "Day-to-day dev workspace"
working_dir = "~/Development/my-app"
[[tabs]]
name = "claude"
command = "claude --dangerously-skip-permissions"
[[tabs]]
name = "lazygit"
command = "lazygit"
[[tabs]]
name = "terminal" # no command — just an empty shell
A project with a split-pane server tab
The server tab is split into two stacked panes; it shows as server ×2 in the
browser.
# options-cafe.toml
name = "Options Cafe"
description = "The main options.cafe monorepo"
working_dir = "~/Development/options-cafe/options.cafe" # ~ and $VARS expand
[[tabs]]
name = "claude"
command = "claude --dangerously-skip-permissions --chrome"
[[tabs]]
name = "editor"
command = "spiceedit"
# A split tab: instead of `command`, list [[tabs.panes]].
[[tabs]]
name = "server"
[[tabs.panes]]
command = "php artisan serve"
[[tabs.panes]]
command = "npm run dev"
split = "down"
lazygit + editor + server, with a side-by-side split
A four-tab project whose server tab splits side by side (right) instead of
stacked.
# webapp.toml
name = "Web App"
description = "lazygit, editor, and a side-by-side server tab"
working_dir = "$HOME/Development/web-app" # $VARS expand too
[[tabs]]
name = "lazygit"
command = "lazygit"
[[tabs]]
name = "editor"
command = "nvim ."
[[tabs]]
name = "server"
[[tabs.panes]]
command = "make api"
[[tabs.panes]]
command = "make web"
split = "right" # beside the first pane, not below
[[tabs]]
name = "shell" # an empty terminal to poke around in
A minimal project using ~
working_dir expands a leading ~; omit it entirely and it defaults to your
home directory.
# notes.toml
name = "Notes"
description = "Quick scratch workspace in my notes dir"
working_dir = "~/Documents/notes"
[[tabs]]
name = "edit"
command = "nvim ."
See also
- Actions Reference — the full action format.
- Control Mode & Projects — the full project schema.
- Template Variables — context you can use in commands.
Spot something off? Edit this page on GitHub ↗