Transmission 4.0.0
Highlights
This is a major release, both in numbering and in effort! It's been in active development for over a year and has a huge list of changes -- over a thousand commits -- since Transmission 3.00. Some of the highlights include:
- Resource Efficiency - Use less memory and fewer CPU cycles
- Better Community - Pull requests welcomed and used
- Code Modernization - Migrated from C90 to modern C++
- New Features - What would a major release be without them?
Resource Efficiency
-
The code has been extensively profiled and improved to fix inefficient code and memory use. For example, a stress test of starting transmission-daemon with 25,000 torrents is almost entirely IO-bound, using 50% fewer CPU cycles and 70% fewer memory allocations than Transmission 3.00.
-
The remote control GUIs (transmission-qt and transmission-web) now use the RPC API "table" mode, resulting in smaller payloads / less bandwidth use.
-
RPC payloads are now compressed using libdeflate, a "heavily optimized [library that is] significantly faster than the zlib library."
Community
- The project is much more responsive to bug reports and code submissions than it has been in the past.
- There is a new group of volunteer contributors who are working on Transmission!
- Transmission 4.0.0 includes over 350 new community commits (see the Thank You section below and in the previous 4.0.0 betas) since 3.00 and welcomes new contributors.
- Documentation has been moved into the
transmission/transmission
so that contributors can submit PRs to improve it.
Code Modernization
- The entire codebase has been migrated from C to C++. In the process, we've removed thousands of lines of custom code and used standard C++ tools instead. The core's code has shrunk by 18%. The core codebase has been extensively refactored to be more testable and maintainable.
- The GTK client has been ported to gtkmm.
- The Web client has been rewritten in modern JavaScript and no longer uses jQuery. The entire gzipped bundle is now 68K.
- The unit tests have been expanded and ported to Google Test. Clang sanitizer builds are run during CI.
- The core library is now fuzz tested.
- Transmission now uses Sonarcloud, Coverity, LGTM, and clang-tidy static analysis on new code. Several hundred code warnings have been fixed compared to Transmission 3.00.
New Features
- Support for using BitTorrent v2 torrents and hybrid torrents. (Support for creating v2 and hybrid torrents is slated for an upcoming release.)
- Users can now set "default" trackers that can be used to announce all public torrents.
- Newly-added seeds can start immediately and verify pieces on demand, instead of needing a full verify before seeding can begin. (#2626)
- Added an option to omit potentially-identifying information (e.g. User-Agent and date created) when creating new torrents. (#3452)
- The Web client has been rewritten and now supports mobile use.
- When creating new torrents, users can now specify the piece size. (#3768, #3145, #2805)
- IPv6 blocklists are now supported. (#3835)
- Beginning with 4.0.0-beta.1, Transmission releases now use semver versioning.
- Dozens of other new features -- too many to list here! We've been working on this for a year!
What's New Since 4.0.0-beta.3
libtransmission (All Platforms)
- Added a new setting,
torrent-added-verify-mode
, to force-verify added torrents. (#4611) - Improved handling of webseed servers that do not support Range requests or 206 Partial Content. (#4601)
- Improved handling of webseed servers that return a content-encoding that was not requested. (#4609)
- Fixed
4.0.0-beta.3
potential socket leak. (#4616) - Fixed
4.0.0-beta.3
regression that failed to detect largefile build flags on 32bit systems. (#4627) - Fixed
4.0.0-beta.1
UI bug when removing a tracker from the announce list. (#4635) - Improved error handling when receiving corrupt piece data from peers. (#4665)
- Fixed
4.0.0-beta.1
FTBFS error on CentOS 7. (#4673, #4675) - Made small performance improvements in libtransmission. (#4577, #4679)
- Dropped libiconv dependency in libtransmission. (#4565)
- Updated 403 RPC error message. (#4567)
- Bumped libdeflate snapshot to 1.17. (#4596)
macOS Client
- Fixed two Help menus in macOS. (#4500)
- Fixed bug that caused magnet links to always be paused when added. (#4528)
- Fixed
4.0.0-beta.1
regression that broke the Piece View "blinking" when a piece completes. (#4587) - Ensured that the preferences window is centered the first time it is shown. (#4659)
- Fixed
4.0.0-beta.1
regression that incorrectly handled corrupt blocklists. (#4705) - Increased the font size in the main window's torrent list. (#4557)
- Fixed libpsl dependency build issue on macOS. (#4642)
Qt Client
- Made display order of speed limits consistent between Properties, Details dialogs. (#4677)
GTK Client
- Fixed
4.0.0-beta.1
regression making it impossible to close "Set location" dialog (GTK 3 only). (#4625) - Fixed
4.0.0-beta.2
regression leading to crash during progress bars rendering on some systems. (#4688)
Web Client
- Fixed
4.0.0-beta.1
potential crash when detecting mime-types. (#4569) - Fixed
4.0.0-beta.1
regression that broke file priority buttons in the web client. (#4610)
Daemon
- Fixed stderr logging issue when running as a
systemd
unit. (#4612)
transmission-remote
- Fixed
4.0.0-beta.1
regression when displaying session info. (#4624) - Fixed
4.0.0-beta.1
regression when displaying tracker info. (#4633)
Thank You!
Last but certainly not least, a big Thank You to these people who contributed after 4.0.0-beta.3:
Contributions to libtransmission (All Platforms):
- @dmantipov (Dmitry Antipov):
- Chore: simplify announcer add callback. (#4573)
- Refactor: use std::function for announcer callback. (#4575)
- Refactor: switch to C++11-compatible tr_wait() from tr_wait_msec(). (#4576)
- Made small performance improvements in libtransmission. (#4577)
- Made small performance improvements in libtransmission. (#4679)
- @InsaneKnight:
- Fixed
4.0.0-beta.3
potential socket leak. (#4616)
- Fixed
- @nevack (Dzmitry Neviadomski):
- Code review for #4576
Contributions to macOS Client:
- @cfauchereau (Clément Fauchereau):
- Fixed two Help menus in macOS. (#4500)
- @DevilDimon (Dmitry Serov):
- @GaryElshaw (Gary Elshaw):
- Increased the font size in the main window's torrent list. (#4557)
- @nevack (Dzmitry Neviadomski):
- @sweetppro (SweetPPro):
- Fixed bug that caused magnet links to always be paused when added. (#4528)
Contributions to Qt Client:
- @anarcat (anarcat):
- Added remote HTTPS support to Qt GUI. (#4622)
- @GaryElshaw (Gary Elshaw):
- Removed 'Message Log' item from Qt sys tray. (#4656)
- @Schlossgeist (Nick):
- Quick fix: changed order of some session prefs. (#4676)
Contributions to Web Client:
- @dareiff (Derek Reiff):
- Fixed
4.0.0-beta.1
regression that broke file priority buttons in the web client. (#4610)
- Fixed
Contributions to Daemon:
- @dmantipov (Dmitry Antipov):
- Fixed stderr logging issue when running as a
systemd
unit. (#4612)
- Fixed stderr logging issue when running as a
Contributions to transmission-remote:
Contributions to Everything Else:
- @progiv (progiv):
- Fixed GitHub CI actions warning for set-output. (#4564)
- @t-8ch (Thomas Weißschuh):
- Code review for #4637
New Contributors since 3.00
- @1100101 made their first contribution in #2040
- @acchang made their first contribution in #3729
- @anacrolix made their first contribution in #2275
- @anarcat made their first contribution in #4622
- @AndreyPavlenko made their first contribution in #585
- @azy5030 made their first contribution in #2805
- @BENICHN made their first contribution in #1760
- @Berbe made their first contribution in #1417
- @bexnoss made their first contribution in #2201
- @bkuhls made their first contribution in #2576
- @buckmelanoma made their first contribution in #2179
- @BunioFH made their first contribution in #2284
- @candrews made their first contribution in #2573
- @carandraug made their first contribution in #3452
- @cfauchereau made their first contribution in #4500
- @Chrool made their first contribution in #1447
- @CodeWitchBella made their first contribution in #2874
- @cpba made their first contribution in #1487
- @Dachtire made their first contribution in #3736
- @dareiff made their first contribution in #3985
- @dbeinder made their first contribution in #2799
- @deepwell made their first contribution in #1681
- @dependabot made their first contribution in #1559
- @depler made their first contribution in #2066
- @dmantipov made their first contribution in #3766
- @evils made their first contribution in #2204
- @ewtoombs made their first contribution in #3049
- @FallenWarrior2k made their first contribution in #2721
- @federicobond made their first contribution in #1441
- @FluxState made their first contribution in #2586
- @foobar-d made their first contribution in #2847
- @fxcoudert made their first contribution in #2234
- @GaryElshaw made their first contribution in #2779
- @GermanAizek made their first contribution in #4172
- @ghazel made their first contribution in #3447
- @github-actions made their first contribution in #4664
- @goldsteinn made their first contribution in #2933
- @guidocella made their first contribution in #1080
- @guidovranken made their first contribution in #3600
- @Harm133 made their first contribution in #3835
- @ile6695 made their first contribution in #2508
- @IMurzich made their first contribution in #3739
- @InsaneKnight made their first contribution in #4616
- @johman10 made their first contribution in #1682
- @jonasmalacofilho made their first contribution in #2232
- @JP-Ellis made their first contribution in #2812
- @kakuhen made their first contribution in #2690
- @Kobaxidze256 made their first contribution in #3552
- @koro666 made their first contribution in #1405
- @kvakvs made their first contribution in #1799
- @Kwstubbs made their first contribution in #4125
- @L2501 made their first contribution in #3750
- @lajp made their first contribution in #2905
- @Lanzaa made their first contribution in #3380
- @lucaxvi made their first contribution in #3655
- @luzpaz made their first contribution in #3743
- @lvella made their first contribution in #1660
- @MatanZ made their first contribution in #2761
- @maxz made their first contribution in #2875
- @meskobalazs made their first contribution in #3210
- @mickaelifs made their first contribution in #1602
- @mlopezfm made their first contribution in #2549
- @mymedia2 made their first contribution in #1354
- @Narthorn made their first contribution in #1638
- @npapke made their first contribution in #1619
- @Oleg-Chashko made their first contribution in #1923
- @orbital-mango made their first contribution in #3124
- @OscarCunningham made their first contribution in #3814
- @pborzenkov made their first contribution in #1251
- @pedrinho made their first contribution in #1313
- @piec made their first contribution in #1328
- @progiv made their first contribution in #4564
- @pudymody made their first contribution in #3927
- @pyrovski made their first contribution in #715
- @razaqq made their first contribution in #2053
- @robd003 made their first contribution in #3669
- @rsekman made their first contribution in #3201
- @saidinesh5 made their first contribution in #1161
- @sammarcus made their first contribution in #459
- @sandervankasteel made their first contribution in #1885
- @Schlossgeist made their first contribution in #4676
- @sewe2000 made their first contribution in #3121
- @shelvacu made their first contribution in #1900
- @shenhanc78 made their first contribution in #1282
- @shric made their first contribution in #1326
- @sio made their first contribution in #893
- @sir-sigurd made their first contribution in #1040
- @smrtrfszm made their first contribution in #4363
- @stefantalpalaru made their first contribution in #4343
- @subdan made their first contribution in #4245
- @sweetppro made their first contribution in #2654
- @tinselcity made their first contribution in #4409
- @ToKe79 made their first contribution in #2071
- @trainto made their first contribution in #1489
- @tylergibbs2 made their first contribution in #1808
- @uiryuu made their first contribution in #3962
- @uprt made their first contribution in #857
- @varesa made their first contribution in #1633
- @vchimishuk made their first contribution in #1364
- @ViktorOn made their first contribution in #3710
- @vuori made their first contribution in #265
- @wiz78 made their first contribution in #874
- @wsy2220 made their first contribution in #4684
- @xavery made their first contribution in #851
- @Xist12gh made their first contribution in #3756
- @yarons made their first contribution in #3996