PROJECT CASE STUDY

TaskForge

A multi-tenant SaaS workspace with tenant-safe authorization, real-time collaboration, and background processing — designed so organisation boundaries are enforced by architecture, not developer memory.

TaskForge project management dashboard showing Kanban workflows, project activity, notifications, and team workload.
RoleFull-stack architecture and implementation
Period2026
TechnologiesNext.js 15 · NestJS · TypeScript · PostgreSQL · Redis

Keeping organization data isolated

Project-management CRUD is straightforward until multiple organisations share the same database and real-time infrastructure. At that point, every read and write becomes an isolation problem: one missed tenant condition can expose another organisation's data, while notifications and background work must remain reliable without slowing request paths.

A missed tenant boundary

THE RISK

In a multi-tenant system, one forgotten tenant filter can expose another organisation's records. The failure is dangerous because it often stays invisible during development when only one organisation exists.

THE APPROACH

Organisation membership and role enforcement were moved into the request guard chain so authorization resolves before handlers execute. A route therefore cannot widen access simply because an individual query forgot a tenant condition.

Authorization before application logic

The system is split into a Next.js frontend and NestJS API so the backend can be exercised independently. Organisation membership and role resolution happen in the request guard chain before handlers execute. PostgreSQL remains the durable source of truth, Redis supports caching and rate limiting, Socket.IO handles real-time updates, and BullMQ moves email and notification fan-out to workers outside the request path.

Next.js 15NestJSTypeScriptPostgreSQLRedisSocket.IOBullMQStripe

An explorable SaaS workflow

The product is deployed with a seeded demo account, allowing the complete organisation, board, role, and live-notification workflow to be explored without local setup.

Reducing API contract drift

The frontend still owns hand-written copies of several API types, leaving room for contract drift. A stronger iteration would generate shared contracts from the API schema so incompatible backend changes fail during development rather than at runtime.