Your media stack, on autopilot.
Self-hosted Servarr and friends automatically configured, connected, secured. One command to rule them all.
flowchart LR
subgraph request["Requests"]
overseerr[Overseerr]
end
subgraph indexing["Indexing"]
flaresolverr[FlareSolverr]
prowlarr[Prowlarr]
end
subgraph trash["TRaSH"]
recyclarr[Recyclarr]
end
subgraph management["Media Management"]
radarr[Radarr]
sonarr[Sonarr]
end
subgraph download["Downloads"]
subgraph vpn["VPN Tunnel"]
gluetun{{Gluetun}}
qbittorrent[qBittorrent]
sabnzbd[SABnzbd]
end
end
subgraph media["Media"]
storage[(Storage)]
plex[Plex]
end
overseerr --> radarr & sonarr
flaresolverr --> prowlarr
prowlarr --> radarr & sonarr
recyclarr -.-> radarr & sonarr
radarr & sonarr --> qbittorrent & sabnzbd
gluetun --- qbittorrent & sabnzbd
qbittorrent & sabnzbd --> storage
radarr & sonarr --> storage
plex --> storage
K8s is a time-sink for homelabs?¶
Sure, Kubernetes has self-healing, scaling, and infrastructure-as-code. But it also wants you to solve VPN routing that doesn't leak, shared storage with hardlinks, and cross-app configuration that survives pod restarts. Copy a million manifests and set up a gitops workflow to have a declarative deployment. Who has time to do all that for a self-hosted home media stack?
Charmarr says hold my beer¶
Charmarr is an open-source collection of Juju charms wrapping your favorite arr apps. It deploys and manages your media stack on Kubernetes while handling the hard parts: VPN routing, storage reconciliation, credential rotation, service discovery, cross-app configuration. And throws in bleeding edge network security for free.
It aims to provide a simple accessible-to-any-homelabber UX, even simpler than setting up docker compose, for bootstrapping an enterprise grade system. All of this within a few minutes that you won't even be able to prepare popcorn before it's done.
Really. The deployment looks like this:
-
Write a 20-line config
variable "wireguard_private_key" { description = "WireGuard private key from your VPN provider" type = string sensitive = true } module "charmarr" { source = "git::https://github.com/charmarr/charmarr//terraform/charmarr?ref=main" model = "charmarr" wireguard_private_key = var.wireguard_private_key vpn_provider = "protonvpn" cluster_cidrs = "10.1.0.0/16,10.152.183.0/24,192.168.0.0/24" storage_backend = "hostpath" hostpath = "/my/gazillion/tb/storage" storage_size = "10000000000000Ti" } -
And just run a one-liner:
And you're done. Charmarr begins autonomously wiring up the apps for you.
Life after¶
-
No more copy-paste API keys
Apps find each other and configure themselves through relations. No more manual copy-pasting of API keys or URLs. Charmarr butlers it all for you.
-
TRaSH Guides, built-in
Built-in clean TRaSH guide profiles using Recyclarr. Easy customization. Just run
juju config radarr trash-profile=remux-web-1080p. -
Privacy first setup
Public traffic stays anonymized always via Gluetun. And protected with a double layered kill switch. Meaning no leaks, ever.
-
Zero-trust ready
Enable Istio Ambient for mTLS and authz firewalls between services, auto-configured from charm relations. Enterprise security, one flag away.
-
It fixes itself
Pod dies? Charmarr reconciles. You sleep. Config drift? Charmarr heals. You chill.
-
Keys rotate themselves
API keys are encrypted at rest. Charmarr rotates them regularly and auto-configures the stack. You can't leak what you don't know.















