# Show HN: Promptctl – Git for your AI prompts

> Source: <https://github.com/naya-ai/promptctl>
> Published: 2026-06-25 01:09:05+00:00

Git for your AI prompts.

Track, version, diff, and rollback your LLM prompts — just like you version your code.

``` bash
$ 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
*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.

Requires [Go 1.22+](https://go.dev/dl/).

```
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/
# 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"
```

Initialize promptctl in the current directory. Creates `.promptctl/store.json`

.

```
promptctl init
```

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

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.

```
# 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.

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:

```
# 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"
# 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
```

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](/naya-ai/promptctl/blob/main/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](https://shawnayawilliams.com)
