Getting Started
Repo Layout
The monorepo map: packages, responsibilities, and boundary rules.
Workspaces
Bun workspaces, one lockfile at the repo root:
projectr-mono/
├── apps/
│ ├── mobile/ Expo SDK 58 app (expo-router, uniwind, HeroUI Native)
│ ├── dashboard/ Next.js 16 admin (App Router, shadcn/ui, Tailwind v4)
│ └── docs/ this site (Fumadocs on Next.js 16)
├── packages/
│ └── backend/ Convex backend (schema, functions, HTTP routes, crons)
├── bun.lock THE lockfile — never create per-package lockfiles
├── bunfig.toml hoisted linker pin
└── package.json workspaces + shared overrides + root scriptsThe monorepo was created on 2026-08-24 by merging three repos (ProjectR, projectR_Dashboard, projectR_backend), each tagged pre-monorepo and frozen on GitHub. Full history is preserved under each package path.
Boundary rules
- One lockfile.
bun.lockat the root only. The post-merge hook runsbun installwhenever it changed. - Hoisted linker.
bunfig.tomlpinslinker = "hoisted". Bun's isolated linker duplicates native modules and breaks React Native builds. Do not remove it. - Overrides only at the root. The
overridesblock in the rootpackage.jsoncarries the union of all three packages' pins. A change there re-runs all three type-checks before commit. Never move the app onto an Expo or React Native prerelease without pinning that prerelease in the block too. Bun never matches a prerelease against a*peer range, so on the SDK 58 preview about 90 packages nested their own stable copies until the pins went in. - No React Query. Server state is Convex reactive subscriptions in both apps. Client state is Zustand (+MMKV persistence on mobile).
- Shared code lives in
packages/backend(types) — there is no shared-UI package.
Where docs live
Each package has a CLAUDE.md with domain detail — read the relevant one before working inside a package. This site is the consolidated, human-facing documentation; the CLAUDE.md files stay as thin agent-facing pointers into it.