macOS · Windows · Linux

Your package manager,
as you type.

A frame appears under your prompt and follows every keystroke. And one syntax for Homebrew, winget, scoop and pacman, instead of one each.

macOS

brew install fire — the frame appears on its own and narrows with every letter. Captured on macOS.

Windows

winget install fire — the same frame and the same keys, another catalogue. Captured on Windows.

Omarchy

yay -S visual-studio — one frame for two catalogues: ◆ a repository package, ▣ an AUR one, ● what is already installed. Captured on Omarchy.
One syntax

One vocabulary, every dialect.

jg install fd reaches whichever of Homebrew, winget, scoop or pacman knows fd — without you having to know which.

❯ jg
╭──────────────────────────────────────────────────────────╮
│❯ jigger                                     jigger 0.21.0│
│  •  cleanup                                              │
│  •  doctor                                               │
│  •  info                                                 │
│  •  install                                              │
│                                                          │
│   ⇥  insert   ↩  execute   ↓  browse   ^G  close         │
╰──────────────────────────────────────────────────────────╯
  • install
  • uninstall
  • upgrade
  • list
  • outdated
  • search
  • info
  • source
  • pin
  • unpin
  • cleanup
  • doctor

The first seven work everywhere. The others exist only where the manager knows them — asking winget for cleanup, or pacman for source, fails cleanly, naming who would know how to do it.

One verb at the centre, jg install fd, with four package managers around it. A single solid arrow reaches the one whose catalogue holds the name; the other three stay dim. Below, the case where two managers know the same name: the picker opens and you choose — nothing is settled for you. ONE VERB, SEVERAL DOORS routed by what the catalogues hold, never by a setting brew it has the name — it runs winget no such name in its catalogue scoop no such name in its catalogue pacman no such name in its catalogue ONE VERB jg install fd who has this name? TWO MANAGERS, ONE NAME not the same software jg install fzf brew scoop THE PICKER it opens, and you choose nothing is decided for you --pm settles it inside a script No setting changes this. you are the one who chooses

Never an automatic choice. When a single manager knows the name, it wins silently. When several do, the picker opens and you decide — two packages sharing a name are not necessarily the same software. No setting changes that; --pm is the way to settle it in a script.

On Arch, pacman and yay are two doors onto the same database: yay drives, pacman reads. Whichever one you have, jg lists your packages once — never twice.

How it works

Three channels, one binary.

jigger sits between your shell and your package managers by three separate paths: it reads their catalogs to complete what you type, translates one vocabulary into each of their dialects, and counts pending upgrades in the background for your prompt.

Three bands: your shell on top, jigger in the middle, the five package managers and the ssh commands at the bottom, linked by three channels — completion reading catalogs, the facade running a translated command, and the prompt counting upgrades in the background. YOUR SHELL jigger.plugin.zsh · jigger.psm1 ❯ winget install Git. ❯ jg install fd 🍺 6.0.17 🔬 7 ❯ ↓ every keystroke, relayed ↑ one frame to draw ↓ one verb, some names ↑ the output, as is ↓ the hook reads one line ↑ version + counters jigger a self-contained Go binary, near-instant startup NO DAEMON · NO NETWORK READ jigger render --line The first word decides who speaks. Stateless: the index stays in the shell. RUN jg <verb> [--pm] [--json] Twelve verbs into every dialect. Routed by catalog, never by setting. STATE jigger prompt --refresh Counts what is waiting, in the background. Never on the prompt's critical path. ↓ reads catalog + installed ↑ candidates, badges, fixes ↓ the translated command ↑ raw stream, exit code ↓ queried in the background ↑ version + how many waiting THE PACKAGE MANAGERS each answers its own way — jigger adapts, they don't change brew catalog cached 24 h pacman it reads, yay drives yay the repositories and the AUR winget 14,401 ids, cached scoop all on disk, no cache ssh scp sftp never run by jigger

Blue — completion reads, it never runs anything. Amber — the facade translates a verb, then lets the manager do the work and relays its output untouched. Green — the prompt: dashed where it runs in the background, solid where the hook only reads one line and costs nothing.

What it guarantees

It stays out of the way.

  • Nothing slow while you type

    Catalogs are cached and read from disk. A keystroke never waits on a package manager.

  • Your manager's output, untouched

    Prompts, progress bars, elevation dialogs — jigger relays them as they are instead of parsing them away.

  • Made for pipes too

    Every listing verb takes --json, so a script never has to read a table meant for humans.

In your prompt

A block in your prompt, if you want one.

Ready-made segments for oh-my-posh and starship: your manager's version, and how many packages are waiting — counted apart, and never on the prompt's critical path.

~ via 🐍 v3.14.7 🍺 6.0.17 🔬 5 📦 2
❯ 

Set JIGGER_PROMPT=1 before loading the plugin, then paste the segment for your prompt and your manager — brew, pacman and Windows versions all ship with jigger.

Nearby

And when you'd rather see than type.

Cocktails is the macOS app of the same family: your packages, their dependencies and your updates, at a glance. jigger works perfectly well without it — they are independent.

Visit the Cocktails site →
Install

Two lines, then one in your shell.

Homebrew on macOS and Linux, scoop on Windows, go install anywhere else. Then one source line in ~/.zshrc, or one Import-Module in your PowerShell profile.

The commands live on a page of their own, next to what to check when nothing shows up, the keys, and the settings worth knowing on day one.