· via dev.to (home feed)
Electron to Tauri migration shrinks macOS menu-bar app from 289 MB to 15 MB
A developer recounts moving the WatchMe menu-bar app to Tauri 2, cutting its bundle from 289 MB to 15 MB while taking on heavier Rust builds and 499 new crates.

A 289 MB app that lists processes
The app at the center of the story is WatchMe, a small macOS menu-bar utility that lists running processes and posts a notification when one you care about exits — handy for stepping away during a long build. According to a first-person account on dev.to, the Electron version of this app weighed in at 289 MB, despite doing only three things that touch the OS: enumerating processes, owning a tray icon, and posting a notification. Everything else is a table and two checkboxes.
The developer is careful about the motivation, arguing that "Electron is bloated" is a lazy reason to rewrite working software. The actual Tauri pitch, as he frames it, is narrower than the marketing suggests: Tauri doesn't make an app fast, it makes it small, by using the operating system's built-in webview instead of shipping a Chromium build. For an app that lives in the menu bar and runs all day, small was the property he wanted.
What changed in the code
Electron's three-part IPC plumbing — a JSON file of channel names, a preload script bridging them, and handlers in the main process — disappears in Tauri 2. Commands become Rust functions annotated with #[tauri::command], and the renderer calls them by name. The ps-list npm package also went away, replaced by the sysinfo crate inside the Rust core; the frontend still reads the same pid, name and cmd fields it always did.
The main process moved from 220 lines of JavaScript to 371 lines of Rust. The packaged-app test harness, 579 lines of scaffolding for booting, driving and tearing down the app, was deleted entirely — the logic worth testing had always been plain JavaScript that simply hadn't been separated from Electron.
The numbers
The headline results: the .app bundle dropped from 289 MB to 15 MB, with the .dmg at 3.7 MB. That is an 18.9x reduction, or 94.7% less for a user to download. npm packages in the lockfile fell from 309 to 73.
Where AI helped, and where it didn't
The migration landed on 10 September as a single commit — 34 files, +12,154 / −4,875 — with Claude Code doing most of the typing. The model was genuinely good at the mechanical translation, the developer writes: the shape of the work is known, the target API is well documented, and every mistake surfaces as a compiler error within seconds. Rust's type checker acts as a brutal reviewer, which is what makes AI-written Rust tolerable.
The most valuable thing the model did had nothing to do with the migration. While rebuilding the UI, it noticed that the CSS class highlighted-row, which marks a process as watched, has never been defined in any stylesheet. The developer checked the repository history: the class was added on 19 September 2024 and no rule for it has ever existed. For roughly two years, the only feedback that a process was being watched was the checkbox the user had just ticked. That, he argues, is what AI is actually for — reading code nobody has read in years, without the assumptions that made the bug invisible to its author.
Where AI fell short is equally specific. It verified the redesigned UI by driving it in a Chromium-based browser, but Tauri on macOS renders in WKWebView, so the verification covered an engine the app never actually runs in. The developer had to close that gap by hand.
The catches
Dependency count didn't go down — it went up. He removed 236 npm packages and added 499 Rust crates. What shrank is what ships, not what the project depends on, and anyone migrating to reduce supply-chain surface area should look at that number before starting.
Build cost also moved onto the developer: node_modules is 105 MB, while the Rust build directory is 5.8 GB, and clean release builds take minutes rather than seconds. He frames it as trading a big download for users against a big build for himself — the right call for an app with more users than developers, but a trade nonetheless.
Finally, not shipping a browser means not controlling one. Tauri uses WKWebView on macOS, WebView2 on Windows and WebKitGTK on Linux. Per Tauri's own documentation, unsupported macOS versions stop receiving WebKit updates, so with a minimum system version of 13.0, the app's CSS floor is whatever Safari shipped with macOS 13. On Electron, this was never a concern because the renderer was bundled.
Why it matters
This is a concrete, numbers-first account of what an Electron-to-Tauri migration actually costs, rather than another benchmark screenshot. For small desktop utilities, the download-size win is real and large, but the post is equally clear about the tradeoffs: a larger total dependency tree, much heavier local builds, and a rendering engine you don't control and that varies per platform. It is also a useful data point on AI-assisted migration — strong at mechanical translation and at surfacing long-standing bugs in unread code, but unable to verify behavior in the webview the shipped app actually uses. The developer's verdict: for a menu-bar utility, he would do it again without hesitating; for a complex canvas-based UI, he would think much harder.
- #electron
- #tauri
- #rust
- #desktop-apps
- #ai-coding