Why Build Desktop Apps with GPUI Instead of Electron?

Long Read·4 min read·6 sections

Scott Tolinski's case on Syntax: for small personal desktop software, a shipped Chromium costs more than it buys. GPUI, the Rust UI framework behind Zed, keeps a React-shaped API in one native program, updates utilities in megabytes via GPUI Kit, and accepts non-native UI, a WASM-only web target, and a young ecosystem as the trade.

Contents 6 sections
  1. Why build desktop apps with GPUI instead of Electron?
  2. Where the web-view road ends
  3. A React-shaped API, with the rough edges visible
  4. GPUI Kit, and the fork the library refuses to support
  5. Eight megabytes against 267
  6. The honest costs, and the verdict

Why build desktop apps with GPUI instead of Electron?

Because for small, personal desktop software the browser engine costs more than it buys, argues Syntax co-host Scott Tolinski — and GPUI, the Rust UI framework behind the Zed editor, lets a web developer keep a React-shaped mental model while dropping the browser entirely. The package he actually ships is one Rust program with no embedded browser, a component library called GPUI Kit, and utilities that update in megabytes. He accepts real trade-offs for this: no native UI controls, a WASM-only web story, and a young ecosystem — none of which, in his use cases, outweigh the weight being shed.

Where the web-view road ends

Tolinski's complaint is not that Electron is slow — he is explicit that VS Code shows the framework can be fast, and that sluggishness there usually traces to third-party extensions. His complaint is structural: Tauri's alternative — Rust on the back end, the operating system's native web view in front — fails for him on macOS specifically. Electron's counter-advantage is exactly the one Tauri gives up: you ship a chosen Chrome version and know every user has the same features.

A React-shaped API, with the rough edges visible

What makes the switch survivable for a web developer, Tolinski says, is that GPUI keeps the React mental model. Components are structs with typed props; there is a render function; state updates are requested through an explicit notify call, which co-host Wes Bos likens to Remix's manual update model. The styling layer is method chaining on individual elements, which he compares to Tailwind-class bloat intensified, and which he tolerates largely because AI agents write most of that code for him.

Two concrete limits came up when Bos pressed on capabilities. First, layout: Programmatic layout in Rust is the workaround, and both note the web itself worked that way before CSS grid existed. Second, architecture — and here the news is good. GPUI is only the UI layer; how the application around it is structured is left to the developer.

GPUI Kit, and the fork the library refuses to support

The piece that made GPUI practical for Tolinski is GPUI Kit, a component library with the expected inventory — accordions, dialogs, popovers, combo boxes — plus a data table with virtualization and sorting that he singles out. That library sits at the center of the episode's one piece of community friction. GPUI's community is fragmented, Tolinski reports, because A fork, GPUI CE, offers features mainline GPUI lacks, per a community post he cites: declarative style transitions, corner smoothing, blur, and gradient borders. But the GPUI Kit maintainer has declined to support the fork, and Tolinski quotes the reasoning: Tolinski takes no side; he uses GPUI and GPUI Kit.

Eight megabytes against 267

The argument that carries the episode is size. For always-on personal utilities — file automation in the manner of Hazel, duplicate checkers, a multi-machine project monitor, a window-placement tool — Tolinski wants thin, light, and fast, and Bos agrees without reservation: he is rewriting his own video recorder to be as lean as possible, precisely because he does not want a separate Chromium instance for every small idea.

The honest costs, and the verdict

Tolinski is unusually direct about what adopting GPUI costs. A Mac-native Liquid Glass look, or Windows-native styling, would have to be reimplemented in GPUI itself — a cost he flips into control over the application's appearance. The ecosystem is young, resources are thin, and the framework is not write-once-deploy-everywhere: no React Native-style simultaneous native, web, and desktop targets, and in practice he stays on native desktop. Even AI-driven testing changes shape — browser automation does not apply — though Mobile exists only as an experimental Metal-over-WGPU target, and Bos imagines a long list of native bridges — maps, NFC, the file picker — before it would be practical.

The verdict is scoped, not evangelical. Tolinski would not use GPUI for a native mobile app or a web app. For personal desktop software — the category where he does not want yet another large Electron install —

Interview Highlights

5 exchanges
  • Q

    Has the GPUI team reimplemented most of what web developers expect from CSS?

    Wes Bos asked11:23
    A
    Scott Tolinski answered

    In Scott's experience the styling layer has covered everything he has tried: shadows, opacity, textures, backgrounds, repeating backgrounds, and spring animations, with a rotating SVG example in the official docs. Styling is written as chained methods on individual elements, which he compares to Tailwind class bloat mixed with jQuery-style chaining, producing long files. That does not bother him much, because AI agents write most of this code and do a good job of it. He does not imagine GPUI covers all of CSS, but nothing he has wanted has been missing so far.

  • Q

    Does GPUI support both flexbox and CSS grid for layout?

    Wes Bos asked12:52
    A
    Scott Tolinski answered

    Searching the docs live, they could find only flexbox — no CSS grid anywhere — and both flag that as a real limitation of GPUI today. Scott notes you can still measure elements and do much of the layout programmatically in Rust, and that web developers managed before CSS grid existed; Wes adds a subgrid-style gap may be what you run into. The layout story right now is flex-only.

  • Q

    Does a GPUI app need a separate backend for heavy work like video processing, or does the logic live in the same program?

    Wes Bos asked14:18
    A
    Scott Tolinski answered

    No separate backend is needed. A GPUI app is one Rust program: UI and logic live in the same codebase, so calling a function is a direct call, eliminating the RPC layer an Electron app needs between its processes. Scott stresses GPUI is only the UI layer — you attach it to an existing Rust application and choose your own architecture, whereas Electron is more opinionated about that split.