.design/DECISIONS.md
Locked decisions before Phase 0. Source: maintainer answers during kickoff session (2026-05-21).
Drop Tweaks tab from bottom nav. Reachable via Profile → Settings (already wired). Keep Home / Search / Apps / Favourites. Override: handoff's 3-tab + Search-FAB rejected as too disruptive to muscle memory.
Bundle Latin-only Fraunces, Inter Tight, JetBrains Mono with the app. Non-Latin scripts (CJK / Devanagari / Arabic / Hebrew / Thai etc.) fall back to system fonts. Modern Android / macOS / Windows ship Noto-like coverage; Linux may show tofu (acceptable risk). Total bundled font weight target: ≤ 4 MB across all three families.
Legacy AppTheme enum → new Palette:
OCEAN → NORDSLATE → NORDPURPLE → PLUMFOREST → FORESTAMBER → CREAMOne-time migration on first launch after upgrade. Surface a non-blocking banner ("Themes refreshed — try the new palettes in Tweaks") via a new one-shot flag in TweaksRepository.
Full DESIGN.md coverage: hero CTAs, lead cards, search input, bottom sheets, confirm dialogs, toasts, device-code box, and any "wonky" call-out in the handoff. Implement as custom WonkySquircleShape : Shape using Path.arcTo with elliptical bounding rects. No fallback to RoundedCornerShape; the asymmetric character is brand-defining.
Cut SponsorScreen entirely. Remove:
GithubStoreGraph.SponsorScreenfeature/profile/.../Options.kt:114)AppNavigation.ktAligns with MIGRATION.md "no donations in UI."
Build during Phase 4. Desktop feature/apps/ adopts list (380dp) + detail (660dp) two-pane per DESIGN.md §8.3. Android remains single-pane → full-screen detail.
Existing single-pane code path retained behind the same composable signature; platform branch picks layout.
ThemeMode enum = LIGHT / DARK / AMOLED / SYSTEM. AMOLED is a Dark sub-mode (resolves to Dark when SYSTEM = dark). All 4 palettes ship an AMOLED variant — pure-black bg (#000) + dimmed surface (lift one notch up). Adds ~30% token surface but contained to Tokens.kt.
Open desktop-app.html / mobile-app.html / design-system.html per phase as side-by-side reference. Not opened upfront en-masse.
Tokens.kt, not Gradle codegen (UX-Architect §1).core/presentation/.../vocabulary/ module hosts all primitives (UX-Architect §8).GhsTheme composable wraps MaterialExpressiveTheme + 6 composition locals (UX-Architect §2).ImageVector.Builder + Canvas; Material Symbols painters where applicable (UX-Architect §9).Design handoff covers only some screens (Home, Library, Detail incl. Inner About/What's-new, Search, APK Inspect, overlay surfaces, Tweaks fragments). Many screens are uncovered. Policy: plan each uncovered screen before implementing, extrapolating from DESIGN.md primitives + patterns + tokens. Ask clarification questions before building.
Beyond DESIGN.md §6.2 baseline (Heartbeat + 120ms tap + palette/mode crossfade):
SharedTransitionLayout) on avatar → Detail herospring(dampingRatio = MediumBouncy))Quick, never blocking user. Spring stiffness defaults: high (300+) so transitions feel snappy.
.design/BACKEND-REFINEMENTS.md drafted upfront. Hand to backend coding agent in parallel while frontend builds. Frontend ships with fallbacks for any field not yet populated.
One mega-PR at the end of overhaul. Commits per feature / milestone (atomic). Memory rule (commit msgs ≤10 words) applies. Each commit compiles + runs.
User-directed: Root + Navigation first, then core module fully, then feature-by-feature. Translated to 17 phases — see MEMORY.md project_design_overhaul and the task list.
Delete feature/profile/.../SponsorScreen.kt composable, its route in GithubStoreGraph, nav wire in AppNavigation, sponsor row in feature/profile/.../Options.kt, and all related strings across 13 locales. No flag, no shim.
Label change only. Route name AppsScreen stays (no breaking change for deep links). BottomNav + Drawer label → "Library". String resource updated across 13 locales.
New first-launch flow:
One-shot. Persisted via TweaksRepository.onboardingComplete: Boolean. Skipped on subsequent launches. Lives in composeApp/ as app-level orchestration (no new feature module — too small).
Use SharedTransitionLayout + sharedElement modifier (@OptIn(ExperimentalSharedTransitionApi::class)) on Android only. Desktop uses standard slide/fade nav transitions via Compose Navigation's enterTransition / exitTransition. Platform branch via expect/actual or runtime platform check.
Source of truth for ViewModel/State/Action/Event/Root/Screen structure, navigation, DI, error handling, testing: ~/.claude/skills/android/*. Applied to KMP/CMP common code (most patterns platform-agnostic).