Documentation

Getting Started with SchröDrive

SchröDrive is the ultimate media automation orchestrator for debrid services. Connect your debrid accounts, indexers, and media servers — then let SchröDrive handle everything automatically.

Part of the Schrödinger's Copy Stack

SchröDrive is the core orchestrator in the Schrödinger's Copy stack. Your media exists in superposition — cloud and local, cached and streamed, everywhere and nowhere — until SchröDrive observes it. Pair it with the SchroDrive Media Manager for intelligent local storage with hardware encoding.

Prerequisites

Docker & Docker Compose

Docker Engine 20.10+ and Docker Compose V2 for container deployment.

Required

Debrid Service Account

At least one of: TorBox, RealDebrid, AllDebrid, Premiumize, Debrid-Link, Deepbrid, Offcloud, Put.io, MegaDebrid, Seedr, or PikPak.

Required

Media Server

Plex, Jellyfin, or Emby for streaming your organised content library.

Required

NVIDIA GPU + Drivers

Required only for Media Manager hardware encoding (NVENC). CPU encoding also supported.

Optional

NVIDIA Container Toolkit

Required for GPU passthrough to Docker containers. Only needed for Media Manager.

Optional

Indexer (Recommended)

Prowlarr or Jackett for automated content discovery and searching.

Optional

Installation — Docker Recommended

Docker is the recommended way to run SchröDrive. Single container, zero external databases.

Quick Docker Run

For a quick test, you can run SchröDrive with a single docker run command:

terminal
bash
docker run -d \
--name schrodrive \
--restart unless-stopped \
-p 8978:8978 \
-p 3000:3000 \
-v /home/user/schrodrive/config:/app/config \
-v /mnt/schrodrive:/mnt/schrodrive:shared \
--cap-add SYS_ADMIN \
--device /dev/fuse \
--security-opt apparmor:unconfined \
-e PROVIDERS=torbox,realdebrid \
-e TORBOX_API_KEY=your_torbox_key \
-e RD_ACCESS_TOKEN=your_rd_token \
-e PLEX_URL=http://plex:32400 \
-e PLEX_TOKEN=your_plex_token \
-e TZ=Australia/Sydney \
ghcr.io/moderniselife/schrodrive:latest

FUSE mounts require --cap-add SYS_ADMIN, --device /dev/fuse, and :shared mount propagation on volume mounts.

Docker Compose

For production deployments, use Docker Compose. Create a docker-compose.yml file:

docker-compose.yml
yaml
1version: "3.9"
2
3services:
4 schrodrive:
5 image: ghcr.io/moderniselife/schrodrive:latest
6 container_name: schrodrive
7 restart: unless-stopped
8 ports:
9 - "8978:8978"
10 - "3000:3000"
11 volumes:
12 - ./config:/app/config
13 - /mnt/schrodrive:/mnt/schrodrive:shared
14 cap_add:
15 - SYS_ADMIN
16 devices:
17 - /dev/fuse
18 security_opt:
19 - apparmor:unconfined
20 environment:
21 # ── Core ──
22 - PROVIDERS=torbox,realdebrid
23 - TZ=Australia/Sydney
24
25 # ── Debrid API Keys ──
26 - TORBOX_API_KEY=your_torbox_key
27 - RD_ACCESS_TOKEN=your_rd_token
28
29 # ── Media Server ──
30 - PLEX_URL=http://plex:32400
31 - PLEX_TOKEN=your_plex_token
32
33 # ── Indexers ──
34 - PROWLARR_URL=http://prowlarr:9696
35 - PROWLARR_API_KEY=your_prowlarr_key
36
37 # ── Request Manager (Seerr / Overseerr / Jellyseerr) ──
38 - SEERR_URL=http://seerr:5055
39 - SEERR_API_KEY=your_seerr_key
40
41 # ── Services ──
42 - RUN_MOUNT=true
43 - RUN_WEBHOOK=true
44 - RUN_POLLER=true
45 - RUN_WEB_GUI=true
46 healthcheck:
47 test: ["CMD", "curl", "-f", "http://localhost:8978/health"]
48 interval: 30s
49 timeout: 10s
50 retries: 3
51 start_period: 30s
Use the Docker Compose Generator

Build a custom configuration tailored to your setup

Installation — Bare Metal

Run SchröDrive directly on your system using Bun.

Install with Bun

terminal
bash
# Clone the repository
$ git clone https://github.com/moderniselife/SchroDrive.git
$ cd SchroDrive
# Install dependencies
$ bun install
# Build the project
$ bun run build
# Run SchröDrive
$ bun dist/index.js serve

