
TaskFlow β SaaS Project Management
βFull-stack project management built for async remote teamsβ
TaskFlow is a full-stack SaaS project management platform built with Next.js and a Go API backend. It supports Kanban boards, Gantt charts, time tracking, and async team updates β designed for remote engineering teams that need structured workflows without the bloat of Jira.
Tech Stack
Technologies & tools used
Frontend
2Next.js
v15
App Router, Server Components, RSC-first architecture
Tailwind CSS
v4
Utility-first styling with neo-brutalist design system
Backend
1Go
v1.22
REST API, business logic, background job workers
Database
2PostgreSQL
v16
Primary relational data store with row-level security
Redis
v7
Session cache, rate limiting, real-time notification queue
Other
1Resend
Transactional email for notifications and invites
Media Gallery
2 items

Kanban Board

Gantt Timeline
Features & Highlights
Key capabilities and achievements
Kanban Board
CoreDrag-and-drop Kanban with configurable swimlanes, WIP limits per column, and automatic backlog prioritization. Board state updates optimistically on the client with server reconciliation.
Gantt Timeline
CoreInteractive Gantt chart with dependency arrows, critical path highlighting, and milestone markers. Auto-reschedules dependent tasks when a blocking task date changes.
Async Status Updates
Each task has a threaded update log. Team members post progress updates asynchronously β no meetings needed. Updates support markdown, @mentions, and file attachments.
Challenges & Solutions
Problems solved and lessons learned
N+1 Queries from Kanban Board Loading
PerformanceLoading a Kanban board with 200 tasks originally fired 201 database queries β one for the board structure, then one per task for assignees, tags, and latest update. This caused 4β8 second load times.
Solution
Rewrote the board query as a single parameterized CTE that joins tasks, assignees, tags, and the latest update in one round trip. Used PostgreSQL array_agg to collapse one-to-many relationships.
Outcome
Board load time dropped from 4.2 seconds to 180ms. Single database round trip regardless of task count.
Real-Time Collaboration Conflicts
TechnicalTwo users editing the same task simultaneously caused silent data loss β the last write always won.
Solution
Implemented optimistic locking with a version field on every task row. Update requests include the version they're based on; the server rejects updates against stale versions with a 409 Conflict.
Outcome
Zero silent data loss incidents since deployment. Users are aware of conflicts and can choose which version to keep.
Related Content
Explore related articles, projects, and tools.