HEJI projects monorepo
One public repo for several products. Each lives in projects/<name>/ with its own Cloudflare
site/Worker, mobile and desktop apps, docs and release settings. They share one Supabase project,
one npm workspace and the CI plumbing.
| Project | What | README |
|---|---|---|
| Waypack | Offline trip bundles: MCP server + Worker site, Flutter app (iOS, Android, macOS) | projects/waypack |
| Wee Hours | Hands-free newborn log: iPhone + watch app with on-device voice (Swift), Even G2 glasses app, site + MCP Worker | projects/weehours |
| FeedbackKit | In-app feedback with a closed fix loop: SDKs (iOS/macOS/watchOS, Android, web, Flutter, React Native, desktop), dashboard, Portal apps, CLI + MCP. Own Supabase project (BACKEND=own) |
projects/feedbackkit |
| Voxbrief | Voice memos on Apple Watch → clean Markdown notes on iPhone/Mac, transcribed and rewritten on the device (Swift, Whisper + Qwen3). No backend (BACKEND=none) |
projects/voxbrief |
| Meowtrix | Remote workspace for vibe engineering: self-hosted Node server (split panes of terminals, browsers, editor), macOS desktop apps (Tauri). No backend (BACKEND=none); standalone npm project with its own lockfile |
projects/meowtrix |
| Contempo | AI-native hour tracker for STR material-participation tests: Android + Wear OS (Kotlin), iOS + watchOS (Swift), web app + admin + API on its Worker. Moved off Firebase onto the shared Supabase project (schema contempo) |
projects/contempo |
| ToddlerCam | Dual-camera app for toddlers (front + rear at once, face-tracking masks, toddler lock) with an Apple Watch remote for the parent (Swift). Kids Category, no backend (BACKEND=none) |
projects/toddlercam |
| TinyTouch | Toddler lock + low-stimulation play on Apple Watch (touch shield, Digital Crown toys, 3-second parent hold) with an iPhone remote (Swift). Kids Category, no backend (BACKEND=none) |
projects/tinytouch |
| G2 Digest | A brief compiled ahead of time into glanceable cards for Even G2 glasses + R1 ring and pre-made audio: web app + brief editor + G2 preview, Even Hub plugin, MCP for the build agent (one Worker, TypeScript) | projects/g2digest |
Layout
projects/<name>/ everything one product owns (apps, services, packages, site, docs)
release.env how scripts/cut_release.sh releases it
supabase/ the shared Supabase project: config, schemas/<name>/, one migrations/ history
scripts/cut_release.sh releases one project: scripts/cut_release.sh <name> [patch|minor|major|x.y.z]
scripts/db_migration.sh new migration for one project; check_supabase.mjs keeps projects apart
scripts/check_isolation.mjs, graduation_check.sh each project can leave for its own Supabase (supabase/GRADUATION.md)
pages/ the GitHub Pages site for every app (npm run pages:dev); project docs come from projects/<name>/docs
.claude/skills/ agent skills: heji-new-project, heji-migrate-project, heji-candidate-review, heji-fix-ci, heji-new-skill, heji-archive-reports, heji-build-next (.agents/skills/ links them for Codex, Antigravity, Gemini CLI, Cursor…)
.github/workflows/ <name>-*.yml per project
.github/actions/ apple-signing (shared), <name>-toolchain
package.json npm workspaces: projects/*/packages/*, projects/*/services/*, projects/*/apps/*
tsconfig.base.json shared TypeScript settings
npm install # every project's workspaces
supabase start # shared local stack (ports 554xx)
npm run build:waypack # per-project scripts: build:<name>, test:<name>, typecheck:<name> (waypack, weehours, g2digest)
Adding a project
- Code in
projects/<name>/: Node packages underpackages/orservices/, apps underapps/(any of them with apackage.jsonis picked up by the workspaces; name them@<name>/…). Addbuild:/test:/typecheck:<name>scripts to the rootpackage.json. - Backend:
projects/<name>/backend.env(copy Wee Hours'): which Supabase project it uses and the only files allowed to contain its coordinates. Projects share the HEJI project until they graduate to their own; keep that possible (supabase/GRADUATION.md). Database: its own Postgres schema (named after the project, so the folder name must be a valid identifier) and Storage bucket. Tables go insupabase/schemas/<name>/; generate migrations withscripts/db_migration.sh <name> <what>. Readsupabase/README.mdfirst: users, auth settings, the service key and the plan's quota are shared (that's the point). Wee Hours is the worked example of a non-legacy project. - CI:
.github/workflows/<name>-ci.ymlwithpaths:coveringprojects/<name>/**and the shared root files (copywaypack-ci.yml). Release workflows trigger onrelease: publishedand must skip other projects' tags:if: startsWith(github.event.release.tag_name, '<name>-v'). Name its GitHub variables and secrets<NAME>_…(only the Apple team signing secrets are shared). - Docs:
projects/<name>/docs/with anindex.md(and optionallypages.jsonfor the sidebar) appears on the site as/<name>/; add a card for the app topages/index.md. - Releases:
projects/<name>/release.env(copy Waypack's) withTAG_PREFIX="<name>-v"andLATEST=false. Waypack owns the repo's "latest" release: its installed Mac apps update fromreleases/latest. - Cloudflare: a Workers Builds project per Worker, root directory = repo root, deploy command
cd projects/<name>/services/<worker> && npm run deploy, build watch pathsprojects/<name>/*. - Apple/Google: per-app bundle IDs under
com.hejitech.*; signing secrets inapple-signingare team-wide and reusable.