From ZerxLab, the author of FluxDown
- processes, each with one job
- 3
- independent UI modules
- 11
- lines of Rust UI code
- ~68k
- lines in the rebuilt Web console
- ~30k
§ 01
Why tear it down
Let me be honest first: the Flutter version of FluxDown worked, and it finished countless downloads for a lot of people. But every time I opened it, I knew it was still one step short of the downloader I had in mind.
Its interface and download engine were squeezed into a single process, talking through an FFI signal bridge. If the interface went wrong, the downloads in flight went down with it.
Multiple windows were another wall. Flutter on the desktop has no real multi-window: settings, the queue manager and task details all had to be crammed into the main window as dialogs. Just for one small quick-download window, I had to write a separate native host on each platform — C++ for Windows, Swift for macOS, C for Linux — embed a second, complete Flutter engine in it, and keep it in sync with the main window over message channels.
Memory is what I felt worst about. Once that small window's engine was created, it could never be torn down — creating and destroying it repeatedly crashed — so it stayed in memory until the app quit. And to keep downloads running in the background, the entire Flutter interface had to stay resident too, even on days you never opened it once.
Then there was the pace of work. Adding one button meant writing a Rust signal, generating Dart bindings, then writing the Dart model again — the same thing, twice, in two languages. Time went into shuttling data around instead of polishing the window you look at every day.
So I stopped patching the old interface and started over: the entire desktop client, rewritten on a pure-Rust native UI.
The downloader I want is one you barely notice: there when you open it, still going when you close it, never in your way.
§ 02
Why GPUI
GPUI is the Rust UI framework behind the Zed editor; it draws the interface directly on the GPU. No WebView, no Electron, no second language — from the download engine to every pixel on screen, it's now one Rust codebase.
That means fewer layers, a shorter path from click to result, and native windows on macOS, Windows and Linux. It isn't a web page stuffed into a shell. It's an app that belongs on your desktop.
Multiple windows are first-class here. Settings, the queue manager, task details and progress windows are all real native windows sharing one process and one live state — open as many as you like, and closing one actually frees it.
§ 03
The new architecture: downloads and UI, fully separated
The most important decision in this rewrite is one you can't see: FluxDown is now three processes, each with a single job.
- 01
fluxdown-desktopInterfaceOnly draws the picture. Starts on demand and quits when you close it — nothing left behind in the background.
- 02
fluxdown-agentGatewayStays resident for the tray, browser capture, clipboard, cloud sync and the local API.
- 03
fluxdowndDownload coreOwns the engine and the database: tasks, queues, schedules, RSS, plugins and webhooks.
The difference is immediate. Close the window and downloads keep going; open it again and it picks up the live state instantly. Close the last window and the interface process exits completely, handing all of its memory back to the system — what stays resident is only the agent and the download core, with no UI runtime at all. Whatever happens to the interface process, it can't touch the files being downloaded. And because the core and the interface speak one protocol, the Web console on your NAS finally shares the same capabilities as the desktop client.
§ 04
The new interface: every corner rethought
Beyond the architecture, I rebuilt the interface itself pixel by pixel. A few of the changes I love most:
- Command palette
- Press ⌘K / Ctrl+K and every action and setting is one search away. Fuzzy matching, and the things you use most float to the top.
- Real multi-window
- Settings, queue manager, task details and a per-task progress window each live on their own — with their position and size remembered.
- Files you can see
- The task list shows system file icons. Double-click to open, drag a finished file out of the window (macOS / Linux Wayland), and moved or deleted files are flagged right away.
- Speed you can read
- Task details gain “Source composition” and “Speed” pages, showing how much came from CDN, proxy or each network card.
- A list that holds still
- Rows keep a stable order while progress updates, and the page stays smooth even with a very long task list.
- Themes, rebuilt
- A declarative token format with contrast that stays readable by design — craft your own palette in the theme builder on this site.
§ 05
Not just the desktop
With a new foundation in place, I brought the rest of the family up to the same starting line.
- A new Web console
- The NAS / server Web console was rewritten from scratch, with layout and actions matching the desktop client one to one.
- Multi-device
- Send tasks to your cloud devices or to paired devices on your LAN; direct LAN pairing is confirmed with a short security code.
- Multi-NIC downloads
- Aggregate several network cards for one download; Auto proxy mode now schedules multiple paths in parallel.
- Old bugs, gone
- A long list of fixes: HTTP resume checks, silent HLS / DASH output, ED2K files over 4 GB, BT pause races, queue schedules and more.
- Quieter, faster
- Idle FluxDown no longer wakes sleeping NAS disks, and cold starts are faster with shorter waits for the window.
§ 06
Before you upgrade
Your tasks, history and settings live in the same local database, so they're all still there after the upgrade. On Windows the installer upgrades the old Flutter version in place, and file associations plus magnet / ed2k links are pointed at the new client automatically.
A few things are worth knowing:
- The LAN pairing protocol is now v2 — upgrade both devices together.
- Saved site credentials need to be entered once more.
- Update the browser extension along with the desktop app, otherwise it may show “Not connected”.
- Windows builds are unsigned for now, so the system may warn you on first launch.
- The Android app is still built on Flutter and keeps receiving engine updates.
§ 07
Finally, thank you
Rewriting software that already works is a risky and lonely thing to do. What carried me through was every issue, every vote, and every “this is great”.
FluxDown is still free, open source and ad-free. If the new interface makes you smile, tell me. If something feels off, tell me even more — you get to steer the next release.
— author of FluxDown