# Site Builder → Sites Container Migration Summary ## Overview Successfully merged Site Builder container into Sites container. Sites is now the primary container hosting both: - **Public Site Renderer** (no auth required) - **Site Builder** (auth required) ## Structure Changes ### New Directory Structure ``` sites/src/ ├── builder/ # Site Builder (from site-builder/src/) │ ├── pages/ # Wizard, Preview, Dashboard │ ├── components/ # Builder-specific components │ ├── state/ # Zustand stores │ ├── api/ # API client with conditional auth │ ├── types/ # TypeScript types │ └── App.css # Builder styles ├── renderer/ # Sites Renderer (existing) │ ├── pages/ # SiteRenderer component │ ├── loaders/ # Site definition loaders │ ├── utils/ # Layout renderer utilities │ └── types/ # Renderer types ├── shared/ # Shared components │ └── ProtectedRoute.tsx ├── App.tsx # Unified router └── main.tsx # Entry point ``` ## Routing Structure ### Public Routes (No Auth) - `/:siteId/*` - Site renderer (public sites) - `/` - Root page ### Builder Routes (Auth Required) - `/builder` - Wizard page - `/builder/preview` - Preview canvas - `/builder/dashboard` - Blueprint history ## Key Changes ### 1. Unified Router (`App.tsx`) - Single router handles both builder and renderer routes - Builder routes wrapped in `ProtectedRoute` component - Builder routes wrapped in `BuilderLayout` component - Code-splitting for builder routes (lazy loading) ### 2. Authentication - `ProtectedRoute` component checks for JWT token in localStorage - Builder API client conditionally includes auth headers - Public renderer routes have no authentication ### 3. API Clients - Builder API (`builder/api/builder.api.ts`): Includes auth token if available - Renderer API (`renderer/loaders/loadSiteDefinition.ts`): No auth required ### 4. Build Configuration - Updated `vite.config.ts` with code-splitting - Builder routes split into separate chunk - Supports both `sites.igny8.com` and `builder.igny8.com` domains ### 5. Docker Configuration - Removed `igny8_site_builder` service from docker-compose - Updated `igny8_sites` service comment - Single container now handles both functions ## Backend (No Changes) - Backend Django views remain unchanged - API endpoints: `/api/v1/site-builder/` (same as before) - Database tables: No changes - Authentication: Same JWT-based auth ## Migration Checklist ✅ Created merged directory structure ✅ Moved site-builder files to sites/src/builder/ ✅ Created unified App.tsx with routing ✅ Created ProtectedRoute component ✅ Created BuilderLayout component ✅ Merged package.json dependencies ✅ Updated vite.config.ts with code-splitting ✅ Updated main.tsx entry point ✅ Updated docker-compose.app.yml (removed site_builder service) ✅ Updated API clients with conditional authentication ✅ Updated index.css with builder styles ## Next Steps 1. **Test Builder Functionality** - Navigate to `/builder` (should require auth) - Test wizard flow - Test preview - Test dashboard 2. **Test Renderer Functionality** - Navigate to `/:siteId/*` (should work without auth) - Test site loading from filesystem - Test site loading from API 3. **Build & Deploy** - Build Docker image: `docker build -t igny8-sites-dev:latest -f Dockerfile.dev .` - Update docker-compose: `docker compose -f docker-compose.app.yml up -d igny8_sites` 4. **Cleanup** (Optional) - Remove `/site-builder` directory after verification - Update documentation ## Notes - **No Backward Compatibility**: Old site-builder container is removed - **Backend Unchanged**: All Django views and models remain the same - **Code-Splitting**: Builder code is lazy-loaded, so public sites don't load builder code - **Route Conflicts**: Builder routes are namespaced under `/builder/*` to avoid conflicts