MCPcopy Index your code
hub / github.com/RenzoBeux/Dashboarr

github.com/RenzoBeux/Dashboarr @v1.11.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.11.0 ↗ · + Follow
2,240 symbols 6,098 edges 449 files 34 documented · 2%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Dashboarr

Dashboarr

A mobile app to manage your self-hosted media stack from a single interface.

Built with Expo & React Native. Inspired by nzb360.

Expo SDK 54 React Native TypeScript Android — Google Play iOS — App Store Direct APK download Support on Ko-fi


Supporters

A huge thank you to everyone who has supported Dashboarr's development on Ko-fi. Your generosity helps keep the project alive!

Support on Ko-fi

Contributors

Thanks to everyone who has contributed to Dashboarr!

Contributors

What is Dashboarr?

Dashboarr is a native mobile app (Android & iOS) that connects directly to your self-hosted *arr stack and media services. No backend server required — the app talks to each service's REST API using your API keys.

Supported services:

Service What you can do
qBittorrent View queue, pause/resume/delete torrents, speed stats, transfer progress
rTorrent / ruTorrent View queue, pause/resume/delete torrents, global speed stats, transfer progress
SABnzbd View Usenet queue & history, pause/resume/delete jobs, add NZB by URL, speed stats
NZBGet View Usenet queue & history, pause/resume/delete jobs, add NZB by URL, speed stats
Radarr Search & add movies, monitor status, view queue, missing/wanted lists
Sonarr Search & add shows, episode monitoring, airing calendar/schedule
Seerr Browse & search media, request movies/shows, approve/decline requests
Tautulli Active Plex streams, bandwidth stats, playback history
Tracearr Live streams with codec/quality details, bandwidth, playback history
Prowlarr Indexer status & toggle, search across all indexers, grab releases, stats
Plex Now playing, recently added, on deck, library browsing
Jellyfin Now playing, recently added, continue watching, library browsing
Emby Now playing, recently added, continue watching, library browsing
Bazarr Wanted subtitles for movies & episodes, history, on-demand subtitle search
Glances Server CPU, RAM, disk, and network stats

Features

  • Unified dashboard — All your services at a glance with customizable, reorderable cards
  • Multi-instance support — Run two qBittorrents, split 4K and 1080p Radarrs, or any combination — switch in-tab and aggregate on the dashboard
  • Dark mode only — Designed for OLED screens and late-night browsing
  • Auto network switching — Detects your home WiFi SSID and switches between local/remote URLs automatically
  • Per-service configuration — Enable only the services you use; tabs auto-hide for disabled services
  • Secure storage — API keys stored in the device's secure enclave via expo-secure-store
  • Wake-on-LAN — Wake your server from the app when it's asleep
  • Pull-to-refresh — On every screen
  • Config import/export — Back up and restore your entire configuration (with biometric auth)
  • Adjustable UI scale — 1.0 / 1.15 / 1.3 for accessibility and larger displays
  • No backend required — Pure client architecture for core functionality; your data stays between your phone and your servers
  • Optional self-hosted backend — Enable real push notifications by running the companion backend on your server (Node.js or Docker)

Download

iOS — App Store

Dashboarr is now available on the Apple App Store: Dashboarr on the App Store

Android — Play Store

Dashboarr is now available on the Google Play Store: Dashboarr on Google Play

Android — Direct APK (de-Googled / sideload)

If you're running a de-Googled Android (GrapheneOS, LineageOS, /e/OS, etc.) or just prefer to sideload, the signed APK for every release is attached to the matching tag on the Releases page.

  1. Download app-release.apk from the latest release
  2. Open it on your device — Android will prompt you to allow installs from your browser/file manager
  3. Updates are manual: there is no in-app updater for sideloaded installs, so check the Releases page periodically (or watch the repo)

The APK is signed with the same keystore as the Play Store build, so you can install it side-by-side or migrate from Play without losing data — but you cannot mix the two on the same device.

Getting Started

Prerequisites

Installation

# Clone the repo
git clone https://github.com/renzobeux/dashboarr.git
cd dashboarr

