Features
- Reduced Data Usage: Network traffic was reduced by 93% due to optimized data syncing.
- Responsive Progress Bars: Progress indicators now feature fluid animations for a more natural feel.
- Custom Headers: Added the ability to specify custom HTTP headers for your server connections. This provides seamless support for advanced home-lab setups, including reverse proxies and zero-trust networks (like Cloudflare Access or Authelia).
- Reworked Server Addition: Redesigned the server setup and edit screens for a smoother experience, complete with an updated Advanced settings page and deferred saving.
- Limit Configuration: You can now configure precise speed limits, seeding time limits, and share ratios for individual torrents directly within the app.
- Offline Banner: A clear overlay banner now appears whenever the connection drops.
- In-App Logs: Added a built-in log viewer to review and easily share system events directly inside the app.
- Self-Signed Certificate Support: Added full support for untrusted and self-signed SSL certificates, making it much easier to connect to your personal or home-hosted servers.
- Clearer Error Alerts: If adding a .torrent file or a magnet link fails, a clear error message will now pop up to explain exactly what went wrong.
Bug Fixes
- Background Resume: Leaving the app and coming back to it no longer forces a hard reload of your data. Everything stays right where you left it unless you switch servers.
- Repositioned Add Button: The "Add Torrent" button has been moved to the toolbar for cleaner, more intuitive access.
- Stable RSS Downloads: Fixed an issue in the RSS view where tapping a row to download a torrent would cause the confirmation sheet to glitch, closing and reopening unexpectedly.
- Connection Timeouts: Implemented strict network timeout limits to prevent the app from hanging indefinitely on the launch screen if a server is unresponsive.
UI/UX
- Smooth Charts: Instead of updating every two seconds, the statistics charts now scroll continuously and smoothly.
- Cleaner Torrent List: The torrent rows now adapt dynamically to show the most relevant details, depending on whether a transfer is downloading, seeding, or paused.
Code Refactoring
- Async Client Migration: Migrated to a modern, asynchronous client architecture.
- RSS Architecture: Refactored the RSS module to fix reported bugs.
- Network & DI: Implemented a stateless NetworkClient and established a TorrentClientProtocol with a structured Dependency Injection setup for future support of clients other than qBittorrent.
- Reactive Torrent Sync: Migrated torrent fetching to use
maindataendpoint.
Show Full Changelog 🛠️
Features
- network: implement stateless NetworkClient and migrate tests to Xcode target (#99) #99 (Michael)
- client: define TorrentClientProtocol and DI structure (#100) #100 (Michael)
- auth: migrate authentication and server management module (#101) #101 (Michael)
- torrent-list: migrate view and view model to TorrentClientProtocol (#102) #102 (Michael)
- torrent-details: migrate torrent details, files and trackers to new client (#103) #103 (Michael)
- add-rss-search: migrate torrent additions, RSS feeds and search engine to new client (#104) #104 (Michael)
- sync: migrate torrent telemetry to reactive maindata delta sync (#106) #106 (Michael)
- ui: implement smooth predictive-feel progress bar with isolated layout animations (Michael-128)
- torrent: show localized error alerts when adding file or magnet torrents fails (#110) #110 (Michael)
- status: add connection status banner overlay for offline state (#111) #111 (Michael)
- sync: trigger immediate telemetry poll on successful login (Michael-128)
- logging: implement core logger subsystem and in-app log viewer (#112) #112 (Michael)
- auth: implement background silent reauthentication on unauthorized telemetry errors (#113) #113 (Michael)
- ui: add release highlights modal sheet with version tracking and localizations (#114) #114 (Michael)
- localization: add Polish, Japanese, and Chinese system localizations (#115) #115 (Michael)
- add demo mode with live-animated mock data and write-action blocking (#117) #117 (Michael)
- server: redesign add/edit server sheet with deferred save, LabeledContent, and updated Advanced page (#118) #118 (Michael)
- server: add custom HTTP headers for zero-trust tunnels and reverse proxies (#120) #120 (Michael)
- server: add untrusted SSL certificate support (#122) #122 (Michael)
- limits: per-torrent ratio, seeding time, speed limits, and share limit action configuration (#123) #123 (Michael)
- ux: torrent details icons, RSS validation warnings, and server connection error improvements (#125) #125 (Michael)
- l10n: add Japanese, Polish, Simplified and Traditional Chinese translations for 37 UI strings (#126) #126 (Michael)
Bug Fixes
- ui: move add torrent button to toolbar for better usability #75 (Michael-128)
- ux: bind TorrentDetailsViewModel to cache manager to enable real-time tag updates (Michael-128)
- ux: implement cache clearing and dynamic client binding on server switch (Michael-128)
- ux: bind tab view lifecycles to activeServerId to auto-reset UI filters on server switch (Michael-128)
- ux: retain local cache on background resume and only clear it when switching servers (Michael-128)
- implement connection timeout limits and launch splash cut-off (#107) #107 (Michael)
- track list multi-selection by info-hash instead of Torrent objects (#108) #108 (Michael)
- filters: always show category and tag pickers to prevent active state locks (Michael-128)
- filters: align untagged local filter checks with UI tag empty string (Michael-128)
- stats: decouple chart timeline ticks from network request latency (#116) #116 (Michael)
- telemetry: recover stale URLSession on persistent fetch failures (#119) #119 (Michael)
- rss: prevent stale TorrentAddViewModel reuse across sheet presentations (#121) #121 (Michael)
- ui: remove conflicting toolbar modifiers causing oversized bottom bar (Michael-128)
- torrent-add: stale file content, concurrent submissions, and test fixtures (#124) #124 (Michael)
- about: remove dead translation link (Michael-128)
Documentation
- add pull request template (Michael)
Styles
- implement delayed real-time scrolling and label sync for stats charts (Michael-128)
- tune stats charts scrolling frequency and delay (Michael-128)
- ui: implement dynamic state-based metadata columns with ETA and ratio icons (Michael-128)
Code Refactoring
- extract UI formatting and state logic to TorrentFormatter (Michael-128)
- introduce TorrentFormatting protocol for testability (Michael-128)
- eliminate legacy client classes and finalize async client migration (#105) #105 (Michael)
- rss: implement clean MVVM architecture, async loading, and lifecycle polling (#109) #109 (Michael)
Tests
- implement unit tests for TorrentListHelperViewModel (Michael-128)
- sync: add unit tests for telemetry connection states and fetch lock (Michael-128)
Continuous Integration
- remove pull request trigger (Michael)
Chores
- update pull request template description comment (Michael)
- update .gitignore (Michael-128)
- bump version to 1.4.0 (Michael-128)