Odyssey is a mobile-first, gamified productivity calendar that turns one meaningful goal into scheduled habits and tasks. It measures both consistency and actual intensity, supports private photo proof, and connects daily progress to milestones and a final goal—the Final Boss.
Use this README as the single entry point when starting or continuing the build. The complete specification is split into three source-of-truth documents:
PRODUCT_SPEC.md— features, workflows, product rules, data definitions, privacy, metrics, MVP scope, acceptance criteria, and extra-feature backlog.DESIGN.md— visual identity, layouts, components, motion, responsive behavior, accessibility presentation, performance targets, and UI quality requirements.TECHNICAL_STACK.md— Expo and React Native stack, device-local SQLite and proof storage, architecture, libraries, security, testing, local builds, and engineering definition of done.
- Follow
PRODUCT_SPEC.mdfor what Odyssey does. - Follow
DESIGN.mdfor how Odyssey looks and feels. - Follow
TECHNICAL_STACK.mdfor how Odyssey is engineered. - If they appear to conflict, product behavior comes from
PRODUCT_SPEC.md; adapt the presentation usingDESIGN.mdwithout inventing or removing product behavior. - V1 stores its database and proof photos on the user's device. It has no backend, account, remote sync, cloud database, online analytics, push service, or online media storage.
- Do not introduce external calendar, AI, wearable, social, cloud, or provider-integration features unless the product scope is explicitly changed.
Ship the complete journey from creating a Final Boss, scheduling measurable Quests, and recording honest effort with optional photo proof through milestone completion, recovery from missed work, and Final Boss victory.
Odyssey is now scaffolded as the local-only Expo SDK 57 application described by the specifications.
corepack enable
pnpm install
pnpm check
pnpm exec expo prebuild --clean
pnpm exec expo run:android
# macOS only:
pnpm exec expo run:iosUse a development build, not Expo Go: SQLCipher requires native prebuild configuration. The project pins Node.js in .nvmrc, stores no API credentials, and needs no backend or online service at runtime.
The fast local acceptance gate is pnpm check. Physical-device permission, reminder-delivery, accessibility, encrypted-database, file-protection, force-close, and performance verification remain separate release gates as defined by the source-of-truth specifications.
On x86_64 Linux, run one command:
./build-apk.shThe script downloads checksum-verified JDK 17 and Android SDK tooling into .build-tools/, installs project dependencies, runs pnpm check, generates the native Android project, builds a standalone release APK with an embedded Hermes bundle, verifies its signature, and writes the result to dist/.
It uses every CPU core by default and chooses a Gradle heap from available memory. The default APK targets arm64-v8a, which is the fastest path for modern physical Android devices. To build all Android ABIs:
ANDROID_ABIS=armeabi-v7a,arm64-v8a,x86,x86_64 ./build-apk.shUseful overrides:
GRADLE_WORKERS=32 GRADLE_HEAP_MB=8192 ./build-apk.sh
SKIP_CHECKS=1 ./build-apk.shThe APK is signed with Android's generated local debug key so it can be installed directly for testing. Publishing through Google Play requires a private production signing key and a release signing configuration; neither is stored in this repository.