<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zhiwei Ma</title>
    <description>The latest articles on DEV Community by Zhiwei Ma (@zhiwei_ma_0fc08a668c1eb51).</description>
    <link>https://dev.to/zhiwei_ma_0fc08a668c1eb51</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3729557%2Fb40e929f-193b-449b-9e8e-1ee496e5fe04.jpg</url>
      <title>DEV Community: Zhiwei Ma</title>
      <link>https://dev.to/zhiwei_ma_0fc08a668c1eb51</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zhiwei_ma_0fc08a668c1eb51"/>
    <language>en</language>
    <item>
      <title>I built a free, open-source IDM alternative with Rust and Flutter — here's how the download engine works</title>
      <dc:creator>Zhiwei Ma</dc:creator>
      <pubDate>Sat, 04 Jul 2026 11:25:55 +0000</pubDate>
      <link>https://dev.to/zhiwei_ma_0fc08a668c1eb51/i-built-a-free-open-source-idm-alternative-with-rust-and-flutter-heres-how-the-download-engine-53jb</link>
      <guid>https://dev.to/zhiwei_ma_0fc08a668c1eb51/i-built-a-free-open-source-idm-alternative-with-rust-and-flutter-heres-how-the-download-engine-53jb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;TL;DR: FluxDown is a free, open-source (AGPL-3.0), zero-ads, zero-tracking multi-protocol download manager. The download engine is written from scratch in Rust + Tokio; the UI is Flutter. It speaks HTTP/HTTPS, FTP, BitTorrent, eD2K, and HLS/DASH, runs on Windows / macOS / Linux, and ships Chrome / Edge / Firefox extensions that take over browser downloads automatically.&lt;/p&gt;

&lt;p&gt;Site: &lt;a href="https://fluxdown.zerx.dev" rel="noopener noreferrer"&gt;https://fluxdown.zerx.dev&lt;/a&gt; · Source: &lt;a href="https://github.com/zerx-lab/FluxDown" rel="noopener noreferrer"&gt;https://github.com/zerx-lab/FluxDown&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;Internet Download Manager (IDM) is genuinely great — multi-threaded segmentation, resume, browser takeover. But it has some dealbreakers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It costs money&lt;/strong&gt; ($24.95 + renewals).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows only&lt;/strong&gt; — nothing for macOS/Linux users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closed source&lt;/strong&gt; — you can't see what it does in the background.&lt;/li&gt;
&lt;li&gt;No BitTorrent / magnet / eD2K, and only partial HLS/DASH support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile most "free" download managers are stuffed with ads, bundleware, or quietly phone home. So I wrote my own: &lt;strong&gt;a Rust + Tokio engine for speed and memory safety, a Flutter UI for a cross-platform and actually-nice interface&lt;/strong&gt; — free forever, no ads, no tracking, no account required.&lt;/p&gt;

&lt;p&gt;That's &lt;strong&gt;FluxDown&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyzgnopg3rl4fuz9k275o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyzgnopg3rl4fuz9k275o.png" alt="FluxDown" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Here's the head-to-head with IDM:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;FluxDown&lt;/th&gt;
&lt;th&gt;IDM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free forever&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$24.95 + renewals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;Yes (AGPL-3.0)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platforms&lt;/td&gt;
&lt;td&gt;Windows / macOS / Linux&lt;/td&gt;
&lt;td&gt;Windows only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BitTorrent &amp;amp; magnet&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;eD2K / eMule links&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HLS / DASH streaming&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dynamic segmentation&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser extension&lt;/td&gt;
&lt;td&gt;Chrome / Edge / Firefox&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ads &amp;amp; tracking&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;None&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Up to 10x faster&lt;/strong&gt; — Rust + Tokio engine with IDM-style runtime dynamic segmentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-protocol&lt;/strong&gt; — HTTP/HTTPS, FTP, BitTorrent (DHT/UPnP/magnet), eD2K (server + Kad DHT source finding, MD4 verification), HLS (AES-decrypt), and DASH — each with a dedicated engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser integration&lt;/strong&gt; — a three-layer download interception engine that also sniffs streaming media on the page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resume anywhere&lt;/strong&gt; — every byte tracked in SQLite (WAL); power loss never costs you progress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean &amp;amp; private&lt;/strong&gt; — zero ads, zero tracking, no account, local-first. Your data never leaves your machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The interesting part: architecture
&lt;/h2&gt;

