Table of contents
Performance is a feature. A slow IDE is a broken IDE. In Q1 2026, we ran a thorough performance audit of our proprietary WebSandbox platform using Lighthouse, Web Vitals, and custom RUM (Real User Monitoring) instrumentation deployed to 5% of production traffic.
Here's what we found and what we fixed — including the things we expected to be fast but weren't.
The Baseline Numbers
Before optimizations, our median measurements on a mid-tier laptop were:
- LCP (Largest Contentful Paint): 3.8 seconds
- INP (Interaction to Next Paint): 280ms
- CLS (Cumulative Layout Shift): 0.12
- WebContainer cold boot: 2.1 seconds
- First keystroke response in editor: 340ms
The 340ms first-keystroke latency was the most alarming. A user who opens a file and starts typing immediately experiences a noticeable freeze. This was caused by the TypeScript language server hydrating on the first edit.
Key Architectural Optimizations
- Asynchronous FileSystem Snapshots. We overhauled how we write to Dexie via
bulk-operations.tsusing a sophisticatedwithFileRepositoryqueueing system. This prevents heavy file changes from locking the main UI thread during autosaves. - Web Worker Global Search. Global search on thousands of files historically choked the browser. We moved this entirely to a dedicated Web Worker (
use-global-search.ts). We explicitly tuned theSEARCH_WORKER_CHUNK_SIZEto process 50 files per chunk, yielding the best balance between search speed and main thread smoothness. We also strictly enforce worker termination and listener cleanup to eliminate memory leak-induced INP spikes. - LSP prewarming. We now start the TypeScript Worker exactly when the workspace first loads rather than waiting for the first edit. First-keystroke latency dropped from 340ms to 18ms.
- Virtualized file tree. Replaced our flat list rendering with
react-window, eliminating janky scrolling on projects with thousands of files, keeping a smooth 60fps framerate. - Debounced LSP diagnostics. Throttled the TypeScript diagnostics cycle from per-keystroke to a 300ms debounce. INP improved from 280ms to 90ms.
Results After
After shipping these proprietary architectural changes, our median measurements became:
- LCP: 1.2 seconds (↓ 68%)
- INP: 90ms (↓ 68%)
- CLS: 0.004 (↓ 97%)
- WebContainer cold boot: 0.6s warm (↓ 71%)
- First keystroke: 18ms (↓ 95%)
What's Next
Our next focus is reducing memory usage for enterprise-scale projects. A workspace with 10,000 files currently uses ~180MB of RAM for the virtual filesystem mirror alone. We're exploring a lazy-load approach where only the directory tree is loaded upfront and file contents are fetched on demand.
