Releases: amule-project/amule
Release list
aMule 3.0.0
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=0capped at "current rate + 5 KB/s",MaxDownloadwas 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.appalongsideaMule.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.
CHTTPDownloadThreadrewritten on top ofwxWebRequest; 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
CUploadDiskIOThreadport. Disk reads + ed2k packet construction off the main thread, RC4 stream-desync race fixed in the ASIO layer, EPOLLET spurious-wakeup fix inHandleRead, adaptive per-slot packet sizing (10 KiB β EMBLOCKSIZE). Dominant contributor to the upload gain. - #461 β
MaxUpload=0is now literal unlimited. The legacy code setallowedDataRate = current_rate + 5 KB/sper 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
uint16touint32. 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
SlotAllocationraised 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-nativeasync_read_someon Windows,wxMutexβstd::mutex, and decouplingm_MaxBlockRequestsfrom per-packet block count. The biggest win on Windows specifically. - #491 β
MaxDownloadis 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, soMaxDownload=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-standingboost::bindplaceholder 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 onCKnownFile/CPartFileso EC enumeration stops rebuilding them on every tick (#725). Per-file byte cache covers the FULLGET_SHARED_FILES/GET_DLOAD_QUEUEpaths 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_UPDATEonly re-sends what actually moved, with a backward-compatible partial-update protocol opt-in for amuleweb (#727 β landed as a 6-commit series).MarkECChangedgaps 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-zlibflag (#840 β handles the WireGuard-as-LAN case). - O(NΒ²) β O(N log N) / O(1) algorithmic fixes.
SharedFilesCtrlbulk-update API skips per-row repaints duringClearED2KPublishInfo(#561, #2bf9b8f34).SharedFileListkeyword indexing inReload(#566).known2.metAICHSaveHashSetdedup made O(1) (#581).known.methash-collision dedup on Init dropped to O(N log N) (#584).wxListCtrl::FindItem(data)O(N) β O(1) via user-data hash map (#614).ExternalConnfile-list enumeration snapshotted to avoid O(NΒ²)GetFileByIndexloops (#687).- amuleweb
array_push_backmade O(N) via cached scan hint (#689). KnownFileListindexes its size-map by(size, mtime)instead of size alone to cut false-positive collision-dedup walks (#593).
- Disk I/O.
CFilegains a 64 KB userspace write buffer to coalesce metadata-save syscalls (#573); the buffer was subsequently moved off the stack onto the heap so it survives musl's 128 KiB pthread stack, and an internal recursive_mutex was added to serialise buffer + fd access against the concurrent-corruption race surfaced on Alpine (#576).SavePartFileswitched to atomic-rename (#670) and gated on an in-memory dirty flag so periodic ticks only touch disk when something actually changed (#671). Upload-stats persistence on 10-min heartbeat when only stats moved (#e8363bf42). - Memory bounds....
2.3.3 - The "delayed too many times, but still not too late" version
Yes, it's been delayed too many times, but finally it's out! With all the new features and bug fixes from the past four years! Let me highlight some for you:
- CMake support. CMake provides us platform-independent configuration files and generates native makefiles and workspaces for the compiler of your choice. It's highly experimental in its current state, but it aims to take the place of good old autoconf/automake one day.
- Command completion with the TAB key in amulecmd.
- Supports compilation with the latest C++ standard (C++17).
- Scope graphs now (should) work on Mac.
- Notification when a download completes.
For the full list of changes see the Changelog.
Requirements
- For UPnP you need at least libupnp-1.6.7.
- For C++17 you need at least Cryptopp-6.0.0.
- For notifications you need at least wxWidgets-2.9.0.
2.3.2 - The "don't close tabs" version
The 2.3.2 version is mainly a bugfix release, containing only a few new features. However, it fixes a lot of bugs that ruined the lives of users of the previous version. But beware! We're also thinking of the future, therefore we still left some bug in our code, for you to find them. π
To get an idea of what's featured in this release here are some of the changes:
- Implemented the missing
Show Sharedcommand in amulecmd. - Fixed "Disable computer's timed standby mode" for MacOS 10.9 Mavericks
- Display hashing progress in progress bars
- Fixed loading of zipped IP filter
- Read AICH root hashes from binary eMuleCollection files
- ... and many many more...
You can read the full list of changes here.
Known Issues
- aMule at the moment supports wxWidgets versions 2.8.12 - 3.0.2. wxWidgets 3.1 is not supported! This also means that you might encounter problems with GTK+3, see issue #51.
- Closing search tabs might make aMule crash. If you experience this problem you can try the patch suggested in pull request #62, but please read carefully the explanation on why it isn't included in the release.