Projects
fullstack · 2026

Tide

Full-featured project management platform with boards, task tracking, and team collaboration — built end-to-end with Next.js and Stripe billing.

Next.jsTypeScriptTanStack QueryBetter AuthTailwind CSSDrizzle ORMPostgresStripeVitestPlaywright
Tide

Problem

Most project management tools are either too bloated or too simple. I wanted to build something that felt genuinely production-ready: multi-tenant workspaces, role-based access, real-time updates, a subscription model, and the kind of performance that doesn't embarrass you in a Lighthouse audit.

The goal was also educational, to push myself through the full complexity of a modern SaaS product: authentication, payments, real-time infrastructure, database design, and end-to-end testing. Not a tutorial clone, but something that surfaces the hard parts.

What it does

  • Multi-tenant workspaces — each workspace has its own members, projects, and role hierarchy (owner / admin / member)
  • Kanban board — drag-and-drop reordering via @dnd-kit, with live SSE updates so collaborators see changes in real time
  • Three task views — Board, List, Table — switchable without losing scroll position
  • Real-time notifications via Server-Sent Events (no polling)
  • In-project WebRTC video calls via simple-peer
  • Global command palette (⌘K) across tasks and projects
  • Stripe billing with Free / Pro tiers and server-enforced limits
  • Email invite system with tokenized, expiring links

Stack

Next.jsRSC + streaming, great DX, Vercel deployment
TypeScriptnd-to-end type safety with Drizzle and Zod
Drizzle ORMType-safe queries, lightweight, great with Neon's HTTP driver
Neon (PostgreSQL)Serverless HTTP driver, edge-compatible, generous free tier
Better AuthMulti-provider, Drizzle adapter, safe per-request session cache
TanStack Query v5 Optimistic updates and cache invalidation on SSE events
StripeWebhooks, subscription management, hosted billing portal
Server-Sent EventsReal-time without WebSockets — works on Vercel serverless
simple-peerPeer-to-peer WebRTC video/audio per project room
Playwright + VitestE2E auth/workspace flows + isolated server action unit tests

Architecture

The entire dashboard uses RSC by default — pages fetch via Drizzle directly, no intermediate API layer. Client components are isolated to where interactivity is needed: the kanban board, forms, search palette, video UI.

Session fetching uses React's cache() to deduplicate across nested layouts within a single request — so a page with three nested layouts calls the DB once, not three times. Critically this uses React's per-request cache, not unstable_cache, so session data never leaks between users.

Real-time uses SSE over WebSockets: no persistent server state, HTTP/2-efficient, and automatic browser reconnection. Each event triggers TanStack Query cache invalidation, re-fetching only the affected data while keeping optimistic updates intact.

Outcome

A fully functional SaaS with real-time collaborative boards, multi-tenant workspaces, Stripe billing with server-enforced limits, and WebRTC video calls. Covered by a Playwright E2E suite for auth and workspace flows, with production monitoring via Sentry and Vercel Speed Insights.