MVP app to let labs log in, pick a template, fill details, publish, and connect custom domains through Vercel Platforms.
apps/web: Next.js frontend and API routes.apps/web/src/templates: template registry, defaults, and full template page components.packages/shared: shared domain types.packages/db: data model/types layer (placeholder for Supabase integration).packages/publisher: publishing adapter (placeholder for Vercel deployment logic).packages/domain-service: custom domain utilities (placeholder for Vercel Domains API wrapper).
npm run devstart web app locally.npm run buildbuild app.npm run lintlint web app.
- Create a Supabase project.
- Run SQL from
apps/web/supabase/schema.sqlin the Supabase SQL editor. - Create
apps/web/.env.localfromapps/web/.env.exampleand fill:NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYNEXT_PUBLIC_PLATFORM_ROOT_DOMAIN(e.g.labsites.app)PLATFORM_ROOT_DOMAIN(same value)
- Restart
npm run dev.
The app now uses Supabase auth (email/password) and persists sites/domains per logged-in user.
Sites also store template_data (JSON) to support per-template extra sections and layout-specific content.
Users can create multiple websites and choose from available wildcard hostnames at publish time.
- Tenant hosts are resolved via middleware and rewritten to internal tenant pages.
- Supported host resolution:
- Custom domains verified/active in
public.domains - Platform subdomains stored in
public.sites.subdomain
- Custom domains verified/active in
- Base app hosts (
localhost, root platform domain,*.vercel.app) continue serving the builder UI.