docs: document poster_cleanarr stale-duplicate cleanup (3rd cleaner), scan API, and UI pills/checkboxes
docs: rewrite wiki for readability — validated against source, restructured nav, instructional voice
docs(asset_renamerr): media-level support matrix — season logos vs backgrounds
docs(asset_renamerr): spell out local naming convention + Plex/Kometa capability matrix
docs: sync wiki with develop — remove unimplemented options, document real ones, add cl2k_maker
- nohl: source_dirs mode is scan|resolve (was movie|series)
- health_checkarr: drop report_only + Lidarr; describe actual removed-item scope
- border_replacerr: drop skip (holiday-only) — never implemented; document border_workers
- poster_renamerr: orphan_assets_mode belongs to poster_cleanarr
- poster_cleanarr: drop unused sleep; document orphan_instances + orphan_ignore_titles
- plex_maintenance: document new dry_run plus sleep/timeout
- sync_gdrive verbose, asset_renamerr print_only_renames, unmatched_assets dict-form instances
- new cl2k_maker section in Modules + Configuration
- Developer-API: document /api/cache endpoints with new pagination
- install docs: image PUID/PGID default 100:99, Python 3.9+, Node 24.16+
- dry_run note: unmatched_assets and nestarr are report-only (no flag)
docs(asset): drop project-key support; reword clear logos -> logos; fix stale TMDB mention
docs(asset): clarify fanart.tv needs only a personal key (no project key)
docs(asset): switch logos/backgrounds source from TMDB to fanart.tv
Document the fanart.tv source for asset_renamerr (likes-ranked clear
logos + backgrounds, personal key requirement, tmdb->fanart migration),
the optional FANART_PROJECT_API_KEY env var, and a fanart.tv credit.
docs: document the strict Plex|Kometa apply_method across modules
- poster_renamerr: add apply_method (kometa default), document the either/or
behavior and that add_posters only applies on the plex path
- asset_renamerr: rename direct -> plex (legacy direct still accepted),
tmdb_language is now a list, add per-instance add_posters to the example
- Kometa-Integration: clarify kometa vs plex are mutually exclusive; fix the
now-incorrect "uploads after copying into destination_dir" note
- Webhooks: the webhook pipeline's final step follows apply_method
docs: cover asset_renamerr + upload tuning + Needs Review/manual matching
- Modules: new asset_renamerr section (clear logo / square art / background;
local + TMDB sources; direct vs kometa apply matrix; chaining via
run_asset_renamerr; idempotency). poster_renamerr config gains
run_asset_renamerr + upload_delay_ms. Count 13 → 14.
- Home: feature blurb + module count.
- Kometa-Integration: logos/backgrounds via asset directory (Kometa reads
logo/background; season naming; square art is direct-only).
- Webhooks: season-aware "wait for Plex to scan" before applying season posters.
- UI-Guide: /poster/unmatched Needs Review tabs — Choose a poster (immediate
apply + lock), Approve, Ignore/Restore; Asset Renamerr settings page.
docs(matching): clarify poster matching uses *arr API, not media folder names
Add a 'How matching works' section to poster_renamerr in Modules.md and an FAQ
entry explaining that match quality comes from *arr metadata + poster-set
naming, not your media folder/file names (TRaSH scheme, Season 1 vs Season 01,
{tvdb-}/{tmdb-} in folders all make no difference to matching).
docs: clarify source_dirs priority (bottom-of-list wins)
docs: heartbeat helper, progress reporting, migration system
UI-Guide:
- /logs: describe the Hide Heartbeat toggle behaviour (now backed by
the [hb] marker, not a frontend regex), per-line search semantics,
per-character match highlighting, and the debug pill's accent
colour distinguishing on/off.
Modules:
- unmatched_assets: clarify that Sonarr seasons use episodeFileCount
(files on disk) for the has_content gate, not episodeCount (aired
episodes); the per-season monitored flag now propagates correctly
so ignore_unmonitored honours per-season decisions; Discord copy-
to-clipboard links directly at the season page when exactly one
season is missing.
Developer-Guide / Writing a new module:
- _report_progress() helper — when to wire it, how to allocate the
0..100 range across phases, link to poster_renamerr as reference.
- logger.heartbeat() — what to use it for, how it interacts with the
Hide Heartbeat toggle.
- _apply_once() one-shot data migrations — naming convention, the
schema_migrations gating table, atomic commit guarantee.
docs(modules,ui): expand unmatched_assets section + Statistics page
- Modules.md: document the actual filtering pipeline (matched=0, status
blocklist, has_content gate, ignore lists), explain where to act on
the report (Statistics page) and the Discord copy-paste request button
with TVDb fallback behaviour
- UI-Guide.md: describe the three unmatched-asset tables now visible on
/poster/statistics and the per-row Request button
docs(poster_cleanarr): document orphan-asset cleanup + pending-deletion ledger rename
- Modules: rewrite the poster_cleanarr section to cover both passes (bloat
+ orphan-asset) with a clear contrast against the Unmatched Assets module.
Update poster_renamerr's run_cleanarr -> clean_orphan_assets toggle.
- Configuration: add orphan_assets_* + asset_dirs to the example.
- Webhooks: rename 'orphaned-poster count' -> 'pending-deletion count' in
the /webhooks/cleanarr/{status,process} descriptions (URLs unchanged).
- Developer-API: pending-deletion queue terminology in /posters/stats and
/system/cleanup-candidates descriptions.
- Troubleshooting: split the 'poster_cleanarr does nothing' answer into
bloat vs. orphan-asset modes.
docs: Border Replacerr settings split between Module Settings and the Border Replacerr page
Mirrors the chub@59911cf refactor — Module Settings now holds only the
non-visual knobs and the holiday name/schedule list; default colors,
per-holiday colors, and the bundled/custom border picker live on the
Border Replacerr page next to the live preview.
- Adds a 'Where each setting lives in the UI' table at the top of the
border_replacerr section explaining the split and the rationale (keep
the basic 'strip the 26px white border' flow uncluttered).
- Updates the custom-border workflow to mention the new thumbnail picker
instead of telling users to edit the borders: list directly. (The YAML
path still works — both routes write the same config field.)
docs(border_replacerr): expand custom-PNG guide with full slug table
Adds the full 13-holiday folder-slug table, exact PNG technical specs
(dimensions, transparent center coordinates, RGBA requirement),
naming convention for the borders: config list (with/without .png),
and a 5-step quick workflow for adding a custom border.
docs(border_replacerr): image-mode borders + 13-holiday bundled gallery
Documents the new themed-border feature shipped in chub ffcb652:
image mode that composites a decorative PNG per holiday, the 56-border
bundled set across 13 holidays, /config/borders/<holiday>/ override
path, and a YAML example showing color-mode and image-mode side by
side.
docs: document poster_cleanarr overlays_only + upgradinatorr count_mode
docs: drop incremental_border_replacerr; clarify border_replacerr; document Border Replacerr preview page
- Modules.md: remove dead incremental_border_replacerr toggle from poster_renamerr example; clarify border_replacerr crops a fixed border_width regardless of color (TPDB white-border standard); rename Skip to Holiday-only mode.
- Configuration.md: surface skip and clarify border_width; convert holiday schedule to range(MM/DD-MM/DD) form.
- UI-Guide.md: document /poster/border-replacerr preview page (live composite gallery + holiday dropdown).
- Developer-API.md: document /api/plex/{instance}/libraries returning {title, type} and the new /api/border-replacerr/* endpoints.
docs: sync with v1.4.1 product state
* Module coverage bumped from 12 to 13 — adds plex_maintenance
(split out of poster_cleanarr to run Plex-side housekeeping on
its own cron). Section added to Modules.md; Home, Credits,
Configuration, Troubleshooting updated to match.
* Fixes poster_cleanarr YAML: removes photo_transcoder,
empty_trash, clean_bundles, optimize_db — those fields live on
plex_maintenance now, not poster_cleanarr, and Pydantic was
silently dropping them from user configs following these docs.
Adds the real fields (local_db, use_existing_db).
* Fixes nestarr YAML: removes the fake dry_run field (not in
NestarrConfig; nestarr is report-only by design).
* Cancellation wording across Modules, Troubleshooting,
Developer-API, FAQ, Credits now reflects reality:
border_replacerr runs to completion (full exception);
plex_maintenance is partial — its PhotoTranscoder loop checks
the cancel flag, but the three Plex-API tasks (empty_trash,
clean_bundles, optimize_db) run to completion since Plex has
no interrupt.
* UI-Guide /poster/manage section now points at /poster/cleanarr
(its actual destination — the old path is a back-compat
redirect), describing the Plex bloat cleanup master-detail UI.
* Developer-API removes POST /api/media/import (endpoint was
dropped intentionally — adding media via CHUB wasn't wanted);
adds GET /api/media/{id}/poster proxy.
* dashboard-light.png captured from the rebranded UI.
Restructure wiki for readability: split install, unify module docs, add Kometa guide
- Add Kometa-Integration page: end-to-end setup between Kometa's
asset_directory and CHUB's poster_renamerr (Docker mount alignment,
PUID/PGID gotchas, verification steps).
- Modules.md: each module now carries its full YAML block next to
the prose (was split across Modules and Configuration). Emoji
anchors for every module with a jump-to TOC at the top.
- Configuration.md: drop per-module YAML (moved to Modules). Keep
top-level blocks (general/auth/instances/schedule/notifications/
user_interface) plus a complete end-to-end example config.yml that
covers every module minimally — previous version was missing
several modules.
- Installation.md: focus on Docker Compose + single-run Docker as
the primary paths. Move Unraid and bare-metal to sibling pages.
- Installation-Unraid.md, Installation-Bare-Metal.md: new sibling
pages with platform-specific guidance (Unraid PUID/GID, systemd
unit for bare metal).
- First-Run.md: new page for post-install setup — admin user,
instance wiring, module enablement, schedule, smoke test, and
the password-reset flow.
- sync_gdrive: replace the inline service-account walkthrough with
a link to the DAPS rclone configuration guide (CHUB uses the same
rclone backend; DAPS's version has screenshots and covers both
service account and OAuth paths).
- Sidebar reorganised with the new pages grouped under Install.
Fix factual errors + add Google SA setup guide
- Nestarr: rewrite description — it's a detection/reporting module
that scans for ARR↔Plex mismatches and nested paths, it does NOT
move items. Config uses library_mappings, not mappings.
- Kometa mount: drop :ro from the Installation examples. Read/write
is required when poster_renamerr runs with action_type: move.
- Developer Guide: correct the AuthMiddleware exempt prefix list
(includes /api/version and static asset paths; webhooks aren't in
the list — they use verify_webhook_secret instead).
- Configuration → sync_gdrive: add full Google service account setup
steps (Cloud Console → IAM & Admin → Service Accounts → key JSON)
so users have an end-to-end path from zero to a working sync.
Rewrite wiki pages to match actual code
- Module cancellation: 11 of 12 modules cooperatively cancel; only
border_replacerr does not (previously claimed 5 of 12).
- poster_cleanarr exposes six modes (report/move/remove/restore/
clear/nothing), not two.
- Fix API paths: media list is /api/media/search, edit is
/{media_id}/metadata; posters list is /api/posters/list; instances
use {instance_id} (not {type}/{name}); system.py router is at /api
prefix with only three routes keeping /system/*.
- Document --reset-auth CLI flag, correct PUID/PGID defaults (100/99),
login rate limiter (0.2/5), SSE token query-param fallback, webhook
debounce (5s via SHA-256 payload hash).
- UI-Guide: correct frontend routes (/media/statistics,
/poster/search/gdrive, etc.) per React Router config.
Flag CHUB-era additions on each module