Bare metal installation requires Bun to be installed on your system. You'll also need rclone installed separately for FUSE mount functionality.

Environment Variables (Bare Metal)

Create a .env file in the project root or export variables directly:

.env
bash
PROVIDERS=torbox,realdebrid
TORBOX_API_KEY=your_torbox_key
RD_ACCESS_TOKEN=your_rd_token
PLEX_URL=http://localhost:32400
PLEX_TOKEN=your_plex_token
TZ=Australia/Sydney

Configuration

SchröDrive is configured entirely through environment variables. Below is the complete reference, organised by category.

VariableDefaultRequiredDescription
PORT8978OptionalPort for the HTTP API server (and Web GUI when RUN_WEB_GUI=true).
PROVIDERStorbox,realdebridOptionalComma-separated list of enabled debrid providers (torbox, realdebrid, alldebrid, premiumize, debridlink, deepbrid, offcloud, putio, megadebrid, seedr, pikpak). Order is priority.
ADD_STRATEGYallOptionalStrategy for adding content: "all" (add to every provider), "failover" (try first then fallback), "single" (first only).
DATA_DIR./dataOptionalDirectory for SQLite DB and blacklist. Overridden by DB_PATH if set.
TOKEN_RESET_TIMEZONEAustralia/SydneyOptionalTimezone for daily download-token reset (midnight).
VariableDefaultRequiredDescription
TORBOX_API_KEY—OptionalAPI key for TorBox. Required if torbox is in PROVIDERS.
TORBOX_API_BASEhttps://api.torbox.appOptionalBase URL for TorBox API.
TORBOX_WEBDAV_URLhttps://webdav.torbox.appOptionalWebDAV endpoint for TorBox.
TORBOX_WEBDAV_USERNAME—OptionalWebDAV username for TorBox.
TORBOX_WEBDAV_PASSWORD—OptionalWebDAV password for TorBox.
VariableDefaultRequiredDescription
RD_ACCESS_TOKEN—OptionalAccess token for RealDebrid. Required if realdebrid is in PROVIDERS.
RD_API_BASEhttps://api.real-debrid.com/rest/1.0OptionalBase URL for RealDebrid API.
RD_WEBDAV_URLhttps://dav.real-debrid.comOptionalWebDAV endpoint for RealDebrid.
RD_WEBDAV_USERNAME—OptionalWebDAV username for RealDebrid.
RD_WEBDAV_PASSWORD—OptionalWebDAV password for RealDebrid.
VariableDefaultRequiredDescription
ALLDEBRID_API_KEY—OptionalAPI key for AllDebrid.
ALLDEBRID_API_BASEhttps://api.alldebrid.com/v4OptionalBase URL for AllDebrid API.
ALLDEBRID_AGENTschrodriveOptionalUser agent for AllDebrid API requests.
ALLDEBRID_WEBDAV_URL—OptionalWebDAV endpoint for AllDebrid.
ALLDEBRID_WEBDAV_USERNAME—OptionalWebDAV username for AllDebrid.
ALLDEBRID_WEBDAV_PASSWORD—OptionalWebDAV password for AllDebrid.
VariableDefaultRequiredDescription
PREMIUMIZE_API_KEY—OptionalAPI key for Premiumize.
PREMIUMIZE_API_BASEhttps://www.premiumize.me/apiOptionalBase URL for Premiumize API.
PREMIUMIZE_WEBDAV_URLhttps://webdav.premiumize.meOptionalWebDAV endpoint for Premiumize.
PREMIUMIZE_WEBDAV_USERNAME—OptionalWebDAV username for Premiumize.
PREMIUMIZE_WEBDAV_PASSWORD—OptionalWebDAV password for Premiumize.
VariableDefaultRequiredDescription
DEEPBRID_API_KEY—OptionalAPI key for Deepbrid.
DEEPBRID_API_BASEhttps://www.deepbrid.com/apiOptionalBase URL for Deepbrid API.
DEEPBRID_WEBDAV_URL—OptionalWebDAV endpoint for Deepbrid.
DEEPBRID_WEBDAV_USERNAME—OptionalWebDAV username for Deepbrid.
DEEPBRID_WEBDAV_PASSWORD—OptionalWebDAV password for Deepbrid.
VariableDefaultRequiredDescription
OFFCLOUD_API_KEY—OptionalAPI key for Offcloud.
OFFCLOUD_API_BASEhttps://offcloud.com/apiOptionalBase URL for Offcloud API.
OFFCLOUD_WEBDAV_URL—OptionalWebDAV endpoint for Offcloud.
OFFCLOUD_WEBDAV_USERNAME—OptionalWebDAV username for Offcloud.
OFFCLOUD_WEBDAV_PASSWORD—OptionalWebDAV password for Offcloud.
VariableDefaultRequiredDescription
PUTIO_OAUTH_TOKEN—OptionalOAuth token for Put.io.
PUTIO_API_BASEhttps://api.put.io/v2OptionalBase URL for Put.io API.
PUTIO_WEBDAV_URLhttps://webdav.put.ioOptionalWebDAV endpoint for Put.io.
PUTIO_WEBDAV_USERNAME—OptionalWebDAV username for Put.io.
PUTIO_WEBDAV_PASSWORD—OptionalWebDAV password for Put.io.
VariableDefaultRequiredDescription
MEGADEBRID_API_KEY—OptionalAPI key for MegaDebrid.
MEGADEBRID_API_BASEhttps://www.mega-debrid.euOptionalBase URL for MegaDebrid API.
VariableDefaultRequiredDescription
SEEDR_API_KEY—OptionalAPI key for Seedr.
SEEDR_API_BASEhttps://www.seedr.cc/restOptionalBase URL for Seedr API.
SEEDR_WEBDAV_URLhttps://dav.seedr.ccOptionalWebDAV endpoint for Seedr.
SEEDR_WEBDAV_USERNAME—OptionalWebDAV username for Seedr.
SEEDR_WEBDAV_PASSWORD—OptionalWebDAV password for Seedr.
VariableDefaultRequiredDescription
PIKPAK_USERNAME—OptionalUsername for PikPak.
PIKPAK_PASSWORD—OptionalPassword for PikPak.
PIKPAK_API_BASEhttps://api-drive.mypikpak.comOptionalBase URL for PikPak API.
PIKPAK_WEBDAV_URL—OptionalWebDAV endpoint for PikPak.
PIKPAK_WEBDAV_USERNAME—OptionalWebDAV username for PikPak.
PIKPAK_WEBDAV_PASSWORD—OptionalWebDAV password for PikPak.
VariableDefaultRequiredDescription
INDEXER_PROVIDERautoOptionalWhich indexer to use: auto, prowlarr, jackett.
PROWLARR_URL—OptionalURL for Prowlarr (e.g. http://prowlarr:9696).
PROWLARR_API_KEY—OptionalAPI key for Prowlarr.
JACKETT_URL—OptionalURL for Jackett (e.g. http://jackett:9117).
JACKETT_API_KEY—OptionalAPI key for Jackett.
VariableDefaultRequiredDescription
SEERR_URL—OptionalURL for Seerr/Overseerr/Jellyseerr.
SEERR_API_KEY—OptionalAPI key for Seerr/Overseerr/Jellyseerr.
SEERR_AUTH—OptionalOptional webhook auth header for Seerr.
POLL_INTERVAL_S30OptionalSeerr poller interval in seconds.
VariableDefaultRequiredDescription
PLEX_URL—OptionalURL for Plex (e.g. http://plex:32400).
PLEX_TOKEN—OptionalPlex token.
JELLYFIN_URL—OptionalURL for Jellyfin.
JELLYFIN_API_KEY—OptionalAPI key for Jellyfin.
EMBY_URL—OptionalURL for Emby.
EMBY_API_KEY—OptionalAPI key for Emby.
VariableDefaultRequiredDescription
MOUNT_BASE/mnt/schrodriveOptionalBase directory for FUSE mounts. /Volumes/SchroDrive on macOS.
RCLONE_PATHrcloneOptionalPath to rclone binary.
MOUNT_OPTIONS—OptionalFull rclone mount options override. When empty, composed from MOUNT_*.
WEBDAV_BRIDGE_ENABLEDtrueOptionalEnable API-to-WebDAV bridge.
WEBDAV_CACHE_TTL_S30OptionalDirectory listing cache TTL.
WEBDAV_DOWNLOAD_CACHE_TTL_S14400OptionalDownload URL cache TTL (4h).
VariableDefaultRequiredDescription
WEBDAV_MOUNTS_ENABLEDfalseOptionalEnable external WebDAV mounting.
WEBDAV_MOUNTS_FILE/config/webdav.jsonOptionalPath to JSON file for WebDAV mounts.
WEBDAV_MOUNTS—OptionalInline JSON array for WebDAV mounts (fallback).
VariableDefaultRequiredDescription
RUN_MOUNTfalseOptionalEnable rclone FUSE mounts.
RUN_WEBHOOKtrueOptionalEnable Seerr webhook listener.
RUN_POLLERfalseOptionalEnable Seerr API poller.
RUN_WATCHLIST_POLLERfalseOptionalEnable Plex/Jellyfin/Emby watchlist poller.
RUN_DEAD_SCANNER_WATCHfalseOptionalEnable dead link scanner + 3-phase repair.
RUN_ORGANIZER_WATCHfalseOptionalEnable media organiser (symlinks).
ARR_BRIDGE_ENABLEDfalseOptionalEnable fake qBittorrent bridge for *arr.
RUN_WEB_GUIfalseOptionalEnable Next.js dashboard (port 3000).
VariableDefaultRequiredDescription
ARR_BRIDGE_ENABLEDfalseOptionalEnable the *arr bridge.
ARR_BRIDGE_PORT8282OptionalPort for *arr bridge (qBittorrent API).
VariableDefaultRequiredDescription
RD_DOWNLOAD_TOKENS—OptionalAdditional RealDebrid tokens (comma-separated).
TORBOX_DOWNLOAD_TOKENS—OptionalAdditional TorBox keys.
AD_DOWNLOAD_TOKENS—OptionalAdditional AllDebrid keys.
PM_DOWNLOAD_TOKENS—OptionalAdditional Premiumize keys.
DL_DOWNLOAD_TOKENS—OptionalAdditional Debrid-Link keys.
DB_DOWNLOAD_TOKENS—OptionalAdditional Deepbrid keys.
OC_DOWNLOAD_TOKENS—OptionalAdditional Offcloud keys.
PUTIO_DOWNLOAD_TOKENS—OptionalAdditional Put.io tokens.
MD_DOWNLOAD_TOKENS—OptionalAdditional MegaDebrid keys.
SEEDR_DOWNLOAD_TOKENS—OptionalAdditional Seedr tokens.
PIKPAK_DOWNLOAD_TOKENS—OptionalAdditional PikPak tokens.

External WebDAV Mounts New in v0.10.0

Mount third-party WebDAV servers as read-only FUSE filesystems. Configure mounts via a JSON file or inline environment variable. Mounts appear under /mnt/schrodrive/webdav/<name>/

Example webdav.json

Place this file at /config/webdav.json (or set WEBDAV_MOUNTS_FILE to a custom path):

webdav.json
json
1[
2 {
3 "name": "nas-media",
4 "url": "https://nas.example.com/webdav/",
5 "username": "admin",
6 "password": "secret",
7 "skipOrganiser": true
8 },
9 {
10 "name": "seedbox",
11 "url": "https://seedbox.example.com/webdav/",
12 "username": "user",
13 "password": "pass",
14 "skipOrganiser": false
15 }
16]

Inline fallback: If the JSON file is not found, SchröDrive falls back to the WEBDAV_MOUNTS environment variable, which accepts the same JSON array format.

Set skipOrganiser: true (default) to prevent the media organiser from processing pre-sorted content.

Integrations

Request Manager

Seerr (Overseerr / Jellyseerr)

Media request management. Webhook + API polling for automatic content acquisition. Seerr is the merged successor to Overseerr + Jellyseerr — all three are fully supported.

Indexer

Prowlarr

Universal indexer manager. Centralise all your indexers in one place.

Indexer

Jackett

API bridge for your favourite torrent indexers.

Media Server

Plex

Stream your library. Automatic scanning, watchlist integration, and metadata.

Media Server

Jellyfin

Free and open-source media system. Full library management support.

Media Server

Emby

Personal media server with automatic library organisation.

Verify Installation

Health Check

Verify SchröDrive is running correctly with a health check:

terminal
bash
$ curl http://localhost:8978/health
# Expected response:
# {"ok":true,"cloudLinksPreWarm":{"complete":true,"completedAt":"2026-08-15T10:00:00.000Z"}}

Web GUI

Open your browser and navigate to the SchröDrive dashboard:

terminal
bash
# Open in your browser
$ open http://localhost:3000
# Or with curl to verify the GUI is accessible
$ curl -s -o /dev/null -w "%{http_code}" http://localhost:3000
# Expected: 200

You're all set!

SchröDrive is now running. Content will begin appearing in your media server as requests come in through Seerr or the Web GUI. Check the dashboard for real-time status and logs.