NOW LET US – AI RAG SaaS Studio TP.HCM
NOW LET US
Digital Product Studio
Back to news
DEV-TOOLS...6 min read

How's Linear so fast? A technical breakdown

Share
NOW LET US Article – How's Linear so fast? A technical breakdown

A technical breakdown of how Linear achieves near-instantaneous performance by treating the browser as a database and optimizing its build pipeline.

How's Linear so fast? A technical breakdown

A few milliseconds is all it takes to update an issue in Linear. A traditional CRUD app doing the same thing takes about 300ms. How do they do it? There's no secret silver bullet to performance. The reality is that it's built from the ground up on the right foundation, then improved by countless decisions. My goal is to walk through some of the techniques that make Linear feel the way it does and help you implement the same.

What I'll cover

Database in the browser

Making the first load feel instant

The sync engine

Designed for speed

Animations

A quick disclaimer: I've never worked at Linear and have never seen their code. Everything I share comes from my personal experience, studying their app, reading their blog posts, or watching their conference talks. I simply love building web apps and have been using Linear since their beta launch. Also, the article’s hero image comes from a video by Meg Wayne, whose work for Linear is phenomenal.

Database in the browser

Most web apps live inside the same loop. The user clicks. The browser fires an HTTP request. A server queries a database and sends it back. The browser repaints. The end result is a spinner, a skeleton, or a frozen UI for a few hundred milliseconds while the app waits on the network.

Linear inverts the traditional relationship. The actual database the UI reads from is in the browser, in IndexedDB. Mutations apply locally first, then asynchronously push to the server, which broadcasts deltas back to other clients via WebSocket.

In my opinion, this is the most critical piece to Linear's performance. When your goal is to build a fast web app the biggest bottleneck you will fight is the network. Any data sent between the client and server costs hundreds of milliseconds. The best approach is to eliminate the need for a network request entirely: which is exactly what Linear does.

I'll be repeating this a lot, but the secret to building incredible web apps is by hiding all the network requests from the user. The more loading states you can avoid the better.

Here's an example of how simple Linear's requests are:

// A traditional web app updating the server
async function updateIssue({ issue }) {
showSpinner();
const response = await fetch(`/api/issues/${issue.id}`, {
method: "PATCH",
body: JSON.stringify({ title: issue.title }),
});
const updated = await response.json();
setIssue(updated)
hideSpinner();
}
// vs Linear
issue.title = "Faster app launch";
issue.save();

The first line, issue.title = "Faster app launch"