&lt;p&gt;In one sentence: &lt;strong&gt;Flutter renders the UI, a zero-FFI pure-Rust engine does the downloading, the two talk over &lt;a href="https://rinf.cunarist.org" rel="noopener noreferrer"&gt;Rinf&lt;/a&gt; signals, and the browser extension connects via Native Messaging.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Browser Extension (WXT)] --Native Messaging--&amp;gt; [fluxdown_nmh]
                                                     │ Named Pipe / Unix socket
[Flutter UI (shadcn_ui)] &amp;lt;--Rinf signals--&amp;gt; [hub — FFI adapter]
                                                     │
                                            [fluxdown_engine]
                            ┌─────────┬───────────┼──────────┬──────────┐
                          HTTP       FTP          BT        eD2K     HLS/DASH
                                                     │
                                                 [SQLite]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key design decision: &lt;strong&gt;the download engine &lt;code&gt;fluxdown_engine&lt;/code&gt; is its own crate with zero rinf / zero Dart dependencies.&lt;/strong&gt; It's decoupled from the host through exactly two traits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;EventSink&lt;/code&gt; — the engine reports progress, segment splits, queue changes, etc.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HostSelection&lt;/code&gt; — the engine calls back when it needs the host to make a decision (pick an HLS quality, choose which files inside a torrent to download).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;hub&lt;/code&gt; crate is just the Rinf FFI adapter: signal plumbing and type conversion, no download logic at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why bother?&lt;/strong&gt; Because the same engine can now serve completely different hosts: the desktop app (Flutter), a headless web server (axum), a CLI client (aria2c-style), and eventually mobile — each just implements &lt;code&gt;EventSink&lt;/code&gt; / &lt;code&gt;HostSelection&lt;/code&gt; once, and the download core stays untouched. The repo already ships a headless server and a CLI reusing the exact same engine.&lt;/p&gt;

&lt;p&gt;It's textbook &lt;strong&gt;dependency inversion / ports-and-adapters&lt;/strong&gt;: the core domain (downloading) depends on nothing UI- or FFI-specific; the frameworks depend on traits the core defines. If you write Rust, you'll appreciate the boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smart segmentation: not just "open N threads"
&lt;/h2&gt;

&lt;p&gt;Most download managers' "multithreading" splits the file into N equal parts and fetches them in parallel. The problem: &lt;strong&gt;networks aren't uniform.&lt;/strong&gt; One segment can land on a slow CDN edge and crawl while every other segment finished ages ago — dragging the whole download down.&lt;/p&gt;

