Your whole self-hosted media stack — in one native app.
Manage your *arr services, download clients, requests, subtitles, indexers and servers from a single adaptive app for iPhone, iPad and Mac, built entirely against each service's public REST API.
Nautilarr is an open-source command deck for a self-hosted media setup. Instead of juggling a dozen web UIs, you get one fast, native app that talks to all of them and presents everything — libraries, the download queue, requests, missing subtitles, indexers, streams and server health — in a single, consistent place.
- One app, three platforms. A single SwiftUI codebase for iPhone, iPad and macOS (via Mac Catalyst). Adaptive layout: a tab bar on iPhone, a sidebar + detail split on iPad and Mac.
- No paid Apple Developer account required. Distributed for iOS/iPadOS via
AltStore using a free Apple ID, and for macOS as an ad-hoc-signed
.app. - Secure & private. API keys and passwords live in the system Keychain, never in plain storage. No analytics, no telemetry — the app only talks to the services you configure.
| 🏠 Dashboard | Per-service stat cards (counts · files · library size · disk usage), currently-playing streams, an upcoming-releases poster carousel and aggregate library stats. |
| 🎬 Library | Unified poster grid across Sonarr / Radarr / Lidarr, with filters, sort, adjustable columns, rich detail views, season/episode monitoring and interactive search. |
| ⬇️ Downloads | One queue across every *arr import list and download client, split by service tabs and status filters (downloading · seeding · completed · paused · error), with inline play/pause/recheck/remove, seed time & ratio, and an optional seed-time limit janitor. |
| 🎟️ Requests | Browse & request titles through Overseerr / Jellyseerr with the same advanced options as the source — destination server, quality profile, root folder, language and per-season selection. |
| 💬 Subtitles | Bazarr "wanted" lists with one-tap search per missing language, provider results ranked by score, and download. |
| 🗂️ Indexers | Prowlarr search, indexer enable/disable and test. |
| 🖥️ Server tools | SSH terminal, host stats and an SFTP file browser, plus Docker start/stop over SSH — with optional Face ID gating. |
| 📅 Calendar | A day-grouped release timeline with downloaded / missing / upcoming status. |
| 🎨 Looks | Apple's Liquid Glass material on iOS / macOS 26+, selectable accent colours, pastel background washes, light/dark themes and an app-wide text-size control. |
| 🌐 Networks | Multiple instances per service, each with a primary (LAN) and fallback (WAN) host — Nautilarr picks the right one automatically, with manual override and custom HTTP headers. |
| 🔔 Notifications | Local notifications + background polling for grabs, imports, health warnings, requests and new streams. |
| 🔁 Backup | Import / export your whole configuration as JSON. |
Each integration talks to the service's own documented, public REST / RPC / GraphQL API. Nautilarr is not affiliated with any of these projects — links go to their official websites and repositories so you can install and configure them yourself.
| Service | Category |
|---|---|
| Sonarr · Radarr · Lidarr | Media management (TV · Movies · Music) |
| Overseerr / Jellyseerr | Requests |
| qBittorrent · Transmission · Deluge | Downloads (torrents) |
| SABnzbd · NZBGet | Downloads (usenet) |
| Prowlarr · NZBHydra2 · Jackett | Indexers |
| Bazarr | Subtitles |
| Tautulli · Jellystat | Monitoring (active streams) |
| Unraid | Server stats + Docker (GraphQL) |
| SSH / SFTP | Terminal · host stats · file browser |
Shortcut launchers (open the app/web, no API access): Plex · Jellyfin.
graph LR
UI["📱 SwiftUI UI<br/>iPhone · iPad · Mac"] --> VM["🧭 MVVM<br/>View Models"]
VM --> KIT["📦 NautilarrKit<br/>(Swift Package)"]
KIT --> CORE["⚙️ NautilarrCore<br/>APIClient · Keychain · Connectivity"]
KIT --> SVC["🔌 Service Kits<br/>Sonarr · Radarr · qBittorrent · …"]
SVC --> CORE
CORE -->|REST · RPC · GraphQL| HOST[("🌊 Your self-hosted services")]
All service and networking logic lives in the NautilarrKit Swift Package, so
it can be unit-tested with swift test independently of the UI.
nautilarr/
├── project.yml # XcodeGen project definition (single app target)
├── App/
│ ├── Sources/
│ │ ├── App/ # @main, AppEnvironment, adaptive RootView
│ │ ├── Shared/ # stores, settings, notifications, background refresh
│ │ ├── DesignSystem/ # theme, Liquid Glass, cached images, components
│ │ └── Features/ # Home · Library · Downloads · Requests · Server · Settings · About
│ └── Resources/ # original icon/palette assets, generated Info.plist
├── Packages/
│ └── NautilarrKit/ # platform-agnostic, unit-tested logic (Swift Package)
│ ├── Sources/
│ │ ├── NautilarrCore/ # APIClient, models, Keychain, connectivity, image cache
│ │ └── <Service>Kit/ # one target per service (Sonarr, Radarr, qBittorrent, …)
│ └── Tests/ # APIClient, failover, credential & per-service fixture tests
├── Scripts/ # IPA/app packaging + AltStore source generation
└── .github/workflows/ # CI (build + test) and Release (IPA/app + Pages)
- MVVM with
ObservableObjectview models. - Networking:
async/awaitoverURLSession; one genericAPIClientwith host failover, pluggable authentication, custom headers and normalised errors. - Connectivity:
NWPathMonitorchooses LAN vs. WAN per request.
Requirements: macOS with Xcode 16+ and XcodeGen
(brew install xcodegen).
# 1. Run the unit tests (no Xcode project needed)
cd Packages/NautilarrKit && swift test && cd -
# 2. Generate the Xcode project (it is git-ignored — always regenerate)
xcodegen generate
# 3. Open it
open Nautilarr.xcodeprojThe
.xcodeprojandApp/Resources/Info.plistare generated fromproject.ymland are git-ignored — always runxcodegen generateafter a fresh checkout. Set your own signing team in Xcode when running on a device.
Command-line build (Mac Catalyst):
xcodebuild -project Nautilarr.xcodeproj -scheme Nautilarr \
-destination 'platform=macOS,variant=Mac Catalyst' buildNautilarr ships an unsigned IPA; AltStore re-signs it on your device with your free Apple ID. Apps signed this way expire after 7 days and must be refreshed (AltStore can do this automatically on the same network as AltServer).
- Install AltStore and AltServer (free).
- In AltStore, open Browse → Sources → Add Source and paste:
https://drakonis96.github.io/nautilarr/apps.json - Find Nautilarr in the source and tap Get / Install.
- Sign in with a free Apple ID when prompted, and enable background refresh.
The Mac build is distributed as an ad-hoc-signed app on the Releases page.
- Download
Nautilarr-macOS-<version>.zipfrom the latest release and unzip it. - Move Nautilarr.app to
/Applications. - First launch is blocked by Gatekeeper (the app is not notarised). Authorise once:
- Right-click the app → Open → Open; or
- From Terminal:
xattr -dr com.apple.quarantine /Applications/Nautilarr.app
- Secrets are stored in the Keychain (this-device-only, after first unlock),
never in
UserDefaultsor the exported instance list. - Relaxed TLS validation for self-signed certificates is opt-in per instance and scoped to that instance's hosts.
- Push notifications while the app is closed are not possible with free-certificate distribution; Nautilarr uses local notifications + background polling only.
- The app makes no analytics or telemetry calls.
Contributions are welcome! A good change usually looks like:
- New service? Add it as its own target under
Packages/NautilarrKit/Sources/, following the existingAPIClient+ authorizer pattern, with fixture-backed unit tests. - Keep UI in
App/Sources/Features/and logic inNautilarrKitso it stays testable withswift test. - Run
swift testand a Mac Catalyst build before opening a PR.
See CONTRIBUTING.md for the full guidelines.
- ✅ Sonarr · Radarr · Lidarr, requests, full download-client suite
- ✅ Tautulli · Prowlarr · Bazarr · SSH/SFTP · Jellystat · Unraid · indexers
- ✅ Liquid Glass redesign, pastel themes, animated About, seed-time limits, advanced unified requests
- 🔜 Live host charts, Unraid Docker mutations, additional languages
MIT © 2026 drakonis96.
Nautilarr is a management client — nothing more. It does not host, store, download, distribute, index, search for or stream any media itself. It is a remote control for self-hosted services that you own and operate, talking to them only through their own publicly documented APIs. No content of any kind ships with the app.
Nautilarr does not endorse, encourage or facilitate copyright infringement or piracy in any form. The app exists to make managing your own infrastructure easier and has substantial legitimate uses — organising media you own or have created, public-domain works, Linux distributions and any content you are legally entitled to access. You alone are responsible for the content you manage and for complying with the laws of your jurisdiction and the terms of every service, network and indexer you choose to connect.
Nautilarr is an independent, original project and is not affiliated with, endorsed by, sponsored by, or derived from any of the services it connects to. All product names, logos and trademarks are the property of their respective owners and are used solely to describe interoperability. Links to each project's official website or repository are in the Supported services table above. All artwork, naming and design are original to Nautilarr.











