Show HN: Promptctl – Git for your AI prompts
Promptctl is a version control tool for AI prompts, similar to Git. It allows users to track, diff, and rollback LLM prompts via CLI. Features include commit, log, diff, show, rollback, search, export, watch, and more. Built with Go and zero external dependencies, it stores all prompt versions locally in a .promptctl/store.json file.
Notifications You must be signed in to change notification settings
Fork 0
Star 1
BranchesTags
Open more actions menu
Folders and files
NameName
Last commit message
Last commit date
Latest commit
History
1 Commit
1 Commit
.github/workflows
.github/workflows
.vscode
.vscode
cmd/promptctl
cmd/promptctl
docs
docs
internal
internal
scripts
scripts
.gitignore
.gitignore
CONTRIBUTING.md
CONTRIBUTING.md
LICENSE
LICENSE
Makefile
Makefile
README.md
README.md
go.mod
go.mod
Repository files navigation
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.
promptctl init
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.
promptctl delete system
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 — the prompt name to commit under (required)
--model — tag new versions with this model
--interval — 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.
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)
completion
Print a shell completion script.
Bash — add to ~/.bashrc
source ~/.config/fish/completions/promptctl.fish
Completions dynamically suggest prompt names for commands that take a 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
About
Git for your AI prompts — version, diff, and rollback LLM prompts from the CLI
github.com/naya-ai/promptctl
Topics
cli
golang
ai
version-control
devtools
developer-tools
gpt
claude
llm
prompt-engineering
Resources
Readme
License
MIT license
Contributing
Contributing
Uh oh!
There was an error while loading. Please reload this page.
Activity
Stars
1 star
Watchers
0 watching
Forks
0 forks
Report repository
Releases 1
v0.1.0 — Initial release
Latest
Jun 25, 2026
Packages 0
Uh oh!
There was an error while loading. Please reload this page.
Contributors
Uh oh!
There was an error while loading. Please reload this page.
Languages
Go 86.8%
Python 12.8%
Makefile 0.4%