A collection of installer scripts for integrating additional applications into Swizzin, a self-hosted media server management platform.
| Script | Application | Description |
|---|---|---|
| sonarr.sh | Sonarr | Multi-instance Sonarr manager (4k, anime, etc.) |
| radarr.sh | Radarr | Multi-instance Radarr manager (4k, anime, etc.) |
| cleanuparr.sh | Cleanuparr | Download queue cleanup for *arr apps |
| decypharr.sh | Decypharr | Encrypted file/torrent management via rclone and qBittorrent |
| notifiarr.sh | Notifiarr | Notification relay client for *arr apps and Plex |
| plex.sh | Plex | Extended Plex installer with subdomain support |
| emby.sh | Emby | Extended Emby installer with subdomain and Premiere bypass |
| jellyfin.sh | Jellyfin | Extended Jellyfin installer with subdomain support |
| organizr.sh | Organizr | Extended Organizr installer with subdomain and SSO support |
| seerr.sh | Seerr | Media request platform (Overseerr fork) |
| byparr.sh | Byparr | FlareSolverr alternative for bypassing anti-bot protections |
| flaresolverr.sh | FlareSolverr | Proxy server to bypass Cloudflare protection |
| huntarr.sh | Huntarr | Automated media discovery for Sonarr, Radarr, Lidarr, etc. |
| subgen.sh | Subgen | Automatic subtitle generation using Whisper AI |
| zurg.sh | Zurg | Real-Debrid WebDAV server with rclone mount |
| lingarr.sh | Lingarr | Extended Lingarr installer with subdomain support (Docker-based) |
| stremthru.sh | StremThru | Debrid streaming proxy with store management |
| mediafusion.sh | MediaFusion | Stremio/Kodi add-on with Torznab API for Prowlarr |
| zilean.sh | Zilean | DMM hashlist Torznab indexer for debrid content |
| nzbdav.sh | NzbDav | NZB-to-WebDAV bridge for debrid download clients |
| newtarr.sh | Newtarr | Media library search tool (ElfHosted Huntarr fork) |
| dns-fix.sh | - | Fix DNS issues for FlareSolverr/Byparr cookie validation |
| watchdog/ | - | Service watchdog with health checks and auto-restart |
| backup/ | - | BorgBackup-based backup system for any SSH borg server |
| swizzin-app-info | - | Discover installed apps and extract URLs, API keys, config paths |
- A working Swizzin installation
- Root access to the server
- Internet connectivity for downloading dependencies
# Switch to root
sudo su -
# Download the script
wget https://raw.githubusercontent.com/STiXzoOR/swizzin-scripts/main/<script>.sh
# or
curl -O https://raw.githubusercontent.com/STiXzoOR/swizzin-scripts/main/<script>.sh
# Make executable and run
chmod +x ~/<script>.sh
~/<script>.shMulti-instance Sonarr manager. Installs the base Sonarr app if needed, then allows adding named instances (e.g., 4k, anime, kids).
# Install base + add instances interactively
bash sonarr.sh
# Add a specific instance
bash sonarr.sh --add 4k
# List all instances
bash sonarr.sh --list
# Remove instances (interactive)
bash sonarr.sh --remove
# Remove specific instance
bash sonarr.sh --remove 4k
# Remove without prompts
bash sonarr.sh --remove 4k --forceInstance naming: Alphanumeric only (e.g., 4k, anime, kids, remux)
Per-instance files:
- Config:
/home/<user>/.config/sonarr-<name>/ - Service:
sonarr-<name>.service - Access:
https://your-server/sonarr-<name>/
Note: Base Sonarr is installed via box install sonarr. Instances share the binary at /opt/Sonarr/ but have separate configs and ports.
Multi-instance Radarr manager. Installs the base Radarr app if needed, then allows adding named instances (e.g., 4k, anime, kids).
# Install base + add instances interactively
bash radarr.sh
# Add a specific instance
bash radarr.sh --add 4k
# List all instances
bash radarr.sh --list
# Remove instances (interactive)
bash radarr.sh --remove
# Remove specific instance
bash radarr.sh --remove 4k
# Remove without prompts
bash radarr.sh --remove 4k --forceInstance naming: Alphanumeric only (e.g., 4k, anime, kids, remux)
Per-instance files:
- Config:
/home/<user>/.config/radarr-<name>/ - Service:
radarr-<name>.service - Access:
https://your-server/radarr-<name>/
Note: Base Radarr is installed via box install radarr. Instances share the binary at /opt/Radarr/ but have separate configs and ports.
Automates cleanup of stalled, incomplete, or blocked downloads from your *arr applications. From the creators of Huntarr.
# Optional: Set custom owner (defaults to master user)
export CLEANUPARR_OWNER="username"
bash cleanuparr.sh
# Remove (will ask about purging config)
bash cleanuparr.sh --removeAccess: https://your-server/cleanuparr/
Config: /opt/cleanuparr/config/cleanuparr.json
Features:
- Removes stalled, incomplete, or malicious downloads
- Blocks problematic torrents across supported services
- Triggers automatic searches to replace deleted content
- Supports Sonarr, Radarr, Lidarr, Readarr, Whisparr
- Supports qBittorrent, Transmission, Deluge, uTorrent
Manages encrypted files and torrents using rclone integration with qBittorrent.
# Optional: Set custom owner (defaults to master user)
export DECYPHARR_OWNER="username"
bash decypharr.shAccess: https://your-server/decypharr/
Config: /home/<user>/.config/Decypharr/config.json
Official client for Notifiarr.com - provides notifications and integrations for *arr apps, Plex, and more.
# Optional: Set custom owner
export NOTIFIARR_OWNER="username"
# You will be prompted for your Notifiarr API key during installation
bash notifiarr.shAccess: https://your-server/notifiarr/
Config: /home/<user>/.config/Notifiarr/notifiarr.conf
Login: Username: admin | Password: your API key (can be changed in Profile page)
Extended Plex installer with subdomain support. Installs Plex via box install plex if not installed, optionally converts to subdomain mode.
# Interactive setup (installs Plex, asks about subdomain)
bash plex.sh
# Convert to subdomain mode (prompts for domain)
bash plex.sh --subdomain
# Revert to subfolder mode
bash plex.sh --subdomain --revert
# Complete removal
bash plex.sh --removeSubdomain Access: https://plex.example.com/
Subfolder Access: https://your-server/plex/
Features:
- Interactive domain prompt (or set
PLEX_DOMAINenv var to bypass) - Automatic Let's Encrypt certificate
- Proper X-Plex-* proxy headers for client communication
- Frame-ancestors CSP header for Organizr embedding (if configured)
Extended Emby installer with subdomain support and Emby Premiere bypass. Installs Emby via box install emby if not installed.
# Interactive setup (installs Emby, asks about subdomain and Premiere)
bash emby.sh
# Convert to subdomain mode (prompts for domain)
bash emby.sh --subdomain
# Revert to subfolder mode
bash emby.sh --subdomain --revert
# Enable Emby Premiere bypass
bash emby.sh --premiere
# Disable Emby Premiere bypass
bash emby.sh --premiere --revert
# Complete removal
bash emby.sh --removeSubdomain Access: https://emby.example.com/
Subfolder Access: https://your-server/emby/
Features:
- Interactive domain prompt (or set
EMBY_DOMAINenv var to bypass) - Automatic Let's Encrypt certificate
- Range/If-Range headers for proper media streaming
- Frame-ancestors CSP header for Organizr embedding (if configured)
Premiere Bypass:
- Intercepts Emby's license validation requests locally
- Creates self-signed certificate for
mb3admin.com - Adds certificate to system CA trust
- Patches
/etc/hoststo redirect validation - Computes and displays Premiere key for reference
Extended Jellyfin installer with subdomain support. Installs Jellyfin via box install jellyfin if not installed.
# Interactive setup (installs Jellyfin, asks about subdomain)
bash jellyfin.sh
# Convert to subdomain mode (prompts for domain)
bash jellyfin.sh --subdomain
# Revert to subfolder mode
bash jellyfin.sh --subdomain --revert
# Complete removal
bash jellyfin.sh --removeSubdomain Access: https://jellyfin.example.com/
Subfolder Access: https://your-server/jellyfin/
Features:
- Interactive domain prompt (or set
JELLYFIN_DOMAINenv var to bypass) - Automatic Let's Encrypt certificate
- WebSocket support via
/socketlocation - WebOS LG TV CORS headers
- Range/If-Range headers for proper media streaming
- Prometheus
/metricsendpoint with private network restrictions
Extended Organizr installer with subdomain and SSO support. Installs Organizr via box install organizr if not installed.
# Interactive setup (installs Organizr, asks about subdomain)
bash organizr.sh
# Convert to subdomain mode (prompts for domain)
bash organizr.sh --subdomain
# Revert to subfolder mode
bash organizr.sh --subdomain --revert
# Modify which apps are protected by SSO
bash organizr.sh --configure
# Fix auth_request placement in redirect blocks
bash organizr.sh --migrate
# Complete removal
bash organizr.sh --removeSubdomain Access: https://organizr.example.com/
Subfolder Access: https://your-server/organizr/
Config: /opt/swizzin-extras/organizr-auth.conf
Features:
- Interactive domain prompt (or set
ORGANIZR_DOMAINenv var to bypass) - Automatic Let's Encrypt certificate
- SSO authentication for selected apps (replaces htpasswd)
- Interactive app selection menu
- Configurable auth levels per app (Admin, User, etc.)
Auth Levels: 0=Admin, 1=Co-Admin, 2=Super User, 3=Power User, 4=User, 998=Logged In
Notes:
- Swizzin's automated Organizr wizard may fail. If Organizr shows the setup wizard, complete it manually at your subdomain URL.
Media request and discovery platform (Overseerr fork) with Plex/Jellyfin integration.
# Interactive setup (prompts for domain)
bash seerr.sh
# Convert to subdomain mode
bash seerr.sh --subdomain
# Revert to direct port access
bash seerr.sh --subdomain --revert
# Complete removal
bash seerr.sh --remove
# Optional: Set custom owner
export SEERR_OWNER="username"Access: https://seerr.example.com/
Config: /home/<user>/.config/Seerr/
FlareSolverr-compatible alternative using Camoufox browser for bypassing anti-bot protections. Used by Prowlarr and other *arr apps.
# Optional: Set custom owner
export BYPARR_OWNER="username"
bash byparr.shPort: 8191 (FlareSolverr default for drop-in compatibility)
Config: /home/<user>/.config/Byparr/env.conf
Prowlarr Setup: Add as FlareSolverr indexer proxy with URL http://127.0.0.1:8191
Note: Byparr and FlareSolverr both use port 8191 - only one can be installed at a time.
Troubleshooting: If you get "cookies not valid" errors, run bash dns-fix.sh to fix DNS resolution issues.
Proxy server to bypass Cloudflare and DDoS-GUARD protection. Used by Prowlarr, Jackett, and other *arr apps to access protected indexers.
# Optional: Set custom owner
export FLARESOLVERR_OWNER="username"
bash flaresolverr.shPort: 8191 (default FlareSolverr port)
Config: /home/<user>/.config/FlareSolverr/env.conf
Prowlarr/Jackett Setup: Add as FlareSolverr indexer proxy with URL http://127.0.0.1:8191
Note: FlareSolverr only supports x64/amd64 architecture. For ARM systems, use Byparr instead. Both use port 8191 - only one can be installed at a time.
Troubleshooting: If you get "cookies not valid" errors, run bash dns-fix.sh to fix DNS resolution issues.
Automated media discovery tool that systematically searches for missing and upgradeable content across your *arr applications.
# Optional: Set custom owner
export HUNTARR_OWNER="username"
bash huntarr.shAccess: https://your-server/huntarr/
Config: /home/<user>/.config/Huntarr/env.conf
Post-Install: Configure your *arr app connections via the web UI.
Automatic subtitle generation for your media library using OpenAI's Whisper AI model. Integrates with Plex, Jellyfin, and Emby via webhooks.
# Optional: Set custom owner
export SUBGEN_OWNER="username"
bash subgen.shWebhook URL: http://127.0.0.1:<port>/webhook
Config: /home/<user>/.config/Subgen/env.conf
Default Settings:
- Model:
medium(balance of speed and accuracy) - Device: auto-detected (
gpuif NVIDIA GPU with drivers found, otherwisecpu) - Format:
srt
Media Server Setup:
- Plex: Settings → Webhooks → Add
http://127.0.0.1:<port>/webhook - Jellyfin: Plugins → Webhook → Add endpoint
- Emby: Server → Webhooks → Add URL
Self-hosted Real-Debrid WebDAV server that mounts your debrid library as a local filesystem using rclone.
# Optional: Set custom owner
export ZURG_OWNER="username"
# You will be prompted for your Real-Debrid API token during installation
bash zurg.shPort: 9999 (WebDAV server)
Mount Point: /mnt/zurg (your Real-Debrid library)
Config: /home/<user>/.config/zurg/config.yml
Services:
zurg.service- The WebDAV serverrclone-zurg.service- The filesystem mount
Get your API token: https://real-debrid.com/apitoken
Usage with *arr apps: Point your *arr applications to /mnt/zurg for accessing Real-Debrid content.
Extended Lingarr installer with subdomain support. Automatic subtitle translation using multiple translation services (LibreTranslate, DeepL, OpenAI, Anthropic, Google, and more). Docker-based application managed via Docker Compose.
# Optional: Set custom owner
export LINGARR_OWNER="username"
# Interactive setup (installs Lingarr, asks about subdomain)
bash lingarr.sh
# Convert to subdomain mode (prompts for domain)
bash lingarr.sh --subdomain
# Revert to subfolder mode
bash lingarr.sh --subdomain --revert
# Update to latest version
bash lingarr.sh --update
# Remove (will ask about purging config)
bash lingarr.sh --remove
# Remove without prompts
bash lingarr.sh --remove --forceSubdomain Access: https://lingarr.example.com/
Subfolder Access: https://your-server/lingarr/
Config: /opt/lingarr/config/
Features:
- Auto-installs Docker Engine + Compose if not present
- Auto-discovers media paths from Sonarr/Radarr (base + multi-instance)
- Auto-discovers Sonarr/Radarr API credentials for integration
- SQLite database (zero configuration)
- Subdomain mode with clean URLs (recommended) or subfolder mode with sub_filter rewriting
- Interactive domain prompt (or set
LINGARR_DOMAINenv var to bypass) - Automatic Let's Encrypt certificate (subdomain mode)
- Frame-ancestors CSP header for Organizr embedding (if configured)
--updateflag pulls latest Docker image and recreates container- Supports 10+ translation backends configurable via web UI
Docker files:
- Compose:
/opt/lingarr/docker-compose.yml - Service:
lingarr.service(systemd wrapper for Docker Compose)
Post-Install: Configure your preferred translation service via the Lingarr web UI.
Fixes DNS resolution issues that can cause "cookies not valid" errors when using FlareSolverr or Byparr with Jackett indexers.
# Check current DNS status
bash dns-fix.sh --status
# Apply full fix (configure public DNS, optionally disable IPv6)
bash dns-fix.sh
# Only disable IPv6 (no DNS changes)
bash dns-fix.sh --disable-ipv6
# Re-enable IPv6
bash dns-fix.sh --enable-ipv6
# Revert all changes to original configuration
bash dns-fix.sh --revertWhat it does:
- Configures system to use public DNS (8.8.8.8, 1.1.1.1)
- Optionally disables IPv6 (can cause resolution mismatches)
- Backs up original configuration
- Automatically restarts affected services (byparr, flaresolverr, jackett)
When to use: If Jackett reports "The cookies provided by FlareSolverr are not valid" when testing indexers.
Monitors services via process state and HTTP health checks, automatically restarts unhealthy services with cooldown protection, and sends notifications.
# Interactive setup (installs watchdog for Emby)
bash watchdog/emby-watchdog.sh
# Install watchdog
bash watchdog/emby-watchdog.sh --install
# Show current status
bash watchdog/emby-watchdog.sh --status
# Clear backoff state, resume monitoring
bash watchdog/emby-watchdog.sh --reset
# Remove watchdog
bash watchdog/emby-watchdog.sh --removeHow it works:
- Cron runs every 2 minutes
- Checks process state (
systemctl is-active) - Checks HTTP health endpoint (configurable URL + expected response)
- If unhealthy, restarts the service
- Rate-limited: max 3 restarts per 15 minutes
- Enters backoff mode if max restarts exceeded
- Sends notifications (Discord, Pushover, Notifiarr, email)
Notifications: During installation, you'll be prompted to configure notification channels. All are optional - leave empty to skip.
Repository files:
watchdog/
├── watchdog.sh # Generic watchdog engine
├── emby-watchdog.sh # Emby-specific installer/manager
└── configs/
├── watchdog.conf.example # Global config template
└── emby-watchdog.conf.example # Emby config template
Runtime files (on server):
| File | Purpose |
|---|---|
/opt/swizzin-extras/watchdog.sh |
Generic watchdog engine |
/opt/swizzin-extras/watchdog.conf |
Global config (notifications) |
/opt/swizzin-extras/watchdog.d/emby.conf |
Emby-specific config |
/var/log/watchdog/emby.log |
Log file |
/etc/cron.d/emby-watchdog |
Cron job |
Status output example:
Emby Watchdog Status
━━━━━━━━━━━━━━━━━━━━
Service: emby-server (active)
Health: http://127.0.0.1:8096/emby/System/Info/Public (OK)
Restarts: 0/3 in current window
State: monitoring
Adding other services: The watchdog engine is generic. Copy watchdog/emby-watchdog.sh, adjust SERVICE_NAME, HEALTH_URL, and HEALTH_EXPECT for your target service (Plex, Jellyfin, etc.).
BorgBackup-based backup system supporting any SSH-accessible borg server (Hetzner Storage Box, Rsync.net, BorgBase, self-hosted).
# Copy backup folder to server and run interactive setup wizard
cd backup/
bash swizzin-backup-install.sh
# Or manually install files and configure
cp swizzin-backup.sh /usr/local/bin/ && chmod +x /usr/local/bin/swizzin-backup.sh
cp swizzin-restore.sh /usr/local/bin/ && chmod +x /usr/local/bin/swizzin-restore.sh
# ... (see backup/README.md for full manual setup)
# Run backup manually
swizzin-backup.sh
# Dry run - show what would be backed up
swizzin-backup.sh --dry-run
# List archives
swizzin-backup.sh --list
# Show discovered services
swizzin-backup.sh --services
# Restore (interactive wizard)
swizzin-restore.sh
# Restore single app
swizzin-restore.sh --app sonarr
# Mount archive for browsing
swizzin-restore.sh --mountSupported backup targets:
- Hetzner Storage Box
- Rsync.net
- BorgBase
- Self-hosted (any Linux server with borg installed)
Features:
- Automatic service stop/start for consistent SQLite backups
- Multi-instance app support (sonarr-4k, radarr-anime, etc.)
- Zurg
.zurgtorrentfile backup for Real-Debrid setups /mnt/symlinksbackup for *arr root folder symlinks- Notifications via Discord, Pushover, Notifiarr, email
- Healthchecks.io integration
- GFS retention: 7 daily, 4 weekly, 6 monthly, 2 yearly
- Encrypted, deduplicated backups via BorgBackup
What gets backed up:
- Swizzin core, nginx, Let's Encrypt, systemd, cron
- All *arr apps (configs, databases, multi-instance)
- Media servers (Plex, Emby, Jellyfin - config + DB only)
- Custom apps (Notifiarr, Decypharr, Zurg, Huntarr, etc.)
- Zurg
.zurgtorrentfiles and *arr root folder symlinks
What's excluded:
- Zurg data directory (except
.zurgtorrentfiles) - Media server caches and transcodes
- Remote mounts (
/mnt/zurg/,/mnt/remote/) - Application binaries (regenerable)
Restore modes:
- Full restore - rebuild entire server
- App restore - single app with service management
- FUSE mount - browse and extract specific files
- Extract path - extract specific directory to staging
See backup/README.md for full documentation including setup wizard, service management, and troubleshooting.
A utility that discovers all installed Swizzin apps and extracts configuration details including URLs, API keys, and config file paths. Useful for automation, documentation, and debugging. Installable as a global command.
# Install globally (run once)
wget https://raw.githubusercontent.com/STiXzoOR/swizzin-scripts/main/swizzin-app-info
chmod +x swizzin-app-info
sudo ./swizzin-app-info --install
# Now use from anywhere:
swizzin-app-info # List all installed apps
swizzin-app-info --json # Output as JSON (for scripting)
swizzin-app-info --app sonarr # Show info for a specific app
swizzin-app-info --verbose # Include config file paths
# Uninstall
sudo swizzin-app-info --uninstallExample output:
App URL API Key
--------------------------------------------------------------------------------
radarr http://localhost:7878/radarr a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
sonarr http://localhost:8989/sonarr z9y8x7w6v5u4t3s2r1q0p9o8n7m6l5k4
sonarr-4k http://localhost:10001/sonarr-4k abc123def456ghi789jkl012mno345pq
plex http://localhost:32400 xYz-AbC-123-PlexToken
bazarr http://localhost:6767/bazarr -
notifiarr http://localhost:5454 notifiarr-api-key-here
How it works:
- Discovers installed apps via lock files in
/install/ - Parses app config files (XML, JSON, YAML, INI, TOML, etc.)
- Falls back to nginx config or systemd environment if config not found
- Supports multi-instance apps (sonarr-4k, radarr-anime, bazarr-4k, etc.)
JSON output fields:
{
"app": "sonarr",
"installed": true,
"config_file": "/home/user/.config/Sonarr/config.xml",
"port": "8989",
"baseurl": "/sonarr",
"apikey": "your-api-key-here",
"full_url": "http://localhost:8989/sonarr"
}Supported apps: All *arr apps (Sonarr, Radarr, Lidarr, Readarr, Prowlarr, Bazarr), media servers (Plex, Emby, Jellyfin), download clients (qBittorrent, Deluge, Transmission, NZBGet, SABnzbd), and custom apps from this repo (Cleanuparr, Decypharr, Huntarr, Notifiarr, Zurg, Lingarr, etc.).
Requirements: Python 3.6+ (no external dependencies)
All scripts now use interactive prompts for required values. Environment variables can be used to bypass prompts for automation.
| Variable | Script | Description |
|---|---|---|
PLEX_DOMAIN |
plex.sh | Public FQDN for Plex (bypasses prompt) |
PLEX_LE_HOSTNAME |
plex.sh | Let's Encrypt hostname (defaults to domain) |
PLEX_LE_INTERACTIVE |
plex.sh | Set to yes for interactive LE (CloudFlare DNS) |
EMBY_DOMAIN |
emby.sh | Public FQDN for Emby (bypasses prompt) |
EMBY_LE_HOSTNAME |
emby.sh | Let's Encrypt hostname |
EMBY_LE_INTERACTIVE |
emby.sh | Set to yes for interactive LE |
JELLYFIN_DOMAIN |
jellyfin.sh | Public FQDN for Jellyfin (bypasses prompt) |
JELLYFIN_LE_HOSTNAME |
jellyfin.sh | Let's Encrypt hostname |
JELLYFIN_LE_INTERACTIVE |
jellyfin.sh | Set to yes for interactive LE |
ORGANIZR_DOMAIN |
organizr.sh | Public FQDN for Organizr (bypasses prompt) |
ORGANIZR_LE_HOSTNAME |
organizr.sh | Let's Encrypt hostname |
ORGANIZR_LE_INTERACTIVE |
organizr.sh | Set to yes for interactive LE |
SEERR_DOMAIN |
seerr.sh | Public FQDN for Seerr (bypasses prompt) |
SEERR_LE_HOSTNAME |
seerr.sh | Let's Encrypt hostname |
SEERR_LE_INTERACTIVE |
seerr.sh | Set to yes for interactive LE |
LINGARR_DOMAIN |
lingarr.sh | Public FQDN for Lingarr (bypasses prompt) |
LINGARR_LE_HOSTNAME |
lingarr.sh | Let's Encrypt hostname |
LINGARR_LE_INTERACTIVE |
lingarr.sh | Set to yes for interactive LE |
DN_API_KEY |
notifiarr.sh | Notifiarr.com API key (prompted if not set) |
RD_TOKEN |
zurg.sh | Real-Debrid API token (prompted if not set) |
<APP>_OWNER |
All | Application owner username (defaults to master user) |
All scripts automatically register with the Swizzin panel if installed. Apps appear in the panel with their icons and links.
All scripts support the --remove flag for complete uninstallation:
# Switch to root
sudo su -
# Download the script (if not already present)
wget https://raw.githubusercontent.com/STiXzoOR/swizzin-scripts/main/<script>.sh
# Run with --remove flag
bash <script>.sh --removeThis will:
- Stop and disable all related services
- Remove the application binary/directory
- Remove nginx configuration
- Remove from Swizzin panel
- Remove configuration files
- Clean up lock files
Note: Let's Encrypt certificates are not removed automatically.
Scripts follow a consistent pattern:
- Source Swizzin utilities
- Set application variables (port, paths, etc.)
- Install dependencies and application
- Create systemd service
- Configure nginx reverse proxy (where applicable)
- Register with Swizzin panel
- Create lock file at
/install/.<app>.lock
Media server scripts (plex.sh, emby.sh, jellyfin.sh, organizr.sh, seerr.sh, lingarr.sh) follow a unified pattern:
# Interactive setup - installs app, asks about features
bash <app>.sh
# Convert to subdomain mode
bash <app>.sh --subdomain
# Revert to subfolder mode
bash <app>.sh --subdomain --revert
# Complete removal
bash <app>.sh --removeByparr, Huntarr, and Subgen use uv for Python version and dependency management:
- uv is installed per-user at
~/.local/bin/uv - Applications are cloned to
/opt/<appname> - Systemd runs apps via
uv run python main.py
- Fork the repository
- Create a feature branch
- Use a template from
templates/as your starting point:template-binary.sh- For single-binary applicationstemplate-python.sh- For Python apps using uvtemplate-docker.sh- For Docker Compose applicationstemplate-subdomain.sh- For extended installers with subdomain supporttemplate-multiinstance.sh- For multi-instance managers
- Follow the coding standards in
CLAUDE.md - Test on a Swizzin installation
- Submit a pull request
See CLAUDE.md for detailed coding conventions and architecture documentation.
This project is licensed under the GPL-3.0 License - see the LICENSE file for details.
- Swizzin - The media server management platform
- All the amazing open-source projects these scripts install