Register and share your invite link to earn from video plays and referrals.

Kenneth Skovhus
@kenneth_skovhus
Flipping bits to bring back magic at @linear
1.5K Following    2.3K Followers
BOOTING LINEAR DEV CLIENT... CUSTOM @vite_js FULL BUNDLE MODE SCREEN
In Linear Diffs you can now see proper markdown previews. So you can clearly see the instructions your agents wrote for your other agents to follow and see any comments your review agents had about it.
Show more
A masterclass in executing complex projects in the world of agents. Ambitious scope that would make it unlikely just a few months prior, yet still approached with the true engineering rigour rather than attempting to one shot it. A pleasure to watch this go down.
Show more
Here is what we learned when migrating Linear to @stylexjs and what motivated the endeavour
Over 1000 PRs later, Linear migrated from styled-components to @stylexjs. What began as performance optimization gave us better defaults for humans and agents alike. Our engineer @kenneth_skovhus on what we learned:
Show more
Recent performance fix: lazy-loaded CSS comes with a price. @vite_js build.cssCodeSplit helped us. Linear still uses CSS Modules for complex selectors not yet migrated to @stylexjs. When our module preloader warmed lazy-loaded chunks that contained CSS, it attached new stylesheets in quick succession. Each invalidated style and layout across the page, triggering 28 full-page layouts. 🥺 We fixed this by setting `build.cssCodeSplit` to false, which makes Vite emit one stylesheet. As StyleX already uses atomic CSS, the file size is acceptable and bounded. That introduced a new issue: Vite adds the file to the HTML as a render-blocking link, delaying our custom loader icon baked into the HTML. Our post-build step rewrites the link to media=print so it fetches early without blocking the loader. We wait for it to load, switch it to media=all, and only then render the app.
Show more
We updated diffs in @linear. You can now preview images, SVGs, and GIFs, compare changes side by side, adjust opacity, and view sources. We’re still pushing to make diff reviews faster and nicer to use. Give it a try we’ve shipped a lot of improvements lately.
Show more
Thanks! Good question. Theming was the part of the migration I expected to fight us the most, and it turned into one of the more interesting pieces. Some context on why our setup is unusual. Linear themes are generated, not hand-authored: a custom theme is a few inputs (like base color, accent color, contrast), and from those we derive over a hundred color variables in LCH space. It goes further than most people expect: selection isn’t a background swap. When a row is selected, we regenerate the entire theme with the selected background as the new base, so labels, borders, and controls all re-derive against it. Same for focus, menus, and elevated surfaces, each scoped to its subtree by a nested ThemeProvider. That shape doesn’t fit StyleX’s built-in theming that well. Components author styles against ordinary stylex.defineVars tokens, but the tokens are placeholders: our ThemeProvider extracts the hashed custom-property names StyleX generated and injects one CSS rule per theme at runtime, scoped to the provider’s boundary. So essentially the setup is the same as before, just a lot more performant. Let me know if you have other questions.
Show more
Thanks! Good question. Theming was the part of the migration I expected to fight us the most, and it turned into one of the more interesting pieces. Some context on why our setup is unusual. Linear themes are generated, not hand-authored: a custom theme is a few inputs (like base color, accent color, contrast), and from those we derive over a hundred color variables in LCH space. It goes further than most people expect: selection isn’t a background swap. When a row is selected, we regenerate the entire theme with the selected background as the new base, so labels, borders, and controls all re-derive against it. Same for focus, menus, and elevated surfaces, each scoped to its subtree by a nested ThemeProvider. That shape doesn’t fit StyleX’s built-in theming that well. Components author styles against ordinary stylex.defineVars tokens, but the tokens are placeholders: our ThemeProvider extracts the hashed custom-property names StyleX generated and injects one CSS rule per theme at runtime, scoped to the provider’s boundary. So essentially the setup is the same as before, just a lot more performant. Let me know if you have other questions.
Show more
Can’t remember last time I used my IDE... @chintanturakhia saw that coming before most people.
After the IDE (2026) A short film about @Coinbase and the work of building software with agents.
After 1.000 PRs: @linear is now styled with @stylexjs. In-app navigation is up to ~30% faster.
The reason I love working @linear is that this feature took 0 meetings, 0 RFCs, no A/B testing, no alignment with PM, no cross-team alignment, no H2 planning, no committees, it moved no KPI (as far as I am concerned). It felt good so we built it.
Show more
We’ve been using full bundle mode since January, and it’s been such a DX improvement. Cold start rendering up to 3x faster, and full reloads around 40% faster.
🚀 Vite 8.1 is out ⚡ Experimental Full Bundle Mode: ~15x faster dev server startup & ~10x faster full reloads on large apps 🧩 Chunk Import Map to keep chunks stable & improve caching 🦀 WASM ESM integration 💡 Lightning CSS on the road to default 👀 and more! Blog post below.
Show more
New post: why and how @linear is moving to @stylexjs. Codemods and agents are doing the heavy lifting. Humans still have to perform detective work on cursed hover states.
A few weeks ago I noticed that Linear got slower than it used to. Especially on the new Diffs feature, that we were getting ready to release, it was pretty bad. For days I was running profiles, staring at profiles, bisecting with agents from every direction. The pattern was clear - we accessed the DOM a ton, which blocked the main threads on style recalcs and layout for 10s or 100s of milliseconds over and over. I shipped dozens of PRs to get rid of those layout-causing calls, using pretext and whatever tricks the agents and I could come up with. It helped, but only a bit. I was getting desperate.
Show more
Imagine having all your company’s context in one system. Then teaching that system how to code. 💥 Issue → Code → Review → Land All from the same interface. Already, 30% of our triage issues are automatically fixed by the agent. And we are just getting started.
Show more
Introducing coding sessions. Linear Agent can now triage issues, investigate the cause, write the fix, open a PR, and bring the code back for review. All shared with your team in Linear.
Show more
How we improved the product experience using @linear Agent in Slack, Coding Agent, and Diffs. A story in three acts 🧵
Issue → Coding Agent → Review → Merge All from within Linear.
Code review, but faster. Introducing Diffs. A new way to review PRs, directly inside Linear. • Realtime updates • Guided reviews with Al (beta) • Focused notifications • Iterate with coding agents • Threaded comments
Show more