# PATCHES.md — Guida al sistema di patch di Fabiodalez Music
> Questo documento descrive come il wrapper Android applica ~50 ottimizzazioni
> sopra l'app web upstream **Monochrome** senza forkare il repo e senza
> produrre merge conflict ad ogni `git pull upstream`.
---
## Sommario
- [TL;DR](#tldr)
- [Architettura a 3 livelli](#architettura-a-3-livelli)
- [Quick start (one-shot build)](#quick-start-one-shot-build)
- [Verifica delle patch (dry-run)](#verifica-delle-patch-dry-run)
- [Elenco completo delle 51 ottimizzazioni](#elenco-completo-delle-51-ottimizzazioni)
- [Come aggiungere una nuova patch upstream](#come-aggiungere-una-nuova-patch-upstream)
- [Debugging: "pattern not found"](#debugging-pattern-not-found)
- [Patch candidate per PR upstream](#patch-candidate-per-pr-upstream)
---
## TL;DR
```bash
# Prima volta (clone + build completo)
git clone https://github.com/monochrome-music/monochrome.git
cd monochrome && git remote rename origin upstream && cd ..
cd fabiodalez-music-android
./fm-build.sh ../monochrome # one-shot: install + build
# Aggiornamento (monochrome già clonato)
./fm-build.sh ../monochrome
# Solo verifica che le patch funzionino ancora (no build, no npm install)
./verify-patches.sh ../monochrome
```
L'APK finale viene copiato in `monochrome/Monochrome-debug.apk`.
---
## Architettura a 3 livelli
Il wrapper applica ottimizzazioni su tre livelli differenti, ognuno con un
diverso trade-off tra invasività e robustezza agli aggiornamenti upstream:
```
┌───────────────────────────────────────────────────────────────────┐
│ LIVELLO 1 — File statici del wrapper │
│ (copiati 1:1 in monochrome/android/* tramite install.sh) │
│ │
│ • android/app/src/main/java/com/monochrome/app/*.java (6 file) │
│ • android/app/src/main/AndroidManifest.xml │
│ • android/app/src/main/res/* │
│ • android/app/build.gradle │
│ • capacitor.config.ts │
│ │
│ ▸ Questi file non esistono nell'upstream. L'install li piazza. │
│ ▸ Sono ~40 delle 50 ottimizzazioni (UI, architettura, bug fix). │
└───────────────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────────┐
│ LIVELLO 2 — Hook JS runtime │
│ (android/android-service.js, iniettato come │
│ │
│ ▸ Monkey-patch runtime: navigator.clipboard, window.open, │
│ HTMLAnchorElement.prototype.click, history.pushState │
│ ▸ DOM observer + MutationObserver per highlight search results │
│ ▸ CSS injection tramite