generate site using llm prompt
This commit is contained in:
215
PLAN.md
215
PLAN.md
@@ -1,6 +1,6 @@
|
||||
# Indie — Independent Website Platform
|
||||
|
||||
A platform that lets anyone create, own, and publish their own static website without social media gatekeeping. Built with a drag-and-drop builder and LLM prompt-to-site generation. Every site is backed by a git repository. Users self-host or use free subdomain hosting.
|
||||
A platform that lets anyone create, own, and publish their own static website through AI prompts. No drag-and-drop builder — just describe what you want, and the AI generates it. Every site is backed by a git repository. Users self-host or use free subdomain hosting.
|
||||
|
||||
---
|
||||
|
||||
@@ -9,14 +9,51 @@ A platform that lets anyone create, own, and publish their own static website wi
|
||||
| Layer | Technology |
|
||||
|-------|-----------|
|
||||
| Backend | Java 17, Spring Boot 3.x, Gradle (Groovy) |
|
||||
| Frontend | Angular 17, Angular Material, Angular CDK (drag-drop) |
|
||||
| Frontend | Angular 17, Angular Material |
|
||||
| Relational DB | PostgreSQL |
|
||||
| Document DB | MongoDB (LLM sessions) |
|
||||
| Document DB | MongoDB (generation versions, LLM sessions) |
|
||||
| Object Storage | Cloudflare R2 (S3-compatible) |
|
||||
| LLM | Gemini (primary), OpenAI (fallback), provider-abstraction for future |
|
||||
| Auth | Spring Security + OAuth2 Client — email/password, Google OAuth, GitHub OAuth, OpenID Connect |
|
||||
| Git | JGit — local repo per site, optional GitHub/GitLab remote push |
|
||||
| Infra | Docker Compose (dev), R2 + Cloudflare (hosting), Caddy/nginx (prod reverse proxy) |
|
||||
| Infra | Docker Compose (dev), R2 + Cloudflare (hosting), nginx (prod reverse proxy) |
|
||||
|
||||
---
|
||||
|
||||
## Core Interaction Model
|
||||
|
||||
```
|
||||
Prompt + Reference URLs
|
||||
│
|
||||
▼
|
||||
┌──────────────────┐ ┌─────────────────┐
|
||||
│ LLM generates │────▶│ Version saved │
|
||||
│ site structure │ │ to timeline │
|
||||
└──────────────────┘ └─────────────────┘
|
||||
│ │
|
||||
▼ ▼
|
||||
┌──────────────────────────────────────────┐
|
||||
│ Workspace Layout: │
|
||||
│ ┌──────────┬──────────────────────────┐ │
|
||||
│ │ Version │ Live Preview │ │
|
||||
│ │ Timeline │ (sandboxed iframe) │ │
|
||||
│ │ sidebar │ │ │
|
||||
│ └──────────┴──────────────────────────┘ │
|
||||
│ ┌──────────────────────────────────────┐ │
|
||||
│ │ Content Editor (grouped by page) │ │
|
||||
│ │ ▼ Homepage │ │
|
||||
│ │ Heading: [editable text] │ │
|
||||
│ │ Body: [editable text] │ │
|
||||
│ │ ▼ About (collapsible) │ │
|
||||
│ └──────────────────────────────────────┘ │
|
||||
└──────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
Refine via new prompt or inline text edits
|
||||
│
|
||||
▼
|
||||
Publish → Export → Git → Hosting
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -24,7 +61,7 @@ A platform that lets anyone create, own, and publish their own static website wi
|
||||
|
||||
### v0.1 — Auth & Foundation (Target: Weeks 1-3)
|
||||
|
||||
**Goal:** User can register, log in via email or OAuth, and create/manage sites and pages.
|
||||
**Goal:** User can register, log in via email or OAuth, and create/manage sites.
|
||||
|
||||
#### Backend
|
||||
|
||||
@@ -38,15 +75,12 @@ A platform that lets anyone create, own, and publish their own static website wi
|
||||
| `com/indie/config/JwtConfig.java` | Add | RS256 signing, access token 15min, refresh token 7d |
|
||||
| `com/indie/config/GitConfig.java` | Add | Repos root path (`/var/git/sites/`), author name/email |
|
||||
| `com/indie/model/User.java` | Add | id(UUID), email, password(bcrypt, nullable), name, avatarUrl, provider(LOCAL/GOOGLE/GITHUB/OPENID), providerId, emailVerified, createdAt, updatedAt |
|
||||
| `com/indie/model/Site.java` | Add | id, userId, name, description, subdomain(unique), themeConfig(JSONB), status(DRAFT/PUBLISHED), publishedAt, createdAt, updatedAt |
|
||||
| `com/indie/model/Page.java` | Add | id, siteId(FK), title, slug, seoTitle, seoDescription, orderIndex, createdAt |
|
||||
| `com/indie/model/Component.java` | Add | id, pageId(FK), type(enum), config(JSONB), styles(JSONB), orderIndex |
|
||||
| `com/indie/repository/*.java` | Add | JPA repositories for User, Site, Page, Component |
|
||||
| `com/indie/model/Site.java` | Add | id, userId, name, description, subdomain(unique), status(DRAFT/PUBLISHED), publishedAt, createdAt, updatedAt |
|
||||
| `com/indie/repository/*.java` | Add | JPA repositories for User, Site |
|
||||
| `com/indie/service/AuthService.java` | Add | register, login, refreshToken, oauthLogin |
|
||||
| `com/indie/service/OAuth2UserService.java` | Add | Maps Google/GitHub/OpenID user info to User entity |
|
||||
| `com/indie/controller/AuthController.java` | Add | `POST /api/auth/register`, `/login`, `/refresh`, `/logout` |
|
||||
| `com/indie/controller/SiteController.java` | Add | Full CRUD: `GET/POST /api/sites`, `GET/PUT/DELETE /api/sites/{id}` |
|
||||
| `com/indie/controller/PageController.java` | Add | CRUD for pages within a site |
|
||||
|
||||
#### Frontend
|
||||
|
||||
@@ -64,68 +98,58 @@ A platform that lets anyone create, own, and publish their own static website wi
|
||||
|
||||
---
|
||||
|
||||
### v0.2 — Drag-and-Drop Builder (Target: Weeks 4-6)
|
||||
### v0.2 — LLM Prompt Workspace (Target: Weeks 4-7)
|
||||
|
||||
**Goal:** User can visually build a website by dragging components onto a canvas, editing their properties, styling via theme editor, and previewing live.
|
||||
**Goal:** User opens a site, types a prompt describing their desired website, optionally adds reference URLs, and the AI generates it. User can refine via follow-up prompts or edit text inline. Each generation is saved as a version in a timeline.
|
||||
|
||||
#### Backend
|
||||
|
||||
| File | Action | Details |
|
||||
|------|--------|---------|
|
||||
| `com/indie/controller/BuilderController.java` | Add | `GET /api/sites/{id}/pages` (with nested components), `PUT /api/sites/{id}/pages/{pageId}/components` (batch save), `GET/PUT /api/sites/{id}/theme` |
|
||||
| `com/indie/service/BuilderService.java` | Add | Validate component tree (type enum, config schema, max 50/page), save in transaction |
|
||||
| `com/indie/service/llm/LLMProvider.java` | Add | Interface: `generate(systemPrompt, userPrompt, references, options) → LLMResult` |
|
||||
| `com/indie/service/llm/GeminiProvider.java` | Add | Primary provider. Supports multimodal (text + images via URL) |
|
||||
| `com/indie/service/llm/OpenAIProvider.java` | Add | Secondary/fallback |
|
||||
| `com/indie/service/llm/LLMFactory.java` | Add | Provider routing + fallback chain |
|
||||
| `com/indie/dto/SiteStructure.java` | Add | Top-level DTO: `List<PageStructure> pages`, `SiteTheme theme`. Each `PageStructure`: id, title, slug, `List<ComponentStructure>`. Each `ComponentStructure`: id, type, config (Map), styles (Map) |
|
||||
| `com/indie/dto/Reference.java` | Add | type(URL/IMAGE), url, altText |
|
||||
| `com/indie/model/GenerationVersion.java` | Add | MongoDB: sessionId, versionNumber, prompt, references(List), full SiteStructure(JSON), createdAt. Linked to a site |
|
||||
| `com/indie/service/LLMService.java` | Add | Orchestrator: validate prompt → build system prompt with references → call LLM → parse → validate schema → store version → return SiteStructure |
|
||||
| `com/indie/service/LLMResponseParser.java` | Add | Parse LLM JSON output, handle markdown fences, malformed fields, partial extraction, default values |
|
||||
| `com/indie/controller/LLMController.java` | Add | `POST /api/llm/generate` (prompt + references → SiteStructure), `POST /api/llm/refine` (existing structure + new prompt → updated structure), `GET /api/llm/versions/{siteId}` (timeline list), `POST /api/llm/versions/{id}/restore` |
|
||||
| `com/indie/service/ReferenceService.java` | Add | For URL references: fetch page content/extract info for LLM context. Upload button present for future use; for MVP, URL-only |
|
||||
| `com/indie/config/RateLimitConfig.java` | Add | Rate limiting: 10 generations/hour/user |
|
||||
| `src/main/resources/prompts/site-generator.txt` | Add | System prompt: schema definition + 2-3 few-shot examples (blog, portfolio, landing page) |
|
||||
|
||||
#### Frontend
|
||||
|
||||
| File | Action | Details |
|
||||
|------|--------|---------|
|
||||
| `src/app/builder/builder.component.ts` | Add | 3-panel layout (palette 250px, canvas flex, properties 320px) via CSS Grid or mat-sidenav |
|
||||
| `src/app/builder/services/builder-state.service.ts` | Add | BehaviorSubject store: `components$`, `selectedComponentId$`, `themeConfig$`, `pages$`. Methods: add, remove, update, reorder. Undo/redo stack (50 snapshots) |
|
||||
| `src/app/builder/services/auto-save.service.ts` | Add | 2s debounce → `PUT` batch save. "Saving..."/"Saved" indicator |
|
||||
| `src/app/builder/component-palette/` | Add | PaletteComponent — Material list of 10 draggable component types, organized by category |
|
||||
| `src/app/builder/canvas/` | Add | CanvasComponent — `cdkDropList` accepting drops, renders components in order, highlight on select, delete on hover |
|
||||
| `src/app/builder/property-panel/` | Add | PropertyPanelComponent — dynamic form per type (config + styles sections). Material expansion panels |
|
||||
| `src/app/builder/renderer/` | Add | Render components per type (heading, text, image, button, divider, gallery, video, contact_form, map, custom_html) — each takes `config` + `styles` as `@Input()` |
|
||||
| `src/app/builder/theme-editor/` | Add | ThemeEditorComponent — color pickers, font selectors, spacing slider. Live preview updates |
|
||||
| `src/app/builder/preview/` | Add | PreviewComponent — sandboxed `<iframe>` with `srcdoc`, responsive device toggles (desktop/tablet/mobile) |
|
||||
| `src/app/builder/builder-api.service.ts` | Add | HTTP calls for save/load components, theme, pages |
|
||||
| `src/app/workspace/workspace.component.ts` | Add | Main workspace layout: prompt area (top), preview (center-right), version timeline (right sidebar), content editor (bottom panel) |
|
||||
| `src/app/workspace/prompt-input/` | Add | PromptInputComponent — expanding textarea, reference URL chip input, Upload button (file picker, MVP: URL only). Generate + Refine buttons |
|
||||
| `src/app/workspace/preview/` | Add | PreviewComponent — sandboxed iframe rendering generated HTML (srcdoc). Device toggle (desktop 1200px, tablet 768px, mobile 375px). Styled to feel like a browser window |
|
||||
| `src/app/workspace/version-timeline/` | Add | VersionTimelineComponent — Material vertical stepper list. Each entry: version number, short prompt summary (truncated), timestamp, thumbnail. Current version highlighted. Click to preview that version. Restore button with confirmation dialog |
|
||||
| `src/app/workspace/content-editor/` | Add | ContentEditorComponent — expandable Material accordion grouped by page. Each page section contains editable fields for each text component (heading text, body text, button labels, image alt texts, etc.). Style edits (colors, fonts) go through prompts. Changes update preview in real time |
|
||||
| `src/app/workspace/services/llm-session.service.ts` | Add | Manages: activeVersion, version list, current prompt, references |
|
||||
| `src/app/workspace/services/workspace-state.service.ts` | Add | BehaviorSubject store: currentStructure$, versions$, selectedVersion$, draftEdits$, previewHtml$ |
|
||||
| `src/app/workspace/services/preview-renderer.service.ts` | Add | Takes SiteStructure + any draft edits → generates HTML string for iframe srcdoc |
|
||||
|
||||
**Component types:** heading, text, image, button, divider, gallery, video, contact_form, map, custom_html
|
||||
**Component types for generated sites:**
|
||||
- heading — text, level (h1-h6)
|
||||
- text — rich text (HTML, sanitized on output)
|
||||
- image — src, alt, caption
|
||||
- button — label, url, style
|
||||
- divider — style, color
|
||||
- gallery — image list, layout
|
||||
- video — embed URL
|
||||
- contact_form — fields config
|
||||
- map — address, zoom
|
||||
- custom_html — raw HTML
|
||||
|
||||
**Version storage:** Each generation attempt creates a MongoDB document (`GenerationVersion`) with the full site structure. Timeline fetched sorted by versionNumber desc. Max 100 versions per site.
|
||||
|
||||
---
|
||||
|
||||
### v0.3 — LLM Prompt-to-Site (Target: Weeks 7-8)
|
||||
|
||||
**Goal:** User types a description of their desired website → AI generates the full site structure (pages + components + theme) → user tweaks in builder or refines via another prompt.
|
||||
|
||||
#### Backend
|
||||
|
||||
| File | Action | Details |
|
||||
|------|--------|---------|
|
||||
| `com/indie/service/llm/LLMProvider.java` | Add | Interface: `generate(systemPrompt, userPrompt, options) → LLMResult`. `LLMResult`: content, tokenUsage, model, latency |
|
||||
| `com/indie/service/llm/GeminiProvider.java` | Add | Implements LLMProvider via Gemini API. Config: `indie.llm.providers.gemini.api-key`, model |
|
||||
| `com/indie/service/llm/OpenAIProvider.java` | Add | Implements LLMProvider via OpenAI API. Config: `indie.llm.providers.openai.api-key`, model |
|
||||
| `com/indie/service/llm/LLMFactory.java` | Add | Returns configured provider from `indie.llm.active-provider`, fallback chain |
|
||||
| `com/indie/dto/LLMOptions.java` | Add | temperature, maxTokens, timeout, responseFormat |
|
||||
| `com/indie/dto/SiteStructure.java` | Add | Top-level DTO: `List<PageStructure> pages`, `ThemeConfig theme`. Nested types for page and component |
|
||||
| `com/indie/dto/LLMResult.java` | Add | content(String), tokenUsage, model, latencyMs |
|
||||
| `com/indie/model/LLMSession.java` | Add | MongoDB document: userId, prompt, generatedStructure, acceptedAt, refinedPrompt, createdAt |
|
||||
| `com/indie/service/LLMService.java` | Add | Orchestrator: prompt → LLM → parse → validate → return SiteStructure |
|
||||
| `com/indie/service/LLMResponseParser.java` | Add | Parse LLM JSON output, handle markdown fences, malformed fields, partial extraction |
|
||||
| `com/indie/controller/LLMController.java` | Add | `POST /api/llm/generate` (prompt→structure), `POST /api/llm/refine` (structure+prompt→refined). Rate limit: 10/hour/user |
|
||||
| `com/indie/config/RateLimitConfig.java` | Add | Rate limiting via bucket4j |
|
||||
| `src/main/resources/prompts/site-generator.txt` | Add | System prompt: schema definition + 2-3 few-shot examples |
|
||||
|
||||
#### Frontend
|
||||
|
||||
| File | Action | Details |
|
||||
|------|--------|---------|
|
||||
| `src/app/llm-workspace/` | Add | LLMWorkspaceComponent — textarea, "Generate" button, loading spinner with ETA, result preview summary, "Apply to Builder" button |
|
||||
| `src/app/llm-workspace/llm-session.service.ts` | Add | Prompt history, refinement flow (original prompt + user edits + refinement → new generation) |
|
||||
|
||||
---
|
||||
|
||||
### v0.4 — Export, Git & Hosting (Target: Weeks 9-11)
|
||||
### v0.3 — Export, Git & Hosting (Target: Weeks 8-11)
|
||||
|
||||
**Goal:** User can publish their site as pure static files. Every publish creates a git commit. User can connect GitHub/GitLab for automatic pushes. Sites served at `*.indie.com` for free.
|
||||
|
||||
@@ -133,8 +157,8 @@ A platform that lets anyone create, own, and publish their own static website wi
|
||||
|
||||
| File | Action | Details |
|
||||
|------|--------|---------|
|
||||
| `com/indie/service/RenderService.java` | Add | Core render engine: `renderSite(site)`, `renderPage(site, page, components) → String`, `renderCss(theme, components) → String`, `renderJs() → String` |
|
||||
| `com/indie/engine/templates/*.html` | Add | Thymeleaf templates per component type + `layout.html` + `head.html` |
|
||||
| `com/indie/service/RenderService.java` | Add | Core render engine: `renderSite(structure) → SiteOutput`. Takes SiteStructure → generates HTML, CSS, JS strings. Uses Thymeleaf templates per component type |
|
||||
| `com/indie/engine/templates/*.html` | Add | Thymeleaf templates per component + `layout.html` (page shell) + `head.html` (SEO meta) |
|
||||
| `com/indie/engine/StyleCompiler.java` | Add | Theme → CSS custom properties at `:root`, component styles → CSS classes, responsive breakpoints |
|
||||
| `com/indie/engine/JsBundle.java` | Add | Generates `script.js`: nav toggle, smooth scroll, lightbox, contact form handler, comment form handler. Minified |
|
||||
| `com/indie/service/ExportService.java` | Add | `export(siteId) → ZipOutputStream` — full site directory + `.git/` |
|
||||
@@ -146,15 +170,15 @@ A platform that lets anyone create, own, and publish their own static website wi
|
||||
| `com/indie/service/DeploymentService.java` | Add | On publish: render → write to git working dir → `GitService.commit` → upload to R2 → return public URL |
|
||||
| `com/indie/controller/DeploymentController.java` | Add | `POST /api/sites/{id}/publish`, `/unpublish` |
|
||||
| `com/indie/service/DomainService.java` | Add | Skeleton: store custom domain mapping in Site entity, prepared for future TLS |
|
||||
| `com/indie/service/MediaService.java` | Add | Upload to R2, validate type/size, resize |
|
||||
| `com/indie/service/MediaService.java` | Add | Upload to R2, validate type/size, resize. Upload button present but MVP is URL-only |
|
||||
| `com/indie/controller/MediaController.java` | Add | `POST /api/media/upload`, `GET /api/media/{id}` |
|
||||
|
||||
#### Frontend
|
||||
|
||||
| File | Action | Details |
|
||||
|------|--------|---------|
|
||||
| `src/app/builder/git-settings/` | Add | GitSettingsComponent — connect/disconnect GitHub/GitLab OAuth, select remote repo, connection status |
|
||||
| `src/app/builder/settings/` | Add | SettingsComponent — site name, subdomain, export zip button, publish/unpublish buttons |
|
||||
| `src/app/workspace/git-settings/` | Add | GitSettingsComponent — connect/disconnect GitHub/GitLab OAuth, select remote repo, connection status indicator |
|
||||
| `src/app/workspace/settings/` | Add | SettingsComponent — site name, subdomain, export zip button, publish/unpublish buttons |
|
||||
|
||||
#### Infrastructure
|
||||
|
||||
@@ -175,9 +199,24 @@ A platform that lets anyone create, own, and publish their own static website wi
|
||||
└── assets/
|
||||
```
|
||||
|
||||
**Output file structure (zip export):**
|
||||
```
|
||||
site-export/
|
||||
├── index.html
|
||||
├── about/index.html
|
||||
├── contact/index.html
|
||||
├── style.css
|
||||
├── script.js
|
||||
├── assets/images/
|
||||
│ ├── hero.jpg
|
||||
│ └── gallery-1.jpg
|
||||
├── 404.html
|
||||
└── .git/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### v0.5 — Social Features & Polish (Target: Weeks 12-13)
|
||||
### v0.4 — Social Features & Polish (Target: Weeks 12-13)
|
||||
|
||||
**Goal:** Minimal social features (comments, RSS) and final polish before public release.
|
||||
|
||||
@@ -194,8 +233,8 @@ A platform that lets anyone create, own, and publish their own static website wi
|
||||
|
||||
| File | Action | Details |
|
||||
|------|--------|---------|
|
||||
| `src/app/builder/settings/` | Modify | Add git history panel (commit list, rollback button, download repo) |
|
||||
| `src/app/builder/components/comments-section/` | Add | In-builder config (enable/disable, moderate) + renderer for generated sites |
|
||||
| `src/app/workspace/settings/` | Modify | Add git history panel (commit list, rollback button, download repo button) |
|
||||
| `src/app/workspace/components/comments-section/` | Add | In-workspace config (enable/disable, moderate) + renderer for generated sites |
|
||||
|
||||
---
|
||||
|
||||
@@ -222,11 +261,9 @@ A platform that lets anyone create, own, and publish their own static website wi
|
||||
│ │ │
|
||||
┌────────▼───┐ ┌──────▼──────┐ ┌───▼────────┐
|
||||
│ PostgreSQL │ │ MongoDB │ │ Git Repos │
|
||||
│ (users, │ │ (LLM sess.) │ │ /var/git/ │
|
||||
│ sites, │ └─────────────┘ └────────────┘
|
||||
│ pages, │
|
||||
│ comps) │
|
||||
└─────────────┘
|
||||
│ (users, │ │ (versions, │ │ /var/git/ │
|
||||
│ sites) │ │ sessions) │ └────────────┘
|
||||
└─────────────┘ └─────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
@@ -234,13 +271,15 @@ A platform that lets anyone create, own, and publish their own static website wi
|
||||
## LLM Provider Abstraction
|
||||
|
||||
```java
|
||||
// Adding a new provider = implement this interface + add config
|
||||
public interface LLMProvider {
|
||||
LLMResult generate(String systemPrompt, String userPrompt, LLMOptions options);
|
||||
LLMResult generate(String systemPrompt, String userPrompt,
|
||||
List<Reference> references, LLMOptions options);
|
||||
String getName();
|
||||
}
|
||||
```
|
||||
|
||||
// application.yml
|
||||
```yaml
|
||||
# application.yml
|
||||
indie:
|
||||
llm:
|
||||
active-provider: gemini
|
||||
@@ -254,19 +293,23 @@ indie:
|
||||
model: gpt-4o-mini
|
||||
```
|
||||
|
||||
Adding a new provider = implement `LLMProvider` interface + add config block.
|
||||
|
||||
---
|
||||
|
||||
## Key Design Decisions
|
||||
|
||||
1. **Static output only** — Generated sites are pure HTML/CSS/JS. No Angular/React dependency for end users. They own the output forever, no lock-in.
|
||||
1. **Pure prompt-based** — No drag-and-drop builder. Every site starts from a prompt. Iteration happens through follow-up prompts and inline text edits.
|
||||
|
||||
2. **Git as source of truth** — Every site is a git repository. Publish = commit. Rollback is a `git checkout`. Export includes full `.git/` history.
|
||||
2. **Static output only** — Generated sites are pure HTML/CSS/JS. No runtime framework dependency. Users own the output forever.
|
||||
|
||||
3. **Shared rendering** — The same component renderers drive the builder preview AND the static export. What you see is what you get.
|
||||
3. **Git as source of truth** — Every site is a git repository. Publish = commit. Rollback = checkout. Export includes full `.git/`.
|
||||
|
||||
4. **No billing in MVP** — Subdomain hosting is free. No Stripe/PayPal code. Monetization (paid hosting, custom domains) is a post-MVP concern.
|
||||
4. **Version timeline** — Every generation creates a version in MongoDB. Users can browse, preview, and restore any previous version.
|
||||
|
||||
5. **Incremental releases** — Each v0.x is independently shippable. If timeline slips, ship what's done.
|
||||
5. **Content editor** — Text edits happen in a structured form grouped by page, not inside the iframe. Style/structure changes go through prompts.
|
||||
|
||||
6. **No billing in MVP** — Subdomain hosting is free. Monetization is post-MVP.
|
||||
|
||||
---
|
||||
|
||||
@@ -274,11 +317,10 @@ indie:
|
||||
|
||||
| Release | What to Test |
|
||||
|---------|-------------|
|
||||
| v0.1 | Register, login (email + OAuth), refresh token, site CRUD, page CRUD, 401 on unauthenticated |
|
||||
| v0.2 | Drag → reorder → save → reload matches, theme change reflects in preview, undo/redo, all 10 component types render |
|
||||
| v0.3 | LLM generates valid SiteStructure JSON, generation loads into builder, refinement updates correctly, error handling (timeout, bad JSON) |
|
||||
| v0.4 | Exported zip opens in browser identically to preview, git init + commit works, git push to remote works, R2 upload succeeds, subdomain serves content |
|
||||
| v0.5 | Comment submit → approve → display, RSS validates, image upload + resize, rollback restores previous version |
|
||||
| v0.1 | Register, login (email + OAuth), refresh token, site CRUD, 401 on unauthenticated |
|
||||
| v0.2 | Prompt → valid SiteStructure generated, preview renders correctly, version timeline shows history, restore works, content editor updates preview, refinement prompt modifies existing structure, reference URLs included in generation |
|
||||
| v0.3 | Exported zip opens in browser identically to preview, git init + commit works, git push to remote works, R2 upload succeeds, subdomain serves content |
|
||||
| v0.4 | Comment submit → approve → display, RSS validates, rollback restores previous version |
|
||||
|
||||
---
|
||||
|
||||
@@ -286,8 +328,7 @@ indie:
|
||||
|
||||
| Risk | Likelihood | Mitigation |
|
||||
|------|-----------|------------|
|
||||
| Scope creep (adding features mid-phase) | High | Strict feature freeze per v0.x; ship as-is |
|
||||
| Drag-drop performance with many components | Medium | Cap at 50 components/page; virtual scroll if needed |
|
||||
| LLM output quality inconsistent | Medium | Iterate on system prompt; template gallery fallback |
|
||||
| Solo developer burnout | Medium | Realistic timeline; celebrate each release |
|
||||
| LLM output quality inconsistent (most critical risk) | High | Invest heavily in system prompt + few-shot examples; solid response parser with fallbacks; allow manual text edits as safety net |
|
||||
| Scope creep | High | Strict feature freeze per v0.x; ship as-is |
|
||||
| LLM API costs | Low | Gemini-2.0-flash is free-tier friendly; rate limit 10/hour/user |
|
||||
| Solo developer burnout | Medium | Realistic timeline; 4 releases instead of 5 saves ~2 weeks |
|
||||
|
||||
Reference in New Issue
Block a user