Frontend, Performance, React
A kanban that loaded in 28 seconds, fixed
Pagination, streaming, and memoization on a board that was scanning every case in the tenant.
Client
Compliance SaaS, EU
Duration
1 sprint
Year
2026
The problem
The flagship kanban view fetched every open case for the tenant on first paint, ran them through several map and filter passes, then rendered all columns at once. On real tenants that meant 28 seconds to interactive, frozen drag and drop, and a CloudWatch graph that looked like a denial of service attack on the read path. Users assumed the product was broken.
The solution
Replaced the bulk fetch with a per column query that pulls the first page of cards and a Show 10 more control for the long tail. Streamed columns into the UI as they arrived rather than waiting for the slowest one. Wrapped card and column components in React.memo, lifted selectors with useMemo, and stabilized event handlers with useCallback so a drag inside one column no longer re-rendered the others. Verified with React Profiler and a synthetic tenant of 5000 cases.
Architecture
Stack
Outcomes
from 28 s to under 2 s
Initial board load
−85 percent
DynamoDB read units on the page
from hundreds to single digits
Re-renders per drag