"We can make the backend more performant, but unless we cut features, we will land probably on 50% better, not 3ร better."
โ Rich Table Kick-Off, 2026-05-04
HONEST CONSTRAINTWhy we're rebuilding the most-used screen in Enginy
Why this is the most-used screen โ and the most complained about
PoC results, Datadog baselines, three layers of limitations
Architecture principles and measurable success criteria
V1 default view, column set, what's in and what's deferred
Six releases, organised around user-perceived capability gates
01
Most-used screen. Most complained about.
CONTEXT
It has accreted features for months. Each one was justified individually. Compounded, they produce four distinct user pains โ three technical, one product.
PAINS WE'VE CONFIRMED
First render is gated by data fetching. Monolithic data source returns everything, even hidden columns. Long-polling shares latency with enrichment workflows.
Fast horizontal and vertical scroll outpaces the cells to the right of the viewport โ visible white areas before columns paint. Column-count ร column-complexity cliff.
Each filter re-fetches through the same monolithic path. Some filtering runs in the browser. Iterative narrowing โ the workflow customers actually use โ is the slowest case.
Every column has equal weight. ICP and Intent exist in the data but never become decision signals. No contact photos. Names truncate. The user reads it as a wall of text.
USAGE FACTS ยท LAST 7 DAYS
Lead workflows still dominate (~66โ72%), but company share is creeping up. List-scoped behavior is the norm (~81%). When this screen lags, it lags for everyone.
02
The rendering layer isn't the bottleneck.
FINDING #2 ยท DATADOG BASELINE (NEW INSTRUMENTATION)
P50 is 518 ms โ the long tail is what users feel.
5+ seconds, every time, on the most loaded view.
companyGroup combinations dominate the slow tail.
Overall P95 is 1,002 ms โ companies entity is the outlier.
~38% slower than global. Worst internal case: 12,968 ms.
1,417 errors over 261,516 loads.
FINDING #1 ยท PROOF OF CONCEPT
Replaced the custom SuperTable with TanStack Table + virtualization in a PoC.
Marginal improvement only. Virtualization comes free with TanStack โ but it was never the binding constraint.
Design is one thing โ here's the real thing running against real data.
๐ URL
๐ฉ Required feature flag
Enable companies_rich_table for the page to render.
Watch for #1
First load time vs the legacy table
Watch for #2
Scroll โ no blank gaps
FINDING #3 ยท THREE LAYERS OF LIMITATION
Row data passed whole to every cell. Reference identity changes during enrichment streaming โ same row re-renders ~20ร per enrichment, invalidating every cell each time. Complex cells (technologies, AI tooltips, badges) lack their own memoization boundary.
Monolithic "one-size-fits-all" data source over-fetches. Background long-polling shares latency with long-running enrichment workflows. Reads and writes share request paths and backend resources.
No internal source-of-truth database. LinkedIn provides coarse categories ("tech industry"), not the segmentation customers want ("B2B SaaS startups"). The table does double duty as viewer and filtering workspace โ that's why customers scroll through 95 pages.
"We can make the backend more performant, but unless we cut features, we will land probably on 50% better, not 3ร better."
โ Rich Table Kick-Off, 2026-05-04
HONEST CONSTRAINTScope must be cut, not just optimized.
A 3ร experience win requires reducing the per-row / per-cell feature surface โ not just a faster engine behind it.
03
Four architectural rules and how we'll measure them.
DESIGN RULES ยท NON-NEGOTIABLE
A cell re-renders if and only if its own value changed. Each cell receives only the slice it consumes, with stable reference identity. Verifiable in React DevTools profiler.
No reuse of the monolithic data source. Two tables get two queries. Filtering and pagination designed together. List-aware paths use the DB's existing bookmark.
Table read paths separated from long-running enrichment / AI generation. The user's view is never bottlenecked behind background work or long-polling.
The rewrite ships a smaller default surface for the daily user. Power-user complexity stays reachable via Advanced Mode while we earn the right to replace it.
HOW WE'LL KNOW WE WON
| Metric | Legacy baseline | Target |
|---|---|---|
| First load ยท P95 (frontend) | 2,836 ms overall worst slice 5,488 ms |
Strictly lower no slice > 3,500 ms |
| Top 10 filter signatures ยท avg | 13โ39 s | < 5 s avg |
| DB time ยท P95 | 1,002 ms overall | Strictly lower on same window |
| Internal cohort ยท P95 | 3,906 ms worst slice 12,968 ms |
โค 2,836 ms worst slice < 4,000 ms |
| Error rate | 0.54% | โค legacy at R1 cutover |
| Blank gaps on scroll | Qualitative โ present today | No visible gaps at normal scroll speed |
We are not claiming a direct product-metric move. The honest goal is reducing churn driven by "the software feels laggy" and "the table doesn't look professional" โ neither cleanly attributable.
04
A new default view for contact lists. Legacy stays reachable.
MVP ยท V1 DEFAULT VIEW
New default when a customer selects a contact list. CSV-imported lists open in the legacy view by default to avoid breaking sparse-data layouts.
"Edit Mode" button switches back to the legacy SuperTable. Power users keep everything they have today while we earn the right to remove it.
Testing and engineering overhead. Every cell we keep means real QA surface.
V1 SCOPE ยท IN AND OUT
RISKS WE'RE TRACKING
Power users are accustomed to high customization. The single biggest source of complaint risk is the transition UX: how users land on the new view, and how they find the old one. Damian owns the flow.
Engineering capacity is fine. QA surface isn't. Email, phone, and the enrichment-adjacent cells each add real QA volume โ which is why so much was cut from V1.
Risk: customers ask us to port every advanced feature into the simple table, defeating the scope cut. Mitigation: R5 (inline editing + legacy removal) is the forcing function.
The column combo including aiVariables averages 9.6 s frontend
in the PoC vs 261โ584 ms without. Flagged for R4 column rollout.
05
Six releases organised around capability gates, not column count.
FRAMING
The previous V1โV4 plan was anchored on column coverage. The 2026-05-11 sync rebuilt it around user-perceived capability gates instead.
SIX CUSTOMER-FACING RELEASES
Inline editing + legacy removal
After R1โR4 ship, the only remaining capability the legacy table holds over the new one is inline editing. Once that's in the new table, the legacy entry point can go.
Removing the fallback is irreversible from a customer-perception standpoint. R5 only ships once R3 (trust) and R4 (parity) are demonstrably working for the majority of customer workloads โ not just selected testers.
SCOPE BOUNDARIES
R1โR5 are scoped to contacts only. Companies SuperTable continues to exist after R5. Companies migration is a separate project.
The list-selector, page filters, and adjacent page chrome are explicitly out of the customer-facing release stream โ scheduled separately after R5.
Improved ICP / Intent Pills, Enrichment Packs, Heat Score + Smart Enrich โ tracked separately. Pills design influences V1 visuals but the project is its own track.
Per-cell memoization, long-polling replacement, isolated read paths, explicit virtualization work. Revisit when R1 / R2 metrics arrive.
IN ONE BREATH
REFERENCES
Let's talk through the open questions on the prior slide.