aMule Portable
aMule team·aMule.aMule.Portable
'All-platform' P2P client based on eMule
winget install --id aMule.aMule.Portable --exact --source wingetLatest 3.0.0·June 8, 2026
Release Notes
3.0.0 — The "alive again" version Hi! We are back. This is the first major release in 5+ years (since 2.3.3, 2021-02-07). Headline changes are dramatic throughput improvements, full build-system overhaul, modernized dependency stack, native binaries for Linux / macOS / Windows, and a broad legacy-API cleanup. We went through hard times, we missed programmers and maintainers. There were doubts whether aMule could reemerge. People called aMule a dead project. But eD2k still has users, and those users need working software. So here we are — back to bring you the best eD2k client. One unfortunate thing happened: Gonosztopi, one of aMule's most prolific devs, who has been the maintainer for many years, is missing. We have no news from him (we hope you are well, man!). And he was the only owner of the original GitHub repo. The other members left in amule-project do not have enough rights on the organization to properly manage the project. So we were forced to create a new one. New org, new repos, but the same folks. You can find the new aMule site here. You will find everything there: the home page, complete documentation, download links, news and links to the source code. Highlights
- Throughput rewrite. Disk I/O moved off the main thread, ASIO/EPOLLET races fixed, throttlers replaced with proper token-bucket limiters. Peer-to-peer download on the same hardware sees ~100–380× speedups across macOS / Linux / Windows over 2.3.3, plus aMule 3.0.0 sustains ~4.8× the upload throughput of eMule 0.70b on Windows. See Performance for the full matrix and per-PR breakdown.
- Both throttlers (MaxUpload, MaxDownload) were also broken pre-fix — MaxUpload=0 capped at "current rate + 5 KB/s", MaxDownload was a ratio controller rather than a literal cap. Both rewritten (#461, #491). Important user-facing bug fixes, but secondary to the headline numbers.
- Big-library / big-shareset scaling. Follow-up wave targeting nodes with 100 k+ shared files: per-file EC payload caches (#725, #736), skip-unchanged EC updates (#727), local-peer ZLIB bypass (#728), and a string of O(N²) → O(N log N) / O(1) algorithmic fixes across SharedFileList, SharedFilesCtrl, KnownFileList, wxListCtrl, ExternalConn, and amuleweb — the WebUI / amulegui stay responsive even on libraries where the previous GUI took minutes to redraw.
- CMake replaces autotools. Single build system, modern toolchain — minimum CMake 3.10, minimum wxWidgets 3.2.0.
- Native binaries for every major desktop. AppImage (x86_64 + aarch64), Flatpak (x86_64 + aarch64), macOS Universal2 .dmg (now bundling aMuleGUI.app alongside aMule.app, #529), Windows portable .zip and NSIS installer (x64 + ARM64, #740). First-run desktop integration prompt for AppImage; cross-platform autostart-on-login toggle (#744).
- Auto-rescan of shared folders. wxFileSystemWatcher-driven (#591), with recursive vs explicit-share intent split (#606) and coverage of Incoming + per-category Incoming dirs (#743).
- HTTPS works again. CHTTPDownloadThread rewritten on top of wxWebRequest; the hand-rolled stack had silently stopped working against modern TLS.
- Kad parallel searches with alpha-frontier widening.
- MaxMindDB replaces deprecated GeoIP for IP→country. Performance Throughput work landed across April 2026. The bottom-line cross-platform numbers first, then the per-PR contributions that produced them. Cross-platform end-to-end (2.3.3 vs 3.0.0) ─────────────────────────────────┬─────────────────┬─────────────────┬─────── Leecher platform │2.3.3 (sustained)│3.0.0 (sustained)│Speedup ─────────────────────────────────┼─────────────────┼─────────────────┼─────── macOS (Apple Silicon, Mac Studio)│0.35 MB/s │135 MB/s │381× ─────────────────────────────────┼─────────────────┼─────────────────┼─────── Linux ARM (UTM VM, Ubuntu 25.10) │0.34 MB/s │117 MB/s │345× ─────────────────────────────────┼─────────────────┼─────────────────┼─────── Windows ARM (UTM VM, Windows 11) │0.36 MB/s │39 MB/s │107× ─────────────────────────────────┴─────────────────┴─────────────────┴─────── Sustained over a 90 s window, single LAN peer downloading a 30 GB file from an x86_64 Linux seeder running the same aMule version under test. Per-platform breakdown of the seeder-side vs leecher-side contributions: ────────┬─────────┬────────────┬───────────────────── Platform│2.3.3 │+ seeder fix│+ leecher fix (3.0.0) ────────┼─────────┼────────────┼───────────────────── macOS │0.35 MB/s│30 MB/s │135 MB/s ────────┼─────────┼────────────┼───────────────────── Linux │0.34 MB/s│20 MB/s │117 MB/s ────────┼─────────┼────────────┼───────────────────── Windows │0.36 MB/s│6.8 MB/s │39 MB/s ────────┴─────────┴────────────┴───────────────────── The seeder-side contribution (PR #451 CUploadDiskIOThread + ASIO fixes) dominates everywhere; the leecher-side contribution (#454 partfile-write offload + #484 throttler-wake fix + #491 token-bucket cap) stacks another ~4–6× on top. vs eMule 0.70b (Windows · same UTM hardware) ────────────────────────────────────────┬───────────┬───────────┬─────── Direction │eMule 0.70b│aMule 3.0.0│Speedup ────────────────────────────────────────┼───────────┼───────────┼─────── Upload (Windows seeds → Mac leecher) │22 MB/s │106 MB/s │~4.8× ────────────────────────────────────────┼───────────┼───────────┼─────── Download (Linux seeds → Windows leeches)│20 MB/s │39 MB/s │~1.9× ────────────────────────────────────────┴───────────┴───────────┴─────── Upload
- #451 — eMule CUploadDiskIOThread port. Disk reads + ed2k packet construction off the main thread, RC4 stream-desync race fixed in the ASIO layer, EPOLLET spurious-wakeup fix in HandleRead, adaptive per-slot packet sizing (10 KiB → EMBLOCKSIZE). Dominant contributor to the upload gain.
- #461 — MaxUpload=0 is now literal unlimited. The legacy code set allowedDataRate = current_rate + 5 KB/s per iteration — a tracking cap that pinned the uplink at a fraction of capacity on any link above a few hundred KB/s.
- #436 — Speed-limit fields widened from uint16 to uint32. Legacy 65,534 KB/s (~524 Mbps) configuration ceiling gone; gigabit-class links can now be configured.
- #463 — Bandwidth-cap UI. Spin button ceiling 19,375 → 1,000,000 KB/s; field width 100 → 140 px so the + button no longer clips off on modern themes. Slot Allocation cap 100 → 100,000 KB/s.
- #898 — Default SlotAllocation raised from 2 kB/s to 10 kB/s. The previous default (set in 2005) fragmented uploads into so many sub-slot slices that fast peers were rate-shaped down to a trickle.
Download
- #454 — CPartFileWriteThread. Disk writes for downloads moved off the main thread.
- #484 — Throttler-wake fix. UploadBandwidthThrottler::Entry() adaptive backoff dozed for 5–25 ms between control-queue pumps, stalling the request→response loop. Empty→non-empty wake gate added on the control-queue path, plus IOCP-native async_read_some on Windows, wxMutex → std::mutex, and decoupling m_MaxBlockRequests from per-packet block count. The biggest win on Windows specifically.
- #491 — MaxDownload is now a literal byte/sec cap. The legacy code was a closed-loop ratio controller that nudged each peer's rate ±5%/tick relative to its own current speed, so MaxDownload=20000 (20 MB/s) shaped traffic toward whatever the aggregate converged on — generally well below configured. Replaced with a global token bucket (CDownloadBandwidthThrottler) enforcing the cap to within 2.5% across platforms.
- #498 — Per-part hash verification deferred to a dedicated worker thread (only runs when the file isn't actively transferring). Follow-ups #499, #500.
Other
- #467 — ASIO handler binding modernised. boost::bind → C++11 lambda, strand.wrap() → bind_executor(), deadline_timer → steady_timer, null_buffers → async_wait(wait_read). Fixes the long-standing boost::bind placeholder warning. Minimum Boost bumped 1.47 → 1.70.
- #504 — Fast-path bare-filename comparison skips wxGetCwd().
Big-library / big-shareset scaling A follow-up wave targeting nodes with 100 k+ shared files, where the daemon ↔ GUI / WebUI / amuleweb traffic and several internal data structures were quadratic in the shareset size:
- EC payload caches. Per-file ed2k:// link and partmet basename cached on CKnownFile / CPartFile so EC enumeration stops rebuilding them on every tick (#725). Per-file byte cache covers the FULL GET_SHARED_FILES / GET_DLOAD_QUEUE paths so wire-marshalling cost drops by orders of magnitude on huge sharesets (#736).
- EC skip-unchanged. Per-file change tracking infrastructure threaded through every field-change site so INC_UPDATE only re-sends what actually moved, with a backward-compatible partial-update protocol opt-in for amuleweb (#727 — landed as a 6-commit series). MarkECChanged gaps closed for paused / user-action setters.
- Local-peer EC bypass. ZLIB compression skipped on local peers (#728), receiver limit raised to 256 MB, and the locality decision later moved to the client side with a user override checkbox / --force-zlib flag (#840 — handles the WireGuard-as-LAN case).
- O(N²) → O(N log N) / O(1) algorithmic fixes.
- SharedFilesCtrl bulk-update API skips per-row repaints during ClearED2KPublishInfo (#561, #2bf9b8f34).
- SharedFileList keyword indexing in Reload (#566).
- known2.met AICH SaveHashSet dedup made O(1) (#581).
- known.met hash-collision dedup on Init dropped to O(N log N) (#584).
- wxListCtrl::FindItem(data) O(N) → O(1) via user-data hash map (#614).
- ExternalConn file-list enumeration snapshotted to avoid O(N²) GetFileByIndex loops (#687).
- amuleweb array_push_back made O(N) via cached scan hint (#689).
- KnownFileList indexes its size-map by (size, mtime) instead of size alone to cut false-positive collision-dedup walks (#593).
Installer type: zip
Details
- Homepage
- https://github.com/amule-project/amule
- License
- GPL-2.0
- Publisher
- aMule team
- Support
- https://github.com/amule-project/amule/issues
- Copyright
- GPL-2.0