{"id":32784722,"url":"https://github.com/joeslain/nexpo","last_synced_at":"2025-11-08T05:01:56.304Z","repository":{"id":322476449,"uuid":"1087814331","full_name":"JoeSlain/Nexpo","owner":"JoeSlain","description":"Easiest way to create apps for web and mobile","archived":false,"fork":false,"pushed_at":"2025-11-04T17:11:49.000Z","size":2642,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-04T18:21:23.831Z","etag":null,"topics":["biomejs","cross-platform","expo","lingui","monorepo","nextjs","react-native","supabase","tamagui","trpc","turborepo","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JoeSlain.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":null},"created_at":"2025-11-01T17:43:09.000Z","updated_at":"2025-11-04T17:17:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/JoeSlain/Nexpo","commit_stats":null,"previous_names":["joeslain/nexpo"],"tags_count":null,"template":true,"template_full_name":null,"purl":"pkg:github/JoeSlain/Nexpo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoeSlain%2FNexpo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoeSlain%2FNexpo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoeSlain%2FNexpo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoeSlain%2FNexpo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JoeSlain","download_url":"https://codeload.github.com/JoeSlain/Nexpo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoeSlain%2FNexpo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":282745088,"owners_count":26720200,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-05T02:00:05.946Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["biomejs","cross-platform","expo","lingui","monorepo","nextjs","react-native","supabase","tamagui","trpc","turborepo","typescript"],"created_at":"2025-11-05T02:00:53.810Z","updated_at":"2025-11-05T02:02:10.903Z","avatar_url":"https://github.com/JoeSlain.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cimg width=\"800\" height=\"364\" alt=\"NEXPO banner\" src=\"https://github.com/user-attachments/assets/9ab52f3e-fe95-40ed-9a54-a7e5e80b555f\" /\u003e\n\nA production-ready monorepo template for building cross-platform applications with Next.js and React Native (Expo)\n\nBased on [Fernando Rojo's work](https://github.com/nandorojo/solito/tree/master/example-monorepos/blank)\n\n\n\n## 🎯 Quick Start\n### ⚡️ Instantly clone \u0026 deploy on vercel\n(You still need to setup supabase manually)\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FJoeSlain%2Fnexpo)\n\n### Manual setup\n1. Click \"Use this template\" on GitHub\n2. Clone your new repository\n3. Follow the [Setup Instructions](#-setup-instructions) below\n\n\n## 📦 What's Included\n\n- **Solito** - Cross-platform navigation between Next.js and React Native\n- **Next.js 16** - React framework for production\n- **Expo SDK 54** - React Native framework\n- **React 19** with React Compiler\n- **tRPC** - End-to-end typesafe APIs\n- **Supabase** - Backend as a service (database, auth, storage)\n- **Lingui** - Internationalization (i18n)\n- **Tamagui** - Universal design system\n- **Storybook** - Component development and testing (web \u0026 native)\n- **Sentry** - Error tracking and monitoring\n- **Turborepo** - Monorepo build system\n- **Biome** - Fast formatter and linter\n- **Husky** - Git hooks\n\n## 🗂 Project Structure\n\n```\n.\n├── apps/\n│   ├── expo/          # React Native app (Expo)\n│   ├── next/           # Next.js web app\n│   ├── storybook-native/  # React Native Storybook\n│   └── storybook-web/     # Web Storybook\n├── packages/\n│   ├── app/            # Shared app code (features, providers, navigation)\n│   └── api/            # tRPC router and Supabase server client\n└── supabase/           # Supabase migrations and config\n```\n\n## 🏁 Setup Instructions\n\n### Prerequisites\n\n- Node.js 20+ and Yarn 4.7.0+\n- Docker (for local Supabase development)\n- Git\n\n### 1. Install Dependencies\n\n```bash\nyarn install\n```\n\n### 2. Configure Environment Variables\n\nThis project uses environment-specific configuration files for development and production. Each app has separate `.env.development` and `.env.production` files.\n\n#### Environment File Structure\n\n**Next.js (`apps/next/`):**\n- `.env.development` - Development environment variables (auto-loaded when `NODE_ENV=development`)\n- `.env.production` - Production environment variables (auto-loaded when `NODE_ENV=production`)\n- `.env.local` - Local overrides (gitignored, highest priority, never commit this file)\n\n**Expo (`apps/expo/`):**\n- `.env.development` - Development environment variables (loaded via helper script)\n- `.env.production` - Production environment variables (loaded via helper script)\n- `.env.local` - Local overrides (gitignored, highest priority, never commit this file)\n\n\u003e **Note**: Next.js automatically loads environment files based on `NODE_ENV`. Expo uses a custom helper script (`scripts/load-env.js`) to achieve the same behavior.\n\n#### Setup Instructions\n\n1. **Update development values** in `apps/next/.env.development` and `apps/expo/.env.development`:\n   - Set your local Supabase URL: `http://127.0.0.1:54321`\n   - Get your local Supabase anon key by running `yarn supabase:status`\n   - For Expo, set `EXPO_PUBLIC_API_URL` to `http://localhost:3000/api/trpc` (or your machine's IP for physical devices)\n\n2. **Update production values** in `apps/next/.env.production` and `apps/expo/.env.production`:\n   - Replace placeholder values with your actual production Supabase credentials\n   - Set production API URLs\n   - Configure production Sentry DSNs\n\n3. **Create `.env.local` files** (optional, for local overrides):\n   ```bash\n   # These files are gitignored and should contain only your local secrets\n   touch apps/next/.env.local\n   touch apps/expo/.env.local\n   ```\n\n#### Required Variables\n\n**Next.js:**\n- `NEXT_PUBLIC_SUPABASE_URL` - Your Supabase project URL\n- `NEXT_PUBLIC_SUPABASE_ANON_KEY` - Your Supabase anon/public key\n- `SUPABASE_SERVICE_ROLE_KEY` - (Optional) For server-side operations with elevated permissions\n- `NEXT_PUBLIC_SENTRY_DSN` - (Optional) Sentry DSN for client-side error tracking\n- `SENTRY_DSN` - (Optional) Server-side Sentry DSN\n- `SENTRY_ORG` - (Optional) Sentry organization slug\n- `SENTRY_PROJECT` - (Optional) Sentry project slug\n\n**Expo:**\n- `EXPO_PUBLIC_SUPABASE_URL` - Your Supabase project URL\n- `EXPO_PUBLIC_SUPABASE_ANON_KEY` - Your Supabase anon/public key\n- `EXPO_PUBLIC_API_URL` - Your Next.js API URL (for tRPC)\n- `EXPO_PUBLIC_SENTRY_DSN` - (Optional) Sentry DSN for error tracking\n\n**Root (for lingui-ai-translate):**\n- `OPENAI_API_KEY` - (Optional) OpenAI API key for automated translations. Get your key from [platform.openai.com](https://platform.openai.com/api-keys)\n\n### 3. Setup Supabase\n\n#### Local Development\n\nStart Supabase locally:\n\n```bash\nyarn supabase:start\n```\n\nThis will:\n- Start all Docker containers\n- Run database migrations\n- Load seed data\n\nGet your local environment variables:\n\n```bash\nyarn supabase:status\n```\n\nAccess Supabase Studio at: http://localhost:54323\n\n#### Production Setup\n\n1. Create a project at [supabase.com](https://supabase.com)\n2. Get your project URL and API keys from the project settings\n3. Update your environment variables with production values\n4. Push your database schema:\n\n```bash\n# Link to your Supabase project (only needed once)\nsupabase link --project-ref your-project-ref\n\n# Push migrations to production\nsupabase db push\n```\n\n⚠️ **Important**: The template includes a seed file. Review and modify `supabase/seed.sql` before deploying to production.\n\n### 4. Update Supabase Project ID\n\nUpdate the project ID in `supabase/config.toml`:\n\n```toml\nproject_id = \"your-project-name\"\n```\n\nThis helps distinguish different Supabase projects on the same machine.\n\n### 5. Update API URLs\n\n#### Expo tRPC Client\n\nUpdate the production API URL in `apps/expo/utils/trpc/client.tsx`:\n\n```typescript\nreturn process.env.EXPO_PUBLIC_API_URL || 'https://your-domain.com/api/trpc'\n```\n\n### 6. Start Development Servers\n\n#### Web (Next.js)\n\n```bash\nyarn web\n```\n\nThis will:\n- Automatically load `.env.development` and `.env.local` (if exists) based on `NODE_ENV=development`\n- Start the Next.js dev server\n- Run on http://localhost:3000\n\nYou can also run directly from the `apps/next` directory:\n```bash\ncd apps/next\nyarn dev\n```\n\n\u003e **Note**: Next.js automatically loads environment files based on `NODE_ENV`. No `dotenv-cli` needed.\n\n#### Mobile (Expo)\n\nFirst, build a dev client:\n\n```bash\ncd apps/expo\nyarn ios\n# or\nyarn android\n```\n\nThen, from the root:\n\n```bash\nyarn native\n```\n\nOr run directly from the `apps/expo` directory:\n```bash\ncd apps/expo\nyarn start\n```\n\nThe Expo scripts automatically load `.env.development` and `.env.local` (if exists) via the `load-env.js` helper script.\n\n## 🚀 Deployment\n\n### Vercel (Next.js)\n\n1. Connect your repository to Vercel\n2. Set the root directory to `apps/next`\n3. Configure environment variables in Vercel dashboard:\n   - `NEXT_PUBLIC_SUPABASE_URL` - Your production Supabase URL\n   - `NEXT_PUBLIC_SUPABASE_ANON_KEY` - Your production Supabase anon key\n   - `SUPABASE_SERVICE_ROLE_KEY` - Your production service role key\n   - `SENTRY_*` - (Optional) Sentry configuration for production\n\n   \u003e **Note**: Vercel automatically sets `NODE_ENV=production` during build, so Next.js will load `.env.production` automatically. However, you should set production values in Vercel's environment variables dashboard for security.\n\n4. Vercel will automatically detect:\n   - Framework: Next.js\n   - Build Command: `cd ../.. \u0026\u0026 npx turbo run build --filter=next-app`\n   - Output Directory: `.next`\n\nOr use the deploy button above after updating the repository URL.\n\n### Expo (Mobile Apps)\n\nDeploy using EAS (Expo Application Services):\n\n#### Prerequisites\n\n1. **Install EAS CLI**:\n   ```bash\n   npm install -g eas-cli\n   ```\n\n2. **Login to EAS**:\n   ```bash\n   eas login\n   ```\n\n#### Configuration\n\nThe `eas.json` file is already configured with build profiles:\n- **development**: Development client builds (simulator/APK)\n- **preview**: Internal distribution builds (APK)\n- **production**: Production app store builds (App Bundle/IPA)\n\n3. **Configure environment variables in EAS**:\n   ```bash\n   cd apps/expo\n   eas secret:create --scope project --name EXPO_PUBLIC_SUPABASE_URL --value \"https://your-project.supabase.co\"\n   eas secret:create --scope project --name EXPO_PUBLIC_SUPABASE_ANON_KEY --value \"your-production-anon-key\"\n   eas secret:create --scope project --name EXPO_PUBLIC_API_URL --value \"https://your-domain.com/api/trpc\"\n   eas secret:create --scope project --name EXPO_PUBLIC_SENTRY_DSN --value \"your-sentry-dsn\"  # Optional\n   ```\n\n   Or configure them in the [EAS dashboard](https://expo.dev/accounts/[your-account]/projects/nexpo/secrets).\n\n4. **Update submit credentials** (optional, for automated submissions):\n   Edit `apps/expo/eas.json` and update the `submit.production` section with your:\n   - Apple ID, App Store Connect App ID, and Team ID (for iOS)\n   - Google Play service account key path (for Android)\n\n#### Build and Submit\n\n5. **Build for production**:\n   ```bash\n   cd apps/expo\n   \n   # Build for iOS\n   npm run eas:build:ios:profile\n   \n   # Build for Android\n   npm run eas:build:android:profile\n   \n   # Build for both platforms\n   npm run eas:build:all -- --profile production\n   ```\n\n6. **Submit to app stores**:\n   ```bash\n   cd apps/expo\n   \n   # Submit iOS build\n   npm run eas:submit:ios\n   \n   # Submit Android build\n   npm run eas:submit:android\n   ```\n\n#### OTA Updates\n\nPublish over-the-air updates without rebuilding:\n\n```bash\ncd apps/expo\n\n# Publish update to production channel\nnpm run eas:update:republish\n\n# Or use interactive mode\nnpm run eas:update\n```\n\n#### Available EAS Scripts\n\nThe project includes several EAS-related scripts in `apps/expo/package.json`:\n\n**Build:**\n- `npm run eas:build:android` - Build for Android\n- `npm run eas:build:ios` - Build for iOS\n- `npm run eas:build:all` - Build for both platforms\n- `npm run eas:build:android:profile` - Build Android with production profile\n- `npm run eas:build:ios:profile` - Build iOS with production profile\n\n**Submit:**\n- `npm run eas:submit:android` - Submit Android build to Play Store\n- `npm run eas:submit:ios` - Submit iOS build to App Store\n\n**Update:**\n- `npm run eas:update` - Publish OTA update (interactive)\n- `npm run eas:update:republish` - Publish update to production branch\n\n**Configuration:**\n- `npm run eas:configure` - Configure EAS Build\n\n## 🔔 Sentry Configuration\n\nThis template includes Sentry for error tracking. To enable:\n\n1. Create a project at [sentry.io](https://sentry.io)\n2. Get your DSN from project settings\n3. Set the environment variables (see above)\n4. Sentry will automatically initialize in both apps\n\n## 🌍 Internationalization (i18n)\n\nThis template uses Lingui for i18n. Supported locales are configured in `packages/app/lingui.config.js`.\n\n### Workflow\n\nThe typical i18n workflow consists of three steps:\n\n1. **Extract messages** - Extract translatable strings from your code\n2. **Translate messages** - Translate messages using AI or manual translation\n3. **Compile messages** - Compile translations for runtime use\n\n### Extract messages\n\nExtract translatable strings from your codebase:\n\n```bash\nyarn lingui:extract\n```\n\nThis scans your code for `t` macros and other Lingui translation functions and generates `.po` files in `packages/app/locales/`.\n\n### Translate messages\n\n#### Using AI Translation (Recommended)\n\nThis template includes `lingui-ai-translate` for automated translations using OpenAI's API.\n\n**Setup:**\n\n1. Get your OpenAI API key from [platform.openai.com](https://platform.openai.com/api-keys)\n2. Add it to your environment variables:\n\n   For root `.env` (used by lingui-ai-translate):\n   ```bash\n   OPENAI_API_KEY=your-openai-api-key-here\n   ```\n\n   Or export it in your shell:\n   ```bash\n   export OPENAI_API_KEY=your-openai-api-key-here\n   ```\n\n3. Run the translation command:\n\n   ```bash\n   yarn lingui:translate\n   ```\n\nThis will automatically translate all messages in your `.po` files to all configured locales using OpenAI's API. The translations preserve placeholders and formatting.\n\n#### Manual Translation\n\nYou can also manually edit the `.po` files in `packages/app/locales/` to translate messages yourself.\n\n### Compile messages\n\nAfter translating, compile the messages for runtime use:\n\n```bash\nyarn lingui:compile\n```\n\nThis generates optimized `.js` files that are used by your application at runtime.\n\n## 📚 Storybook\n\nThis template includes Storybook for both web and React Native, allowing you to develop and test UI components in isolation.\n\n### Web Storybook\n\nStart the web Storybook to view and test components in a browser environment:\n\n```bash\nyarn storybook:web\n```\n\nThis will start Storybook on http://localhost:6006\n\n### React Native Storybook\n\nStart the React Native Storybook to view and test components in a mobile environment:\n\n```bash\nyarn storybook:native\n```\n\nThis will start Storybook on http://localhost:7007 and open the Expo app with Storybook UI integrated.\n\nYou can also run it directly from the `apps/storybook-native` directory:\n\n```bash\ncd apps/storybook-native\nyarn storybook\n# or run the Expo app directly\nyarn ios\n# or\nyarn android\n```\n\n### Story Locations\n\nStories are automatically loaded from:\n- `apps/storybook-web/src/**/*.stories.tsx` (web stories)\n- `apps/storybook-native/src/**/*.stories.tsx` (native stories)\n- `packages/ui/src/**/*.stories.tsx` (shared UI package stories)\n\n### Features\n\n- **Tamagui Integration** - Both Storybook apps use the shared Tamagui config from `packages/app/tamagui.config.ts`\n- **Monorepo Support** - Stories from shared packages are automatically loaded\n- **TypeScript Support** - Full TypeScript support for stories\n- **Addons** - Web Storybook includes accessibility, docs, and testing addons\n\n### Writing Stories\n\nWhen writing stories that should work in both web and React Native:\n\n```tsx\nimport type { Meta, StoryObj } from '@storybook/react' // web\n// or '@storybook/react-native' for native-only stories\n\nimport { YourComponent } from './YourComponent'\n\nconst meta = {\n  title: 'UI/YourComponent',\n  component: YourComponent,\n  // ... rest of config\n} satisfies Meta\u003ctypeof YourComponent\u003e\n\nexport default meta\n```\n\nFor platform-specific stories, use platform-specific story files or conditional imports.\n\n## 🆕 Add new dependencies\n\n### Pure JS dependencies\n\nIf you're installing a JavaScript-only dependency that will be used across platforms, install it in `packages/app`:\n\n```bash\ncd packages/app\nyarn add date-fns\ncd ../..\nyarn\n```\n\n### Native dependencies\n\nIf you're installing a library with any native code, you must install it in `apps/expo`:\n\n```bash\ncd apps/expo\nyarn add react-native-reanimated\ncd ../..\nyarn\n```\n\nYou can also install the native library inside of `packages/app` if you want to get autoimport for that package inside of the app folder. However, you need to be careful and install the exact same version in both packages. If the versions mismatch at all, you'll potentially get terrible bugs. This is a classic monorepo issue.\n\nTo check for and fix version mismatches, use the `check-deps` command:\n\n```bash\n# Check for version mismatches\nyarn check-deps\n\n# Automatically fix version mismatches\nyarn check-deps:fix\n```\n\nAlways run `yarn check-deps` after installing dependencies to ensure all packages are using compatible versions.\n\n## 🛠 Development Commands\n\n```bash\n# Install dependencies\nyarn install\n\n# Start Next.js dev server (loads .env.local automatically)\nyarn web\n\n# Start Expo dev server (loads .env automatically)\nyarn native\n\n# Start Storybook\nyarn storybook:web      # Web Storybook (port 6006)\nyarn storybook:native  # React Native Storybook (port 7007)\n\n# Run linter\nyarn lint\n\n# Fix linting issues\nyarn lint:fix\n\n# Format code\nyarn format\n\n# EAS commands (from apps/expo directory)\ncd apps/expo\nnpm run eas:build:android      # Build for Android\nnpm run eas:build:ios          # Build for iOS\nnpm run eas:submit:android     # Submit Android build\nnpm run eas:submit:ios         # Submit iOS build\nnpm run eas:update             # Publish OTA update\n\n# Lingui commands\nyarn lingui:extract      # Extract translatable messages from code\nyarn lingui:translate   # Translate messages using AI (requires OPENAI_API_KEY)\nyarn lingui:compile     # Compile translations for runtime use\n\n# Supabase commands\nyarn supabase:start      # Start local Supabase\nyarn supabase:stop       # Stop local Supabase\nyarn supabase:status     # Show connection details\nyarn supabase:reset      # Reset database and run migrations\nyarn supabase:logs       # View logs\n\n# Dependency management\nyarn check-deps          # Check for version mismatches across packages\nyarn check-deps:fix      # Automatically fix version mismatches\n```\n\n### Environment Variables in Scripts\n\n**Next.js:**\n- Automatically loads `.env.development` when `NODE_ENV=development` (default for `yarn dev`)\n- Automatically loads `.env.production` when `NODE_ENV=production` (default for `yarn build` and `yarn start`)\n- Always loads `.env.local` last (highest priority, gitignored)\n- No `dotenv-cli` needed - Next.js handles this natively\n\n**Expo:**\n- Uses `scripts/load-env.js` helper to load environment files based on `NODE_ENV`\n- Loads `.env.development` when `NODE_ENV=development` (default for `yarn start`, `yarn ios`, `yarn android`)\n- Loads `.env.production` when `NODE_ENV=production` (for `yarn build:ios`, `yarn build:android`)\n- Always loads `.env.local` last (highest priority, gitignored)\n\nAll `yarn` commands within each app directory automatically load the appropriate environment files based on `NODE_ENV`, so you don't need to manually source or export environment variables.\n\n## 📚 Documentation\n\n- [Solito Documentation](https://solito.dev)\n- [Next.js Documentation](https://nextjs.org/docs)\n- [Expo Documentation](https://docs.expo.dev)\n- [Supabase Documentation](https://supabase.com/docs)\n- [tRPC Documentation](https://trpc.io)\n- [Turborepo Documentation](https://turbo.build/repo/docs)\n\n## 📝 License\n\nThis template is available as open source under the terms of the [MIT License](LICENSE).\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## ⚠️ Important Notes\n\n- Review and customize `supabase/seed.sql` before deploying to production\n- Update all hardcoded URLs and API endpoints in your codebase\n- Set up proper environment variables for all environments\n- Configure Sentry for production error tracking\n- Set up proper database backups in Supabase\n- Review security settings in Supabase dashboard\n\n## 🆘 Troubleshooting\n\n### Supabase local setup issues\n\nIf you encounter issues with local Supabase:\n\n```bash\n# Reset everything\nyarn supabase:stop\ndocker system prune -a --volumes\nyarn supabase:start\n```\n\n### Port conflicts\n\nIf ports 3000, 54321, 54322, or 54323 are in use, you can:\n- Change ports in respective config files\n- Stop the conflicting services\n\n### Build issues\n\nClear caches and rebuild:\n\n```bash\n# Clear Turbo cache\nrm -rf .turbo\n\n# Clear Next.js cache\nrm -rf apps/next/.next\n\n# Reinstall dependencies\nrm -rf node_modules apps/*/node_modules packages/*/node_modules\nyarn install\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoeslain%2Fnexpo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoeslain%2Fnexpo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoeslain%2Fnexpo/lists"}