# pacer - terminal autocomplete for macOS

Pacer shows terminal autocomplete in a popover at your cursor in Ghostty, iTerm2, and Terminal on macOS, with zsh. No AI, no account, no telemetry.

## Synopsis

```text
pacer setup | uninstall
pacer launch | quit | restart
pacer update [--force]
pacer stats [--days N]
pacer doctor
pacer settings key [value] [--delete]
```

## Description

Stop guessing flags, branch names, and file paths. Pacer shows what you can type next, right at your cursor.

Pacer shows an autocomplete popover next to your cursor while you type in zsh, in Ghostty, iTerm2, or Terminal. It lists subcommands, options, branches, files, and scripts. Use ↑ ↓ to move, ⏎ or ⇥ to insert, and esc to close.

- No AI
- No account
- No telemetry
- Runs on your Mac

## Install

Install with Homebrew, then run `pacer setup`:

```text
$ brew install --cask alexitaylor/tap/pacer
```

Or with the [install script](/install), which also runs `pacer setup`:

```text
$ curl -fsSL https://pacer.sh/install | bash
```

## Features

- **Works in your terminal**: Ghostty, iTerm2, and Terminal. The popover opens at the cursor in each one.
- **Subcommands and options**: Completion specs for more than 700 CLIs, from the open Fig spec library. Each row shows what the item does on a second line.
- **Branches you can tell apart**: Each branch row shows the age and subject of its last commit. The current branch comes first, then up to five branches you checked out recently, marked `Recent`.
- **Changed files first**: Commands that take a file, such as `vim`, `code`, and `cat`, put the files from `git status` at the top. A red letter shows how each one changed: `M` modified, `A` added, `?` new, `R` renamed.
- **Ranked by what you run in this repo**: Suggestions you use often in the current repo rise to the top. Only commands that succeeded count, and older uses count less.
- **A guard for risky commands**: `git push --force`, `git reset --hard`, `rm -rf`, and similar commands show a red RISK badge and a red name. The shell asks for a second ⏎ before it runs them, whether you typed, pasted, or recalled the line.
- **Scripts that explain themselves**: In a `scripts/` or `bin/` folder, each file shows the first sentence of its top comment, so you can pick the right script without opening it. Executable files come first.
- **`pacer stats`**: A local report of how often you use Pacer and how fast the popover responds: completions accepted, keystrokes saved, your top commands, and speed at p50 and p95 against a 100 ms target, with where the time goes.
- **Any command, even without a spec**: When a command has no spec, Pacer reads its `--help` output and builds completions from it. The result is cached until the program changes, so an update brings its new subcommands at once.
- **`pacer doctor`**: Checks that Pacer is installed and working, like `brew doctor`: the app and its signature, the version, the Accessibility permission, the shell hooks, and leftovers from Kiro CLI, Amazon Q, or Fig. Each problem comes with a one-line fix.
- **Your own specs**: Put compiled specs in `~/.config/pacer/specs`. A spec there wins over the bundled spec with the same name.

## Examples

Switch branches by what you did on them, not by name.

```text
$ git switch 
  docs/landing-page  Current branch · now · Draft the man page layout
  feat/risky-guard  Recent · 25m · Mark risky commands and ask for an extra Enter
  main  Recent · 3h · Rank suggestions by how often you use them
  fix/popover-spinner  5h · Clear the popover spinner when a generator fails
  at/677-changed-files  1d · List changed files first in file suggestions
  chore/bump-deps  2w · Bump vite to 6.3.4
```

Open the file you are working on. Changed files come first.

```text
$ vim 
  src/state/index.ts  Changed file
  src/changedFiles.ts  Changed file
  NOTES.md  Changed file
  README.md
  node_modules/
  package.json
```

Risky options are marked before you insert them.

```text
$ git push --f
  --follow-tags  Push all the refs that would be pushed without this option, and also push annotated tags in refs/tags that are missing from the remote but are pointing at commit-ish that are reachable from the refs being pushed. This can also be specified with configuration variable push.followTags
  -f, --force  Usually, the command refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it. Also, when --force-with-lease option is used, the command refuses to update a remote ref whose current value does not match what is expected. This flag disables these checks, and can cause the remote repository to lose commits; use it with care  [RISK]
  --force-with-lease  Protect the named ref (alone), if it is going to be updated, by requiring its current value to be the same as the specified value <expect> (which is allowed to be different from the remote-tracking branch we have for the refname, or we do not even have to have such a remote-tracking branch when this form is used). If <expect> is the empty string, then the named ref must not already exist  [RISK]
```

A tool with no spec still completes, from its own --help.

```text
$ deploy --
  --env  Target environment: staging or prod
  --dry-run  Print the plan without applying it
  --region  Cloud region to deploy to
  -v, --verbose  Print every step
```

## Speed and health

Pacer measures itself on your Mac. `pacer stats` shows how often it helps and how fast the popover responds; the target is 100 ms, and on the maker's Mac a typical keystroke takes about 45 ms. Example output:

