promptfinder
Fuzzy and semantic finder for the prompts you typed into Codex, Claude Code and Cursor — and the answers you got back. One local SQLite index, a Textual TUI, cloud embeddings only when you turn them on.
uv tool install . # or: uv tool install promptfinder (once published)
promptfinder # opens the TUI; the first launch runs the onboarding wizard
What it does
- Discovers coding-agent sessions on macOS and Linux:
~/.codex/sessions(+archived_sessions),~/.claude/projects, Cursor'sglobalStorage/state.vscdb. - Indexes human prompts (inputs) and, optionally, the final model response of every turn (outputs). Tool calls, tool results, reasoning and system/meta messages are never indexed.
- Groups sessions by project = git root of the session's working directory; inside a repo you can flip between current project and global.
- Fuzzy search (fzf-style, no external binary) over message bodies and metadata; semantic search through Gemini Embedding 2 (default) or another provider, stored in
sqlite-vec. - Keeps indexed copies when a source disappears — they are shown with an archived badge and stay searchable.
- Re-indexes on startup and, optionally, through a background watcher installed as a launchd LaunchAgent / systemd user unit.
Commands
promptfinder TUI (fuzzy by default; ctrl+y copy, ctrl+t semantic, ctrl+g scope, ctrl+a agents, ctrl+r roles)
promptfinder --select print the chosen message on Enter (e.g. codex "$(promptfinder --select)")
promptfinder onboard re-run the wizard
promptfinder index [--full] [--embed] [--yes] [--agent codex] [--json]
promptfinder search "landing page" [--mode fuzzy|semantic] [--current|--global] [--project PATH]
[--agent codex,…] [--role input|output|both] [--since 2026-01-01]
[--limit 10] [--no-archived] [--format text|json|bodies|full]
promptfinder copy "landing page" copy the best hit to the clipboard (--pick 2 for the second, same filters as search)
promptfinder copy --id 1234 copy a message by id (ids come from search --format json)
promptfinder copy interactive picker: Enter copies the highlighted prompt and exits
promptfinder status [--json] counts, embedding coverage, daemon state
promptfinder doctor [--online] discovery, adapter sniff, sqlite-vec, keys, service, diagnostics
promptfinder config show|path|set KEY VALUE|unset KEY|edit
promptfinder purge --embeddings [--index NAME] | --all
promptfinder rebuild re-index everything (cached vectors are re-used, nothing is re-embedded)
promptfinder daemon run|install|uninstall|status|logs
Configuration
~/.config/promptfinder/config.toml (also on macOS; $XDG_CONFIG_HOME is honoured). API keys are stored in plaintext by design — the file is created with mode 0600. Environment variables (GOOGLE_API_KEY/GEMINI_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY) are used as a fallback for interactive use; the background daemon only sees the config file.
[indexing]
agents = ["codex", "claude_code", "cursor"]
roles = ["input"] # add "output" to index final responses
[search]
default_mode = "fuzzy" # fuzzy | semantic
default_scope = "current" # current | global (current applies only inside a git repo)
[embeddings]
enabled = true
active_index = "google-gemini-embedding-2-3072"
[[embeddings.indexes]]
name = "google-gemini-embedding-2-3072"
provider = "google"
model = "gemini-embedding-2"
dimensions = 3072
[providers.google]
api_key = "…"
Changing the embedding provider, model or dimensions creates a new index; the active one is selected with embeddings.active_index. Nothing is sent to a provider until the backfill has been confirmed once (backfill_confirmed_at), after which the watcher embeds new messages automatically.
Data lives in ~/.local/share/promptfinder/index.sqlite; daemon logs in ~/.local/state/promptfinder/.
Development
uv sync --all-groups
uv run promptfinder doctor
uv run pytest
uv run ruff check src tests
See docs/prompts/plan.md for the design and the verified on-disk formats of the three agents.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file promptfinder-0.1.0.tar.gz.
File metadata
- Download URL: promptfinder-0.1.0.tar.gz
- Upload date:
- Size: 60.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d979142b822f4d3126ed534c554472add853707597e942ec66999aa12a26ac2
|
|
| MD5 |
77b05cb1492c382da35be01f9eaa2dec
|
|
| BLAKE2b-256 |
aaf1bbe80576b52c91aab317b4df9a4805e1a45cde81492ca73ccd5798aec779
|
File details
Details for the file promptfinder-0.1.0-py3-none-any.whl.
File metadata
- Download URL: promptfinder-0.1.0-py3-none-any.whl
- Upload date:
- Size: 78.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52a0d2e5e0722e80ad06263d26e11580f94c6705250c2608bc9ae3e0b77f4a3c
|
|
| MD5 |
0be4aff4979b0a5aa5f0d805af922d5c
|
|
| BLAKE2b-256 |
e40687c04d4d39dc94845743f4fdcd86de03159c61f112c6c4a9d3450a9672b5
|