Architecture

Monorepo with three packages: shared foundation, mobile app, computer app.


Monorepo layout

jotbunker/                        # npm workspaces root
├── packages/
│   ├── shared/                   # Pure TypeScript library
│   ├── mobile/                   # Expo Router app (iOS/Android)
│   └── desktop/                  # Electron + electron-vite (Windows)
├── wiki/                         # This documentation
├── vitest.config.ts              # Multi-project test config
└── .github/workflows/release.yml # Tag → Windows build → GitHub release

Shared package (packages/shared/)

Pure TypeScript — no platform dependencies. Both mobile and desktop import from @jotbunker/shared. Contains:

Mobile package (packages/mobile/)

Expo SDK 54 app with Expo Router navigation. Targets iOS and Android.

Computer package (packages/desktop/)

Electron 35 with electron-vite. Windows only.

Dependency strategy

Build system

Platform Tool Trigger
iOS EAS Build (--local) on Mac Mini Manual — ~/build-{dev,preview,prod}-jotbunker.sh
Android (emulator) build-android-emu.ps1 + adb reverse + npx expo start --localhost Manual
Android (device) build-android.ps1 + adb reverse + npx expo start --localhost Manual
Computer electron-vite + electron-builder npm run dist locally, or push v* git tag for GitHub Actions CI
Tests Vitest 3 npm test (runs shared, mobile, computer projects)

Key design decisions


See also: Sync Protocol | Data Storage