SignalBoard is a full-stack productivity dashboard with DB-backed workspaces, tasks, activity, and integrations. The app uses a modern SaaS UI, Next.js App Router architecture, Prisma data modeling, and a CI-backed test/build workflow.
Tech Stack: Next.js App Router, TypeScript, Prisma, SQLite (local) / Postgres (prod), NextAuth, Tailwind, Vitest, Playwright
Live deployment: https://flow-azure-beta.vercel.app
- Multi-tenant workspace UI with activity timeline and priority tasks
- Workspace switcher persisted per user
- Integrations connect/disconnect with
lastSyncedAt - Tasks CRUD with activity logging
- Theme toggle with persistent preference
- Credentials sign-in is the default; GitHub OAuth appears only if configured
- Prisma schema + seed data for v1 functionality
- Unit tests (Vitest) and E2E tests (Playwright)
- Open the live deployment and sign in with the seeded account credentials.
- Switch workspaces to confirm preferences and workspace state persist.
- Add or update a task, then review the activity timeline.
- Toggle an integration to see simulated connected/disconnected states.
- Review the Prisma schema, seed script, Vitest tests, and Playwright smoke flow.
- CI runs lint, typecheck, unit tests, Prisma generation, and production build.
- Playwright coverage exercises the browser-level signed-in path.
- Local SQLite and production Postgres schemas are split for realistic deployment setup.
- CI checks that local SQLite and production Postgres Prisma model definitions stay in sync.
- Install dependencies:
npm install
-
Create
.env.localfrom.env.exampleand fill secrets. -
Initialize SQLite and seed:
npm run db:generate:localnpm run db:migrate:localnpm run db:seed
- Start the dev server:
npm run dev
- Open:
http://localhost:3000
Create a .env.local file with:
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=replace-with-a-long-random-secret
DATABASE_URL="file:./dev.db"Keep NEXTAUTH_SECRET stable between restarts (changing it will invalidate existing sessions and require clearing auth cookies).
Seeded account credentials:
- Email:
ops@signalboard.local - Password:
signalboard
Optional:
GITHUB_CLIENT_ID+GITHUB_CLIENT_SECRET(enables GitHub OAuth)
SignalBoard uses Prisma + SQLite for local development. Production should use Postgres (Neon/Supabase).
The model definitions are duplicated in prisma/schema.prisma and prisma/postgres/schema.prisma so each environment can use the correct datasource provider. Keep them aligned with:
npm run validate:schema
npm run db:generate
npm run db:migrate
npm run db:seed
npm run test
npm run test:e2e
npm run dev— start development servernpm run build— production buildnpm run start— run production servernpm run lint— lint codenpm run db:generate— generate Prisma clientnpm run db:migrate— create SQLite migrationnpm run db:deploy— run migrations in productionnpm run db:seed— seed local data
- Create a Postgres database (Neon recommended) and copy the connection string.
- Import this repo into Vercel.
- Set the required environment variables in Vercel:
DATABASE_URL(Postgres)NEXTAUTH_URL(your Vercel production URL)NEXTAUTH_SECRET(long random string)PRISMA_SCHEMA=prisma/postgres/schema.prismaGITHUB_CLIENT_ID+GITHUB_CLIENT_SECRET(optional)
- Deploy. Vercel runs
vercel-build, which executesnpm run db:generate && npm run db:deploy && next build. - First login auto-seeds sample workspace data if the database is empty.
Prisma production verification:
vercel-buildrunsprisma migrate deploy --schema prisma/postgres/schema.prismavianpm run db:deploy.DATABASE_URLin Vercel must start withpostgresql://orpostgres://.
- Go to https://flow-azure-beta.vercel.app/signin
- Use the seeded credentials shown on the sign-in page.
NEXTAUTH_URL must match the production domain exactly.
/api/health is publicly accessible and returns JSON confirming DB connectivity.
If Vercel Deployment Protection (Vercel Authentication) is enabled, public requests to /api/health may be blocked. To allow public health checks:
- Vercel Project → Settings → Deployment Protection.
- Disable “Vercel Authentication” for Production (or create a Shareable Link if keeping protection on).
- Redeploy after changing protection, then verify
/api/healthis publicly reachable.
Use the Settings page reset action (POST /api/reset) to rebuild both sample workspaces.
SignalBoard stores a sample display name in localStorage. The first-run prompt lets you set it, and the Settings reset action clears it so the onboarding prompt appears again.
The Overview page includes a skippable quick tour. Restart it from Settings, and use “Clear personalization” to return to the default sample user.
- Click “Load sample workspace data” on Overview to load sample data.
- Use the command palette (Press
/or Cmd/Ctrl+K) to jump between pages. - Open the “?” icon in the header to see what’s simulated vs real.
- Sign in and set a display name.
- Switch between “SignalBoard HQ” and “Operations Hub”.
- Open Pipeline or Momentum and load sample data if needed.
- Toggle integrations or add a task to see activity update.
- Next.js App Router + TypeScript UI
- Prisma ORM with Postgres in production, SQLite locally
- NextAuth credentials for seeded account authentication
- Vitest + Playwright for tests
See docs/architecture.md for the data model, route boundaries, and deployment split.
- OAuth/session cookie loops: Ensure
NEXTAUTH_URLexactly matches the deployed URL (no trailing slash) and redeploy after changing it. - Invalid session/CSRF errors: Set a strong
NEXTAUTH_SECRET, then clear cookies for the domain and try again. - Preview deployments: If preview URLs are used, set
NEXTAUTH_URLto the preview URL or use a separate Vercel Environment Variable for Preview.

