Show HN: Figxit, IDE-style autocomplete for the macOS terminal Figxit launched as a free, local macOS terminal autocomplete tool that rebuilds the completion feature of Fig, which was acquired and folded into a larger AI product. Figxit opens a native popup under the cursor listing commands, subcommands, options, scripts and targets, ranked by the user's own Atuin history, with adapters for zsh, bash and fish and no account, cloud service or telemetry. The tool reads Makefile targets and package.json scripts directly and loads the open source Fig completion specs, hiding options already present on the command line. A native autocomplete popup for your terminal. It opens under the cursor as you type and lists the commands, subcommands, options, scripts, and targets that fit, ordered by what you use most in the current project. It is the completion part of Fig, rebuilt as a small local tool: no account, no AI chat, no telemetry. Fig made the terminal easier to use. You typed git and saw what you could do next, with a short description on each row. Fig was then acquired and folded into a larger AI product, and the standalone autocomplete went away. The open alternatives each miss a part of that experience: - Shell completion menus open only when you press Tab, and they do not know which command you use most. - Tools that draw inside the terminal must take over the terminal session to do it. - History search finds a full past command, but it does not show what a command can do. Figxit puts the three parts back together: a popup that opens by itself, completion data for hundreds of tools, and ranking from your own history. Make the command line show you its options at the moment you need them, with no cost to speed and no data leaving your machine. - One popup for each shell and terminal. The engine and the popup do not depend on the shell. Each shell needs only a small adapter. There are adapters for zsh, bash, and fish. - Completion that knows your project. A Makefile , a package.json , and a git repository already describe what you can run. Figxit reads them directly, so a new project works with no setup. - Your history is the ranking. The command you run ten times a day in this folder is the first row. - Native on each platform. On macOS the popup is a real system window with the system glass material, not text drawn over your prompt. - Local only. No account, no cloud service, no usage tracking. make lists the targets of the Makefile in the current folder. npm run , pnpm , yarn , and bun run list the scripts of package.json . The icon comes from the verb in the name: dev , start , and serve share one shape, test and test:e2e share another, and dev-down gets the stop shape. One list of 12 verbs covers most script and target names in popular open source projects. For a Makefile , the right column shows the comments that many projects already write: @ Development dev: Start the stack with hot reload dev-down: Stop the stack @ Tests test: Run the unit tests @ starts a section and after a target is its help text. Both are optional. Figxit loads the open source Fig completion specs. Type a command and a space for its subcommands, or a dash for its options. Options that are already on the line are hidden. Specs can also supply live values, for example git branches after git checkout , hosts after ssh , and files and folders where a command takes a path. Figxit reads your Atuin https://atuin.sh history database, read-only. A word scores higher when you used it in the same folder, in the same repository, or recently. Without Atuin the popup still works, in the order the sources give. For a command that has a spec, history from other folders is not shown. This keeps scripts from one project out of the list in another. | Key | Action | |---|---| | Up, Down | Move the selection | | Tab | Insert the selected row | | Enter | On a normal row: insert it, when you typed part of it or moved to it. It does not run the line. On the run row the return icon, shown first when the typed word is complete : run the line. In all other cases, run the line as typed | | Ctrl-U or more typing | Close the popup | When the popup is closed, the keys do what they did before. Tab still opens your normal completion and Up still searches your history. Figxit reads a few naming habits that many projects have already. None is required. | You write | Figxit shows | |---|---| | dev: Start the stack | The text after as the description of dev | | @ Development | A section name in front of the descriptions below it | | release: prod Publish the app | A red icon on release . The tag is not shown in the popup | The tags are prod , production , danger , and caution . A help command made with the usual awk line still works, and prints the tag. The verb in a target or script name selects the icon: dev , start , and serve share one, test another, build another. The list of 12 verbs is in engine/src/verbs.ts . A red icon marks a row that touches production. A row gets it in one of three ways: | Rule | Examples | |---|---| | The name is written in capitals | SSH host PROD , target DEPLOY , script MIGRATE | | The name has the word prod or production | deploy:prod , build:production , api-prod , prod-db-1 | | A Makefile target has a tag in its help text | release: prod Publish the app | The rule applies to Makefile targets, package.json scripts, and live values such as SSH hosts and Docker contexts. It does not apply to files, to subcommands and options, or to words from your history. Only the icon colour changes. - A Mac with Apple Silicon. - macOS 13 or later. The glass background needs macOS 26 or later. - zsh, bash 5 or later, or fish 4, in tmux or directly in a terminal that reports its cursor position. The /bin/bash of macOS is version 3.2 and does not work. - tmux is optional. In tmux, each terminal app works. Without tmux, the popup is tested in Ghostty, iTerm2, and Terminal. WezTerm, Alacritty, and kitty are not tested yet without tmux. - Atuin, optional, for ranking. No Accessibility or Screen Recording permission is needed. 1. Download Figxit.dmg https://figxit.com/download/Figxit.dmg , open it, and drag Figxit to Applications. 2. Open Figxit. An icon appears in the menu bar and a setup window opens. 3. The setup window shows the line for your login shell. Click the Add button, or copy the line and add it yourself: zsh, in ~/.zshrc eval "$ '/Applications/Figxit.app/Contents/MacOS/figxit-engine' init zsh " bash, in ~/.bashrc, or in ~/.bash profile if that file does not load ~/.bashrc eval "$ '/Applications/Figxit.app/Contents/MacOS/figxit-engine' init bash " fish, in ~/.config/fish/conf.d/figxit.fish status is-interactive; and '/Applications/Figxit.app/Contents/MacOS/figxit-engine' init fish | source 1. Open a new terminal or a new tmux pane and type a command. The line also defines the figxit command in your shell, so nothing needs to be on your PATH. The icon shows that Figxit is running. It is dimmed when the engine is stopped. Its menu has: - Pause Suggestions and Restart Engine - Set Up Shell , which opens the setup window again - Run Doctor , which checks each part of the installation - Launch at Login - Check for Updates , which downloads and installs a new version - Check for Updates Automatically , on by default. Clear it to stop the daily check - Quit Figxit | Command | Action | |---|---| | figxit init zsh | Print the lines that load Figxit in zsh. init bash and init fish do the same for those shells | | figxit start | Start the popup helper and the engine | | figxit stop | Stop them | | figxit doctor | Check each part of the installation | | figxit --version | Print the version | Figxit has three parts that talk over unix sockets in ~/.local/state/figxit/ . shell adapter ── buffer, cursor, folder ──▶ engine ── rows, grid position ──▶ helper zsh, bash, fish Bun Swift, AppKit ▲ │ └───────── text to insert on Tab ───────────┘ Adapter shell/zsh/figxit.zsh . A zsh line editor hook sends the buffer to the engine after each key and returns at once, so typing never waits. It reads a reply only when you press Tab. Bridge for bash and fish engine/src/bridge.ts , shell/bash/figxit.bash , shell/fish/figxit.fish . These shells cannot open a unix socket or watch one. Each shell starts one bridge process, figxit-engine bridge , which holds the engine connection for that shell. The adapters use shell builtins only, so no process starts for a key. - bash binds each printable key and each editing key to a macro: the original function, then a hook that writes the buffer to the bridge through a pipe. Tab, Enter, Up, and Down first ask if the popup is open, and run their original binding if it is not. - fish adds the hook to its existing bindings. It has no pipe that stays open, so it appends each line to a file in ~/.local/state/figxit/shell-