# prompt-gen A local web app for building and reusing prompt templates. Write a prompt once with `{{variable}}` placeholders, save it as a preset, then fill in the fields to generate new prompts on demand. ![prompt-gen screenshot](https://shx.reversed.dev/u/dspbfv.png) ## Features - **Presets** — save any number of named templates with descriptions - **Live variable filling** — input fields are generated automatically from `{{variable_name}}` placeholders in your template - **AI rewrite** — send the filled prompt to GPT for improvement with one click - **Persistent storage** — everything saved to a local `settings.json`, no database ## Quick start (Docker) ```bash docker compose up --build ``` Open [http://localhost:8000](http://localhost:8000). Data persists in a Docker named volume. To back it up: ```bash docker compose cp app:/app/data/settings.json ./settings.json ``` ## Quick start (local dev) **Requirements:** Python 3.11+, Node 18+ ```bash # Install dependencies pip install -r requirements.txt cd frontend && npm install && npm run build && cd .. # Run uvicorn backend.main:app --host 127.0.0.1 --port 8001 ``` Open [http://localhost:8001](http://localhost:8001). ### Hot-reload dev mode ```bash # Terminal 1 — backend uvicorn backend.main:app --port 8001 --reload # Terminal 2 — frontend cd frontend && npm run dev ``` Frontend dev server runs on [http://localhost:5173](http://localhost:5173) and proxies `/api` to port 8001. ## AI rewrite Click the ⚙ icon and enter your OpenAI API key. The key is stored in `settings.json` and never sent to the frontend. Once set, the **✦ Rewrite with AI** button becomes active in the prompt runner. The model defaults to `gpt-4.1`. Override it with the `OPENAI_MODEL` environment variable: ```bash OPENAI_MODEL=gpt-4o uvicorn backend.main:app --port 8001 # or in docker-compose.yml under environment: ``` ## Template syntax Use `{{variable_name}}` anywhere in your template. Variable names must start with a letter or underscore and contain only letters, numbers, and underscores. ``` Resolve {{issue_id}} in {{repo}}. Create the PR as {{author}}. ``` Duplicate variable names collapse to a single input field. Variables appear in the order they first appear in the template. ## Configuration All settings are stored in `settings.json` at the project root (or at `$SETTINGS_PATH` when set). ```json { "openai_api_key": "sk-...", "presets": [ { "id": "a1b2c3d4", "name": "My template", "description": "optional", "template": "Resolve {{issue_id}} in {{repo}}.", "variables": ["issue_id", "repo"], "created_at": "2026-06-26T10:00:00Z", "updated_at": "2026-06-26T10:00:00Z" } ] } ``` ## API The FastAPI backend exposes a simple REST API at `/api`. | Method | Path | Description | |--------|------|-------------| | `GET` | `/api/presets` | List all presets | | `POST` | `/api/presets` | Create a preset | | `PUT` | `/api/presets/{id}` | Update a preset | | `DELETE` | `/api/presets/{id}` | Delete a preset | | `GET` | `/api/settings` | Check if OpenAI key is set | | `POST` | `/api/settings` | Save OpenAI API key | | `POST` | `/api/rewrite` | Rewrite a prompt with AI | Interactive docs available at [http://localhost:8001/docs](http://localhost:8001/docs) when running locally. ## Stack - **Frontend** — React 18, Tailwind CSS v3, Vite - **Backend** — FastAPI, uvicorn - **Storage** — `settings.json` (flat file, no database)