Offline encyclopedia for the Fate franchise — linking each Servant to their historical and mythological origins.
app/ Application, Navigation, Hilt entry
core/common/ AppResult, dispatchers
core/model/ Immutable domain models
core/domain/ Repository interfaces + UseCases
core/data/ Room, DataStore, JSON asset seeding, mappers
core/designsystem/ Fate dark-fantasy Material 3 theme + shared UI
feature/home/ Catalog grid, search, class filters
feature/details/ Anime / History / Comparison tabs
Pattern: Clean Architecture · MVVM · UDF · Offline-first · Feature modules
ViewModels never talk to repositories — only UseCases.
Kotlin · Jetpack Compose · Material 3 · Hilt · Coroutines/Flow · Navigation Compose · Room · DataStore · Coil · kotlinx.serialization · JUnit · MockK · Turbine
Servants live under app/src/main/assets/servants/{id}/:
servant.json— encyclopedia payloadanime.webp/history.webp— optional artwork (gradient placeholders used when missing)
On first launch, JSON assets are imported into Room (source of truth).
Verification is done in Android Studio Panda 2 (2025.3.2) — no CLI Gradle build is required from agents or contributors for day-to-day work.
- Open the project root in Android Studio.
- File → Sync Project with Gradle Files (wait until sync finishes).
- Select a Pixel 7A emulator (API 34+ recommended).
- Run the app configuration (green Run / Shift+F10).
If sync fails after a toolchain bump, use File → Invalidate Caches once, then Sync again.
- Create
assets/servants/{new-id}/servant.json - Optionally add
anime.webpandhistory.webp - Clear app data (or bump Room version) so seeding re-imports
Use official licensed art for anime portraits and public-domain Wikimedia Commons works for historical portraits. Placeholders render automatically until assets are added.