```text
$ pacer stats
 Pacer stats · last 7 days

 COMPLETIONS
   Accepted          212
   Keystrokes saved  4180

 SPEED  1904 samples · target 100 ms
   p50    43 ms  █████████░░░░░░░░░░░  ✓ under target
   p95    63 ms  █████████████░░░░░░░  ✓ under target
```

`pacer doctor` checks the installation and says how to fix anything that is wrong:

```text
$ pacer doctor
 Pacer doctor

   ✓ Installed      /Applications/Pacer.app
   ✓ App running    yes
   ✓ Accessibility  allowed
   ✗ Other tools    Kiro CLI blocks in ~/.zshrc
                    → Delete the Kiro CLI pre and post block lines from that file

 1 problem found.
```

## Future directions

These features are planned. They are not in the current release.

- **Quiet for commands you dismiss** (planned): Press esc on the same command three times and the popover stops opening for it.
- **The fix that worked last time** (planned): When a command failed in this folder and a similar one then worked, Pacer suggests the one that worked.
- **Snippets with blanks** (planned): Save long commands with `pacer snip add`. Fill in the blanks with ⇥.

## What's new

- **Release v0.1.0-202610300542**: Terminal.app and iTerm2 support. Changed files first, with their status letter. Branch rows with commit age and subject, and recent checkouts. Ranking by what you run in each repo. A guard for risky commands. Scripts with descriptions. `pacer stats` and `pacer doctor`. `pacer update` says when changes are waiting for the next release.
- **Release v0.1.0-202610300038**: First build: the popover in Ghostty, the Fig spec library, completions from `--help`, and `pacer update`.

## Files

- **~/.config/pacer/specs/**: Your own completion specs.
- **~/Library/Application Support/pacer/settings.json**: Settings. Read and change them with `pacer settings`.
- **~/Library/Application Support/pacer/data.sqlite3**: Your command history, used for ranking, and the usage and speed events behind `pacer stats`. Events older than 90 days are deleted. It all stays on your Mac.
- **~/.zshrc, ~/.zprofile**: Pacer adds its shell hooks here. `pacer uninstall` removes them.

## Privacy

Pacer makes no network calls while you type. Completions come from spec files on disk and from commands it runs in your own shell, like `git branch`.

There is no AI, no account, and no telemetry. `pacer stats` reads its numbers from a local file and sends them nowhere. Only two commands use the network, and only when you run them: `pacer update` downloads a newer release, and `pacer doctor` asks GitHub for the latest version number.

## Requirements

- **macOS on Apple silicon**: Intel Macs are not supported.
- **zsh**: The shell: the program inside the terminal window that reads and runs your commands. It has been the default on macOS since 2019. Pacer does not work with bash or fish.
- **Ghostty, iTerm2, or Terminal**: Pacer reads where the cursor is to place the popover. Kitty, WezTerm, Alacritty, and the VS Code terminal are not supported yet.
- **Accessibility permission**: macOS asks for it once, so that Pacer can read where the cursor is.

## First run

The first time Pacer starts, macOS asks you to allow it in System Settings > Privacy & Security > Accessibility. Pacer needs this permission for one thing: to read where the cursor is, so the popover opens next to it. It does not read what is on your screen.

Then open a new terminal tab and type a command, such as `git ` with a space. If the popover does not appear, run `pacer doctor`. It names the step that is missing and how to fix it.

## Questions

### Is Pacer a replacement for Fig?

Yes, for one setup. Pacer started from the Fig code that Amazon released as open source. It keeps the popover and the spec library, and removes the account, the AI, and the cloud.

### Which terminals does it work in?

Ghostty, iTerm2, and Terminal on macOS. It does not work in Warp, Kitty, WezTerm, Alacritty, or the VS Code terminal yet.

### Does Pacer send my commands anywhere?

No. Your history stays in a local file. See the [privacy page](/privacy).

### What if something is not working?

Run `pacer doctor`. It checks the app, the Accessibility permission, the shell hooks, and conflicts with Kiro CLI, Amazon Q, or Fig, and gives a one-line fix for each problem. If that does not help, see the [contact](/contact) page.

### Can I add completions for my own tools?

Yes. Add a spec to `~/.config/pacer/specs`, or let Pacer read the tool's `--help`.

## See also

- [fig(1)](/vs-fig): Pacer and Fig compared
- [amazon-q(1)](/vs-amazon-q): Pacer and Amazon Q autocomplete compared
- [kiro(1)](/from-kiro): Moving from Kiro CLI or Amazon Q to Pacer
- [zsh-autosuggestions(7)](/vs-zsh-autosuggestions): Inline history suggestions compared with a popover
- [fzf-tab(7)](/vs-fzf-tab): Fuzzy tab completion compared with Pacer
- [warp(1)](/vs-warp): A terminal with built-in completions compared with Pacer
- [ghostty(1)](https://ghostty.org): A terminal Pacer runs in
- [iterm2(1)](https://iterm2.com): A terminal Pacer runs in

## History

Pacer started in 2026 from `aws/amazon-q-developer-cli-autocomplete` at commit `b654a1b`, the open-source Fig code, which is licensed under MIT and Apache 2.0.

## Author

[Off Leash Labs](https://offleashlabs.dev/). Write to [offleashlabs@gmail.com](mailto:offleashlabs@gmail.com).
