A shared engine.
Native interfaces.
ATorrent aims for a consistent experience across systems. That does not mean every version should have the same interface or lifecycle.
ATorrent combines a common transfer engine with interfaces adapted to Android, macOS and iOS/iPadOS. Windows is in development.
Share the engine, adapt the experience
The most specialised part is the transfer engine. ATorrent uses libtorrent to manage BitTorrent sessions, metadata, peers and download events. The interface and storage are adapted to each platform.
The project uses SwiftUI on Apple and Jetpack Compose on Android, following the conventions and tools of each system.
Android: the service is part of the design
On Android, showing progress is only part of the job. Transfers must work with the app lifecycle. The project separates the Compose interface, ViewModel, Room repository and BitTorrent engine.
A Foreground Service maintains the transfer session and displays a progress notification. Room stores transfer information, while resume data restores engine state.
macOS: modules with clear responsibilities
On desktop, the project is organised into packages. TorrentCore contains the domain models and contracts; TorrentPersistence handles storage; and TorrentEngineBridge integrates Swift with libtorrent.
The SwiftUI app uses these modules through an MVVM architecture, keeping the engine, persistence and interface responsibilities separate.
iOS and iPadOS: different constraints
The native engine is packaged for devices and simulators. A C/C++ bridge and an XCFramework expose the integration to Swift. SwiftData and resume data retain the information needed to restore transfers.
Storage lives in the app sandbox. A desktop feature cannot simply move to mobile and expect the same file access or background behaviour.
Consistency does not mean uniformity
Core actions—add, pause, resume and remove—can share common logic. Execution details require platform-specific choices: an Android service, macOS packages or iOS app storage.
Sharing the engine maintains common transfer logic while using each system's capabilities.
Explore the technical documentation