diff --git a/README.md b/README.md index 2ee9a82..dd5d7f8 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,7 @@ backend/ │ │ ├── GitLabPagesProvider.java # GitLab Pages implementation │ │ ├── GitService.java # JGit: init, commit, push, log, rollback │ │ ├── KeyManager.java # SSH key-pair generation per site - │ │ ├── MediaService.java # S3/MinIO file upload and public URLs + │ │ ├── ExportService.java # Exports site structure to ZIP │ │ └── DomainService.java # Custom domain resolution skeleton │ ├── service/llm/ @@ -196,7 +196,6 @@ backend/ │ ├── LLMController.java # POST /api/llm/generate, /refine, /versions/* │ ├── GitController.java # POST /api/sites/{id}/git/* │ ├── DeploymentController.java # POST /api/sites/{id}/publish, /unpublish - │ ├── MediaController.java # POST /api/media/upload, GET /api/media/{key} │ ├── ExportController.java # GET /api/sites/{id}/export │ ├── UserSettingsController.java # GET/PUT/DELETE /api/user/llm-config │ └── SelfHostedController.java # CRUD /api/sites/{id}/self-hosted @@ -345,13 +344,6 @@ config/ # Auto-generated on first boot | PUT | `/api/sites/{id}/self-hosted` | Save SSH/deploy configuration | | DELETE | `/api/sites/{id}/self-hosted` | Remove configuration | -### Media (`/api/media`) - -| Method | Path | Description | -|--------|------|-------------| -| POST | `/api/media/upload` | Upload a file (returns key, url, metadata) | -| GET | `/api/media/{key}` | Get public URL for a stored file | - ### User Settings (`/api/user`) | Method | Path | Description | @@ -463,31 +455,24 @@ The frontend Docker image serves the app via nginx (port 80) and proxies `/api/` - [x] Frontend: JWT interceptor, auth guard, login guard, lazy routes - [x] Scheduled cleanup of unverified accounts -### v0.2 — LLM Prompt Workspace (in progress) -- [ ] Prompt-to-site generation via Gemini/OpenAI -- [ ] Version timeline with MongoDB storage -- [ ] Live preview (sandboxed iframe) -- [ ] Content editor (grouped by page) -- [ ] Refine via follow-up prompts -- [ ] Rate limiting (10 generations/hour/user) -- [ ] Reference URL support for context +### v0.2 — LLM Prompt Workspace ✅ +- [x] Prompt-to-site generation via Gemini/OpenAI +- [x] Version timeline with MongoDB storage +- [x] Live preview (sandboxed iframe) +- [x] Content editor (grouped by page) +- [x] Refine via follow-up prompts +- [x] Rate limiting (10 generations/hour/user) +- [x] Reference URL support for context -### v0.3 — Export, Git & Hosting (planned) -- [ ] Render engine (HTML + CSS + JS generation) -- [ ] Git init, commit, push via JGit -- [ ] SSH key-pair management per site -- [ ] GitHub Pages / GitLab Pages providers -- [ ] S3 upload (R2 in production) -- [ ] Export as `.zip` archive -- [ ] Publish/unpublish flow -- [ ] Custom domain skeleton -- [ ] Media file upload service - -### v0.4 — Social Features & Polish (planned) -- [ ] Comments with moderation -- [ ] RSS feed generation -- [ ] Git history panel in workspace -- [ ] Self-hosted deployment (SSH + rsync + nginx) +### v0.3 — Export, Git & Hosting ✅ +- [x] Render engine (HTML + CSS + JS generation) +- [x] Git init, commit, push via JGit +- [x] SSH key-pair management per site +- [x] GitHub Pages / GitLab Pages providers +- [x] Export as `.zip` archive +- [x] Publish/unpublish flow +- [x] Custom domain skeleton +- [x] Self-hosted deployment (SSH + rsync + nginx) --- @@ -523,12 +508,17 @@ Provider API keys can be configured globally via env vars (`GEMINI_API_KEY`, `OP ## config/ Directory -On first boot, the application auto-generates the following files in `config/`: +The following files live in `config/` and are auto-generated on first boot if they don't exist. +In production, generate and mount them manually: -| File | Algorithm | Purpose | -|------|-----------|---------| -| `jwt-private.key` | RS256 | JWT token signing | -| `jwt-public.key` | RS256 | JWT token verification | -| `encryption.key` | AES-256-GCM (Base64) | LLM API key encryption | +```bash +# RS256 key pair for JWT +openssl genpkey -algorithm RSA -out config/jwt-private.key -pkeyopt rsa_keygen_bits:2048 +openssl rsa -pubout -in config/jwt-private.key -out config/jwt-public.key -In production, generate and mount these manually rather than relying on auto-generation. +# AES-256-GCM master key for LLM API key encryption +openssl rand -base64 32 > config/encryption.key +``` + +Set the `INDIE_JWT_PRIVATE_KEY_PATH`, `INDIE_JWT_PUBLIC_KEY_PATH`, and +`INDIE_ENCRYPTION_KEY_PATH` env vars to point to these files.