.
diff --git a/README.md b/README.md
index fa85ad7..0b53ed4 100644
--- a/README.md
+++ b/README.md
@@ -1,168 +1,238 @@
+
+
# ScrollMeter
-ScrollMeter is an Android app that measures how far content moves while you
-scroll across your phone and converts that movement into real-world distance.
+### Kolik toho denně nascrolluješ?
-It uses Android Accessibility scroll events and processes all measurement data
-locally on the device.
+Screen time ti řekne, jak dlouho. ScrollMeter ti ukáže, jak daleko.
+Každé posunutí feedu, článku nebo seznamu sečte a převede na metry a kilometry.
-ScrollMeter measures scroll distance, not the raw physical trajectory of a
-finger across the touchscreen.
+**Zadarmo · bez reklam · bez účtu · bez internetu · Android 10+**
-## Status
+[**⬇️ Stáhnout aplikaci**](../../releases/latest) · [Jak ji nainstalovat](#jak-ji-nainstalovat-za-tři-minuty) · [Jaká oprávnění chce](#jaká-oprávnění-potřebuje) · [Je to bezpečné?](#je-to-bezpečné)
-Project founded 2026-09-23. Phases 0–7 merged (`v0.0` … `v0.7`): bootstrap, measurement proof of concept
-(GO/NO-GO gate), calibration, persistence with optional time in app, dashboard, history and apps, export and
-settings, onboarding with the Play disclosure and English. Phase 8 (release hardening, `v0.8`) adds the signed
-release build, the emulator matrix API 28–36, the battery protocol and the first release `v0.1.0`. Phase 9
-(`v0.9`, release `v0.2.0`) replaces the goal with a daily limit in colour and History + Apps with one
-*Statistiky* screen (ADR-036). The app is for family phones, installed from the APK — not Google Play.
-**Requires Android 10 (API 29) or newer** — Android 9 does not deliver the scroll events (ADR-033).
-Manual on-phone checks still owed are listed under "Dluh ověření" in `handoff.md`. See `PLAN.md` (phases,
-gates) and `handoff.md` (live state).
+
-## Repository map
+---
-| Path | What it is |
-|---|---|
-| `docs/SPEC.md` | The product + technical specification, v1.0 (binding) |
-| `PLAN.md` | Development plan by phases 0–8 with Definition of Done (Czech) |
-| `handoff.md` | Live state: toolchain pins, phase status, decisions log (Czech) |
-| `docs/measurement-model.md` | What scroll distance is, formulas, calibration, fallback, fling |
-| `docs/accessibility-policy.md` | Which Accessibility API we use, what we never read, Play disclosure |
-| `docs/play-listing.md` | Draft Play listing, Accessibility declaration answers, Data safety, privacy policy text, video scenario |
-| `docs/accuracy-testing.md` | Test protocol and the device / app compatibility tables |
-| `docs/architecture.md` | Event pipeline, package layout, threading, data model |
-| `docs/measurement-decisions.md` | ADR log for non-obvious decisions |
-| `docs/prompts/` | Kick-off prompts for coding sessions |
-| `tools/` | `analyze_debug_csv.py` (per-app analysis of debug CSVs), `device_accuracy.py` (adb-driven accuracy tests), `accuracy.py` (ground truth CSV vs measured CSV → MAE, MAPE), `check_manifest_policy.py` / `check_release_apk.py` (what a build may ship), `build_release.sh` (signed release) |
-| `CLAUDE.md` | Rules for coding agents working in this repo |
-
-## Build and run (available from Phase 0)
+## Ve zkratce
-```bash
-./gradlew assembleDebug # build
-./gradlew testDebugUnitTest # JVM unit tests
-./gradlew lintDebug # Android lint
-./gradlew installDebug # install on the connected phone
-```
+- 📏 **Měří vzdálenost scrollování** ve všech aplikacích a ukáže ji v metrech: dnes, za týden, za měsíc.
+- 📴 **Nemá přístup k internetu.** Nemůže nic odeslat, ani kdyby chtěla. Všechno zůstává v telefonu.
+- 🙈 **Nečte, co je na obrazovce.** Dozví se jen „v aplikaci X se obsah posunul o tolik pixelů". Žádné texty, zprávy ani hesla.
+- 👤 **Žádný účet, žádné reklamy, žádná analytika.** Nikdo kromě tebe neví, že ji používáš.
+- 🔓 **Celý kód je veřejný** tady v repozitáři, kdokoliv si může ověřit, co dělá.
+
+## Co uvidíš
+
+
+
+ |
+ |
+ |
+
+
+Přehled dnes proti dennímu limitu |
+Statistiky den, týden, měsíc, po aplikacích |
+Soukromí co čte a co nikdy |
+
+
+
+## Co umí
+
+📊 **Dnes, tento týden, tento měsíc.** Karta *Dnes* ukazuje vzdálenost proti dennímu limitu, který si
+nastavíš sám: zelená, od 70 % oranžová, nad limitem červená. A vždycky i slovy, třeba „Zbývá 80 m z limitu 500 m".
+
+📱 **Po aplikacích.** Kolik metrů v Instagramu, kolik v prohlížeči, kolik ve zprávách. Volitelně i kolik
+času v každé aplikaci trávíš: „Instagram 1,21 km (3 h 40 min)".
+
+🏃 **Srovnání, ať si to představíš.** „To je přibližně délka jednoho běžeckého okruhu." Není to soutěž,
+žádné rekordy ani odznaky. Jen číslo, které ti řekne víc než minuty.
+
+📐 **Kalibrace platební kartou.** Přiložíš kartu k displeji, posuneš čáru na její okraj a měření sedí
+na milimetr tvého konkrétního telefonu. Bez kalibrace se použije odhad podle údajů displeje.
+
+🔔 **Dvě volitelná oznámení.** Když překročíš denní limit, a ráno shrnutí včerejška. Každé nejvýš jednou
+denně, obě jsou ve výchozím stavu vypnutá.
+
+📤 **Export do CSV a smazání jedním tlačítkem.** Data si můžeš kdykoliv vzít do tabulky, nebo je všechna smazat.
+
+🇨🇿 🇬🇧 **Česky i anglicky**, podle jazyka telefonu.
+
+## Co to nedělá
+
+- ❌ **Neblokuje aplikace a nic ti nezakazuje.** Jen měří a ukazuje. Limit je informace, ne zámek.
+- ❌ **Není to rodičovská kontrola.** Nikomu nic nehlásí, data neopustí telefon, na kterém je nainstalovaná.
+- ❌ **Nečte obsah obrazovky.** Neví, co čteš, co píšeš, komu, ani na jaké stránce jsi.
+- ❌ **Neměří dráhu prstu.** Měří, o kolik se posunul obsah. Po švihnutí prstem obsah ještě dojede,
+ takže vzdálenost bývá delší než pohyb prstu. To je záměr: měří se, kolik obsahu ti projelo před očima.
+- ❌ **Neměří všude.** Některé aplikace systému scrollování nehlásí, typicky **YouTube**. V nich ScrollMeter
+ nenaměří nic a přizná to. Čas v aplikaci (když ho povolíš) se u nich ukáže i tak.
+- ❌ **Nezálohuje se do cloudu** a data se nepřenesou na nový telefon. Kdo si je chce odnést, použije export.
+
+---
+
+## Jak ji nainstalovat (za tři minuty)
+
+Aplikace **není v Google Play**, instaluje se ze souboru. Zní to hůř, než to je.
+Potřebuješ **Android 10 nebo novější**.
+
+**1.** V telefonu otevři [**stránku ke stažení**](../../releases/latest) a klepni na soubor
+`scrollmeter-….apk` (ten s koncovkou `.apk`, ne `.aab`).
+
+**2.** Telefon se zeptá, jestli soubor stáhnout → **Stáhnout**.
+
+**3.** Otevři stažený soubor, z lišty oznámení nebo v aplikaci *Soubory* → *Stažené*.
+
+**4.** Android řekne, že z tohohle zdroje instalovat nesmí. Klepni na **Nastavení**, zapni
+**Povolit z tohoto zdroje** a vrať se zpátky.
+
+**5.** **Instalovat** → **Otevřít**.
+
+**6.** Aplikace tě provede úvodem. Na obrazovce *Povolit měření scrollování* si přečti, co bude číst a co ne,
+a klepni na **Rozumím a chci pokračovat** → **Otevřít nastavení zpřístupnění**.
+
+
+
+**7.** V nastavení najdi **ScrollMeter** (bývá v části *Stažené aplikace* nebo *Nainstalované aplikace*)
+a zapni ho. Android ukáže obecné varování, co všechno služby Usnadnění *smějí*. ScrollMeter z toho
+používá jen jedinou věc, viz [oprávnění](#jaká-oprávnění-potřebuje). Potvrď a vrať se do aplikace.
+
+> **Napsal Android „Omezené nastavení"?** Na Androidu 13 a novějším to je normální u každé aplikace
+> nainstalované mimo obchod. Otevři **Nastavení → Aplikace → ScrollMeter**, vpravo nahoře klepni na **⋮**
+> a zvol **Povolit omezená nastavení**. Pak krok 7 zopakuj. Aplikace na to má přímo tlačítko
+> *Otevřít informace o aplikaci*.
+
+**8.** Kalibrace: klepni na **Zkalibrovat platební kartou** (asi minuta), nebo **Použít automatický odhad**.
+Kalibrovat jde kdykoliv později.
+
+**9.** Volitelně povol **Čas v aplikacích**. Bez toho aplikace měří dál, jen neuvidíš minuty.
-Requires JDK 21 for Gradle (pinned in `gradle/gradle-daemon-jvm.properties`)
-and the Android SDK with platform 36 (`local.properties` → `sdk.dir`).
+Hotovo. Teď normálně používej telefon a za chvíli se do ScrollMeteru podívej.
-## Release build (Phase 8)
+> **Aplikace se sama neaktualizuje.** Nemá přístup k internetu, takže se ani nedozví, že vyšla nová verze.
+> **Každou novou verzi si stáhneš a nainstaluješ ručně**, stejným postupem jako tuhle první. Naměřená data
+> i nastavení zůstanou. Kdo to nechce hlídat, přidá si tenhle repozitář do
+> [Obtainium](https://github.com/ImranR98/Obtainium) a o aktualizacích se dozví sám.
+
+> **Google Play Protect** může u ručně instalované aplikace zobrazit varování. To je standardní hláška
+> u všeho mimo obchod, ne nález něčeho škodlivého.
+
+---
+
+## Jaká oprávnění potřebuje
+
+| Oprávnění | Povinné? | K čemu | Co z něj aplikace dostane |
+|---|---|---|---|
+| **Služba Usnadnění** (Zpřístupnění) | **ano** | Jediný způsob, jak se aplikace dozví o scrollování v *jiných* aplikacích. | Jen událost „obsah se posunul": v jaké aplikaci, kdy a o kolik pixelů. Nic víc. |
+| **Přístup k údajům o využití** | ne | Čas strávený v jednotlivých aplikacích. | Kdy byla která aplikace na popředí. Ukládá se jen součet minut na aplikaci a den. |
+| **Oznámení** | ne | Upozornění na překročený limit a ranní shrnutí. | Nic, jen smí poslat oznámení. Ptá se, až když oznámení zapneš. |
+
+**Co aplikace nechce a nemá:** přístup k **internetu**, polohu, kontakty, fotky a soubory, mikrofon,
+kameru, seznam všech nainstalovaných aplikací, kreslení přes jiné aplikace, běh na popředí.
+
+### Proč Usnadnění a proč se ho nebát
+
+Usnadnění je silné oprávnění. Obecně umí číst obrazovku a ovládat telefon, a proto Android u každé
+aplikace, která ho chce, ukáže stejné strašidelné varování. **Co konkrétní aplikace z Usnadnění skutečně
+dostane, ale určuje její konfigurace**, a ta je u ScrollMeteru nastavená na minimum:
+
+- odebírá **jediný typ události**, „obsah se posunul" (`typeViewScrolled`),
+- má výslovně **zakázáno číst obsah oken** (`canRetrieveWindowContent="false"`), takže text obrazovky
+ nedostane, ani kdyby o něj požádala,
+- neovládá telefon, neklepe za tebe, nesleduje dotyky.
+
+Tuhle konfiguraci najdeš v souboru
+[`accessibility_service_config.xml`](app/src/main/res/xml/accessibility_service_config.xml) a hlídají ji
+automatické testy, které při jakémkoli rozšíření oprávnění selžou.
+
+---
+
+## Je to bezpečné?
+
+### ✅ Proč tomu můžeš věřit
+
+- **Bez internetu nejde nic poslat.** Aplikace nemá oprávnění `INTERNET`. To není slib v podmínkách
+ použití, to je technická nemožnost: Android jí síť vůbec nepustí. V *Nastavení → Aplikace → ScrollMeter →
+ Mobilní data* uvidíš 0 B.
+- **Neví, co čteš.** Ukládá jen čas, název balíčku aplikace (např. `com.instagram.android`), počet
+ posunutých pixelů a spočítanou vzdálenost. Nikdy text, zprávy, hesla, adresy stránek ani vyplněné formuláře.
+- **Žádné cizí knihovny na sledování.** Žádná analytika, reklamní SDK, crash reporting ani Google Play Services.
+- **Data jsou jen tvoje.** Vypnutá záloha do cloudu, z telefonu odejdou jen exportem, který spustíš ty.
+ *Nastavení → Data → Smazat všechna data* je smaže, odinstalace taky.
+- **Otevřený kód.** Všechno, co aplikace dělá, je tady v repozitáři. Kdo nechce věřit mně, přeloží si ji
+ ze zdrojáku sám ([návod pro vývojáře](docs/development.md)).
+- **Podepsané APK.** Každá verze je podepsaná stejným klíčem. Otisk certifikátu (SHA-256):
+ ```
+ 04:6F:8C:D0:B0:73:23:F7:07:12:E1:12:53:CA:D7:FB:82:03:F2:68:C8:D8:10:53:78:3D:9C:1A:66:9C:0E:88
+ ```
+ Ověříš ho příkazem `apksigner verify --print-certs scrollmeter-….apk`. Otisky souborů jsou
+ v `SHA256SUMS` u každé verze.
+
+### ⚠️ Na co si dát pozor
+
+- **Usnadnění dávej jen aplikacím, kterým věříš.** To platí obecně, ne jen tady. Podvodné aplikace
+ ho zneužívají ke čtení obrazovky. Tahle aplikace z něj bere jen scrollování (viz výše), ale stahuj ji
+ **jen z téhle stránky**, ne z přeposlaných souborů nebo cizích webů.
+- **Co naměří, ukazuje o tobě dost.** Z čísel je vidět, které aplikace používáš a jak moc. V telefonu jsou
+ v bezpečí, ale kdo má tvůj odemčený telefon, uvidí je taky. A exportované CSV už je obyčejný soubor:
+ kam ho pošleš, tam je.
+- **Není to ověřený obchod.** Tuhle aplikaci nikdo cizí nekontroloval, žádný Google ani nezávislý audit.
+ Tvoje jistota je otevřený kód a to, že nemá internet.
+- **Od roku 2027 může Google zpřísnit** instalaci aplikací mimo obchod na certifikovaných telefonech.
+ V Česku zatím platí postup výše beze změny.
+
+---
+
+## Co zatím neumí
+
+- **YouTube a některé další aplikace neměří**, protože scrollování systému nehlásí. Týká se to i části
+ moderních aplikací postavených na nových seznamech v Jetpack Compose.
+- **Přesnost je odhad.** Bez kalibrace se spoléhá na to, co o sobě hlásí displej, a to se u některých
+ telefonů o pár procent liší. Kalibrace kartou to srovná.
+- **Některé telefony měření uspávají.** Hlavně OnePlus / Oppo / Realme (ColorOS) umí službu na pozadí
+ zabít, když dochází paměť. Aplikace to pozná a na přehledu ukáže červený pruh s tlačítkem *Zapnout měření*.
+ Zkusit můžeš vypnout pro ScrollMeter optimalizaci baterie; že to pomůže na každém telefonu, zatím ověřené není.
+- **Vynucené zastavení vypne měření.** Když ScrollMeter v nastavení aplikací *vynuceně zastavíš*, Android mu
+ Usnadnění vypne a je potřeba ho zapnout znovu.
+- **Jen jeden telefon.** Nic se nesynchronizuje, každý telefon měří sám za sebe.
+
+---
+
+## Je to open source
+
+Tohle je koníček, ne produkt. Vznikl pro rodinu a vyvíjím ho, **jak mám čas a chuť**, bez roadmapy a bez termínů.
+
+Celý kód je venku pod **[GPL-3.0](LICENSE)**. Kdokoliv si ho může vzít, upravit, opravit nebo v projektu
+pokračovat po svém. Licence hlídá jedinou věc: odvozená verze zůstane taky otevřená.
+
+- 🐛 **Chyba nebo nápad?** → [issue](../../issues)
+- 🔧 **Chceš přispět kódem?** → pull requesty vítám, testy prosím taky
+- 🍴 **Chceš to forknout?** → posluž si
+
+### Autor
+
+**Honza Hubka** — [honzahubka.cz](https://honzahubka.cz) · [LinkedIn](https://www.linkedin.com/in/honzahubka/)
+
+## Pro vývojáře
+
+Kotlin + Jetpack Compose, Room, DataStore. minSdk 29, compileSdk 36, žádné Google Play Services, žádná síť.
```bash
-tools/build_release.sh # clean tree only: signed APK + AAB, both checked against the upload certificate, APK checked
+./gradlew assembleDebug # APK v app/build/outputs/apk/debug/
+./gradlew testDebugUnitTest # unit testy
+./gradlew lintDebug # Android lint
```
-Signing comes only from environment variables (`SIGNING_KEYSTORE_PATH`, `SIGNING_STORE_PASSWORD`,
-`SIGNING_KEY_ALIAS`, `SIGNING_KEY_PASSWORD`, ADR-034); without them `assembleRelease` builds an unsigned APK
-(CI does). The script takes the upload key from `~/.android-keystores/scrollmeter-upload.jks` and its password
-from the macOS Keychain item `scrollmeter-upload-keystore` — neither is in the repository. Outputs:
-`app/build/outputs/apk/release/app-release.apk` (what gets installed — the app is distributed as an APK to family
-phones, not through Google Play) and `app/build/outputs/bundle/release/app-release.aab` (kept for a store, none planned).
-
-Release APKs are signed by `CN=ScrollMeter, O=Honza Hubka, C=CZ`, certificate SHA-256
-`04:6F:8C:D0:B0:73:23:F7:07:12:E1:12:53:CA:D7:FB:82:03:F2:68:C8:D8:10:53:78:3D:9C:1A:66:9C:0E:88` —
-check a downloaded APK with `apksigner verify --print-certs app-release.apk`.
-
-## How to test the measurement POC (Phase 1)
-
-The debug build (`com.scrollmeter.app.debug`) adds two developer screens to the home screen:
-**Debug měření** (the last 100 scroll events live) and **Testovací seznam** (our own list with an
-exact ground truth). Release builds contain neither.
-
-1. **Install:** `./gradlew installDebug` with the phone connected over USB (USB debugging on).
-2. **Enable the service** — either by hand: Settings → Accessibility → Downloaded / Installed apps →
- *ScrollMeter — měření scrollování* → On; or over adb (POC only):
- ```bash
- ADB=~/Library/Android/sdk/platform-tools/adb
- $ADB shell settings put secure enabled_accessibility_services com.scrollmeter.app.debug/com.scrollmeter.app.accessibility.ScrollAccessibilityService
- $ADB shell settings put secure accessibility_enabled 1
- ```
- OnePlus / ColorOS refuses these writes until Developer options → **Zakázat sledování oprávnění**
- (*Disable permission monitoring*, at the very bottom) is on.
-3. **Check it runs:** open ScrollMeter — the card says *Měření je zapnuté* and the total since the
- service started grows while you scroll anywhere. `adb shell dumpsys accessibility` lists the service
- with `eventTypes=TYPE_VIEW_SCROLLED`.
-4. **Own list with ground truth:** *Testovací seznam* → pick a surface (*View* = classic Android views,
- *Column* = Compose `verticalScroll`, *Lazy* = Compose `LazyColumn`) → *Vynulovat* → scroll the list and
- the carousel by hand. Each axis shows ground truth px, measured px and the error. *Lazy* is expected to
- measure 0 (ADR-019). Automated version (Tests A–E of spec §36):
- `python3 tools/device_accuracy.py --surface view,column,lazy --markdown`.
-5. **Other apps:** *Debug měření* → *Vymazat* (the *v souboru* counter drops to 0) → go through the apps one
- after another, 20–30 s each (slow scrolls, flings, horizontal carousels) — no need to come back in
- between. Every event is written through to the phone's app-private storage, so the run survives the
- system killing ScrollMeter (ColorOS does that under memory pressure; the service restarts by itself).
- Apps behind a login screen (Instagram, TikTok, X) need an account to reach a feed.
-6. **Collect and analyse** — no export needed; the analyser splits the run per app:
- ```bash
- $ADB exec-out run-as com.scrollmeter.app.debug cat files/debug/recording.csv > run.csv
- python3 tools/analyze_debug_csv.py run.csv # per-app table: coverage, fallback, outliers, duplicates
- $ADB logcat -s ScrollMeter:D # one line per event, live
- ```
- *Export CSV* on the phone writes the same rows plus a device header (needed for the outlier-limit
- column) to `/sdcard/Android/data/com.scrollmeter.app.debug/files/debug/` (`adb pull` that folder);
- *Sdílet* sends it elsewhere.
-7. **Switch the service off** when done: `$ADB shell settings delete secure enabled_accessibility_services` (an empty `put` fails with "Bad arguments")
- or in Accessibility settings.
-
-## Calibration (Phase 2)
-
-Home → *Zkalibrovat displej* (or *Přesnost měření* → *Zkalibrovat platební kartou*). Hold the phone upright,
-lay a payment card on the screen right of the blue vertical line with its top edge on the top line, and
-move the bottom line to the card's bottom edge (slider, then − / + for single pixels) → *Uložit kalibraci*.
-*Přesnost měření* then shows *Platební karta · 1 pixel = … mm* and the date. The card applies only to the
-phone and display resolution it was made on (ADR-024); *Přeskočit – použít automatický odhad* goes back to
-`xdpi`/`ydpi`. New calibration applies to new events only.
-
-Accuracy with the calibration in force: `python3 tools/device_accuracy.py --surface view,column --csv-out out/`
-then `python3 tools/accuracy.py out/ground_truth.csv out/measured.csv`. The test list itself shows MAE / MAPE
-over the runs of a series (*Vynulovat* closes a run, *Nová série* starts over).
-
-## Přehled and Statistiky (Phases 4, 5, 9)
-
-*Přehled* is the one main screen — no bottom bar; *Nastavení* sits behind the gear. The *Dnes* card shows
-today's distance against the **daily limit** (500 m by default, or *Bez limitu*): green, orange from 70 %, red
-over it, and always in words too ("Zbývá 80 m z limitu 500 m", "Překročeno o 120 m (limit 500 m)"). Below it
-*Tento týden* and *Tento měsíc* with their total and average per day, the three apps scrolled most today and
-one comparison ("To je přibližně délka jednoho běžeckého okruhu."). Every number is live — stored plus what
-the service has not written yet. When the service is off, a red banner with *Zapnout měření* comes first. It
-is not a competition: no goals, no records (ADR-036).
-
-Tapping *Dnes*, a week or a month opens **Statistiky**: *Den / Týden / Měsíc* with ‹ ›, for a week or month a
-bar per day in its limit colour with the limit as a dashed line (tap a bar to open that day), and every app
-of the period from the longest distance down, with the time in the app on the same row — "Chrome
-1,21 km (3 h 40 min)". Apps with time but no scroll data (YouTube) show "— (2 h 15 min)" at the end. An app
-opens its detail for that period: distance, share, time in app, scroll time, pace, a measurement-quality word
-(never an accuracy percentage — ADR-029) and 30-day charts. Durations roll over from minutes to hours to days
-("1 d 1 h 1 min"). Time in app needs Usage access; until it is granted a card offers it once (*Ukázat jak* →
-a disclosure screen → Android settings), and the rows show no brackets.
-
-## Settings, export and notifications (Phase 6)
-
-*Nastavení* holds the service and Usage-access status, *Přesnost měření*, the daily limit (100 m – 5 km, a
-custom 10 m – 100 km, or *Bez limitu*), *Vyloučené aplikace* (launcher, keyboard and System UI are suggested; an
-excluded app disappears from every total, history and export and comes back when switched on again), units,
-theme, the two opt-in notifications (over the limit, yesterday's summary — each at most once a day; on
-Android 13+ the system asks for permission when one is switched on), *Exportovat CSV* (save `per_app.csv` /
-`daily_summary.csv` through the system file picker, or share both), *Smazat všechna data* (optionally with the
-settings and the card calibration), *Soukromí* and *O aplikaci* (version, device, the total measured since the first day); in debug builds also the
-developer screens.
-The CSV format is in ADR-031: comma separated, dot decimals, UTF-8 with BOM, an empty field means unknown.
-
-## Stored data and time in app (Phase 3)
-
-Distances are stored per day and app in an app-private Room database (`scrollmeter.db`) and survive app
-restarts; Home shows *Dnes* from it (at most 10 s behind the live counter). Time in app is optional: grant
-*Přístup k údajům o využití* to ScrollMeter in Android settings (on an emulator:
-`adb shell appops set com.scrollmeter.app.debug GET_USAGE_STATS allow`) and open the app — it snapshots the
-last days into `daily_app_usage`. Inspect a debug build's data with
-`adb shell "run-as com.scrollmeter.app.debug sqlite3 databases/scrollmeter.db 'select * from daily_app_aggregate'"`.
-
-Note: `adb shell am force-stop` turns the accessibility service off (Android removes it from the enabled list);
-turn it on again in Usnadnění.
-
-The debug CSV holds numbers and identifiers only (time, package, window id, view class, deltas, scroll
-positions, distance, source, accepted/rejected) — never text from the screen.
+Potřebuješ **JDK 21** a Android SDK s platformou 36. Build, podepsaný release, testovací protokoly
+a měření přesnosti popisuje [`docs/development.md`](docs/development.md).
+
+| Dokument | O čem je |
+|---|---|
+| [`docs/development.md`](docs/development.md) | build, release, ruční testy, kalibrace, uložená data |
+| [`docs/SPEC.md`](docs/SPEC.md) | produktová a technická specifikace |
+| [`docs/measurement-model.md`](docs/measurement-model.md) | co je vzdálenost scrollování, vzorce, kalibrace |
+| [`docs/accessibility-policy.md`](docs/accessibility-policy.md) | co z Usnadnění používáme a co nikdy nečteme |
+| [`docs/architecture.md`](docs/architecture.md) | tok událostí, balíčky, vlákna, datový model |
+| [`docs/measurement-decisions.md`](docs/measurement-decisions.md) | záznam rozhodnutí (ADR) |
+| [`handoff.md`](handoff.md) | živý stav prací a otevřené body |
diff --git a/docs/development.md b/docs/development.md
new file mode 100644
index 0000000..e662e0d
--- /dev/null
+++ b/docs/development.md
@@ -0,0 +1,171 @@
+# ScrollMeter — for developers
+
+> The user-facing page (what the app does, permissions, installation) is the Czech [`README.md`](../README.md).
+> This file is the developer reference: build, release, test protocols.
+
+ScrollMeter is an Android app that measures how far content moves while you
+scroll across your phone and converts that movement into real-world distance.
+
+It uses Android Accessibility scroll events and processes all measurement data
+locally on the device.
+
+ScrollMeter measures scroll distance, not the raw physical trajectory of a
+finger across the touchscreen.
+
+## Status
+
+Project founded 2026-09-23. Phases 0–7 merged (`v0.0` … `v0.7`): bootstrap, measurement proof of concept
+(GO/NO-GO gate), calibration, persistence with optional time in app, dashboard, history and apps, export and
+settings, onboarding with the Play disclosure and English. Phase 8 (release hardening, `v0.8`) adds the signed
+release build, the emulator matrix API 28–36, the battery protocol and the first release `v0.1.0`. Phase 9
+(`v0.9`, release `v0.2.0`) replaces the goal with a daily limit in colour and History + Apps with one
+*Statistiky* screen (ADR-036). The app is for family phones, installed from the APK — not Google Play.
+**Requires Android 10 (API 29) or newer** — Android 9 does not deliver the scroll events (ADR-033).
+Manual on-phone checks still owed are listed under "Dluh ověření" in `handoff.md`. See `PLAN.md` (phases,
+gates) and `handoff.md` (live state).
+
+## Repository map
+
+| Path | What it is |
+|---|---|
+| `docs/SPEC.md` | The product + technical specification, v1.0 (binding) |
+| `PLAN.md` | Development plan by phases 0–8 with Definition of Done (Czech) |
+| `handoff.md` | Live state: toolchain pins, phase status, decisions log (Czech) |
+| `docs/measurement-model.md` | What scroll distance is, formulas, calibration, fallback, fling |
+| `docs/accessibility-policy.md` | Which Accessibility API we use, what we never read, Play disclosure |
+| `docs/play-listing.md` | Draft Play listing, Accessibility declaration answers, Data safety, privacy policy text, video scenario |
+| `docs/accuracy-testing.md` | Test protocol and the device / app compatibility tables |
+| `docs/architecture.md` | Event pipeline, package layout, threading, data model |
+| `docs/measurement-decisions.md` | ADR log for non-obvious decisions |
+| `docs/prompts/` | Kick-off prompts for coding sessions |
+| `tools/` | `analyze_debug_csv.py` (per-app analysis of debug CSVs), `device_accuracy.py` (adb-driven accuracy tests), `accuracy.py` (ground truth CSV vs measured CSV → MAE, MAPE), `check_manifest_policy.py` / `check_release_apk.py` (what a build may ship), `build_release.sh` (signed release) |
+| `CLAUDE.md` | Rules for coding agents working in this repo |
+
+## Build and run (available from Phase 0)
+
+```bash
+./gradlew assembleDebug # build
+./gradlew testDebugUnitTest # JVM unit tests
+./gradlew lintDebug # Android lint
+./gradlew installDebug # install on the connected phone
+```
+
+Requires JDK 21 for Gradle (pinned in `gradle/gradle-daemon-jvm.properties`)
+and the Android SDK with platform 36 (`local.properties` → `sdk.dir`).
+
+## Release build (Phase 8)
+
+```bash
+tools/build_release.sh # clean tree only: signed APK + AAB, both checked against the upload certificate, APK checked
+```
+
+Signing comes only from environment variables (`SIGNING_KEYSTORE_PATH`, `SIGNING_STORE_PASSWORD`,
+`SIGNING_KEY_ALIAS`, `SIGNING_KEY_PASSWORD`, ADR-034); without them `assembleRelease` builds an unsigned APK
+(CI does). The script takes the upload key from `~/.android-keystores/scrollmeter-upload.jks` and its password
+from the macOS Keychain item `scrollmeter-upload-keystore` — neither is in the repository. Outputs:
+`app/build/outputs/apk/release/app-release.apk` (what gets installed — the app is distributed as an APK to family
+phones, not through Google Play) and `app/build/outputs/bundle/release/app-release.aab` (kept for a store, none planned).
+
+Release APKs are signed by `CN=ScrollMeter, O=Honza Hubka, C=CZ`, certificate SHA-256
+`04:6F:8C:D0:B0:73:23:F7:07:12:E1:12:53:CA:D7:FB:82:03:F2:68:C8:D8:10:53:78:3D:9C:1A:66:9C:0E:88` —
+check a downloaded APK with `apksigner verify --print-certs app-release.apk`.
+
+## How to test the measurement POC (Phase 1)
+
+The debug build (`com.scrollmeter.app.debug`) adds two developer screens to the home screen:
+**Debug měření** (the last 100 scroll events live) and **Testovací seznam** (our own list with an
+exact ground truth). Release builds contain neither.
+
+1. **Install:** `./gradlew installDebug` with the phone connected over USB (USB debugging on).
+2. **Enable the service** — either by hand: Settings → Accessibility → Downloaded / Installed apps →
+ *ScrollMeter — měření scrollování* → On; or over adb (POC only):
+ ```bash
+ ADB=~/Library/Android/sdk/platform-tools/adb
+ $ADB shell settings put secure enabled_accessibility_services com.scrollmeter.app.debug/com.scrollmeter.app.accessibility.ScrollAccessibilityService
+ $ADB shell settings put secure accessibility_enabled 1
+ ```
+ OnePlus / ColorOS refuses these writes until Developer options → **Zakázat sledování oprávnění**
+ (*Disable permission monitoring*, at the very bottom) is on.
+3. **Check it runs:** open ScrollMeter — the card says *Měření je zapnuté* and the total since the
+ service started grows while you scroll anywhere. `adb shell dumpsys accessibility` lists the service
+ with `eventTypes=TYPE_VIEW_SCROLLED`.
+4. **Own list with ground truth:** *Testovací seznam* → pick a surface (*View* = classic Android views,
+ *Column* = Compose `verticalScroll`, *Lazy* = Compose `LazyColumn`) → *Vynulovat* → scroll the list and
+ the carousel by hand. Each axis shows ground truth px, measured px and the error. *Lazy* is expected to
+ measure 0 (ADR-019). Automated version (Tests A–E of spec §36):
+ `python3 tools/device_accuracy.py --surface view,column,lazy --markdown`.
+5. **Other apps:** *Debug měření* → *Vymazat* (the *v souboru* counter drops to 0) → go through the apps one
+ after another, 20–30 s each (slow scrolls, flings, horizontal carousels) — no need to come back in
+ between. Every event is written through to the phone's app-private storage, so the run survives the
+ system killing ScrollMeter (ColorOS does that under memory pressure; the service restarts by itself).
+ Apps behind a login screen (Instagram, TikTok, X) need an account to reach a feed.
+6. **Collect and analyse** — no export needed; the analyser splits the run per app:
+ ```bash
+ $ADB exec-out run-as com.scrollmeter.app.debug cat files/debug/recording.csv > run.csv
+ python3 tools/analyze_debug_csv.py run.csv # per-app table: coverage, fallback, outliers, duplicates
+ $ADB logcat -s ScrollMeter:D # one line per event, live
+ ```
+ *Export CSV* on the phone writes the same rows plus a device header (needed for the outlier-limit
+ column) to `/sdcard/Android/data/com.scrollmeter.app.debug/files/debug/` (`adb pull` that folder);
+ *Sdílet* sends it elsewhere.
+7. **Switch the service off** when done: `$ADB shell settings delete secure enabled_accessibility_services` (an empty `put` fails with "Bad arguments")
+ or in Accessibility settings.
+
+## Calibration (Phase 2)
+
+Home → *Zkalibrovat displej* (or *Přesnost měření* → *Zkalibrovat platební kartou*). Hold the phone upright,
+lay a payment card on the screen right of the blue vertical line with its top edge on the top line, and
+move the bottom line to the card's bottom edge (slider, then − / + for single pixels) → *Uložit kalibraci*.
+*Přesnost měření* then shows *Platební karta · 1 pixel = … mm* and the date. The card applies only to the
+phone and display resolution it was made on (ADR-024); *Přeskočit – použít automatický odhad* goes back to
+`xdpi`/`ydpi`. New calibration applies to new events only.
+
+Accuracy with the calibration in force: `python3 tools/device_accuracy.py --surface view,column --csv-out out/`
+then `python3 tools/accuracy.py out/ground_truth.csv out/measured.csv`. The test list itself shows MAE / MAPE
+over the runs of a series (*Vynulovat* closes a run, *Nová série* starts over).
+
+## Přehled and Statistiky (Phases 4, 5, 9)
+
+*Přehled* is the one main screen — no bottom bar; *Nastavení* sits behind the gear. The *Dnes* card shows
+today's distance against the **daily limit** (500 m by default, or *Bez limitu*): green, orange from 70 %, red
+over it, and always in words too ("Zbývá 80 m z limitu 500 m", "Překročeno o 120 m (limit 500 m)"). Below it
+*Tento týden* and *Tento měsíc* with their total and average per day, the three apps scrolled most today and
+one comparison ("To je přibližně délka jednoho běžeckého okruhu."). Every number is live — stored plus what
+the service has not written yet. When the service is off, a red banner with *Zapnout měření* comes first. It
+is not a competition: no goals, no records (ADR-036).
+
+Tapping *Dnes*, a week or a month opens **Statistiky**: *Den / Týden / Měsíc* with ‹ ›, for a week or month a
+bar per day in its limit colour with the limit as a dashed line (tap a bar to open that day), and every app
+of the period from the longest distance down, with the time in the app on the same row — "Chrome
+1,21 km (3 h 40 min)". Apps with time but no scroll data (YouTube) show "— (2 h 15 min)" at the end. An app
+opens its detail for that period: distance, share, time in app, scroll time, pace, a measurement-quality word
+(never an accuracy percentage — ADR-029) and 30-day charts. Durations roll over from minutes to hours to days
+("1 d 1 h 1 min"). Time in app needs Usage access; until it is granted a card offers it once (*Ukázat jak* →
+a disclosure screen → Android settings), and the rows show no brackets.
+
+## Settings, export and notifications (Phase 6)
+
+*Nastavení* holds the service and Usage-access status, *Přesnost měření*, the daily limit (100 m – 5 km, a
+custom 10 m – 100 km, or *Bez limitu*), *Vyloučené aplikace* (launcher, keyboard and System UI are suggested; an
+excluded app disappears from every total, history and export and comes back when switched on again), units,
+theme, the two opt-in notifications (over the limit, yesterday's summary — each at most once a day; on
+Android 13+ the system asks for permission when one is switched on), *Exportovat CSV* (save `per_app.csv` /
+`daily_summary.csv` through the system file picker, or share both), *Smazat všechna data* (optionally with the
+settings and the card calibration), *Soukromí* and *O aplikaci* (version, device, the total measured since the first day); in debug builds also the
+developer screens.
+The CSV format is in ADR-031: comma separated, dot decimals, UTF-8 with BOM, an empty field means unknown.
+
+## Stored data and time in app (Phase 3)
+
+Distances are stored per day and app in an app-private Room database (`scrollmeter.db`) and survive app
+restarts; Home shows *Dnes* from it (at most 10 s behind the live counter). Time in app is optional: grant
+*Přístup k údajům o využití* to ScrollMeter in Android settings (on an emulator:
+`adb shell appops set com.scrollmeter.app.debug GET_USAGE_STATS allow`) and open the app — it snapshots the
+last days into `daily_app_usage`. Inspect a debug build's data with
+`adb shell "run-as com.scrollmeter.app.debug sqlite3 databases/scrollmeter.db 'select * from daily_app_aggregate'"`.
+
+Note: `adb shell am force-stop` turns the accessibility service off (Android removes it from the enabled list);
+turn it on again in Usnadnění.
+
+The debug CSV holds numbers and identifiers only (time, package, window id, view class, deltas, scroll
+positions, distance, source, accepted/rejected) — never text from the screen.
diff --git a/docs/img/onboarding-disclosure.png b/docs/img/onboarding-disclosure.png
new file mode 100644
index 0000000..85d07e6
Binary files /dev/null and b/docs/img/onboarding-disclosure.png differ
diff --git a/docs/img/prehled.png b/docs/img/prehled.png
new file mode 100644
index 0000000..0146483
Binary files /dev/null and b/docs/img/prehled.png differ
diff --git a/docs/img/soukromi.png b/docs/img/soukromi.png
new file mode 100644
index 0000000..3c99296
Binary files /dev/null and b/docs/img/soukromi.png differ
diff --git a/docs/img/statistiky.png b/docs/img/statistiky.png
new file mode 100644
index 0000000..aeb405d
Binary files /dev/null and b/docs/img/statistiky.png differ
diff --git a/docs/play-listing.md b/docs/play-listing.md
index e79de35..7155f52 100644
--- a/docs/play-listing.md
+++ b/docs/play-listing.md
@@ -150,7 +150,7 @@ signed with the upload key (ADR-034). The same commit's APK is the GitHub Releas
What Honza does in Play Console, in this order:
1. Create the app (default language cs-CZ or en — open point in `handoff.md`), choose **Play App Signing** with
Google-generated app signing key; upload `app-release.aab` to *Internal testing*. The upload key's certificate
- (SHA-256 `04:6F:8C:D0:…:9C:0E:88`, full value in `README.md`) is registered by that first upload.
+ (SHA-256 `04:6F:8C:D0:…:9C:0E:88`, full value in `docs/development.md`) is registered by that first upload.
2. App content: privacy policy URL (text above — needs a public URL), Data safety (above), Accessibility API
declaration with the video (above), `PACKAGE_USAGE_STATS` needs no form (ADR-021), content rating, target
audience 16+ (above), ads: none.
diff --git a/handoff.md b/handoff.md
index 641e6a8..133ec90 100644
--- a/handoff.md
+++ b/handoff.md
@@ -6,9 +6,9 @@
## Identita projektu
- Lokální cesta: `/Users/hupcus/Documents/VIBE-CODE/SCROLLMETER`
-- GitHub: [`hupcus/scrollmeter`](https://github.com/hupcus/scrollmeter) (privátní), založen 2026-09-23 v Phase 0
+- GitHub: [`hupcus/scrollmeter`](https://github.com/hupcus/scrollmeter) (**veřejný od 2026-09-28**, GPL-3.0), založen 2026-09-23 v Phase 0
- Package: `com.scrollmeter.app` (debug: `com.scrollmeter.app.debug`)
-- Cíl (Honza, 2026-09-25): **aplikace pro rodinu**, instalace přes sideload APK; případně volně ke stažení na GitHubu (otevřené rozhodnutí). **Google Play není v plánu.**
+- Cíl (Honza, 2026-09-25): **aplikace pro rodinu**, instalace přes sideload APK; od 2026-09-28 volně ke stažení z GitHub Releases (README = stránka ke stažení). **Google Play není v plánu.**
## Toolchain (závazný — ověřeno reálným buildem v Phase 0, 2026-09-23)
@@ -466,9 +466,9 @@ Každý bod: co udělat, kdo, a co by špatný výsledek změnil. Pořadí = dop
- [x] Výchozí jazyk: `values/` je čeština (D17) — pro rodinu správně; řešilo se jen kvůli zahraničnímu vydání na Play, které není v plánu (2026-09-25).
- [x] Zásady ochrany soukromí s veřejnou URL — potřeboval je jen Google Play, který není v plánu (2026-09-25). Text zůstává v `docs/play-listing.md` a stejné informace ukazuje aplikace (Soukromí).
- [x] Podpisový keystore pro release — Phase 8 (ADR-034): `~/.android-keystores/scrollmeter-upload.jks`, heslo v Klíčence, `tools/build_release.sh`.
-- [ ] **Záloha upload keystoru** — Honza rozhodne kam (návrh: soubor do iCloud Drive › Klíče vedle záložního klíče Supabase, heslo zvlášť do správce hesel). Bez Google Play je klíč **jediná identita aplikace**: jeho ztráta = všichni v rodině musí aplikaci odinstalovat a přijdou o data (CSV export existuje, import ne).
+- [ ] **Záloha upload keystoru** — Honza rozhodne kam (návrh: soubor zvlášť od hesla, heslo do správce hesel). Bez Google Play je klíč **jediná identita aplikace**: jeho ztráta = všichni v rodině musí aplikaci odinstalovat a přijdou o data (CSV export existuje, import ne).
- [ ] **Ověření vývojáře Androidu (Google, globálně od 2027):** na certifikovaných telefonech půjde neověřená aplikace instalovat jen přes adb nebo „pokročilý postup“ (režim vývojáře, restart, 24 h čekání). Pro rodinu stačí **bezplatný účet „limited distribution“** v Android Developer Console: až 20 autorizovaných zařízení (párování QR kódem / odkazem se souhlasem na telefonu), bez dokladu totožnosti, potřebuje Google účet s dvoufázovým ověřením a platební profil (jméno, adresa); registrovat jde jen balíček, který Android ještě neviděl → `com.scrollmeter.app` zaregistrovat (Honza) před rokem 2027. Pro cizí lidi (veřejné stažení) by platilo plné ověření vývojáře. Zdroje: developer.android.com/developer-verification/guides/limited-distribution, android-developers.googleblog.com (03/2026). V ČR zatím beze změny (2026 jen BR, ID, SG, TH).
-- [ ] **Veřejné stažení z GitHubu** — rozhodnutí Honzy: (a) zveřejnit celé repo (před tím audit historie na citlivé údaje), (b) samostatné veřejné repo jen s releasy (kód zůstane privátní), (c) nic — APK posílat rodině přímo. Veřejné releasy navíc umožní aktualizace přes Obtainium (aplikace sama nemá `INTERNET`, takže se aktualizovat neumí).
+- [x] **Veřejné stažení z GitHubu** — Honza 2026-09-28 zvolil (a) „stejně jako detektor“: celé repo veřejné, GPL-3.0, české README pro uživatele. Původní varianty: (a) zveřejnit celé repo (před tím audit historie na citlivé údaje), (b) samostatné veřejné repo jen s releasy (kód zůstane privátní), (c) nic — APK posílat rodině přímo. Veřejné releasy navíc umožní aktualizace přes Obtainium (aplikace sama nemá `INTERNET`, takže se aktualizovat neumí).
- [ ] **Android 9 (API 28)** — nepodporovaný od Phase 8 (ADR-033, minSdk 29). Vrátit by ho šlo jen s `typeWindowStateChanged` ve službě = změna tvrdého pravidla → jen s Honzovým souhlasem; doporučení: nechat (podíl Androidu 9 je malý a klesá).
- [ ] Compose `Column` pomalé tahy podměřuje o 6–11 % (3 události na tah; MAPE přesto < 5 %). Hledat až s Compose lazy (ADR-019), stejný zdroj.
- [ ] Ticker flushů (10 s) se po flushi po 50 událostech nerestartuje → při souvislém scrollu ~65 % zápisů navíc (115 místo ~70 za 10 min, každý ~0 ms). Zvážit až podle V8.
@@ -476,6 +476,14 @@ Každý bod: co udělat, kdo, a co by špatný výsledek změnil. Pořadí = dop
## Log rozhodnutí (nejnovější nahoře)
+### 2026-09-28 — veřejné repo a stránka ke stažení (Honza, Opus 5.5)
+- Honza: ScrollMeter instalovatelný přímo z GitHubu „stejně jako detektor“ (`hupcus/detektor-mapy`) → varianta (a): repo veřejné, licence GPL-3.0 jako u detektoru.
+- Před zveřejněním audit celé historie (všechny revize): žádná hesla, tokeny ani klíče; osobní údaje jen e-mail autora commitů a sériové číslo testovacího OnePlusu. Keystore a jeho heslo v gitu nikdy nebyly.
+- `README.md` je česká stránka pro uživatele (co dělá / nedělá, instalace vč. „Omezeného nastavení“, oprávnění, bezpečnost); vývojářský obsah přesunut do `docs/development.md`. Screenshoty v `docs/img/` z emulátoru (release APK, reálně naměřená data).
+- Release `v0.2.0` přepnut z prerelease na Latest, aby fungoval odkaz `releases/latest`. **Každý další release publikovat jako Latest** (ne prerelease), jinak odkaz v README ukáže starou verzi.
+- Pro cizí lidi platí od 2027 plné ověření vývojáře Androidu (ne „limited distribution“) — README na to upozorňuje, rozhodnutí o registraci zůstává otevřené.
+
+
### 2026-09-25 — Phase 9 Statistiky + denní limit (Opus 5.5, návrh Fable 5.1)
- Honza: období s rozpadem po aplikacích, čas na stejném řádku, „není to soutěž“ — cíl → limit se zelenou / oranžovou / červenou. Detail ADR-036.
- Rozhodnuto samostatně (výchozí doporučení): žádná spodní lišta, Nastavení pod ozubeným kolem; limit 500 m zapnutý (kdo si v 0.1.0 nastavil cíl, má ho jako limit); oranžová od 70 %; týden / měsíc podle průměru na den; srovnání „Pro představu“ zůstává; oznámení o rekordu a gamifikace (SPEC §47) pryč.