# Install dependencies
pnpm install

# Start the dev server
pnpm start

Scan the QR code with Expo Go on your device, or press a for Android emulator / i for iOS simulator.

Building for Production

# Android (EAS Build)
pnpm build:android

# iOS (EAS Build)
pnpm build:ios

# Android local production build — produces both AAB (Play Store) and APK (sideload)
pnpm build:android:prod

# Upload the locally-built APK to the GitHub Release matching package.json version
# (creates the release with auto-generated notes if it doesn't exist yet)
pnpm release:android:apk

# Build + upload in one go
pnpm release:android

The release:* scripts require the GitHub CLI (gh) to be installed and authenticated against the repo. The APK is read from android/app/build/outputs/apk/release/app-release.apk and uploaded to the tag v<version> from package.json.

Backend (Optional — Push Notifications)

Dashboarr works fully without a backend. If you want real push notifications delivered to your phone's lock screen — torrent completed, new episodes grabbed, request approved, service offline — you can self-host the lightweight companion backend.

The backend polls your services and ingests their webhooks, then fires Expo pushes to every paired device. It pairs with your phone via QR code (no accounts) and supports multiple instances per service kind.

For setup, configuration, environment variables, webhook URLs, and per-instance push attribution, see the backend README.

Configuration

All service configuration is done in the Settings tab within the app:

  1. Enable the services you use
  2. Enter each service's local URL, remote URL, and API key
  3. Optionally set your home WiFi SSID for automatic local/remote URL switching
  4. Reorder dashboard cards by entering edit mode on the dashboard

Using Dashboarr with Tailscale (or any VPN)

Tailscale works great with Dashboarr. The trick is to address each service by its Tailscale name or IP (the 100.x.x.x address, or a MagicDNS name like radarr.your-tailnet.ts.net) instead of its plain LAN IP. Tailscale addresses are reachable from anywhere, so Dashboarr never treats them as offline when you leave your home WiFi.

