This repo is a modern TypeScript monorepo for a shared notes app across web and native.
It currently uses:
- Turborepo
- pnpm
- Next.js 16 with the App Router
- Expo SDK 55 with Expo Router
- React 19
- Convex
- Clerk
- OpenAI for optional note summaries
apps/web- the Next.js web appapps/native- the Expo native apppackages/backend- the Convex backend and generated API types
pnpm installRun the backend setup command:
pnpm --filter @packages/backend setupThis will log you into Convex, create or connect a project, and generate packages/backend/.env.local.
Follow the official Convex + Clerk guide.
In the Clerk dashboard, enable the Convex integration and copy the Clerk JWT issuer domain. Add it to your Convex environment variables as:
CLERK_JWT_ISSUER_DOMAIN=https://your-frontend-api.clerk.accounts.devIf you want native social login, enable Google and Apple in Clerk as well.
If you want AI summaries, also add:
OPENAI_API_KEY=...to your Convex environment variables.
Create .env.local files in apps/web and apps/native from the provided .example.env files.
- Use
CONVEX_URLfrompackages/backend/.env.localfor bothNEXT_PUBLIC_CONVEX_URLandEXPO_PUBLIC_CONVEX_URL - Use your Clerk publishable key for both app env files
- Use your Clerk secret key in
apps/web/.env.local
pnpm devThis runs the backend, web app, and native app through Turbo.
From apps/web, use Convex to deploy the backend and build the web app:
cd ../../packages/backend && pnpm exec convex deploy --cmd 'cd ../../apps/web && pnpm build' --cmd-url-env-var-name NEXT_PUBLIC_CONVEX_URLapps/web/vercel.json is already set up for this flow on Vercel.
Install dependencies in the package that actually uses them.
Examples:
pnpm --filter web-app add mypackage@latest
pnpm --filter native-app add mypackage@latest
pnpm --filter @packages/backend add mypackage@latest- The native app uses Expo Router route groups under
apps/native/src/app - The web app protects note routes with
apps/web/src/proxy.ts - Convex enforces note ownership server-side in
packages/backend/convex/notes.ts