Back
Why Linear feels so fast: a technical breakdown
SiTech AI Team3 min read

Why Linear feels so fast: a technical breakdown

A technical breakdown explains how Linear keeps interface updates in the millisecond range: the database lives in the browser, mutations apply locally, and the app ships less code in more pieces.

Updating an issue in Linear takes a few milliseconds, where a traditional CRUD app doing the same thing takes about 300ms. A technical breakdown published on performance.dev walks through the techniques behind that feel — and notes that there is no secret silver bullet. The author says he has never worked at Linear or seen its code.

Database in the browser

Most web apps follow one loop: a click, an HTTP request, a server-side query, and a few hundred milliseconds behind a spinner. Linear inverts it. The database the interface reads from lives in the browser, in IndexedDB: mutations apply locally first, then push asynchronously to the server, which broadcasts deltas to other clients over WebSocket.

A change is two lines — issue.title = "Faster app launch" updates an in-memory store of MobX observables, and issue.save() queues a transaction the sync engine batches and flushes. The UI re-renders synchronously from local state, so there is nothing to wait for. Linear's co-founder Tuomas said at a 2024 conference that "literally the first lines of code" he wrote was the sync engine. Most teams do not need one: TanStack Query or SWR with optimistic updates get surprisingly close.

Making the first load feel instant

Speed also starts at build time. Linear's pipeline has been rewritten four times — Parcel, Rollup, Vite, Rolldown — each time to ship less JavaScript and CSS. The company claims 50% less code shipped, 30% smaller after compression, cold-cache loads 10–30% faster, a 59% drop in time-to-first-paint for the active-issues view on Safari, and 70–80% lower memory use. Dropping legacy browsers, better dead-code elimination and aggressive code splitting did most of that.

Linear still ships roughly 21 MB of minified JavaScript, split into hundreds of route-level chunks fetched on demand. To avoid a waterfall of imports, its HTML declares modulepreload hints, so the browser fires the requests in parallel before any JavaScript runs.

Motion and the last details

Animation is the final layer. Linear's stylesheet keeps durations short: 0.1s for quick transitions, 0.25s regular, 0.35s slow, with a 0.15s highlight fade-out — well below Material's 200ms or iOS's roughly 350ms spring. Enter and exit are asymmetric: highlights, popovers and the agent panel appear instantly and fade out over 150ms. Motion usually references an origin — the status popover scales out of the status pill — so it tells users where an element came from.

No silver bullet

The article's conclusion is that no single decision makes an app fast. The server is a sync target rather than a source of truth, the database lives in the browser, mutations reconcile in the background, and the first load ships less code in more pieces. The hard part, the author writes, is not the implementation but years of dedication to the craft as the codebase grows and meets new constraints.

SSiTech

SiTech — AI-powered web development

We build fast, modern websites and bring AI into real business workflows. Have a project or a question? We'd love to help.