Setup is first-time only: a complete tree prints the path and exits
(use upgrade, config edit, or uninstall). Incomplete leftovers from a
failed attempt are offered for cleanup. Uninstall is quieter and
remembers earlier install/media paths so stray trees still get found.
Express asks the same question as manual. The pick is stored as
QUALITY_TIER and applied to movies and TV, including Seerr. Compose
up hides sidecar Dockerfile output behind a spinner.
Indexer add-but-not-on is a full sentence. VPN search routing
talks about searches, not Gluetun HTTP proxies. Do not invent
FlareSolverr or paste our own jargon around Prowlarr's error.
Enable Gluetun's HTTP proxy and add it as a Prowlarr indexer proxy
when VPN is on so searches leave via the tunnel, not the host ISP.
Remove the managed proxy when VPN is off. Log the real Prowlarr error
when an indexer can only be saved disabled, instead of always blaming
FlareSolverr.
Keep TV specials when a request covers only regular seasons. Encode
first-run passwords, default missing config-show fields, and strip
Windows CRLF on Python, Dockerfiles, and migrations. Pin express-stack
images. After Sonarr title delete, remove leftover torrents/ dirs even
when qB already dropped the torrent. Document that only the default
stack is supported.
A partial failure used to replace secrets and point at config apply,
which does not retry password changes. Keep the old secrets and ask
for config edit again.
Stop copying cli.sh and a lib subset to ~/.local/bin. Setup and upgrade
write a short wrapper that execs $INSTALL_DIR/cli.sh. Leftover PATH libs
are removed. update-cli now points at upgrade.
Re-wire without replacing compose. Update the shared login on every
UI. Make assemblrr quality profiles the Radarr/Sonarr Add New default.
config edit is picker-only. Forward Seerr Host headers, chmod only the
VPN secrets just written, and ignore Python cache files.
Hold media-purge-watch when *arr shows a queue or upgrade delete.
config edit vpn retargets Radarr/Sonarr qB host and clears tun0 when
VPN is off. Start waits on the service catalog (missing ≠ ready).
Empty indexer confirm no longer wipes Prowlarr. Wire only minSeeders.
Existing-media import is optional.
Recyclarr sync, backup/restore archives, git fetches, and Prowlarr
indexer sync now use wait_while/wait_inline. Compose up/pull keep
their own progress instead of a fake overlay.
vpn-watchdog and media-purge-watch are build-only images; pull_policy
build stops the 'pull access denied' noise. Windows clones left CRLF
in .env.example so config.sh died with $'\\r' on /mnt/e — strip CR
when generating and sourcing .env.
A hung copy onto /mnt/e left the home pointer pointing at ~/assemblrr,
so uninstall --force --media never touched the E: trees. Write
INSTALL_DIRECTORY and MEDIA_DIRECTORY as soon as paths are chosen,
scan mounted drives for leftover assemblrr dirs, time out stuck
USB/WSL I/O, and let r refresh the drive picker (WSL automount).
Pin Recyclarr to ghcr.io/recyclarr/recyclarr:8 (:latest is unpublished)
and write ~/.local/bin into bashrc/zshrc/fish so the early CLI still
works after a failed setup on Arch/WSL. Setup now picks install/media
paths from an fzf list of home plus mounted drives.
Seerr's DELETE /api/v1/media/:id/file is title-scoped and would wipe
every remaining season. For a TV request that is only a subset, the
gateway now deletes those Sonarr episode files and unmonitors them,
then drops the request. Movies and last remaining seasons still use
the title-level cascade.
media-purge --seasons and the inotify watcher match that: a season
path never title-purges (other seasons may only be monitored). qB
cleanup requires a season token, refuses multi-season and S01-03
packs, and uses the same title-boundary rules as title-level. *arr
recycle bin is /data/media/.recycle with 7-day cleanup.
Sonarr uncertainty (missing key, failed episodefile list, empty TV
season list) returns 502 and leaves the request. The gateway mounts
config/sonarr/ as a directory so first install cannot replace
config.xml with a Docker-created directory.
Fire Sonarr refresh once on import complete, skip a second
/Library/Refresh so it cannot cancel a running scan, and heal
series that still show 0 episodes despite video on disk.
Section-based `config edit` (setup vs edit copy), qB Automatic Torrent
Management so category folders are used, upgrade --skip-stack/--skip-wire,
and a port-forwarding warning instead of a provider allowlist.
qBittorrent 5.x does not bind WireGuard's tun0 unless told to, so tracker
and DHT packets left via eth0 and Gluetun dropped them (stalledDL). Bind
the session to tun0 on VPN installs. Build sidecar images on the host
instead of apk at start, move vpn-watchdog off Gluetun's netns, ignore
non-video inotify events, and stop start/upgrade from aborting or
re-prompting.
Explain that the website accepts email but Bazarr/API need the profile
username; reject @-looking usernames and live-test credentials via the
OpenSubtitles REST login before storing secrets.
Remove Portainer from managed compose and catalog; leave a custom.yaml
example for optional use. Upgrade/start use compose --remove-orphans and
migration 002 removes leftover Portainer containers unless custom.yaml
keeps it. Fix setup double URL list when status is unhealthy, share
OpenSubtitles y/N on express, and tone down indexer/provider prompts.
Drop hardcoded subtitle-provider defaults. Wire-up lists providers
from the running Bazarr container and enables only user selections
(plus OpenSubtitles.com when credentials were saved).
Stock Seerr only drops the request row; intercept DELETE /api/v1/request/:id
to cascade media file delete (*arr + purge hooks) before removing the request.
Hardlink-safe cleanup: Seerr/Jellyfin/*arr deletes remove library files and
qB torrents via purge hooks and media-purge-watch. Indexers get seed ratio/time
so completed downloads can leave torrents/. Upgrade always re-wires services;
drop user-facing config sync. Live e2e covers Radarr, Seerr, and Jellyfin APIs.
Unmapped folders under movie/TV roots are looked up and added with the
default quality profile (no search), then rescanned and synced to Bazarr.
Enables Netflix-like reinstall/keep-media and fills Bazarr for disk libraries.
Drop writing ~/assemblrr_services.txt; status now shows live state and
localhost URLs for each service, with --docker for raw compose ps.
Health parsing is fixed under set -e; uninstall cleans legacy txt.
Introduce managed-file apply, ordered migrations, backup-first upgrade CLI,
and migration 001_add_bazarr (skip if user already defined Bazarr). Local
--from uses the same apply path as production git fetch of main.
Ship Bazarr in the core compose stack, wire Sonarr/Radarr/Jellyfin on
config sync, apply TRaSH-style scoring, free multi-provider defaults, and
optional OpenSubtitles.com credentials from setup secrets.
LAN IPs from setup go stale after DHCP or network changes, so
ctrl-click links in assemblrr_services.txt timed out. Prefer
localhost so the saved URLs keep working on the install machine.
Track required vs optional wiring steps with real exit codes, stop
claiming success after partial failures, and note Jellyfin import scan
in the README.
Set the Prowlarr app profile before fullSync, wait for Radarr indexers,
then patch *arr minimumSeeders once. Expand Features & Philosophy to
match the install, CLI, VPN, and quality-profile behavior.
Always sync HD/UHD (and Sonarr WEB) as include packs, name them with
an assemblrr prefix, soften blocking CF scores, zero quality minSize,
relax minimumSeeders, and update Seerr on reconfigure. Document TRaSH
guide drift and tighten comments and uninstall messaging.
Docker creates missing volume parents as root, which broke setup after
the early VPN test (config/ owned by root). Add prepare_install_dirs,
call it before VPN test and full compose up, and reuse it on CLI start.