&lt;p&gt;FluxDown's segmentation does two things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Dynamic segment count (&lt;code&gt;segment_advisor&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of blindly maxing out threads, it tiers by file size, capped by CPU core count:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;lt; 1 MB → 1 segment (multithreading a tiny file just wastes handshakes)&lt;/li&gt;
&lt;li&gt;1–10 MB → 4&lt;/li&gt;
&lt;li&gt;10–100 MB → 8&lt;/li&gt;
&lt;li&gt;100 MB–1 GB → 16&lt;/li&gt;
&lt;li&gt;&amp;gt; 1 GB → 32+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Runtime split &amp;amp; rescue (&lt;code&gt;segment_coordinator&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proactive split&lt;/strong&gt; — a segment is clearly lagging → split its remainder into two and parallelize.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reactive rescue&lt;/strong&gt; — a segment stalls → split it so idle threads take over.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Splits are atomic: the child-segment insert and the parent-segment shrink commit in a &lt;strong&gt;single transaction&lt;/strong&gt;, so there's no intermediate state that could re-download or miss bytes. The split is reported through &lt;code&gt;EventSink&lt;/code&gt;, so the UI can play that IDM-style segment-visualization animation in real time.&lt;/p&gt;

&lt;p&gt;That's what "idle threads rescue slow segments" means — &lt;strong&gt;like IDM, but smarter.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Global rate limiting: token bucket
&lt;/h2&gt;

&lt;p&gt;Downloading in the background while still browsing needs a speed cap. FluxDown uses a classic &lt;strong&gt;token bucket&lt;/strong&gt; as a global limiter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parameters: &lt;code&gt;rate&lt;/code&gt; (bytes/sec) + &lt;code&gt;burst&lt;/code&gt; (defaults to &lt;code&gt;rate&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Before each write it &lt;code&gt;consume(bytes)&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt;s if tokens run short — non-blocking on the Tokio runtime by construction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get precise total-bandwidth control while still allowing short bursts, without the stuttery feel of a naive limiter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resume: full SQLite persistence
&lt;/h2&gt;

&lt;p&gt;Tasks, segments, config, and queues all live in SQLite (WAL + foreign keys). Each segment's &lt;code&gt;downloaded_bytes&lt;/code&gt; is flushed in 5-second batches, so &lt;strong&gt;after a power loss / crash / forced shutdown, it resumes from the exact byte offset&lt;/strong&gt; — no re-downloading completed parts.&lt;/p&gt;

&lt;p&gt;Side note: the persistence layer uses sqlx's &lt;code&gt;Any&lt;/code&gt; pool with &lt;code&gt;$N&lt;/code&gt; placeholders, so a single SQL codebase runs on both SQLite and PostgreSQL — groundwork for headless-server deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser integration: three-layer interception
&lt;/h2&gt;

&lt;p&gt;With the extension installed, FluxDown takes over browser downloads through three lines of defense:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;webRequest.onHeadersReceived&lt;/code&gt;&lt;/strong&gt; — cache response headers, detect &lt;code&gt;Content-Disposition&lt;/code&gt; / &lt;code&gt;Content-Type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;downloads.onDeterminingFilename&lt;/code&gt;&lt;/strong&gt; — the primary intercept (Chrome MV3), &lt;code&gt;suggest({cancel:true})&lt;/code&gt; cleanly cancels the browser's own download and hands it to FluxDown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;downloads.onCreated + onChanged&lt;/code&gt;&lt;/strong&gt; — fallback intercept, and the only path on Firefox.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Plus: automatic sniffing of video/audio/HLS streams on the page, &lt;code&gt;Alt+Click&lt;/code&gt; to temporarily let the browser download directly, and a right-click "Send to FluxDown". All platforms talk to the app over a Native Messaging Host (Named Pipe on Windows, Unix socket on Linux/macOS).&lt;/p&gt;

&lt;h2&gt;
  
  
  Download &amp;amp; install
&lt;/h2&gt;

&lt;p&gt;Grab the latest build (currently v0.1.52) from GitHub Releases or the site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt; (x64 / ARM64): &lt;code&gt;setup.exe&lt;/code&gt; installer · portable &lt;code&gt;.zip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS&lt;/strong&gt; (Intel / Apple Silicon): &lt;code&gt;.dmg&lt;/code&gt; · portable &lt;code&gt;.tar.gz&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux&lt;/strong&gt; (x64): &lt;code&gt;.AppImage&lt;/code&gt; · &lt;code&gt;.deb&lt;/code&gt; · Arch &lt;code&gt;.pkg.tar.zst&lt;/code&gt; · portable &lt;code&gt;.tar.gz&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Extensions: &lt;a href="https://chromewebstore.google.com/detail/fluxdown/meleenglfggcmcajknpeeeiobnpfmahc" rel="noopener noreferrer"&gt;Chrome&lt;/a&gt; · &lt;a href="https://microsoftedge.microsoft.com/addons/detail/fluxdown/nglkkjbogjghekbhhcnccnpfedjbdhhd" rel="noopener noreferrer"&gt;Edge&lt;/a&gt; · &lt;a href="https://addons.mozilla.org/firefox/addon/fluxdown" rel="noopener noreferrer"&gt;Firefox&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ The only official domain is &lt;strong&gt;fluxdown.zerx.dev&lt;/strong&gt; and the source repo is &lt;strong&gt;github.com/zerx-lab/FluxDown&lt;/strong&gt;. Please don't download from anywhere else.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;FluxDown is fully open source (AGPL-3.0). The whole point of writing the engine in Rust was to prove that &lt;strong&gt;free software can still be seriously engineered.&lt;/strong&gt; Stack: Rust + Tokio + Flutter + Rinf. The code is on GitHub — issues and PRs welcome.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://fluxdown.zerx.dev" rel="noopener noreferrer"&gt;https://fluxdown.zerx.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/zerx-lab/FluxDown" rel="noopener noreferrer"&gt;https://github.com/zerx-lab/FluxDown&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it saves you time, a GitHub star helps more people find it. Happy to answer anything about the engine internals in the comments.&lt;/p&gt;

</description>
      <category>rust</category>
    </item>
    <item>
      <title>FluxDown: A Free Download Manager Built with Rust + Flutter</title>
      <dc:creator>Zhiwei Ma</dc:creator>
      <pubDate>Mon, 16 Feb 2026 07:29:40 +0000</pubDate>
      <link>https://dev.to/zhiwei_ma_0fc08a668c1eb51/fluxdown-a-free-download-manager-built-with-rust-flutter-3ace</link>
      <guid>https://dev.to/zhiwei_ma_0fc08a668c1eb51/fluxdown-a-free-download-manager-built-with-rust-flutter-3ace</guid>
      <description>&lt;p&gt;I've been working on a download manager called FluxDown that handles multiple protocols in one app. The backend is written in Rust on top of Tokio, and the GUI uses Flutter with shadcn-style components. It's free, no ads, no accounts required.&lt;/p&gt;

&lt;p&gt;Here's what it does and why I built it this way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Protocol Downloads
&lt;/h2&gt;

&lt;p&gt;Most download managers handle one protocol well and ignore the rest. IDM is great for HTTP but can't do BitTorrent. qBittorrent handles torrents but nothing else. I wanted a single tool that covers everything I actually use day to day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/HTTPS&lt;/strong&gt; with adaptive segmentation (more on this below)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FTP&lt;/strong&gt; with multi-connection parallel downloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BitTorrent&lt;/strong&gt; via librqbit — magnet links, .torrent files, DHT, UPnP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HLS streaming&lt;/strong&gt; — .m3u8 with AES-128 decryption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DASH streaming&lt;/strong&gt; — .mpd with quality selection&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Adaptive Segmentation
&lt;/h2&gt;

&lt;p&gt;This is probably the part I'm happiest with. IDM splits every download into 8 segments regardless of file size or connection speed. That works fine in many cases, but it's not optimal.&lt;/p&gt;

&lt;p&gt;FluxDown takes a different approach. Before starting a download, it sends a 512KB probe request to measure your actual bandwidth. Then it calculates the segment count based on three factors: file size, measured bandwidth, and CPU core count.&lt;/p&gt;

&lt;p&gt;The logic works like this: files under 4MB don't get segmented at all — single connection is fine. For larger files, each segment is at least 2MB. The upper bound is 4x your CPU core count (for I/O parallelism), capped at 64. If your bandwidth is below 512KB/s, it scales down to 25% of the recommended count to avoid overloading a slow connection.&lt;/p&gt;

&lt;p&gt;There's also runtime dynamic splitting. When one segment finishes, the idle worker picks up part of the slowest remaining segment. This matters more than you'd expect on connections with variable speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The download engine is a Rust binary running on Tokio's async runtime. Each download task is an independent tokio task with its own CancellationToken for lifecycle control. The Rust side handles all network I/O and disk writes.&lt;/p&gt;

&lt;p&gt;The GUI is Flutter (Dart), connected to the Rust backend through the Rinf framework using FFI with bincode serialization. This keeps the UI responsive — Dart handles rendering and user interaction, Rust handles the heavy lifting. No shared memory headaches, just message passing.&lt;/p&gt;

&lt;p&gt;For HTTP, I use reqwest with rustls. FTP goes through suppaftp's synchronous API wrapped in spawn_blocking with mpsc channels. BitTorrent uses librqbit with its own multi-threaded runtime, also in spawn_blocking since it internally calls block_on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser Extension
&lt;/h2&gt;

&lt;p&gt;The Chrome MV3 extension (also works on Firefox) has a three-layer interception system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;webRequest API caches download metadata&lt;/li&gt;
&lt;li&gt;downloads.onDeterminingFilename does the main interception&lt;/li&gt;
&lt;li&gt;downloads.onCreated catches anything that slips through&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For streaming detection, it monkey-patches the page's &lt;code&gt;fetch()&lt;/code&gt; and &lt;code&gt;XMLHttpRequest&lt;/code&gt; to catch .m3u8 and .mpd URLs automatically. The extension talks to the desktop client over a local HTTP API on port 19527 — no Native Messaging needed, which makes installation simpler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speed limiting&lt;/strong&gt;: Token bucket algorithm with 50ms refill intervals. Smooth curve, not choppy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence&lt;/strong&gt;: All task state goes to SQLite. Resume works after crashes and reboots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI&lt;/strong&gt;: Dark and light themes, 12 color schemes. System tray, .torrent file association, single-instance enforcement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code quality&lt;/strong&gt;: Rust edition 2024 with strict Clippy lints — deny on unwrap, expect, and wildcard imports. Every error path is handled explicitly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Windows only for now. No post-download script execution. BT download speed depends on seed availability (nothing I can do about that). SOCKS5 proxy support exists but isn't perfectly stable yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;FluxDown is completely free — no ads, no accounts, no telemetry. All data stays local.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://fluxdown.zerx.dev" rel="noopener noreferrer"&gt;fluxdown.zerx.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd appreciate any feedback on the architecture decisions or feature requests.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>flutter</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building a GPU-Accelerated Terminal Emulator with Rust and GPUI</title>
      <dc:creator>Zhiwei Ma</dc:creator>
      <pubDate>Sat, 24 Jan 2026 05:40:42 +0000</pubDate>
      <link>https://dev.to/zhiwei_ma_0fc08a668c1eb51/building-a-gpu-accelerated-terminal-emulator-with-rust-and-gpui-4103</link>
      <guid>https://dev.to/zhiwei_ma_0fc08a668c1eb51/building-a-gpu-accelerated-terminal-emulator-with-rust-and-gpui-4103</guid>
      <description>&lt;p&gt;I've been working on a terminal emulator project called &lt;strong&gt;zTerm&lt;/strong&gt; in my spare time, and wanted to share some lessons learned along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terminal emulation&lt;/strong&gt;: Built on top of &lt;code&gt;alacritty_terminal&lt;/code&gt; - no need to reinvent the wheel for VT parsing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Framework&lt;/strong&gt;: GPUI, the same framework that powers the Zed editor, with GPU-accelerated rendering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component library&lt;/strong&gt;: gpui-component from Longbridge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I chose GPUI because I was curious about what makes Zed's rendering so smooth. Wanted to see if I could achieve similar results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges I Faced
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cross-Platform PTY
&lt;/h3&gt;

&lt;p&gt;The differences between Windows ConPTY and Unix PTY were bigger than expected. Signal handling and process lifecycle management took significant debugging time.&lt;/p&gt;

&lt;h3&gt;
  
  
  IME Support
&lt;/h3&gt;

&lt;p&gt;Supporting Chinese/Japanese/Korean input methods was tricky. Cursor positioning, candidate window placement, and composition state handling all behave differently across platforms. GPUI's documentation is sparse here, so I ended up reading Zed's source code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rendering Performance
&lt;/h3&gt;

&lt;p&gt;Initially, I was triggering a render on every PTY event. Running &lt;code&gt;cat&lt;/code&gt; on a large file would freeze the terminal. Adding a 4ms batching interval to coalesce multiple events before rendering made a huge difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Status
&lt;/h2&gt;

&lt;p&gt;Basic functionality works: multi-tab support, scroll history, mouse selection, and keyboard shortcuts. Split panes are in progress, and theming is planned.&lt;/p&gt;

&lt;p&gt;The code is still rough around the edges. If you have experience with GPUI or terminal emulators, feedback and PRs are welcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/zerx-lab/zTerm" rel="noopener noreferrer"&gt;https://github.com/zerx-lab/zTerm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built with Rust. No pre-built releases yet - you'll need to compile from source if you want to try it out.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>rust</category>
      <category>showdev</category>
      <category>ui</category>
    </item>
  </channel>
</rss>