, updates an in-memory datastore (MobX observable in Linear's case) . The second line, issue.save();

, queues a transaction that their sync engine batches and flushes to the server. The key here is that the UI re-renders synchronously off the local, in-memory, update. There are no spinners because there is nothing to wait for because the data is synced in the backround. This is the magic of treating the browser as the database for each user.

Tuomas, one of Linear's co-founders, said this at a conference in 2024: 'Literally the first lines of code that I wrote was the sync engine, which is very uncommon to what you usually do when you're a startup.' From day one, Linear knew the approach they wanted to take and the tradeoffs it would take.

I know most people won't build a custom sync engine like Linear just to make their app feel fast and they don't need to. For most use cases, libraries like Tanstack Query and SWR can get surprisingly close with optimistic updates. Most web apps feel slow because the UI waits for each network request to complete before updating state. For most usecases the network request will succeed so you should take advantage of that and optimistically update your state.

// optimistic mutation with SWR
mutate(
`/api/issues/${issue.id}`,
{ ...issue, title: "Faster app launch" },
false
);
// vs Linear
issue.title = "Faster app launch";
issue.save();

The key idea is simple: UI responsiveness should not depend on network latency. Users perceive speed based on how quickly the interface reacts, not how quickly the server responds.

Optmistic requests is one of the highest leverage improvements you can make:

eliminate unnecessary spinners

update state immediately

validate in the background

rollback only if needed

Linear's foundation is based on this exact principal and it makes the app feel native and fast.

A peek into Linear's stack

Linear is built on the simplest stacks you can find: React, TypeScript, MobX, Postgres, a CDN. There's no edge database, no React Server Components, or no fancy framework.

Frontend
React + react-dom (UI runtime)
MobX (observable graph, granular re-renders)
TypeScript (single language end-to-end)
Rolldown-Vite + plugin-react-oxc(mid-2025; previously Rollup; previously Parcel)
ProseMirror + y-prosemirror (rich text editor; Yjs CRDT for live collab)
Radix UI primitives (popovers, menus, focus traps)
Emotion + StyleX (Emotion runtime + StyleX compiled to atomic CSS)
Comlink (Worker RPC)
idb (IndexedDB wrapper backing the local-first store)
graphql-request (GraphQL transport to the sync server)
Sentry (error monitoring)
Inter Variable (single woff2, font-display: swap)
Backend
Node.js + TypeScript (single language for all server code)
PostgreSQL on Cloud SQL (issues table partitioned 300 ways)
Memorystore Redis (event bus + cache + sync cursors)
turbopuffer (similar-issue detection, vector db)
Kubernetes on GCP (one workload per concern)
Cloudflare Workers (multi-region edge proxy)
Other clients
Desktop: Electron (same web JS, native chrome)
Mobile: Swift (iOS) + Kotlin (a separate full reimplementation)
Marketing
Next.js (static)
styled-components
Inline SVG sprite

The biggest standout to me is their decision to stick with client-side rendering. CSR often gets criticized for slow initial loads, but with the right architecture and design it can feel instant.

I'm also a big fan of the simplicity it brings. Keeping the app entirely client-side creates a much cleaner mental model and removes a lot of the complexity that comes with server-rendered apps. You don't have to constantly think if you're on the server or client. If window object is accessible or not. If you're setting the right cache headers or not. There's beauty in simplicity and the constraints you're forced into.

So how does Linear make their client side rendered app feel instant?

Making the first load feel instant

One thing I obsess over is the first load, and Linear clearly does as well. For productivity tools especially, the time it takes before you can actually start working is one of the most important details to consider. No one wants to be waiting for a new tab to load for multiple seconds

First, you have to understand what makes initial loads slow. For a client side app you have to request the index.html

, then that requests all the JavaScript and CSS, which then runs some sort of authentication, and finally makes some API requests to show the app.

Linear's bundler arc: Parcel, Rollup, Vite, Rolldown

The first step to making an app feel instant happens long before runtime. It starts at build time. Remember, the network is the bottleneck, so shipping the least amount of JavaScript and CSS is critical to fast load times.

From what I can gather Linear has rewritten their build pipeline four times: Parcel → Rollup → Vite → Rolldown. Each migration was driven by the same goal: reduce the amount of JavaScript and CSS and improve the developer experience.

From their own blog posts they claim:

50% less code shipped.

30% smaller after compression.

Cold-cache page loads got 10 to 30% faster.

Time-to-first-paint of the active-issues view dropped 59% (on Safari).

Memory usage dropped 70 to 80%

Most of that came from a combination of decisions targeting only modern browsers, better dead-code elimination, and aggressive code splitting. Dropping legacy su

© 2026 Now Let Us. All rights reserved.

Source: Hacker News

Advertisement
Ad slot ready: 5887729102

More in this category

NOW LET US Related – Anthropic, please ship an official Claude Desktop for Linux

dev-tools

Anthropic, please ship an official Claude Desktop for Linux

Developers are urging Anthropic to release an official Claude Desktop client for Linux, highlighting security risks from unofficial third-party builds and the irony that Claude's advanced features already run on Linux internally.

NOW LET US Related – LLMs are eroding my software engineering career and I don't know what to do

dev-tools

LLMs are eroding my software engineering career and I don't know what to do

A veteran software engineer shares a candid reflection on how rapid advancements in Large Language Models (LLMs) are systematically eroding domain expertise, debugging skills, and the value of clean code architecture.

NOW LET US Related – The 29th International Obfuscated C Code Contest (IOCCC) 2025 Winners

dev-tools

The 29th International Obfuscated C Code Contest (IOCCC) 2025 Winners

The 29th International Obfuscated C Code Contest (IOCCC) has announced its 2025 winners, showcasing historic levels of submission volume and quality alongside mind-bending C programming creations.

NOW LET US Related – I design with Claude more than Figma now

dev-tools

I design with Claude more than Figma now

A designer shares how integrating Claude into their workflow completely transformed their process, shifting from static Figma mockups to building fully functional prototypes directly in the codebase.

NOW LET US Related – Valve P2P networking broken for more than 2 months

dev-tools

Valve P2P networking broken for more than 2 months

A major systemic issue with Valve's Steam Networking protocol has been severely impacting P2P gaming in the Middle East for over two months. Despite players contacting ISPs and Steam Support, this routing issue remains unresolved.

NOW LET US Related – Field of clones: How horse replicas came to dominate polo

dev-tools

Field of clones: How horse replicas came to dominate polo

In Argentina, cloning polo horses has evolved from a wild gamble into a highly lucrative, mature industry. While the technology dominates the sport, it continues to spark intense scientific and ethical debates.

EXPLORE TOPICS

Discover All Categories

Deep dive into the specific technology sectors that matter most to you.