The clock drains on the compositor, not on a timer
The felt's turn clock ran off a 200ms setInterval writing a fraction into React. That is an honest way to build a bar that must track a server deadline, and it ...
Stop the inline image toolbar re-rendering on every scroll frame
measure() runs on each scroll and resize event and built a fresh state object every time, so the toolbar re-rendered whether or not anything about the image had...
A conversation outlives the window showing it
Opening a chat window cost seven requests before a message rendered β history, members, receipts, mark-read, the unread snapshot, the counterpart's avatar and t...
One session snapshot for the tab, not one per hook instance
useUserInfo held its session in three useState cells. It has 187 call sites and roughly 27 of them are mounted for the whole session β the nav, every shell prov...
Ship Geist as WOFF2
Both faces are preloaded on every route, so the format is paid on every first visit. 134,132 B of WOFF became 112,252 B of WOFF2 β 21,880 B, a 16% cut. That is...
A retail market should not download the mortgage tabs
The market settings page imported all 24 tabs statically, so every market shipped every tab β a retail market carried the seven mortgage tabs, the four personal...
Show the first wallpaper without waiting for the slowest
The slideshow preloaded every wallpaper behind a single Promise.all, so nothing painted until the LAST image in the set had settled. On a tenant with a dozen ba...
Every context and hook now reads user-info through the coalescer
Seven independent /api/user-info calls fired on a cold authenticated load, each one asking for the member id a sibling was already asking for at the same moment...
One refresh timer for the whole app, not one per useUserInfo()
useUserInfo has 194 call sites, roughly a dozen of them mounted for the entire session β the nav, the shell providers, the launchpad. Each instance armed its ow...
Server-render the authenticated app, and fix the fallback org that 500s
MemberListProvider returned null until its mount effect ran, and it sits above NavTop AND {children} β so that one line kept the ENTIRE authenticated applicatio...
A checkbox click should not re-render the folder sidebar
Six call sites read the email store with a bare `useEmailStore()`. In zustand that subscribes to the WHOLE store, so any change anywhere in it re-renders the co...
Memoize the app-wide unread value, fix a self-retriggering effect
UnreadContext published a fourteen-member object literal as its context value, so React saw the context change on every render of the provider and woke every co...
Stop polling for badges nobody is looking at, and stop waking every consumer
Two always-mounted providers ran a one-minute poll with no visibility gate. LegalPackageCount had none at all; TrainingPendingCount had a visibilitychange re-re...
A phone-less org should not open a call socket
The softphone opened its SockJS/STOMP connection to media.<domain> unconditionally at boot. getCapabilities() is awaited a few lines above and is the backend's ...
Stop re-merging the whole catalogue on every request
getRequestConfig runs per request, and for any non-English member it called mergeWithFallback over the entire 23,252-key catalogue every time β rebuilding a res...
One arriving message should not re-render the whole history
Batch 5 of the client-side performance audit. MessageList maps every loaded message to a MessageBubble, and MessageBubble was not memoized. With 300 messages o...
Take AG Grid's 187 KB of CSS off the critical path of every route
Batch 4 of the client-side performance audit, and the last of the big ones. app/globals.css opened with two @imports of ag-grid's stylesheets, and the root lay...
Stop sending the whole message catalogue to the sign-in handoff
Batch 3 of the client-side performance audit. The root layout passed every message to NextIntlClientProvider on every route. The catalogue is 1.05 MB compact β...
Split the tool windows out of the shell, stop the idle timer storm
Batch 2 of the client-side performance audit. As with batch 1, nothing a member can see or do changes. The tool registry imported all ten tool windows eagerly,...
Stop shipping the shell code no route can reach
Batch 1 of the client-side performance audit. Every change is behaviour-preserving; nothing a member can see or do is different afterwards. I18nProviders impor...
Fetch one server-filtered page instead of the whole organisation
The grid fetched every lead in the org and narrowed it in a ~300-line useMemo. Measured on production 2026-08-20: 1,427 leads fetched so seven could be shown, 2...
Ask for the unread count, not the whole folder tree
The mail badge needs one integer and was fetching every folder in the mailbox to find it, which on the IMAP providers is the most expensive call the mail backen...
Stop making the inbox wait on two lookups it can see the answer to
Two round trips still sat in front of a rendered inbox, and by this point they were the only thing left there β the folder tree and the first page already arriv...
Ask earlier, ask once, and stop asking for what has not changed
Three more things standing between opening /messages and seeing mail. Nothing was requested until the bundle had landed. /messages pulls several megabytes of J...
Stop paying for a key nothing reads, and stop waiting to ask
Three things were slowing /messages down before a single message was fetched. Every email call made a round trip to /api/generate-otk first and sent the result...
Hash with BLAKE3 only, so skipping the upload actually saves time
Dedup worked β the server logged 'linked WITHOUT upload' and 358 MB never left the machine β but the member still waited, because computing SHA3-256 alongside B...
Merge partial DTOs into local state, drop refetch-after-patch
Every edit-style autosave (name fields, employment, assets, liabilities, REO, declarations, military, HMDA demographics, originator) used to issue a full mortga...
Eliminate OTK Redis overhead and proxy log noise for message fetches
- Bypass OTK generation in the MediaService proxy route: forward the *** cookie directly instead of generating a one-time key, removing 4 Redis round-trips ...
Improve chat message loading performance
- Cache getCurrentMemberId() result in a ref to avoid repeated /api/user-info calls on every WebSocket message and typing indicator - Parallelize message hist...
Revert to docker driver for faster builds
- docker-container driver adds initialization overhead - For fast builds (<3min), docker driver is more efficient - Removed cache options (not supported by dock...
Switch to docker-container driver with cache for optimal build performance
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.