Git for your AI prompts.
Track, version, diff, and rollback your LLM prompts — just like you version your code.
$ promptctl commit system --file prompts/system.txt -m "initial"
✓ Committed prompt "system" as v1
$ promptctl commit system --file prompts/system.txt -m "added citation rule"
✓ Committed prompt "system" as v2
$ promptctl diff system
--- system v1 (2026-06-01 09:12)
+++ system v2 (2026-06-03 14:47)
- You are a helpful assistant.
+ You are a helpful assistant. Always cite your sources.
$ promptctl rollback system 1 -m "reverting — citation hurt recall"
✓ Rolled back "system" to v1 → saved as v3
The Problem
Your prompts live in random places — hardcoded in files, buried in Notion docs, copy-pasted in Slack. When something breaks or stops working well, you have no idea:
- What the prompt looked like last week when it was working
- What changed between versions
- Which version performed best
- How to get back to a specific point
promptctl solves this. It's git for prompts.
Installation
Requires Go 1.22+.
go install github.com/naya-ai/promptctl/cmd/promptctl@latest
Or build from source:
git clone https://github.com/naya-ai/promptctl.git cd promptctl make build # binary at bin/promptctl # or: go build -o bin/promptctl ./cmd/promptctl/
Demo
Quick Start
# 1. Initialize in your project (creates .promptctl/store.json) promptctl init # 2. Save your first prompt version echo "You are a helpful assistant." | promptctl commit system -m "initial" # 3. Make a change and save it echo "You are a helpful assistant. Always cite sources." | promptctl commit system -m "added citation rule" --model claude-3 # 4. See the history promptctl log system --preview # 5. Compare latest vs. previous promptctl diff system # 6. Roll back promptctl rollback system 1 -m "reverting"
Commands
init
Initialize promptctl in the current directory. Creates .promptctl/store.json.
commit
Save a new version of a prompt.
# From stdin echo "You are a helpful assistant." | promptctl commit system -m "initial" # From a file (recommended for longer prompts) promptctl commit system --file prompts/system.txt -m "from file" # With metadata promptctl commit classifier -m "optimized for speed" --model gpt-4o-mini --tag prod # Interactive — type END on its own line to finish promptctl commit system -m "manual entry"
Flags:
-m/--message— commit message (default:"add version N")--model— tag with the model this prompt targets--tag— add a label to this version-f/--file— read content from a file instead of stdin
log
Show version history.
promptctl log # all prompts promptctl log system # one prompt promptctl log system --preview # show content snippets promptctl log system --tag prod # filter by tag promptctl log system --json # machine-readable output
diff
Compare versions side by side with color highlighting.
promptctl diff system # latest vs. previous promptctl diff system 2 # v2 vs. latest promptctl diff system 1 3 # v1 vs. v3
show
Show a prompt version.
promptctl show system # latest version promptctl show system 2 # specific version promptctl show system --raw # content only (good for piping) promptctl show system --json # full JSON promptctl show system --copy # copy to clipboard (macOS/Linux) promptctl show system --version-at 2026-06-01 # version that was latest on that date
rollback
Restore a previous version. Creates a new version (non-destructive).
promptctl rollback system 1
promptctl rollback system 1 -m "reverting — citation hurt recall"list
List all tracked prompts.
promptctl list promptctl list --json # JSON array with version counts promptctl list --names # one name per line (used by shell completions)
search
Search across content, commit messages, and tags.
promptctl search "helpful assistant" promptctl search prod # matches tag "prod"
export
Export all versions of a prompt to Markdown.
promptctl export system promptctl export system > system-history.md
copy
Fork a prompt with its full version history under a new name.
promptctl copy system system-experimental
rename
Rename a prompt. All history moves with it.
promptctl rename system assistant
delete
Delete a prompt and all its versions.
watch
Auto-commit a file whenever it changes on disk. Great for editing prompts in your usual editor and automatically versioning every save.
promptctl watch prompts/system.txt --as system promptctl watch prompts/system.txt --as system --model claude-3 --interval 2
Flags:
--as <name>— the prompt name to commit under (required)--model— tag new versions with this model--interval <seconds>— polling interval (default: 1)
Commit timestamps match the file's modification time, not when promptctl ran.
prune
Keep only the N most recent versions and discard the rest.
promptctl prune system --keep 10
stats
Show a store-wide overview.
Stats:
──────────────────────────────────────────────────
Prompts: 4
Total versions: 23
Total content: 8432 chars
First commit: 2026-06-01 09:12:00
Last commit: 2026-06-24 15:30:44
Most iterated: system (12 versions)
completion
Print a shell completion script.
# Bash — add to ~/.bashrc source <(promptctl completion bash) # Zsh — add to ~/.zshrc source <(promptctl completion zsh) # Fish — save to completions directory promptctl completion fish > ~/.config/fish/completions/promptctl.fish
Completions dynamically suggest prompt names for commands that take a <name> argument.
How It Works
promptctl stores everything in .promptctl/store.json — similar to how .git/ works. The store is discovered from your current directory or any parent, so commands work from any subdirectory.
your-project/
├── .promptctl/
│ └── store.json ← all prompt versions live here
├── src/
└── ...
Add .promptctl/ to your project's .gitignore to keep prompt history local. If your team wants to share versions in git, track only the store file:
.promptctl/* !.promptctl/store.json
Reading & Writing Programmatically
Several commands support --json or --raw for scripting:
# Read the latest version of a prompt promptctl show system --raw # Pipe the latest content into another tool promptctl show system --raw | pbcopy # List prompts as JSON promptctl list --json # Ingest output from a script ./generate-prompt.sh | promptctl commit system -m "generated"
Tagging & Model Tracking
# Tag a version for filtering promptctl commit system -m "production" --tag prod --model claude-opus-4-8 # View only tagged versions promptctl log system --tag prod # Find all prompts referencing a tag promptctl search prod
Why Zero Dependencies?
promptctl uses only Go's standard library — no external packages, no version conflicts, no go mod tidy surprises. One binary, no runtime.
Roadmap
- Remote sync (S3, GitHub Gist)
- Side-by-side terminal diff view
- VS Code extension
Contributing
See CONTRIBUTING.md. PRs welcome — open an issue first for major changes.
git clone https://github.com/naya-ai/promptctl.git cd promptctl make test make build
License
MIT © Shawnaya Williams

