A modern, production-ready monorepo boilerplate featuring Next.js, Expo, and Convex. Start building full-stack applications with web and mobile support in minutes.
- π― Full-Stack Ready - Next.js web app + Expo mobile app + Convex backend
- π¨ Shared Design System - Unified theme and components across web and mobile
- β‘ Type-Safe - End-to-end TypeScript with shared types
- π₯ Modern Stack - React 19, Next.js 16, Expo Router, Tailwind CSS
- π¦ Monorepo - pnpm workspaces for efficient dependency management
- π UI Components - Pre-built shadcn/ui components for web
- π± Native Components - Custom native components for mobile
- π Zero Config - Pre-configured with best practices
- π Production Ready - ESLint, TypeScript, and optimized builds
Before you begin, ensure you have the following installed:
- Node.js 18.0 or higher (Download)
- pnpm 8.0 or higher (Install guide)
- Git (Download)
For mobile development:
- Expo CLI (optional, included in dependencies)
- iOS Simulator (macOS only) or Android Studio (for Android)
git clone https://github.com/yourusername/boilerplate-2026.git
cd boilerplate-2026pnpm installCopy the example environment file and fill in your values:
cp .env.example .env.localEdit .env.local and add your configuration:
# Convex
CONVEX_DEPLOYMENT=
NEXT_PUBLIC_CONVEX_URL=
# Add your other environment variables hereIf you're using Convex, initialize it:
pnpm exec convex devFollow the prompts to create a new Convex project or link to an existing one.
Choose one of the following options:
Option A: Run Everything
pnpm dev:allThis starts the website, mobile app, and Convex backend simultaneously.
Option B: Run Website Only
pnpm dev:websiteStarts the Next.js website and Convex backend.
Option C: Run Mobile (iOS)
pnpm dev:mobile:iosStarts the Expo mobile app (iOS) and Convex backend.
Option D: Run Mobile (Android)
pnpm dev:mobile:androidStarts the Expo mobile app (Android) and Convex backend.
From the root directory:
pnpm dev:mobile:iosThis starts the mobile app (iOS) and Convex backend together.
To run only the mobile app without Convex:
pnpm dev:mobile-only:iosFrom the root directory:
pnpm dev:mobile:androidThis starts the mobile app (Android) and Convex backend together.
To run only the mobile app without Convex:
pnpm dev:mobile-only:android- Install the Expo Go app on your device
- Start the development server from the root:
pnpm dev:mobile-only:ios # or pnpm dev:mobile-only:android - Scan the QR code with Expo Go (iOS) or the Expo app (Android)
Alternatively, you can run from the mobile directory:
cd mobile
pnpm startFrom the mobile directory:
cd mobile
pnpm webThe website runs on http://lvh.me:3000 by default.
- Development:
http://lvh.me:3000 - Hot Reload: Enabled with Turbopack
- TypeScript: Full type checking
boilerplate-2026/
βββ website/ # Next.js web application
βββ mobile/ # Expo React Native application
βββ shared/ # Shared code, types, and constants
βββ convex/ # Convex backend functions
βββ package.json # Root workspace configuration
| Command | Description |
|---|---|
pnpm dev:all |
Start website, mobile, and Convex |
pnpm dev:website |
Start website and Convex |
pnpm dev:website-only |
Start only website |
pnpm dev:mobile:ios |
Start mobile (iOS) and Convex |
pnpm dev:mobile:android |
Start mobile (Android) and Convex |
pnpm dev:mobile-only:ios |
Start only mobile (iOS) |
pnpm dev:mobile-only:android |
Start only mobile (Android) |
pnpm dev:convex |
Start only Convex |
pnpm build |
Build website for production |
| Command | Description |
|---|---|
pnpm dev |
Start development server |
pnpm build |
Build for production |
pnpm start |
Start production server |
pnpm lint |
Run ESLint |
| Command | Description |
|---|---|
pnpm start |
Start Expo development server |
pnpm ios |
Run on iOS simulator |
pnpm android |
Run on Android emulator |
pnpm web |
Run web version |
pnpm lint |
Run ESLint |
Uses Tailwind CSS with a shared theme system. Colors and design tokens are defined in shared/constants/theme/.
Uses Uniwind (Tailwind for React Native) with the same shared theme system for consistency across platforms.
Each package has its own tsconfig.json that extends the root configuration. The shared package is configured to be imported across workspaces.
- Website: Next.js ESLint config
- Mobile: Expo ESLint config
- Root: Shared rules
.env.example- Template for environment variables.env.local- Local development variables (not committed)
- Push your code to GitHub
- Import your repository in Vercel
- Set the root directory to
website - Add environment variables in Vercel dashboard
- Deploy!
-
Install EAS CLI:
npm install -g eas-cli
-
Configure your project:
cd mobile eas build:configure -
Build for production:
eas build --platform ios eas build --platform android
-
Submit to app stores:
eas submit --platform ios eas submit --platform android
Convex automatically deploys when you push to your main branch. Configure deployment in your Convex dashboard.
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
If port 3000 is already in use, you can change it in website/package.json:
"dev": "next dev --turbopack --hostname lvh.me --port 3001"Clear Metro cache:
cd mobile
pnpm start -- --reset-cacheMake sure your .env.local has the correct NEXT_PUBLIC_CONVEX_URL and that Convex is running.
If you encounter dependency issues:
rm -rf node_modules
rm pnpm-lock.yaml
pnpm installThis project is licensed under the MIT License - see the LICENSE file for details.
- shadcn/ui for the amazing component library
- Expo for the incredible mobile development experience
- Convex for the powerful backend platform
- Vercel for Next.js and hosting
If this project helped you, please give it a β on GitHub!
Built with β€οΈ using Next.js, Expo, and Convex