Native iOS client for the Sappho self-hosted audiobook server.
- Stream or download audiobooks from your Sappho server
- Background audio playback with lock screen controls
- Chapter navigation and bookmarking
- Adjustable playback speed (0.25x - 3x) with fine-tune controls
- Sleep timer
- Progress sync across devices
- Offline downloads
- Library browsing by author, series, genre, and collections
- AirPlay support
- Dark theme matching the Sappho web app
Coming soon
- iOS 17.0+
- Xcode 15.0+
- A running Sappho server
git clone https://github.com/mondominator/sapphoios.git
cd sapphoiosThe project uses XcodeGen to generate the .xcodeproj from project.yml:
brew install xcodegen
xcodegen generateopen Sappho.xcodeprojSelect your target device or simulator and press Cmd+R.
On first launch, enter your Sappho server URL and credentials to connect.
The app follows a clean architecture pattern with SwiftUI:
Sappho/
├── App/ # Entry point
├── Data/
│ ├── Remote/ # API client (URLSession + async/await)
│ └── Repository/ # Auth storage (Keychain)
├── Domain/Model/ # Data models
├── Presentation/ # SwiftUI views
│ ├── Home/ # Main feed
│ ├── Library/ # Browse by author/series/genre
│ ├── Detail/ # Audiobook detail
│ ├── Player/ # Full & mini player
│ ├── Search/ # Search
│ ├── Profile/ # User settings & admin
│ └── Components/ # Shared UI & theme
├── Service/
│ ├── AudioPlayerService # AVFoundation playback
│ └── DownloadManager # Offline downloads
└── Cast/ # Chromecast (Google Cast SDK)
State management uses Swift's @Observable macro with @Environment injection.
- Sappho Server - The audiobook server (Node.js)
- Sappho Android - Android client (Kotlin/Jetpack Compose)
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
- Fork the repo
- Create your feature branch (
git checkout -b feature/my-feature) - Commit your changes
- Push to the branch (
git push origin feature/my-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.