ProjectR Docs
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 scripts

The 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.lock at the root only. The post-merge hook runs bun install whenever it changed.
  • Hoisted linker. bunfig.toml pins linker = "hoisted". Bun's isolated linker duplicates native modules and breaks React Native builds. Do not remove it.
  • Overrides only at the root. The overrides block in the root package.json carries 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.

On this page