In-flight Migrations
The three large migrations in progress. Incomplete migration = the project’s biggest active debt, because each leaves the codebase in a partially-converted state. Back to register.
1. Mobile consolidation onto shared UI + Koin (TD-01)
Goal: one mobile UI living in shared/, used by both iOS and Android, on a single DI system (Koin). Android drops its Hilt + Room/offline layer and its *_presentation UI. Big-bang on branch design-system-foundation.
Source of truth: plans/mobile-consolidation-koin.md
Current debt / status
| Step | What | Status |
|---|---|---|
| S1 | Koin foundation on Android (deps, AndroidAppModule, startKoin, Hilt removed from androidApp) | ✅ Done |
| S2 | androidApp hosts SharedAppNavHost; :androidApp:compileDevDebugKotlin green | ✅ Done |
| S3 | Shell to mobile prototype (frosted tab bar, tab set) | ✅ Partial |
| S4 | Close shared-UI feature gaps (every feature + detail/edit sub-route in commonMain) | ⬜ Not verified |
| S5 | Delete old Android UI + Hilt + offline (≈56 @HiltViewModel, 66 hiltViewModel() sites, LoggedScreen, NavHostWrapper, all *_presentation) | ⬜ Not done |
| S6 | Cleanup + device run-verify (assembleDevDebug, click every route) | ⬜ Not done |
| S7 | Responsive breakpoints across all screens (shared OterWindowSize) | ⬜ Not done |
Note: the orphaned old feature/lib module folders (
finance,tasks, …core-ui,test-core, etc.) were already deleted from disk (2026-06). What remains for S5 is the Hilt/Room/*_presentationcode insideandroidApp/coreand the Hilt gradle wiring — see infra.md for the leftover version pins.
Risks
- Runtime feature gaps (S4): compile-green ≠ working app. A feature missing a shared screen/service/sub-route silently disappears at runtime. Must exercise every tab + detail/edit flow on a device before S5.
- High blast radius (S5): deletion touches the Android UI, DI, and persistence layers together.
- Lost offline: dropping Room means network-only; flaky connectivity degrades UX. Accepted by the user, but a regression to track. → architecture.md
- Test infra: the Hilt-based
test-corewas removed; tests must move to koin-test. → testing.md - Android-only infra (FCM, widgets, global timer, walkthrough): each must be re-bridged from
androidMainvia Koin or explicitly dropped during S5.
Target state
androidApp and iosApp both render the same shared/commonMain screens via SharedAppNavHost + MobileAppShell, with Koin-provided VMs/services, and one responsive layout system across phone/tablet/desktop.
2. Web frontend: Kotlin/JS React → TypeScript React (TD-05)
Goal: replace the old Kotlin/JS web client with a TypeScript/Next.js app (web-frontend/), keeping business logic on the Kotlin server.
Source of truth: infra/web-migration-plan.md · web-frontend/IMPROVEMENTS.md
Current debt / status
web-frontend/exists and is the active client (Next.js 16, React 19.2, TypeScript 5, Tailwind 4, Zustand 5, Axios).- Component library + hooks + design system built; feature parity incomplete — the harder pieces (real-time/WebSocket, file uploads, push notifications) are not fully ported.
- Doc duplication:
WEB_MIGRATION_PLAN.mdexists at both repo root anddocs/infra/— dedupe (TD-13).
Target state
TypeScript React frontend at full feature parity; the old Kotlin/JS client fully retired; one canonical migration doc.
3. Design-token consolidation (Figma ↔ code 1:1) (TD-06)
Goal: one set of design tokens, name-for-name between Figma variables and the Compose Oter.* tokens (currently there are three sources of truth: Figma, code, prototype spec).
Source of truth: design-system/tokens.md
Current debt / status
- Positive: the design-token guard baseline (
config/design-token-guard-baseline.txt) is empty — no files are currently exempt, i.e. the guarded screens are migrated toOter.*. - Open: 5 token DECISIONS still unresolved (primitives tier missing in code, translucent fills, light-theme status colors
dangerLight/warningLight/infoLight, tag colors, elevation/motion/typography kept code-only). Figma↔code is not yet 1:1.
Target state
Figma variables and code tokens are identical and three-tier (primitives → semantic → scales); the guard stays green in --strict. → design-system.md