diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..62f7085
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,107 @@
+# CLAUDE.md
+
+Zwei eigenstaendige Userscripts, die die phpBB-Seiten von `cs.rin.ru` fuer
+Safari auf iOS in eine mobile Ansicht umbauen. Kein Build, keine
+Abhaengigkeiten, kein `package.json` — die `.user.js`-Dateien sind das Produkt.
+
+| Datei | Greift auf | Zweck |
+|---|---|---|
+| `rin-mobile.user.js` | `*://cs.rin.ru/forum/*` | Themenlisten als Karten |
+| `rin-thread.user.js` | `*://cs.rin.ru/forum/viewtopic.php*` | Thread als Beitragsstrom + Navigationsleiste |
+| `dev/*.dev.user.js` | zusaetzlich `localhost:*` | Loader, binden per `@require file:///` die echten Scripts ein |
+| `dev/viewtopic.php` | — | Fixture: gespeicherter Thread, 1114 Seiten |
+
+## Gemeinsames Muster beider Scripts
+
+Beide sind nach demselben Schema gebaut, Aenderungen am einen sind oft auch am
+anderen faellig:
+
+1. IIFE mit `'use strict'`, `DEBUG`-Flag und `log`-Array ganz oben
+2. Viewport-Meta setzen (idempotent ueber `[data-rm]`)
+3. Kompletter Style-Block als Template-Literal, **bedingungslos** injiziert
+4. `build()` liest das Original-DOM, baut ein neues `div.rm-root`
+5. Alle bisherigen `body`-Kinder bekommen `.rm-hidden`, dann wird `root`
+ angehaengt
+6. `run()` haengt bei `DEBUG` das gruene Overlay oben an
+7. Start ueber `DOMContentLoaded`, falls `readyState === 'loading'`
+
+## Fallen, die nicht aus dem Code hervorgehen
+
+**Beide Stylesheets sind auf Threadseiten gleichzeitig aktiv.**
+`rin-mobile` matcht `*://cs.rin.ru/forum/*`, also auch `viewtopic.php`. Sein
+`build()` steigt dort zwar aus, der Style-Block wird aber vorher injiziert.
+Gleich benannte Klassen kollidieren mit identischer Spezifitaet, entschieden
+wird nach Ladereihenfolge der Userscripts — und die ist nicht garantiert.
+
+- Nur bewusst geteilt: `.rm-root`, `.rm-hidden`, `.rm-dbg`
+- **Offene Kollision:** `.rm-root` hat in `rin-mobile` `padding:0 !important`,
+ in `rin-thread` `padding:0 0 64px 0 !important`. Laedt `rin-mobile` spaeter,
+ faellt die Freihaltung hinter der fixierten Leiste weg. Noch nicht behoben.
+- Neue Klassen im Thread-Script gegen `rin-mobile.user.js` gegenpruefen.
+ `.rm-goto` und `.rm-grid` heissen genau deshalb so — `.rm-jump` und
+ `.rm-pages` waren dort schon belegt.
+
+**Was nach `body` soll, muss nach der Ausblend-Schleife angehaengt werden.**
+Die Schleife markiert *alle* vorhandenen `body`-Kinder mit `.rm-hidden`. Das
+Sheet im Thread-Script wird deshalb erst beim ersten Antippen gebaut — das
+loest das Problem nebenbei mit.
+
+**`Page X of Y` steht als `Page 1 of 1114`
+im Markup.** Ein Grep im Roh-HTML nach `Page 1 of` findet nichts, die Regex auf
+`txt(document.body)` greift trotzdem. Nicht vorschnell fuer kaputt halten.
+
+**`per_page` kommt aus der `jumpto()`-Funktion der Seite**
+(`var per_page = '15';`). Nur damit lassen sich Seiten-URLs als
+`start = (Seite - 1) * per_page` selbst bauen. Die gerenderten Seitenlinks
+taugen nicht als Quelle — phpBB zeigt bei 1114 Seiten nur `1, 2, 3, 4, 5 … 1114`.
+Ohne `per_page` degradiert die Leiste auf erste Seite plus die
+Original-Zurueck/Weiter-Links, das Sheet verschwindet.
+
+**`postRow()` steigt bewusst mehrere `tr` hoch.** Der Beitragstext liegt in
+einer verschachtelten Tabelle, `closest('tr')` trifft die innere Zeile ohne
+Autor- und Profilspalte.
+
+**`DEBUG` steht in beiden Dateien auf `true`** und muss vor dem Ausliefern in
+beiden auf `false`. Die Versionsnummer steht ebenfalls doppelt: im
+`@version`-Header und im Text des Debug-Overlays.
+
+## Testen
+
+Es gibt keine Testsuite. Bewaehrt hat sich ein Wegwerf-Harness mit jsdom im
+Scratchpad (nicht im Repo ablegen — das Projekt soll abhaengigkeitsfrei
+bleiben):
+
+```js
+const dom = new JSDOM(html, { url: 'https://cs.rin.ru/forum/viewtopic.php?f=10&t=68689&start=45' });
+```
+
+Drei Stolpersteine dabei:
+
+- JSDOM parst asynchron fertig. Nach `eval(src)` rund 60 ms warten, sonst hat
+ das Script noch auf `DOMContentLoaded` gewartet und nichts gebaut.
+- `location.href` ist in JSDOM nicht ueberschreibbar. Fuer Navigationstests im
+ eingelesenen Quelltext `location.href = u;` durch einen Hook ersetzen.
+- `requestAnimationFrame` und `scrollIntoView` fehlen und muessen gestubbt
+ werden.
+
+Sinnvolle Faelle: erste Seite, zweite Seite, Mitte, letzte Seite, dazu die
+Degradation ohne `per_page` und ein Thread ohne Paginierung. Fixture-Eckdaten:
+`f=10&t=68689`, `per_page = 15`, 1114 Seiten, letzte Seite `start=16695`.
+
+Am Geraet zu pruefen bleibt, was Blink nicht zeigt: `env(safe-area-inset-*)`,
+fixierte Leisten gegen Safaris ein- und ausfahrende Toolbar,
+`-webkit-backdrop-filter`, Schriftskalierung. Details und die
+Tampermonkey-Einrichtung stehen in der README.
+
+## Konventionen
+
+- **ES5-Stil im Script-Code:** `var`, `function`, keine Arrow Functions, kein
+ `let`/`const`. Template-Literals und `Set` sind in Gebrauch. Keine
+ Transpilation, kein Linter.
+- **Kommentare deutsch, Umlaute als `ae`/`oe`/`ue` transliteriert.** Echte
+ Umlaute nur in Strings und Regexes, die im UI landen.
+- Kommentare begruenden, warum etwas so gebaut ist (welche DOM-Eigenheit von
+ phpBB dahintersteckt), nicht was der Code tut.
+- CSS-Klassen durchgaengig mit `rm-` praefixiert.
+- Neue nutzersichtbare Funktionen in der README dokumentieren — zweisprachig,
+ siehe globale Anweisung.