This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
VBHelper is an Android app (Kotlin + Jetpack Compose) for interacting with Vital Bracelet series devices (VB, VH, VBC, VBBE) via NFC. It reads/writes characters, manages cards, tracks adventures, and handles cryptographic secrets for device communication.
All Gradle commands require JDK 17. Set JAVA_HOME before building:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
# Build the project
./gradlew build
# Run unit tests
./gradlew test
# Run a single unit test class
./gradlew testDebugUnitTest --tests "com.github.nacabaro.vbhelper.ExampleUnitTest"
# Run instrumented (Android device) tests
./gradlew connectedAndroidTest
# Install debug APK
./gradlew installDebug
# Lint check (has baseline in lint-baseline.xml)
./gradlew lint
Single-module project — all Gradle tasks target :app.
Pattern: Controller-based screens with Repository data access and a manual service locator for DI.
Data flow: Screen composables → Controller (interface + impl) → Repository → Room DAO → SQLite
Key architectural decisions:
DefaultAppContainer (in di/) is the DI root — lazily creates the Room DB, DataStore instances, and all repositories. Accessed via (application as VBHelper).container.Controller interface and ControllerImpl. Controllers hold business logic and expose state via Kotlin Flow.vb-nfc-reader library (0.2.0-SNAPSHOT from mavenLocal). Card parsing uses vb-dim-reader.app/src/main/assets/items.db.Source layout (app/src/main/java/com/github/nacabaro/vbhelper/):
| Directory | Purpose |
|---|---|
di/ |
App-level DI container and Application class |
database/ |
Room database, DAOs (11 DAOs, 17 entities) |
domain/ |
Domain model classes (card, characters, device_data, items) |
source/ |
Repositories (8) for data access |
screens/ |
Compose UI screens, each with its own Controller |
navigation/ |
Compose NavHost, route definitions, bottom nav bar |
components/ |
Shared UI components |
dtos/ |
Data transfer objects for screen-layer queries |
utils/ |
DeviceType enum, bitmap helpers |
proto/ |
Protobuf definitions for secrets |
vb-nfc-reader is resolved from mavenLocal() — must be installed locally to buildgradle/libs.versions.tomlAppContainer/DefaultAppContainer. Do not introduce Hilt, Dagger, or KoinFlow for observable stategradle/libs.versions.toml, never inline in build.gradle.ktsThe following modifications carry high risk and require careful consideration:
app/src/main/assets/items.db — Pre-loaded item database. Must stay in sync with Room schema. A mismatch crashes the app on fresh install.app/src/main/proto/*.proto — Protobuf definitions for cryptographic secret storage. Changing field numbers or removing fields can make existing user secrets unreadable, effectively bricking their device pairing.vb-nfc-reader version — Resolved from mavenLocal() as a SNAPSHOT. Changing the version requires the new version to be installed locally. Version mismatches cause build failures with confusing error messages.gradlew / gradle/wrapper/ — Managed by Gradle. Manual edits can break the build for all developers. Use ./gradlew wrapper --gradle-version=X.Y to upgrade.