history | fuzzy | inject

Your terminal remembers.
Now it answers.

CmdPop is a floating picker for your command history — like Win+V, but for the terminal. It reads bash, zsh, fish and PowerShell history directly, with zero shell plugins, and types the command you pick straight back into your prompt.

this demo is live — click it, type to filter, ↑↓ to move, Enter to inject

zsh — ~/projects/api
➜ api
    enter insert ↑↓ navigate ^f favorite ★ ^d delete esc close

    cmdpop start

    One pipeline, three verbs

    CmdPop never hooks your shell. It reads the history files your shells already write, keeps one deduplicated database, and puts keystrokes back into whatever terminal you're focused on.

    step 1 — read

    Read every history file

    Native parsers for .bash_history (with timestamps), zsh EXTENDED_HISTORY and multi-line commands, fish's YAML log, PSReadLine, and Clink. No plugins, no RC edits.

    step 2 — store

    Deduplicate into SQLite

    One local database at ~/.cmdpop/history.db. Run counts, last-used times, favorites. Commands containing password, token, secret… are never stored.

    step 3 — inject

    Type it back for you

    Hit Ctrl+Alt+H anywhere, fuzzy-find, press Enter. CmdPop injects the command into your active terminal via SendKeys, xdotool/ydotool, or AppleScript — clipboard as a last resort.

    --features

    Small tool, sharp edges filed off

    Version 0.1.1 ships with 115 automated tests, an 81% coverage gate in CI, and strict typing across the codebase.

    Fuzzy search

    RapidFuzz scoring that's word-order-agnostic and substring-friendly — "git amend" finds git commit --amend.

    Fully offline

    No network calls, no telemetry, no cloud. Your history stays in one SQLite file you own.

    Secrets filtered

    Configurable exclude patterns drop sensitive commands before they ever touch the database.

    Favorites & recency

    Star the commands you live by; everything else sorts by score, then by when you last ran it.

    Keyboard-only

    Search, navigate, favorite, delete and insert without leaving the home row — even while typing in the search box.

    One config file

    ~/.cmdpop/config.toml — hotkey, popup size, exclude patterns. Sensible defaults, zero setup.

    echo $SHELL

    Every shell you actually use

    History support is a parser, not an integration — adding a shell means one small reader class.

    ShellPlatformsSourceSupport
    bashLinux · macOS · WSL~/.bash_history✓ full, with timestamps
    zshLinux · macOS~/.zsh_history✓ full, EXTENDED_HISTORY + multi-line
    fishLinux · macOSfish_history✓ full, with timestamps
    PowerShellWindows · Linux · macOSPSReadLine ConsoleHost_history✓ full
    CMDWindowsClink .history△ requires Clink

    man cmdpop

    The whole manual fits here

    Every shortcut works while you're typing in the search box.

    Open picker (daemon)Ctrl+Alt+H
    Navigate results↑ ↓
    Insert commandEnter
    Toggle favorite ★Ctrl+F
    Delete from historyCtrl+D
    CloseEsc

    pip install

    Install in under a minute

    Python 3.11+ on Windows, macOS, or Linux. Grab the wheel from the latest GitHub release, or install from source.

    # from the GitHub release wheel
    $ pip install https://github.com/Arnav1771/Popup_pop/releases/latest/download/cmdpop-0.1.1-py3-none-any.whl

    # or from source
    $ git clone https://github.com/Arnav1771/Popup_pop.git && cd Popup_pop && pip install .

    # then
    $ cmdpop sync # import your history
    $ cmdpop open # open the picker
    $ cmdpop start # or run the global-hotkey daemon

    MIT licensed. Issues and PRs welcome on GitHub.