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    2K Followers
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
No need to leave Linear to shape projects and initiatives. All your context in one place. Enjoyed building this with @kenneth_skovhus
Issue tracking is dead. We are building what comes next.
0
200
4K
249
Forward to community