The open-source prompt vault that stores everything in a Git repository you own.
Sign in with GitHub or Bitbucket. Save your AI prompts as versioned files.
No database. No subscriptions. No vendor lock-in.
SalvaPrompt is a self-hostable web app that turns any GitHub or Bitbucket repository into a personal prompt library.
You don't sign up for yet another SaaS platform. You don't trust a stranger's database with your carefully crafted prompts.
You just sign in with the Git account you already have, and SalvaPrompt stores your prompts as versioned .prt files — directly in a repo you control.
Write a prompt
↓
SalvaPrompt saves it as a .prt file in your Git repo
↓
Full version history. Public or private. Yours forever.
↓
Access it from anywhere. Share it with anyone (or no one).
Every prompt is a first-class citizen: it has a title, a body, tags, a creation date, and a full Git history. You can make the vault public to share your prompt library with the world, or keep it private.
Most prompt managers store your data in their own database on their own servers. SalvaPrompt stores nothing — your Git repo is the database.
| Capability | SalvaPrompt | Typical prompt managers |
|---|---|---|
| You own 100% of the data | ✅ | ❌ |
| Full version history (Git) | ✅ | ❌ |
| Works with your existing GitHub/Bitbucket account | ✅ | ❌ |
| Public or private vault — your choice | ✅ | ❌ |
| No subscription, no usage limits | ✅ | ❌ |
| Self-hostable on any Node.js server | ✅ | ❌ |
| Open source | ✅ | ❌ |
| Zero vendor lock-in | ✅ | ❌ |
SalvaPrompt uses the GitHub and Bitbucket APIs to read and write files directly to your repository. Each prompt is stored as a .prt file (a plain JSON document) inside a prompts/ folder in your chosen repo.
{
"title": "Senior code reviewer",
"body": "Review the following code as a senior engineer would...",
"tags": ["code", "review", "engineering"],
"createdAt": "2025-04-20T10:30:00Z"
}No proprietary format. No lock-in. If you ever stop using SalvaPrompt, your prompts are still there — readable JSON files in a Git repo.
git clone https://gitlab.com/your-username/salvaprompt.git
cd salvapromptnpm installcp .env.local.example .env.localOpen .env.local and fill in your values. See Environment Variables for the full reference.
npm run devOpen http://localhost:3000 — sign in and start saving prompts.
| Variable | Required | Description |
|---|---|---|
NEXTAUTH_SECRET |
✅ | Random secret for signing sessions — generate with openssl rand -base64 32 |
NEXTAUTH_URL |
✅ | Public base URL of the app (e.g. https://yourdomain.com) |
GITHUB_ID |
✅ | GitHub OAuth App Client ID |
GITHUB_SECRET |
✅ | GitHub OAuth App Client Secret |
BITBUCKET_ID |
Bitbucket OAuth Consumer Key (required if Bitbucket login is enabled) | |
BITBUCKET_SECRET |
Bitbucket OAuth Consumer Secret | |
ENABLE_BITBUCKET |
— | Set to false to hide the Bitbucket login option. Defaults to true |
MAINTENANCE_MODE |
— | Set to true to redirect all traffic to /maintenance |
MAINTENANCE_UNTIL |
— | ISO 8601 date shown on the maintenance page (e.g. 2025-12-31T23:59:00Z) |
PORT |
— | HTTP port for the standalone server. Defaults to 3000 |
GitHub
- Go to GitHub Developer Settings → OAuth Apps → New OAuth App
- Set Authorization callback URL to
https://yourdomain.com/api/auth/callback/github - Copy the Client ID and Secret into your
.env.local
Bitbucket
- Go to Bitbucket Workspace Settings → OAuth consumers → Add consumer
- Grant Account: Read and Repositories: Read & Write permissions
- Set Callback URL to
https://yourdomain.com/api/auth/callback/bitbucket - Copy the Key and Secret into your
.env.local
npm i -g vercel
vercelSet all environment variables under Project → Settings → Environment Variables in the Vercel dashboard.
npm run build
npm start # starts server.js on $PORT (default 3000)The build uses output: "standalone" — the .next/standalone folder is fully self-contained and ready to ship.
├── app/
│ ├── api/ # Backend endpoints (auth, prompts, repo)
│ ├── dashboard/ # Prompt library view
│ ├── prompts/ # Create & view individual prompts
│ ├── onboarding/ # First-time setup flow
│ └── maintenance/ # Maintenance page
├── components/ # Shared React components
├── lib/ # Auth config, Bitbucket client, utilities
├── types/ # TypeScript type definitions
└── middleware.ts # Maintenance-mode redirect logic
- Full-text search across all saved prompts
- Tags & filtering — filter the dashboard by tag
- Prompt export — download your library as a ZIP or Markdown collection
- GitLab support — third OAuth provider alongside GitHub and Bitbucket
- Prompt templates — start from a curated set of community prompts
- Dark mode
Pull requests are welcome. For major changes please open an issue first to discuss what you'd like to change.
- Fork the project
- Create your feature branch:
git checkout -b feat/my-feature - Commit your changes:
git commit -m 'feat: add my feature' - Push to the branch:
git push origin feat/my-feature - Open a Pull Request
MIT — use it, fork it, ship it, build on it.
SalvaPrompt — Every prompt you ever wrote. Safe, versioned, yours.