Cautious by design, not by chance
The operating cycle is always the same, and simulation is the resting state: the container touches nothing until you ask it twice.
Simulation
Full preview: no real changes, just a log of what would happen.
Review
Read the log and the generated PDF: every proposed rename is there, in black and white.
Apply
The renames are actually carried out and recorded in the journal, line by line.
Rest
Back to simulation: the safe state is the default, always.
annulla_tutto is the full rollback: byte-for-byte restore verified, idempotence confirmed at zero. By design it is reachable only from the docker-compose, never from the phone — the big levers stay away from pockets.Two brains and a remote
TMDB + Wikipedia, with an arbiter
Titles come from TMDB, and episodes are checked against the Wikipedia/Wikidata tables (cache v4). When the sources disagree, the arbiter decides season by season — as with Berlino: S1 from TMDB, S2 from wiki.
Remote from your phone
A mobile-first web UI served by main.py (standard library only, port 8095): buttons for simulate, apply and undo with confirmations, live log and an optional PIN on the actions that write.
Archive always in sync
With AGGIORNA_ARCHIVIO ("no"/"chiedi"/"si") seasons and episodes missing from the library are flagged with [Renamer] notes that clean themselves up once the missing piece arrives. Atomic writes, backup, idempotent.
A memory of every move
Every rename ends up in rename_journal.jsonl. Configuration is stripped to the bone: TMDB key, IGNORA list and the journal. No panels, no surprises.
The cases that break other renamers
The August 2026 certification goes through here: three notoriously hostile series, solved and tested.
Dragon Ball Z
Absolute numbering recognized even in a flat folder: no phantom seasons. And for Dragon Ball 1986, double titles "X a.k.a. Y" — excludable via IGNORA.txt.
Berlino
Empty cells at the end of the wiki table no longer throw the parser off; the arbiter combines the two sources and each season takes its titles from the most reliable one.
Heidi
Among the many namesake "Heidi" entries, disambiguation uses the local folder structure and vetoes the sibling series: "La serie animata" (the animated series) wins.
Your library, with the names it deserves.
Replace main.py and the two compose files, restart the container and run the first simulation: the log will tell you everything before anything happens.
Start with the simulation