This portfolio uses Google Analytics only after you agree. It records aggregate navigation and performance signals, never contact-form contents or account details. Declining does not change the site.
A collaborative task management application with teams, real-time sync, live notifications, and role-based access - built with Next.js 15 and Convex to explore reactive database subscriptions and event-driven communication patterns.
Status
Selected work
System context
TypeScript, Next.js, React, Convex
Source
Public repository
01 / System behavior
Interactive proof
A project-specific technical mechanism based on the recorded architecture and implementation context.
TaskFlow is a collaborative task management app designed as a deep exploration of Convex's real-time capabilities. Every useQuery call is a live subscription that automatically re-renders when data changes - no WebSocket code, no pub/sub, no cache invalidation.
The Convex backend is organized as logically isolated service modules with clear boundaries: taskService (CRUD, status transitions, filtering), userService (profiles, email uniqueness validation), teamService (team management, member roles, cascading deletes), commentService (threaded comments per task), notificationService (alerts for assignments and completions), and a typed eventBus for cross-service communication.
03 / Architecture record
Architecture
A structured reading of the architecture recorded with this project.
02Cross-service communication happens inline within mutations
03The Convex backend follows a service-oriented structure
Read the full architecture record
The frontend uses Next.js 15 with the App Router. Every data-fetching component uses Convex's useQuery hook, which subscribes to the underlying data - when any mutation touches the relevant tables, the query re-evaluates server-side and pushes the new result to every connected client.
The Convex backend follows a service-oriented structure: each service module (task, user, team, comment, notification) exports its own types and private helpers, while public-facing files re-export as a facade for the frontend.
Cross-service communication happens inline within mutations - when a task is assigned, the mutation checks if the assignee differs from the creator and inserts a notification directly. The notification service's useQuery picks it up instantly.
How the system is shaped
The schema defines five tables with carefully chosen composite indexes - the teamMembers(teamId, userId) composite index is critical for the membership check that would otherwise scan the entire table.
Business rules include cascading deletes with cross-service cleanup (deleting a team removes all members, then tasks, then the team itself), email uniqueness validation across mutations, and dependency checks before destructive operations.
05 / Selected highlights
Selected implementation notes
The decisions and workflows that carry the most explanatory weight.
Real-time sync via Convex reactive queries - task updates appear across all connected clients within milliseconds, with zero WebSocket or cache invalidation code
Service-oriented Convex backend with logically isolated modules (task, user, team, comment, notification) and typed event definitions
5 database tables with 10+ carefully chosen indexes including composite indexes for efficient membership queries
Cascading delete logic with cross-service cleanup - explicit application-level rules that are visible and testable
Live notification system for task assignments, completions, and comments using inline event-driven communication within mutations
Authentication via Convex Auth with email/password and GitHub as a provider
A production-ready rate limiting solution implementing Fixed Window Counter and Sliding Window Log algorithms from scratch with pluggable storage backends, per-client configuration, and tests that prove exactly where the fixed window fails.
A fully modular e-commerce platform built as a Turborepo monorepo with a Fastify backend, Astro storefront (React islands), React + Vite admin panel, and three shared packages - featuring dynamic RBAC, convention-based route auto-registration, and background job processing.