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
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 wasworking - What changed between versions
- Which version performed best
- How to get back to a specific point
promptctl solves this. It's git
for prompts.
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
promptctl init
echo "You are a helpful assistant." | promptctl commit system -m "initial"
echo "You are a helpful assistant. Always cite sources." | promptctl commit system -m "added citation rule" --model claude-3
promptctl log system --preview
promptctl diff system
promptctl rollback system 1 -m "reverting"
Initialize promptctl in the current directory. Creates .promptctl/store.json
.
promptctl init
Save a new version of a prompt.
echo "You are a helpful assistant." | promptctl commit system -m "initial"
promptctl commit system --file prompts/system.txt -m "from file"
promptctl commit classifier -m "optimized for speed" --model gpt-4o-mini --tag prod
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
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
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 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
Restore a previous version. Creates a new version (non-destructive).
promptctl rollback system 1
promptctl rollback system 1 -m "reverting — citation hurt recall"
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 across content, commit messages, and tags.
promptctl search "helpful assistant"
promptctl search prod # matches tag "prod"
Export all versions of a prompt to Markdown.
promptctl export system
promptctl export system > system-history.md
Fork a prompt with its full version history under a new name.
promptctl copy system system-experimental
Rename a prompt. All history moves with it.
promptctl rename system assistant
Delete a prompt and all its versions.
promptctl delete system
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.
Keep only the N most recent versions and discard the rest.
promptctl prune system --keep 10
Show a store-wide overview.
promptctl stats
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)
Print a shell completion script.
source <(promptctl completion bash)
source <(promptctl completion zsh)
promptctl completion fish > ~/.config/fish/completions/promptctl.fish
Completions dynamically suggest prompt names for commands that take a <name>
argument.
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
Several commands support --json
or --raw
for scripting:
promptctl show system --raw
promptctl show system --raw | pbcopy
promptctl list --json
./generate-prompt.sh | promptctl commit system -m "generated"
promptctl commit system -m "production" --tag prod --model claude-opus-4-8
promptctl log system --tag prod
promptctl search prod
promptctl uses only Go's standard library — no external packages, no version conflicts, no go mod tidy
surprises. One binary, no runtime.
- Remote sync (S3, GitHub Gist)
- Side-by-side terminal diff view
- VS Code extension
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
MIT © Shawnaya Williams