Use it

Download, wire, use.

Showing commands for macOS Windows Omarchy

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

brew install fire — the list narrows with every letter, nothing pressed. Captured on macOS.

Windows

winget install fire — the same frame and the same keys, a different catalogue: winget answers with Publisher.Package identifiers where brew shows bare formula names. Captured on Windows.

Omarchy

yay -S visual-studio — repositories and the AUR in a single list: ◆ for a repository package, ▣ for an AUR one, ● for what is already installed. Captured on 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

jg install fd — the facade answers for whichever manager knows the package. Captured on macOS.

Windows

jg install node — with two managers installed side by side, the right-hand column names who answers for each candidate. Captured on Windows.

Omarchy

jg install fd — with one detail that belongs to Arch: pacman and yay are two doors onto the same database, so jg lists your packages once, never twice. Captured on 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

brew install fire lists the names that begin with fire. ^R switches to regex and arrayfire joins them — the pattern is not anchored, so the list gets wider before it gets narrower. Then (bird|fly) keeps four. Captured on macOS.

Windows

winget install fire offers twenty-one candidates by prefix. ^R, then (bird|blade), keeps four — an alternation no prefix search can express. Captured on Windows.

Omarchy

yay -S fire lists the names that begin with fire. ^R switches to regex, and names carrying fire in the middle join them — the list gets wider before it gets narrower. Then (bird|fly) keeps the firebirds and the fireflies, repositories and AUR at once. Captured on 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

jg install hexy, completed to hexyl, then run — scoop's own output, relayed untouched. Captured on Windows, against a real manager.

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

jg upgrade hyperf, completed to hyperfine, then run — scoop replacing 1.16.1 with 1.20.0. Captured on Windows, against a real manager.

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.