Use it
Download, wire, use.
1
Download it.
macOS
Homebrew, from the project's tap — hosted on the project's GitLab, hence the explicit URL. The formula builds the binary on your machine, pulling go in as a build dependency, and installs the zsh plugin alongside it.
brew tap yves/cocktails https://gitlab.yg-devworks.com/yves/homebrew-cocktails.git
brew install jigger
To upgrade later: brew upgrade jigger.
Windows
scoop, from the project's bucket. Since v0.10.0 the releases carry prebuilt binaries: nothing to compile, no Go to install. scoop bucket add takes two arguments — the local name you choose, then the repository; passing only a name makes scoop look it up in its own directory and answer unknown bucket.
scoop bucket add jigger https://gitlab.yg-devworks.com/yves/scoop-jigger.git
scoop install jigger
To upgrade later: scoop update jigger. There is no winget package.
Omarchy
Go, because there is no jigger package — neither in the Arch repositories nor in the AUR. It is not a lesser route: jigger has no runtime dependency beyond the managers themselves, so the compiled binary is the whole of it.
sudo pacman -S --needed go git zsh
go install gitlab.yg-devworks.com/yves/jigger@latest
The binary lands in $GOBIN — ~/go/bin by default. Put it on the PATH if it isn't already:
export PATH="$HOME/go/bin:$PATH"
To upgrade later: the same go install line — @latest fetches the newest tag each time.
Any platform, if you have Go: go install gitlab.yg-devworks.com/yves/jigger@latest
2
Wire it into your shell.
macOS
One source line in ~/.zshrc, then exec zsh. It covers every manager the machine has: the plugin doesn't need to be told whether it faces brew or pacman, it looks.
source "$(brew --prefix jigger)/share/jigger/jigger.plugin.zsh"
The order of the source calls doesn't matter, starship included — the plugin places itself wherever it needs to in zsh's hooks.
Windows
The bucket installed the binary only. The module — the part that draws the popup — comes from the repository, so clone it first. The path below is the one the rest of this section uses; any other works, as long as the next line points at it.
git clone https://github.com/Yves848/jigger.git $HOME\git\jigger
Then one Import-Module line in $PROFILE — notepad $PROFILE opens it, and New-Item -ItemType File -Path $PROFILE -Force creates it when it doesn't exist yet — then . $PROFILE, or a new tab.
Import-Module $HOME\git\jigger\shell\jigger.psm1
Here the order is real: if you use oh-my-posh or starship, import jigger after it. And PSReadLine keeps only the last handler bound to a chord — a profile that binds ^R after the import takes the key back, and the regex toggle becomes unreachable. The guide shows how to hand it over.
Omarchy
The plugin is not in the Go module — it comes from the repository, so clone it first. The path below is the one the next line points at; any other works.
git clone https://github.com/Yves848/jigger.git ~/git/jigger
Then one source line in ~/.zshrc, and exec zsh. It covers both managers at once: the plugin doesn't need to be told whether it faces pacman or yay, it looks.
source ~/git/jigger/shell/jigger.plugin.zsh
Keep the clone: git pull updates the plugin, go install …@latest the binary, and the two travel together — the plugin refuses to load against a binary older than 0.11.0, and says so.
3
Check it took.
macOS
The version first, then who answers. An old binary shadowing a newer install in the PATH is the most painful failure to diagnose — one line settles it.
jigger --version
which -a jigger
Windows
The version first, then who answers. An old binary shadowing a newer install in the PATH is the most painful failure to diagnose — one line settles it.
jigger --version
Get-Command jigger -All
Omarchy
The version first, then who answers. An old binary shadowing a newer install in the PATH is the most painful failure to diagnose — one line settles it.
jigger --version
which -a jigger
Then open a fresh shell and type brew ins — pacman ins on Arch, winget ins on Windows — without pressing Enter. The frame should appear under the prompt and narrow down with every letter.
Nothing shows up? The plugin says so when it refuses to load: a message, at shell startup, reports that the binary is missing from the PATH, or that it is too old for this plugin. On the very first use the frame may say “building the catalog…” — jigger never holds up a keystroke waiting on a package manager, so it builds its catalog in the background instead.
4
Now type a command.
There is nothing else to learn. The popup lives on its own, and the recordings below are what it actually does — not a mock-up.
Your manager, as you type
Type a package-manager command and the frame appears on its own, narrowing down with every letter. Nothing to trigger, nothing to remember.
macOS
Windows
Omarchy
One syntax: jg
jg install fd reaches whichever manager knows fd, without you having to know which. The facade only adds: brew install fd keeps working exactly as before, popup included.
macOS
Windows
Omarchy
Regex, on the same line
^R switches the filter, and only the filter: the line, the frame and the keys don't move. The title says which mode is on, and outside the popup the key remains your shell's reverse history search.
Four things the toggle doesn't say out loud. The pattern is not anchored: it matches anywhere in a name, so switching often widens the list before you narrow it. The case is ignored in both modes — switching never changes that quietly. It applies to package names only: verbs, subcommands and flags keep prefix matching, where a regex would teach nothing. And a pattern that doesn't compile matches nothing — the frame says so, rather than dumping the whole catalogue because a bracket is missing.
macOS
Windows
Omarchy
Completing, then running
⏎ completes the last part and runs the line, in a single keystroke. From that point on jigger does nothing at all: what scrolls by is the manager's own output, relayed as is — progress bars, prompts and elevation included.
macOS
Installing through the facade behaves the same on macOS, with brew answering — and no capture of it is recorded: filming one would install packages for real on the machine doing the filming, which the Windows recording does on a dedicated VM. Switch to Windows above to watch it.
Windows
Omarchy
Same on Arch, with yay answering — and its own prompts relayed as is, the AUR ones included, since jigger does nothing at all once the line is run. No capture of it is recorded: filming one means installing for real, which the Windows recording does on a dedicated VM. Switch to Windows above to watch it.
And an upgrade
Same gesture, different verb. Nothing here is specific to installing: upgrade, search and outdated are completed and run the same way.
macOS
The same holds on macOS, where brew does the upgrading — no capture either, for the same reason: upgrading for real belongs on a dedicated machine. Switch to Windows above to watch it.
Windows
Omarchy
Same gesture on Arch. Note that yay drives and pacman only reads, which is why jg install --pm pacman does not exist while yay is installed. No capture of it either, for the same reason: upgrading for real belongs on a dedicated machine. Switch to Windows above to watch it.
5
The keys.
The same set everywhere — one frame, one set of keys, whether Homebrew, winget, scoop, pacman or yay is the one answering.
- ⇥ inserts the current candidate
- ⏎ completes the last part and runs the line, in a single keystroke
- ↓ enters the list, then moves down one candidate
- ↑ moves up; on the first candidate, hands the keyboard back to the shell
- ^N ^P the same, for those who prefer them to arrow keys
- ^G closes the popup for the current line — ⇥ reopens it
- ^R switches the filter between plain text and regex; the frame's title shows [regex] while it is on
Your arrow keys are never taken over. As long as the popup doesn't hold the keyboard, ↑ and ↓ stay your shell history. The frame shows which: the current line underlined and the footer reading ↑↓ navigate when it has focus, ↓ browse when it doesn't.
jigger corrects what it inserts whenever the command would otherwise be wrong: --cask in front of a Homebrew cask, the qualified name main/flux for a scoop package present in several buckets, quotes around a winget identifier that contains spaces.
6
Settings.
Settings are environment variables, set before the source or the Import-Module: the plugin reads its keys and sets its hooks at load time. Four of the twelve, the ones worth knowing on day one:
-
JIGGER_COMMANDS
The commands that open the popup — brew pacman yay ssh scp sftp under zsh, winget,scoop,ssh,scp,sftp under PowerShell. This is also how the SSH picker gets turned off. jigger and jg are always added to whatever you set.
-
JIGGER_LANG
Messages: en or fr. Read before LC_ALL, LC_MESSAGES and LANG — this is how you get French back in an English-speaking shell.
-
JIGGER_LIVE
1 by default. 0 means nothing shows up unasked: ⇥ opens the full-screen picker instead. That is also the way to isolate a conflict with another line-editing plugin.
-
JIGGER_CACHE_DIR
Where the catalogs are cached — ~/Library/Caches/jigger on macOS, %LOCALAPPDATA%\jigger on Windows. jigger prompt --path prints the file actually in use.
Environment variables vanish with the shell. jigger config opens a screen that writes them down, says where each value comes from — default, file, or environment — and never touches your ~/.zshrc or your $PROFILE.