Pick whichever fits you:

  • Simplest (works everywhere): turn on Always use Remote URL, then put your Tailscale address in the Remote URL field (leave Local URL empty). One address that works on WiFi and on cellular, with no home-network setup needed.
  • Fast at home, Tailscale away:
  • Set Local URL to the plain LAN address (e.g. http://192.168.1.50:7878)
  • Set Remote URL to the Tailscale address (e.g. http://100.x.x.x:7878)
  • Add your home WiFi under Settings → Home Networks, turn on auto-switch, and leave Always use Remote URL off

At home Dashboarr uses the direct LAN URL; away it uses Tailscale. - VPN that routes your LAN (WireGuard, OpenVPN, Tailscale subnet router): if your tunnel makes the plain 192.168.x addresses reachable from anywhere, you have two options. With Auto-switch network off, nothing to configure: Dashboarr always uses the Local URL and, while a VPN is connected, no longer marks private addresses offline. With auto-switch on, also enable Settings → Treat VPN as home (the toggle appears once auto-switch is on): while any VPN is connected, Dashboarr behaves as if you were on your home WiFi and uses the local URLs directly. The app can only detect that a VPN is up, not which one, so enable this only if your VPN reaches your home network.

Without a VPN connected, avoid putting a 192.168.x or 10.x address in the Remote URL slot. Private LAN addresses can't be reached over mobile data, so Dashboarr marks them offline when you're off WiFi (when a VPN is connected it will still try them). If you only reach your server through a Tailscale subnet router (so it has no 100.x address of its own), this VPN handling covers you; alternatively, install Tailscale directly on that server so it gets its own Tailscale address.

Project Structure

app/                  # Expo Router file-based routing
  (tabs)/             # Bottom tab screens (dashboard, movies, tv, etc.)
  movie/              # Movie detail & search screens
  series/             # Series detail & search screens
  torrent/            # Torrent detail screen
  sab/                # SABnzbd job detail screens
  nzb/                # NZBGet job detail screens
backend/
  dashboarr-backend/  # Self-hosted companion server (Fastify + SQLite)
components/
  ui/                 # Reusable UI primitives (cards, buttons, inputs, toggles)
  common/             # Shared layout components (screen wrapper, pull-to-refresh)
  dashboard/          # Dashboard card components
  downloads/          # Unified downloads list (qBittorrent + SABnzbd + NZBGet)
  qbittorrent/        # qBittorrent-specific components
  radarr/             # Radarr-specific components
  sonarr/             # Sonarr-specific components
  overseerr/          # Seerr-specific components (folder name kept for back-compat)
  settings/           # Settings screen components
services/             # Raw API clients for each service
hooks/                # TanStack Query wrappers (caching, polling, mutations)
store/                # Zustand stores + AsyncStorage/SecureStore helpers
lib/                  # Types, utils, constants, HTTP client, Wake-on-LAN
plugins/              # Custom Expo config plugins (Android signing)

Tech Stack

Layer Technology
Framework Expo SDK 54 (React Native 0.81)
Routing Expo Router v6
Styling NativeWind v4 (Tailwind CSS)
Data fetching TanStack Query v5
State management Zustand v5
Secure storage expo-secure-store
Icons lucide-react-native
Language TypeScript (strict mode)

Roadmap

See TODO.md for planned features and ideas.

Contributing

Contributions are welcome! Feel free to open issues and pull requests.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Support Development

Dashboarr is free and open source under GPL-3.0. If you find it useful, you can support continued development on Ko-fi:

Support on Ko-fi

Every coffee helps cover Apple Developer fees and time spent adding new services!

License

This project is open source. See the LICENSE file for details.

Acknowledgments

  • nzb360 — The original inspiration for this project
  • The *arr stack community for building incredible self-hosted media tools

Star History

Star History Chart

Extension points exported contracts — how you extend this code

TracearrUser (Interface)
* Tracearr "JSON Webhook" notification agent payload. Every event arrives as * `{ event, timestamp, data }`; the `data`
backend/dashboarr-backend/src/routes/webhooks/tracearr.ts
HomeNetworkLike (Interface)
Minimal shape a home-network entry needs for validation — kept structural so * this module doesn't import the store (a
lib/wifi.ts
JellystatRequestOptions (Interface)
* JellyStat is a Jellyfin statistics server (analogous to Tautulli for Plex). * Its REST API lives at the server root (
services/jellystat-api.ts
InsecureTlsNativeModule (Interface)
(no doc)
modules/insecure-tls/index.ts
AddMovieSheetProps (Interface)
(no doc)
components/radarr/add-movie-sheet.tsx
SeriesOptionsSheetProps (Interface)
(no doc)
components/sonarr/series-options-sheet.tsx
WorkspaceIntroOverlayProps (Interface)
(no doc)
components/onboarding/workspace-intro-overlay.tsx
PosterImage (Interface)
(no doc)
components/search/media-search-result-card.tsx

Core symbols most depended-on inside this repo

useInstanceTarget
called by 190
hooks/use-instance-target.ts
serviceRequest
called by 146
lib/http-client.ts
validateExportPayload
called by 125
store/config-schema.ts
migrateConfig
called by 107
store/config-migrations.ts
toast
called by 98
components/ui/toast.tsx
open
called by 92
lib/modal-flow.ts
setJSON
called by 67
store/storage.ts
toastError
called by 62
components/ui/toast.tsx

Shape

Function 1,718
Interface 448
Method 51
Class 23

Languages

TypeScript99%
Kotlin1%

Modules by API surface

lib/types.ts128 symbols
store/config-store.ts40 symbols
services/overseerr-api.ts37 symbols
services/qbittorrent-api.ts35 symbols
services/sonarr-api.ts32 symbols
hooks/use-overseerr.ts30 symbols
services/lidarr-api.ts29 symbols
services/transmission-api.ts26 symbols
services/radarr-api.ts25 symbols
hooks/use-sonarr.ts25 symbols
backend/dashboarr-backend/src/workers/transitions.ts23 symbols
app/dashboard-edit/[id].tsx23 symbols

For agents

$ claude mcp add Dashboarr \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page