Version 3.0.1 — "bugfixes and polish"
2026-06-24
First point release after the 3.0.0 rebirth, and the first cut entirely on the new amule-org/amule repository. 147 merged PRs of post-launch work: a new IP2Country preferences panel, remote-GUI (amulegui) improvements over EC, smarter search, AICH request rate-limiting, a top-to-bottom WebUI / WebServer modernization and security pass, a Weblate-driven translation pipeline, and a one-click release process. No on-disk format or config changes — a drop-in upgrade from 3.0.0.
Highlights
- IP2Country preferences panel. A new Preferences page to choose the GeoIP source — DB-IP, MaxMind, or a custom URL — instead of editing config by hand (#113). IP2Country is now enabled by default and hard-fails at configure if the dependency is missing (#119).
- Remote GUI over EC. amulegui now populates the Server Info tab from amuled (#120), keeps statistics and Kad graphs alive across tab switches (#135), and stops offering preferences it can't actually push to the daemon (#122).
- Smarter search. Modern file formats and corrected extension categories in the type filter (#189), new Length / Bitrate / Codec columns in results (#139), a working Related Files lookup (#154), and global search that works even with Kad disabled (#38).
- AICH anti-abuse + speed.
OP_AICHREQUESTis now rate-limited viaCheckForAggressive(), andLoadHashSetgained an O(1) root-hash → offset cache with a self-healing linear-scan fallback, so AICH recovery on largeknown2files no longer rescans the whole file per request (#186, #191, #193). - WebUI / WebServer reborn. The default web template was dragged out of its 2005 Dreamweaver origins: HTML5 doctype, presentational markup migrated to
style.css, themaquette.dwttemplate and deadMM_*rollover JavaScript removed, favicon refreshed, and the whole thing re-encoded as UTF-8. On top of the cleanup came real features — select-all checkboxes, a working priority selector on the Shared page, download/delete confirmation with file counts, auto-refresh that pauses while rows are selected, button tooltips, and unified styling and size/speed units. - WebUI security hardening. XSS defences (
htmlspecialchars+addslashes, sort-param whitelisting), CWebSocket request-parser hardening and memory-leak fixes, and a sweep of the embedded PHP interpreter (php_core_lib,php_amule_lib,php_syntree,php_native_split) fixing memory frees, base16/base64 handling, and long-standing parser bugs. - Translations via Weblate. Translation now flows through a hosted Weblate instance feeding the repo, with a
--no-wrapcatalog policy and build-time po4a manpage rendering; sixteen catalog-update rounds landed this cycle. - One-click releases. Maintainers can cut a release from the GitHub Actions UI — pick a version, and the workflow tags, builds every platform, verifies the artifact set, and assembles a draft Release (#234).
IP2Country
- New Preferences panel to select the GeoIP source: DB-IP, MaxMind, or a custom URL (#113).
- Enabled by default; configure hard-fails when the dependency is missing rather than silently disabling (#119).
Remote GUI & Platform
- amulegui populates the Server Info tab from amuled over EC (#120) and stops offering preferences it can't push to the daemon (#122).
- Statistics + Kad graphs stay populated across tab switches (#135); the Kad status bar refreshes after
StopKad()(#133). - Theme-aware colours: list-control text (#179) and statistics labels (#128) no longer hardcode
*wxBLACK/BLUE/RED, fixing legibility on dark themes. - Window-state persistence: Messages columns + minimized-window geometry saved (#138); macOS persists list-control settings on Dock → Quit (#141).
- macOS Preferences left-rail tab icons padded (#130).
wxWebSession-cleanup_Exitworkaround applied on all platforms to avoid a shutdown crash (#159).
Search & Networking
- Global search works with Kad disabled (#38); Windows EC search fixed by using
wxUIntPtrform_currentSearch(#39). - File-type filter: miscategorised extensions corrected and modern formats added (#189).
- Result columns: Length, Bitrate, Codec added (#139); Directories column moved to the end (#142).
- Related Files lookup fixed; TCP/UDP server flags shown in Release builds too (#154).
- EC search lifecycle: the prior Kad search is stopped when the EC client starts a new one (#36); late ed2k server replies dropped after the client switches to Kad (#37).
SO_REUSEADDRon the UDP socket so it rebinds cleanly after suspend/resume (#121).- Server Info log cleared at the transition source on ed2k disconnect / server switch (#163, #164).
- UPnP ASCII
tolower()scoped underLC_CTYPE=Cso non-C locales don't corrupt device matching (#208). - Full path logged when an ed2k link collides with an existing file (#172).
AICH & Hashing
OP_AICHREQUESTrate-limited viaCheckForAggressive()andLoadHashSetmade O(1) through a root-hash → offset cache (#186).- True linear-scan fallback when the cached offset is stale (#191); the cache self-heals on a successful rewind (#193).
- UDP file-info handler short-circuits when the requesting client is banned (#192).
WebUI & WebServer
The biggest theme of the release by volume — driven mainly by ngosang, with the embedded-PHP work by RealGreenDragon.
Template modernization:
- HTML5 doctype adopted; layout glitches from the switch corrected (#110, #204).
- Presentational HTML attributes migrated to semantic CSS — text/element attrs (#95), table/iframe attrs (#102), inline
<style>blocks consolidated intostyle.css(#89), JS nav rollovers replaced with CSS:hover(#92). - Dead Dreamweaver scaffolding removed: the
maquette.dwttemplate (#88),MM_*JavaScript extracted then deleted once shown to be no-ops (#90, #93), staleonLoadtree calls instats_tree.php(#111), and small deprecated CSS/HTML leftovers (#105). <script>blocks moved into<head>(#84); structural HTML errors corrected (#87); straystyle.cssbrace removed and formatting normalized (#78); shared-files page re-encoded as UTF-8 with English alt-text (#80); higher-resolution transparent favicon (#112).
New WebUI features:
- Priority selector wired up on the Shared page (#210).
- Select-all checkbox on file tables (#212); auto-refresh pauses while checkboxes are selected (#213) and avoids the form-resubmission prompt (#230).
- Download/delete actions confirm with a file count (#214).
- Search-page controls improved (#215); button tooltips and clickable images (#216).
- Unified button styles (#217), form controls (#206), and file size + speed units (#218); footer-bar background (#219); logo links home to Transfers (#209); clearer dropdown option labels (#207); footer "Download link" refreshes the main page (#81).
WebUI bug fixes:
- Sorting downloads by sources never worked — fixed (#75).
- Wrong MByte/GByte multipliers in the search size filters corrected (#76).
- Division-by-zero guard on the downloads-page percentages (#83).
- Login error message now actually shown, and made readable (#82, #96).
- Static
.css/.jsserved to unauthenticated clients so the login page styles correctly (#97). - amuleweb honours the per-user template dir when spawned by the GUI (#72); copy-pasted preferences code removed from the log page (#74).
- ed2k links can be added via the footer links form (#145); search results cleared across cycles and on new search (#33).
Embedded PHP interpreter:
- Memory freed correctly when casting array values (#108) and for
for()header expression lists (#109). OtherFunctionsbase16 decode, base64 footer append, duplicate.asfentry, and mp3 comment handling corrected (#30).- Interpreter sweep:
php_native_split(#146),php_core_lib(#150),php_amule_lib_standalone(#151),php_amule_lib(#152),php_syntree(#153), with follow-ups (#155, #156).
WebUI Security
- XSS hardening:
htmlspecialchars+addslashesbuiltins added and remote-controlled strings escaped (#106); the searchsortparam whitelisted before being stored in the session (#107); broad WebUI/WebServer backend hardening (#91). - CWebSocket request parsing hardened for header casing, body bounds, cookie conversion, and MinGW portability (#27, #28); CWebSocket memory leaks fixed and review findings addressed (#29).
Translations & i18n
- Translation moved to a hosted Weblate workflow feeding the repo; the README points contributors there (#71). Catalog rounds: #57, #66, #100, #123, #147, #160, #165, #170, #184, #187, #199, #200, #202, #211, #229, #235; Brazilian Portuguese also refreshed by hand (#7), and the IP2Country strings translated into Italian (#129).
--no-wrappolicy adopted for the app catalogs (#61) and extended to the manpage.pofiles (#67).- Non-ASCII output fixes: the logger writes stdout/stderr via
utf8_str(#42); locale is initialised so non-ASCII strings stop mangling under the default C locale (#205, fixes #203); a real newline is used in a comment-dialog tooltip (#70). - Windows
SPANISHINTERNATIONALrouted topo/es.po(#64).
Build System & CI
- One-click release workflow from the Actions UI: tag → full matrix → artifact-manifest gate → draft Release (#234). Repo bootstrap: issue/PR templates (#12). The
manpages-syncCI check disabled where Weblate PRs broke it (#68). cryptopp-modernaccepted by the build, with packager-friendly flags (#169); versionedlibatomic.so.1accepted infind_library(#176).BUILD_TESTINGoff by default (#49); options.cmake typo/casing cleanup (#50); apofilesdependency added to every NLS-aware executable (#98).- LLP64 portability: unsafe uses of
longcleaned up (#65). - Toolbar ID collision with manually-added IDs resolved (#52);
SearchDlgFALSEmacro replaced withfalse(#48);IDC_SPINSEARCHAVAILABILITYspelling corrected (#51).
Shared Files & Preferences
SharedDirWatcher: the inotify race window on newly-created subdirectories closed (#227), with a follow-up so file CREATEs reliably reachNotifyPathAdded(#228).- First-run no longer wipes
shareddir-*.datduring userhash init (#79) or promotes staleshareddir.datentries to explicit shares (#86). - "Show Clients for" defaults to "All files" (#126).
- English language-picker IDs corrected, with an explicit U.S. entry (#60).
Manpages & Docs
- Translated manpages now rendered at build time with po4a (#94), with
--no-updateso the build doesn't dirty the source tree (#101). - README: a Translations section (#71), an amule-org column in the Development Statistics table (#62), and NetBSD added (#32).
Packaging & Flathub
- Icons refreshed from a new 256×256 master (#15), then reverted to the established design upscaled to meet Flathub's 256px minimum (#21).
- Flathub-strict manifest staged under
packaging/flathub/(#16), with metainfo + desktop polish for listing readiness (#17) and commit-pin bumps as the manifest tracked master (#23, #24, #26). - Flatpak fixes: libbfd disabled in the sandboxed build (#19); the install-prefix locale dir registered for wxLocale lookup (#22);
.mocatalogs shipped inside the main app rather than a separate.Localeextension (#25); all bundled languages surfaced in the Preferences Language picker on Flatpak (#175). - macOS: webserver templates bundled into
aMule.appso the in-app WebUI resolves them (#195).
Known Limitations
Carried over from 3.0.0:
- macOS
.dmgis not yet code-signed or notarized — Gatekeeper warnings on first launch. - Flathub submission still pending — install the
.flatpakdirectly withflatpak install <file>for now. - AppImage isn't yet in AppImageLauncher's catalogue.
Contributors
This release is 147 merged PRs cut entirely on the new amule-org/amule repository. Particular thanks to:
- got3nks — 59 PRs across search, amulegui / EC, AICH, IP2Country, packaging, locale, and the release tooling.
- ngosang — 46 PRs; the WebUI / WebServer modernization, hardening, and UX features are almost entirely his.
- Marcelo Jimenez (mrjimenez) — 9 PRs across the webserver, build system, and translations.
- RealGreenDragon — 8 PRs fixing the embedded PHP interpreter.
- danim7 — 2 PRs (global-search-without-Kad, Related Files + server flags).
- peyoker — WebUI / WebServer security hardening (#91).
- cardpuncher — NetBSD in the README (#32).
Merged PRs in this release
Complete list of PRs that landed for 3.0.1, in numerical order:
#7, #12, #15, #16, #17, #19, #21, #22, #23, #24, #25, #26, #27, #28, #29, #30, #32, #33, #36, #37, #38, #39, #42, #43, #44, #48, #49, #50, #51, #52, #57, #60, #61, #62, #64, #65, #66, #67, #68, #70, #71, #72, #74, #75, #76, #78, #79, #80, #81, #82, #83, #84, #86, #87, #88, #89, #90, #91, #92, #93, #94, #95, #96, #97, #98, #100, #101, #102, #105, #106, #107, #108, #109, #110, #111, #112, #113, #119, #120, #121, #122, #123, #126, #128, #129, #130, #133, #135, #138, #139, #141, #142, #145, #146, #147, #150, #151, #152, #153, #154, #155, #156, #159, #160, #163, #164, #165, #169, #170, #172, #175, #176, #179, #182, #184, #186, #187, #189, #191, #192, #193, #195, #199, #200, #202, #204, #205, #206, #207, #208, #209, #210, #211, #212, #213, #214, #215, #216, #217, #218, #219, #227, #228, #229, #230, #234, #235.