From 64d664fbe94196d22f5fa9871fb454dbcf5d9c0f Mon Sep 17 00:00:00 2001 From: Louis Date: Sat, 17 Oct 2026 14:56:22 +0200 Subject: [PATCH] replica: one folder per app (replica/wetter) Co-Authored-By: Claude Opus 5.5 --- README.md | 16 ++++++++-------- replica/{ => wetter}/architecture.md | 0 replica/{ => wetter}/build-log.md | 0 .../clone-screens/S01-clear-day.png | Bin .../clone-screens/S01-clear-night-dark.png | Bin .../clone-screens/S01-full-dark.png | Bin .../clone-screens/S01-full-light.png | Bin .../clone-screens/S01-rain-nowcast.png | Bin .../clone-screens/S01-real-light.png | Bin replica/{ => wetter}/clone-screens/S01-snow.png | Bin .../clone-screens/S01-storm-dark.png | Bin .../{ => wetter}/clone-screens/S01-tablet.png | Bin .../{ => wetter}/clone-screens/S04-day-dark.png | Bin .../clone-screens/S08-settings-dark.png | Bin .../{ => wetter}/clone-screens/S08-settings.png | Bin .../{ => wetter}/clone-screens/S15-preview.png | Bin replica/{ => wetter}/design/Tokens.kt | 0 replica/{ => wetter}/design/components.md | 0 replica/{ => wetter}/design/gen_theme.py | 0 .../{ => wetter}/design/icon/icon-preview.png | Bin .../{ => wetter}/design/icon/icon-preview.svg | 0 replica/{ => wetter}/design/tokens.json | 2 +- replica/{ => wetter}/features.csv | 0 replica/{ => wetter}/recon.md | 0 replica/{ => wetter}/schema.sql | 0 .../screens/ref-01-cards-hero-dayview-dark.png | Bin .../screens/ref-02-light-ai-report-nowcast.png | Bin .../screens/ref-03-cloudy-light-cards.png | Bin .../screens/ref-04-cards-dark-vs-old-app.png | Bin wetter/app/build.gradle.kts | 2 +- .../src/test/java/app/wetter/ScreenshotTest.kt | 2 +- 31 files changed, 11 insertions(+), 11 deletions(-) rename replica/{ => wetter}/architecture.md (100%) rename replica/{ => wetter}/build-log.md (100%) rename replica/{ => wetter}/clone-screens/S01-clear-day.png (100%) rename replica/{ => wetter}/clone-screens/S01-clear-night-dark.png (100%) rename replica/{ => wetter}/clone-screens/S01-full-dark.png (100%) rename replica/{ => wetter}/clone-screens/S01-full-light.png (100%) rename replica/{ => wetter}/clone-screens/S01-rain-nowcast.png (100%) rename replica/{ => wetter}/clone-screens/S01-real-light.png (100%) rename replica/{ => wetter}/clone-screens/S01-snow.png (100%) rename replica/{ => wetter}/clone-screens/S01-storm-dark.png (100%) rename replica/{ => wetter}/clone-screens/S01-tablet.png (100%) rename replica/{ => wetter}/clone-screens/S04-day-dark.png (100%) rename replica/{ => wetter}/clone-screens/S08-settings-dark.png (100%) rename replica/{ => wetter}/clone-screens/S08-settings.png (100%) rename replica/{ => wetter}/clone-screens/S15-preview.png (100%) rename replica/{ => wetter}/design/Tokens.kt (100%) rename replica/{ => wetter}/design/components.md (100%) rename replica/{ => wetter}/design/gen_theme.py (100%) rename replica/{ => wetter}/design/icon/icon-preview.png (100%) rename replica/{ => wetter}/design/icon/icon-preview.svg (100%) rename replica/{ => wetter}/design/tokens.json (99%) rename replica/{ => wetter}/features.csv (100%) rename replica/{ => wetter}/recon.md (100%) rename replica/{ => wetter}/schema.sql (100%) rename replica/{ => wetter}/screens/ref-01-cards-hero-dayview-dark.png (100%) rename replica/{ => wetter}/screens/ref-02-light-ai-report-nowcast.png (100%) rename replica/{ => wetter}/screens/ref-03-cloudy-light-cards.png (100%) rename replica/{ => wetter}/screens/ref-04-cards-dark-vs-old-app.png (100%) diff --git a/README.md b/README.md index 0c6e54e..2b34982 100644 --- a/README.md +++ b/README.md @@ -73,20 +73,20 @@ obtainium://app/%7B%22id%22%3A%22app.wetter%22%2C%22url%22%3A%22https%3A%2F%2Fgi ### The Replica pipeline -Every app is rebuilt with **[Replica](https://github.com/Jakeschincariol/replica-skill)**, an open set of eleven Claude Code skills by Jake Schincariol for cloning an app's *functionality and UX patterns* clean-room style. Each skill writes files the next one reads, and everything is kept in [`replica/`](replica/): +Every app is rebuilt with **[Replica](https://github.com/Jakeschincariol/replica-skill)**, an open set of eleven Claude Code skills by Jake Schincariol for cloning an app's *functionality and UX patterns* clean-room style. Each skill writes files the next one reads, and everything is kept in [`replica//`](replica/wetter/): | Step | Skill | What it produced for Wetter | | --- | --- | --- | -| 1 | `replica-recon` | [Recon map](replica/recon.md) built from public sources (help center, reviews, store listing): 15 screens, 9 user flows, components, inferred data model, [feature matrix](replica/features.csv) | -| 2 | `replica-architect` | [Architecture](replica/architecture.md) and [schema](replica/schema.sql): native Kotlin, offline-first, no server, public APIs only | -| 3 | `replica-design` | [Design tokens](replica/design/tokens.json) and [component specs](replica/design/components.md), WCAG AA contrast checked (70 colour pairs), generated into Compose code | -| 4 | `replica-build` | The app itself, screen by screen, with a [build log](replica/build-log.md) and [screenshots](replica/clone-screens/) rendered from a real API response | +| 1 | `replica-recon` | [Recon map](replica/wetter/recon.md) built from public sources (help center, reviews, store listing): 15 screens, 9 user flows, components, inferred data model, [feature matrix](replica/wetter/features.csv) | +| 2 | `replica-architect` | [Architecture](replica/wetter/architecture.md) and [schema](replica/wetter/schema.sql): native Kotlin, offline-first, no server, public APIs only | +| 3 | `replica-design` | [Design tokens](replica/wetter/design/tokens.json) and [component specs](replica/wetter/design/components.md), WCAG AA contrast checked (70 colour pairs), generated into Compose code | +| 4 | `replica-build` | The app itself, screen by screen, with a [build log](replica/wetter/build-log.md) and [screenshots](replica/wetter/clone-screens/) rendered from a real API response | | next | `replica-test`, `replica-diff`, `replica-entrepreneur`, `replica-brand`, `replica-launch`, `replica-deploy`, `replica-backend` | QA, parity scoring against the original, reading real user reviews for improvements, naming and branding, store listing, release | The rules Replica enforces, and that this project follows: - **Public sources and our own devices only.** No decompiling, no private APIs, no reading the original's code or network traffic. -- **Everything written fresh.** Code, icons, weather glyphs, the animated sky and every label are made from scratch. Reference screenshots of the originals live in `replica/screens/` for layout comparison only and never ship. +- **Everything written fresh.** Code, icons, weather glyphs, the animated sky and every label are made from scratch. Reference screenshots of the originals live in `replica//screens/` for layout comparison only and never ship. - **What cannot be cloned is left out on purpose:** Google's own forecast models, Gemini summaries, Calendar/Gmail-based insights and account sync. Open alternatives replace them where it makes sense. ### Built with AI, steered by a human @@ -107,7 +107,7 @@ Requirements: JDK 17 or newer and the Android SDK (platform 36). cd wetter ./gradlew :app:assembleRelease # APK in app/build/outputs/apk/release/ ./gradlew :app:testDebugUnitTest # unit + screenshot tests -./gradlew :app:recordRoborazziDebug # re-render replica/clone-screens/ +./gradlew :app:recordRoborazziDebug # re-render replica/wetter/clone-screens/ ``` Release builds are signed with the project key from `~/.android/nogoogleapps-release.properties` (kept outside the repository); without it they fall back to the debug key for local testing. `scripts/release.sh ` builds, signs and publishes a release in the format Obtainium expects. @@ -115,7 +115,7 @@ Release builds are signed with the project key from `~/.android/nogoogleapps-rel ## Repository layout ``` -replica/ recon, architecture, design system, build log, screenshots +replica// recon, architecture, design system, build log, screenshots (one folder per app) wetter/ the weather app (Kotlin, Jetpack Compose, Glance widgets, Room, WorkManager) ``` diff --git a/replica/architecture.md b/replica/wetter/architecture.md similarity index 100% rename from replica/architecture.md rename to replica/wetter/architecture.md diff --git a/replica/build-log.md b/replica/wetter/build-log.md similarity index 100% rename from replica/build-log.md rename to replica/wetter/build-log.md diff --git a/replica/clone-screens/S01-clear-day.png b/replica/wetter/clone-screens/S01-clear-day.png similarity index 100% rename from replica/clone-screens/S01-clear-day.png rename to replica/wetter/clone-screens/S01-clear-day.png diff --git a/replica/clone-screens/S01-clear-night-dark.png b/replica/wetter/clone-screens/S01-clear-night-dark.png similarity index 100% rename from replica/clone-screens/S01-clear-night-dark.png rename to replica/wetter/clone-screens/S01-clear-night-dark.png diff --git a/replica/clone-screens/S01-full-dark.png b/replica/wetter/clone-screens/S01-full-dark.png similarity index 100% rename from replica/clone-screens/S01-full-dark.png rename to replica/wetter/clone-screens/S01-full-dark.png diff --git a/replica/clone-screens/S01-full-light.png b/replica/wetter/clone-screens/S01-full-light.png similarity index 100% rename from replica/clone-screens/S01-full-light.png rename to replica/wetter/clone-screens/S01-full-light.png diff --git a/replica/clone-screens/S01-rain-nowcast.png b/replica/wetter/clone-screens/S01-rain-nowcast.png similarity index 100% rename from replica/clone-screens/S01-rain-nowcast.png rename to replica/wetter/clone-screens/S01-rain-nowcast.png diff --git a/replica/clone-screens/S01-real-light.png b/replica/wetter/clone-screens/S01-real-light.png similarity index 100% rename from replica/clone-screens/S01-real-light.png rename to replica/wetter/clone-screens/S01-real-light.png diff --git a/replica/clone-screens/S01-snow.png b/replica/wetter/clone-screens/S01-snow.png similarity index 100% rename from replica/clone-screens/S01-snow.png rename to replica/wetter/clone-screens/S01-snow.png diff --git a/replica/clone-screens/S01-storm-dark.png b/replica/wetter/clone-screens/S01-storm-dark.png similarity index 100% rename from replica/clone-screens/S01-storm-dark.png rename to replica/wetter/clone-screens/S01-storm-dark.png diff --git a/replica/clone-screens/S01-tablet.png b/replica/wetter/clone-screens/S01-tablet.png similarity index 100% rename from replica/clone-screens/S01-tablet.png rename to replica/wetter/clone-screens/S01-tablet.png diff --git a/replica/clone-screens/S04-day-dark.png b/replica/wetter/clone-screens/S04-day-dark.png similarity index 100% rename from replica/clone-screens/S04-day-dark.png rename to replica/wetter/clone-screens/S04-day-dark.png diff --git a/replica/clone-screens/S08-settings-dark.png b/replica/wetter/clone-screens/S08-settings-dark.png similarity index 100% rename from replica/clone-screens/S08-settings-dark.png rename to replica/wetter/clone-screens/S08-settings-dark.png diff --git a/replica/clone-screens/S08-settings.png b/replica/wetter/clone-screens/S08-settings.png similarity index 100% rename from replica/clone-screens/S08-settings.png rename to replica/wetter/clone-screens/S08-settings.png diff --git a/replica/clone-screens/S15-preview.png b/replica/wetter/clone-screens/S15-preview.png similarity index 100% rename from replica/clone-screens/S15-preview.png rename to replica/wetter/clone-screens/S15-preview.png diff --git a/replica/design/Tokens.kt b/replica/wetter/design/Tokens.kt similarity index 100% rename from replica/design/Tokens.kt rename to replica/wetter/design/Tokens.kt diff --git a/replica/design/components.md b/replica/wetter/design/components.md similarity index 100% rename from replica/design/components.md rename to replica/wetter/design/components.md diff --git a/replica/design/gen_theme.py b/replica/wetter/design/gen_theme.py similarity index 100% rename from replica/design/gen_theme.py rename to replica/wetter/design/gen_theme.py diff --git a/replica/design/icon/icon-preview.png b/replica/wetter/design/icon/icon-preview.png similarity index 100% rename from replica/design/icon/icon-preview.png rename to replica/wetter/design/icon/icon-preview.png diff --git a/replica/design/icon/icon-preview.svg b/replica/wetter/design/icon/icon-preview.svg similarity index 100% rename from replica/design/icon/icon-preview.svg rename to replica/wetter/design/icon/icon-preview.svg diff --git a/replica/design/tokens.json b/replica/wetter/design/tokens.json similarity index 99% rename from replica/design/tokens.json rename to replica/wetter/design/tokens.json index 5135a5f..711188d 100644 --- a/replica/design/tokens.json +++ b/replica/wetter/design/tokens.json @@ -1,5 +1,5 @@ { - "_about": "Wetter-Klon tokens. Roles measured by eye from replica/screens/ref-01..04 (Pixel Weather, 2024-25). Values are own approximations, no brand colour copied. Names stay, values change in /replica-brand. Check: python3 ~/.claude/skills/replica-design/contrast.py replica/design/tokens.json", + "_about": "Wetter-Klon tokens. Roles measured by eye from replica/screens/ref-01..04 (Pixel Weather, 2024-25). Values are own approximations, no brand colour copied. Names stay, values change in /replica-brand. Check: python3 ~/.claude/skills/replica-design/contrast.py replica/wetter/design/tokens.json", "color": { "bg": "#f8f9ff", "surface": "#ffffff", diff --git a/replica/features.csv b/replica/wetter/features.csv similarity index 100% rename from replica/features.csv rename to replica/wetter/features.csv diff --git a/replica/recon.md b/replica/wetter/recon.md similarity index 100% rename from replica/recon.md rename to replica/wetter/recon.md diff --git a/replica/schema.sql b/replica/wetter/schema.sql similarity index 100% rename from replica/schema.sql rename to replica/wetter/schema.sql diff --git a/replica/screens/ref-01-cards-hero-dayview-dark.png b/replica/wetter/screens/ref-01-cards-hero-dayview-dark.png similarity index 100% rename from replica/screens/ref-01-cards-hero-dayview-dark.png rename to replica/wetter/screens/ref-01-cards-hero-dayview-dark.png diff --git a/replica/screens/ref-02-light-ai-report-nowcast.png b/replica/wetter/screens/ref-02-light-ai-report-nowcast.png similarity index 100% rename from replica/screens/ref-02-light-ai-report-nowcast.png rename to replica/wetter/screens/ref-02-light-ai-report-nowcast.png diff --git a/replica/screens/ref-03-cloudy-light-cards.png b/replica/wetter/screens/ref-03-cloudy-light-cards.png similarity index 100% rename from replica/screens/ref-03-cloudy-light-cards.png rename to replica/wetter/screens/ref-03-cloudy-light-cards.png diff --git a/replica/screens/ref-04-cards-dark-vs-old-app.png b/replica/wetter/screens/ref-04-cards-dark-vs-old-app.png similarity index 100% rename from replica/screens/ref-04-cards-dark-vs-old-app.png rename to replica/wetter/screens/ref-04-cards-dark-vs-old-app.png diff --git a/wetter/app/build.gradle.kts b/wetter/app/build.gradle.kts index 76a8022..dc2ab08 100644 --- a/wetter/app/build.gradle.kts +++ b/wetter/app/build.gradle.kts @@ -97,4 +97,4 @@ dependencies { testImplementation("io.github.takahirom.roborazzi:roborazzi-compose:1.46.1") } -roborazzi { outputDir.set(rootProject.file("../replica/clone-screens")) } +roborazzi { outputDir.set(rootProject.file("../replica/wetter/clone-screens")) } diff --git a/wetter/app/src/test/java/app/wetter/ScreenshotTest.kt b/wetter/app/src/test/java/app/wetter/ScreenshotTest.kt index 2fc0c4a..4f7dda3 100644 --- a/wetter/app/src/test/java/app/wetter/ScreenshotTest.kt +++ b/wetter/app/src/test/java/app/wetter/ScreenshotTest.kt @@ -56,7 +56,7 @@ class ScreenshotTest { private fun shot(name: String, theme: ThemeMode, content: @Composable () -> Unit) { compose.setContent { WeatherTheme(theme) { content() } } - compose.onRoot().captureRoboImage("../../replica/clone-screens/$name.png") + compose.onRoot().captureRoboImage("../../replica/wetter/clone-screens/$name.png") } @Composable