At Gerus-lab, we build software for real users. Not for benchmarks, not for Hacker News upvotes. Real users on real machines, including 8-year-old laptops with 4GB RAM that IT departments refuse to replace.
So when we shipped a desktop client using Electron, and our client's ops team started complaining that our "lightweight" app was eating 340MB of RAM on startup — we didn't argue. We rewrote it.
This is the story of that rewrite, what we learned, and why the dev community's obsession with "ship fast with Electron" is quietly crippling the software industry.
The Problem Nobody Wants to Say Out Loud
Electron bundles a full Chromium browser and Node.js runtime into every app. Every. Single. One.
That's why your "simple" note-taking app weighs 180MB. That's why Slack uses more RAM than Chrome with 20 tabs open. That's why Discord — a glorified chat client — can make a 2020 MacBook Pro fans spin up like a jet engine.
A Russian developer recently went viral documenting this exact problem: Windows Notepad now consumes ~50MB of RAM, while an equivalent native Win32 app in C takes 1.8MB. They bought a brand new Intel Core Ultra 9 285 with 32GB RAM, booted Windows 11 — and it was already 77% full before opening a single program.
This is not a minor inconvenience. It's a systemic failure.
Electron app startup memory: 280-400MB
Tauri app startup memory: 45-80MB
Native Win32 equivalent: 2-15MB
Ratio: 27x-200x
What We Did at Gerus-lab
Our client was a logistics company. Their field workers used a desktop app for scanning, reporting, and syncing data with their backend. The app ran on ruggedized Windows tablets — not exactly gaming rigs.
The original Electron app:
- Startup time: 4.2 seconds
- Idle memory: 340MB
- Binary size: 167MB installer
- CPU during sync: 12-18%
We proposed a rewrite. The client was skeptical — "if it works, why touch it?"
We showed them the numbers. We rewrote the core in C++ with a minimal UI layer, keeping only the sync and reporting logic.
After rewrite:
- Startup time: 0.8 seconds (5.2x faster)
- Idle memory: 12MB (28x less)
- Binary size: 6.1MB installer (27x smaller)
- CPU during sync: 1-2%
The field workers noticed immediately. Without a single announcement or update note.
The "But Electron Is Faster to Ship" Argument
Yes. And no.
Electron is faster to ship version 1. It's not faster when:
1. Your users are on low-end hardware
If your target market includes enterprise desktops, government machines, or emerging markets — Electron is a liability, not an asset.
2. You need background processes
Electron apps that run in the background are brutal. They prevent sleep, chew through battery, and users learn to kill them.
3. You care about startup time
Studies show users abandon apps that take >3 seconds to load. Electron routinely breaks this threshold on mid-range hardware.
4. Security matters
Bundling an entire browser engine means bundling every browser vulnerability too. Electron apps have a long history of RCE vulnerabilities through the webview layer.
What Are The Real Alternatives?
We've shipped projects using several stacks, and here's our honest assessment:
Tauri (Rust + WebView)
Uses the OS-native webview instead of bundling Chromium. Result: dramatically smaller binaries, dramatically less memory.
// Tauri app main.rs
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![my_custom_command])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
Pros: Small binary, low memory, fast startup, Rust safety guarantees
Cons: WebView inconsistencies across OS, Rust learning curve, smaller ecosystem
We at Gerus-lab currently recommend Tauri for most new desktop projects. It hits the sweet spot between developer productivity and runtime efficiency.
Flutter Desktop
Mature, cross-platform, good performance. The UI is rendered by Flutter's own engine (Skia/Impeller), not a browser.
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: MyHomePage(),
);
}
}
Pros: One codebase for mobile+desktop, good performance, strong typing
Cons: Binary size (40-80MB), Dart isn't mainstream, UI looks Flutter-ish everywhere
We've used Flutter for internal tools where the same team builds mobile and desktop. Works great in that context.
.NET MAUI / WinUI 3
If you're in the Microsoft ecosystem and targeting Windows primarily — native WinUI 3 is worth serious consideration. It's fast, has full system integration, and Microsoft is (slowly) investing in it.
Pros: Native performance, deep Windows integration, C# ecosystem
Cons: Windows-only (MAUI is cross-platform but slower), learning curve
Pure Native (Qt, wxWidgets, Win32)
For max performance and minimum footprint. This is what the viral Win32 article was about — you can still write Windows apps that feel like Windows apps, shape the window however you want, and run in 2MB of RAM.
This isn't "legacy" — it's intentional. Some of the most reliable software ever written runs this way.
The Deeper Problem: We Optimized for Developer Experience, Not User Experience
Electron won because JavaScript developers could ship desktop apps without learning a new language. That's genuinely valuable. I'm not here to mock it.
But somewhere along the way, we stopped asking whether users were experiencing the software well, and started asking only whether developers were experiencing the development well.
At Gerus-lab, we've been pushing back on this. Our rule: the user's experience of the running software matters more than the developer's experience of writing it.
That doesn't mean we write everything in C. It means we pick the right tool:
- Internal admin panel with 5 users? Electron is probably fine.
- App for 10,000 field workers on budget tablets? Definitely not Electron.
- Cross-platform consumer app where performance matters? Tauri or Flutter.
The Memory Math
Let's be concrete about what "bloat" costs at scale:
Imagine 50,000 enterprise users running your Electron app. It idles at 350MB.
- Total RAM consumed across all instances: 17.5 TB
- If this runs on VMs in a corporate environment: significant cloud cost
- If this runs on physical machines: slower machines, more IT complaints, more hardware refresh cycles
Now imagine the Tauri version idling at 45MB:
- Total RAM: 2.25 TB
- Savings: 15.25 TB of RAM, translated to actual server and hardware costs
This isn't hypothetical. We worked with an enterprise client where switching from an Electron-based internal tool to Tauri reduced their AWS desktop virtualization bill by ~$8,400/month.
What This Means for You
If you're building a new desktop app in 2026, seriously evaluate before defaulting to Electron:
- What hardware will your users actually run this on?
- Does your app run in the background? If yes, Electron is painful.
- Do you ship cross-platform? Tauri handles this well now.
- Is performance a selling point? Then RAM usage IS a feature.
The Win32 nostalgia piece that went viral this week isn't really about nostalgia. It's a reminder that native development — taking the time to work with the OS instead of against it — produces software that respects the person running it.
We're not saying abandon JavaScript. We're saying: stop treating Electron as the default answer. It's a tradeoff. Make it consciously.
What We're Working On
At Gerus-lab, we're currently building:
- A Tauri-based desktop agent for enterprise workflow automation
- A Flutter app for a fintech client targeting Android + Windows simultaneously
- Consulting for teams migrating off Electron to reduce infrastructure costs
If you're dealing with bloated Electron apps and wondering whether a rewrite is worth it — let's talk. We've done the math. Usually it is.
Have you migrated away from Electron? What did you switch to, and what were your results? Drop it in the comments — genuinely curious what the community has seen.
Top comments (0)