- login page (Supabase email/password sign-in + sign-up)
- onboarding: create first tenant, redirects into /dashboard once a
membership exists
- dashboard shell: sidebar nav, tenant switcher (x-tenant-id header,
never in body/query -- matches ceo-api's TenantGuard), sign out
- Organizations, Tasks, and Team (members/RBAC) pages wired to ceo-api
via a thin apiFetch wrapper that attaches the Supabase bearer token
- executive "paper & ink" design tokens (Tailwind) replacing defaults
- Dockerfile: declare NEXT_PUBLIC_* as build ARGs so Coolify's existing
build-time env vars actually get inlined (was previously silently
dropped, which would have crashed prerendering)
Next.js only emits .next/standalone, not an empty public/ dir when the
source has none -- the Dockerfile's COPY --from=build /app/public
failed outright since the path never existed.
Same class of bug as ceo-api/ceo-worker: plain npm install skips
devDependencies (typescript, tailwindcss, postcss) when NODE_ENV=production
is visible at build time, which next build needs. Switched to
npm ci --include=dev.