Skip to content

Releases: amule-project/amule

aMule 3.0.0

Choose a tag to compare

@github-actions github-actions released this 08 Jun 09:37

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).
  • Disk I/O. CFile gains 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). SavePartFile switched 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....
Read more

2.3.3 - The "delayed too many times, but still not too late" version

Choose a tag to compare

@gonosztopi gonosztopi released this 07 Feb 23:03

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.

Download aMule - all-platform eMule P2P Client

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

Choose a tag to compare

@gonosztopi gonosztopi released this 16 Sep 08:16

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 Shared command 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.