diff --git a/PLAN.md b/PLAN.md index 290b144..f98173e 100644 --- a/PLAN.md +++ b/PLAN.md @@ -1,6 +1,6 @@ # Indie — Independent Website Platform -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. +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. --- @@ -75,7 +75,7 @@ Prompt + Reference URLs | `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), status(DRAFT/PUBLISHED), publishedAt, createdAt, updatedAt | +| `com/indie/model/Site.java` | Add | id, userId, name, description, 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 | @@ -151,7 +151,7 @@ Prompt + Reference URLs ### 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. +**Goal:** User can publish their site as pure static files. Every publish creates a git commit. User can connect GitHub/GitLab for automatic pushes. #### Backend @@ -178,13 +178,13 @@ Prompt + Reference URLs | File | Action | Details | |------|--------|---------| | `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 | +| `src/app/workspace/settings/` | Add | SettingsComponent — site name, export zip button, publish/unpublish buttons | #### Infrastructure | File | Action | Details | |------|--------|---------| -| `infra/cloudflare-worker.js` | Add | Routes `*.indie.com` → R2 bucket `indie-sites/{subdomain}/` | +| `infra/cloudflare-worker.js` | TBD | Routes custom domains → R2 bucket | | `docker-compose.prod.yml` | Add | Production services: PostgreSQL, MongoDB, backend (×2), nginx, certbot | **Git directory structure on server:** @@ -225,9 +225,9 @@ site-export/ | File | Action | Details | |------|--------|---------| | `com/indie/model/Comment.java` | Add | JPA: id(UUID), siteId, pageId, authorName, authorEmail, content, isApproved, parentCommentId, createdAt | -| `com/indie/controller/CommentController.java` | Add | Public: `POST /api/sites/{subdomain}/comments`. Authenticated: `GET/PUT/DELETE` moderation | +| `com/indie/controller/CommentController.java` | Add | Public: `POST /api/sites/{siteId}/comments`. Authenticated: `GET/PUT/DELETE` moderation | | `com/indie/service/RssService.java` | Add | `generateRss(siteId) → String` — RSS 2.0 feed from site pages | -| `com/indie/controller/RssController.java` | Add | `GET /api/feed/{subdomain}` → `application/rss+xml`, 1h cache | +| `com/indie/controller/RssController.java` | Add | `GET /api/feed/{siteId}` → `application/rss+xml`, 1h cache | #### Frontend @@ -243,13 +243,13 @@ site-export/ ``` ┌──────────────────────┐ │ Cloudflare CDN │ - │ *.indie.com → R2 │ + │ custom domains → R2 │ └────────┬─────────────┘ │ ┌────────▼─────────────┐ │ Cloudflare R2 │ │ indie-sites bucket │ - │ /{subdomain}/* │ + │ /{siteId}/* │ └──────────────────────┘ ▲ ┌────────┴─────────────┐ @@ -309,7 +309,7 @@ Adding a new provider = implement `LLMProvider` interface + add config block. 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. +6. **No billing in MVP** — Monetization is post-MVP. --- @@ -319,7 +319,7 @@ Adding a new provider = implement `LLMProvider` interface + add config block. |---------|-------------| | 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.3 | Exported zip opens in browser identically to preview, git init + commit works, git push to remote works, R2 upload succeeds | | v0.4 | Comment submit → approve → display, RSS validates, rollback restores previous version | --- diff --git a/README.md b/README.md index b9a14bd..bc3f496 100644 --- a/README.md +++ b/README.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 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. --- diff --git a/frontend/src/app/core/models/site.ts b/frontend/src/app/core/models/site.ts index f31cdce..5969573 100644 --- a/frontend/src/app/core/models/site.ts +++ b/frontend/src/app/core/models/site.ts @@ -3,7 +3,6 @@ export interface SiteResponse { userId: string; name: string; description: string; - subdomain: string; publishedUrl: string | null; themeConfig: Record; status: 'DRAFT' | 'PUBLISHED'; @@ -16,7 +15,6 @@ export interface SiteResponse { export interface SiteRequest { name: string; description: string; - subdomain: string; deploymentTarget?: string; themeConfig?: Record; } diff --git a/frontend/src/app/dashboard/create-site-dialog/create-site-dialog.ts b/frontend/src/app/dashboard/create-site-dialog/create-site-dialog.ts index af9546a..d9b008b 100644 --- a/frontend/src/app/dashboard/create-site-dialog/create-site-dialog.ts +++ b/frontend/src/app/dashboard/create-site-dialog/create-site-dialog.ts @@ -21,15 +21,6 @@ import { SiteService } from '../../core/services/site.service'; Name is required - - Subdomain - - Subdomain is required - - Lowercase letters, numbers, and hyphens only - - - Description (optional) @@ -51,7 +42,6 @@ export class CreateSiteDialog { form = this.fb.group({ name: ['', Validators.required], - subdomain: ['', [Validators.pattern(/^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/)]], description: [''], }); loading = false; diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index 6ff3dfe..5088d75 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -61,7 +61,6 @@ import { DeleteSiteDialog } from './delete-site-dialog/delete-site-dialog'; {{ site.name }} - {{ site.subdomain }}

{{ site.description || 'No description' }}

diff --git a/frontend/src/app/llm-workspace/settings/settings.component.ts b/frontend/src/app/llm-workspace/settings/settings.component.ts index 2323cc0..98c0bcc 100644 --- a/frontend/src/app/llm-workspace/settings/settings.component.ts +++ b/frontend/src/app/llm-workspace/settings/settings.component.ts @@ -56,10 +56,6 @@ import { SelfHostedConfigResponse } from '../../core/models/deployment'; Description
- - Subdomain - -