Monorepo template for creating a modern web application.
apps/
api
- Supabase Local Development
PostgreSQL database, authentication, and API servicesweb
[Demo] - SvelteKit Frontend
Main web application with Supabase integrationpages
[Demo] - Static Site Publishing
High-quality static websites with URL validation, accessibility checks, and SEO optimizationpackages/
eslint-config
- Centralized ESLint 9 configuration with Flat Configroot
, web
(Svelte), pages
(Vanilla JS)# Install dependencies (.env file is created automatically)
pnpm install
# For static site development
pnpm --filter pages dev
# For web app development
pnpm --filter api start # Start Supabase API
pnpm --filter api generate # Generate TypeScript types (only when schema changes)
pnpm --filter web dev # Start web development server
Note: TypeScript types are committed to the repository, so you only need to run
generate
when the database schema changes.
After running pnpm install
, a .env
file is automatically created from .env.example
. Fill in the required values:
For local development:
PUBLIC_SUPABASE_URL
- http://127.0.0.1:54321
PUBLIC_SUPABASE_ANON_KEY
- Copy the anon key displayed when running pnpm --filter api start
For production deployment:
PUBLIC_SUPABASE_URL
- https://[project-id].supabase.co
PUBLIC_SUPABASE_ANON_KEY
- Get from Supabase Dashboard > Project Settings > API KeysOptional (for advanced operations):
DATABASE_URL
- Enables pnpm --filter api push/pull
to target production databaseSUPABASE_SERVICE_ROLE_KEY
- Server-side admin access for Edge Functions, Webhooks (never use in browser!)# Project Setup
pnpm install # Install dependencies (.env file is created automatically)
# Development
pnpm dev # Start all apps in development mode
pnpm generate # Generate Supabase TypeScript types
pnpm build # Build all applications
pnpm lint # Run linting across all apps
pnpm test # Run tests across all apps
pnpm format # Format code with Prettier
cd apps/api
pnpm start # Start Supabase locally
pnpm stop # Stop Supabase
pnpm reset # Reset database and regenerate types
pnpm diff # Show schema changes
pnpm push # Push migrations to remote
pnpm pull # Pull schema changes from remote and regenerate types
pnpm migration # Create new migration file
pnpm link # Link to remote project
pnpm seed # Seed storage buckets
pnpm generate # Generate TypeScript types
cd apps/web
pnpm dev # Start development server (port 5173)
pnpm build # Build for production
pnpm preview # Preview production build
pnpm test # Run Vitest tests
pnpm lint # Run linting
cd apps/pages
pnpm dev # Start development server (port 3000)
pnpm build # Build static site with Tailwind CSS
pnpm test # Validate links, images, and accessibility (Note: Delete tests/external-links.txt before pnpm test to update URL tracking)
pnpm lint # Run HTML validation with markuplint
pnpm deploy # Deploy to server (rsync)
# Optimization Utilities
pnpm add-size-to-img # Add width/height to <img> tags for better performance
pnpm clean-image # Remove unused images from project
Service | Port | Description |
---|---|---|
Supabase API | 54321 | REST API, GraphQL, Storage |
Supabase DB | 54322 | PostgreSQL database |
Supabase Studio | 54323 | Admin dashboard |
Supabase Inbucket | 54324 | Email testing |
Web App | 5173 | SvelteKit development server |
Pages | 3000 | Static site with BrowserSync |
TypeScript types are automatically generated from your Supabase database schema:
apps/api/$generated/supabase-types.ts
apps/web/src/lib/supabase.ts
pnpm generate
to update typesYou can easily switch between development and production environments:
pnpm start
).env
with production Supabase credentialsThe project supports deploying both apps as separate Vercel projects. Each app includes its own vercel.json
configuration file.
Configuration:
apps/web
apps/web/vercel.json
apps/web/vercel.json
Environment Variables: Set the following environment variables in your Vercel project settings:
PUBLIC_SUPABASE_URL=https://your-project.supabase.co
PUBLIC_SUPABASE_ANON_KEY=your-anon-key
PUBLIC_GA4_MEASUREMENT_ID=G-XXXXXXXXXX # Optional
ENABLE_EXPERIMENTAL_COREPACK=1
Option 1: Vercel Deployment
apps/pages
apps/pages/vercel.json
apps/pages/vercel.json
public
Option 2: Server Deployment (rsync)
pnpm run deploy
command in apps/pages
apps/web
apps/pages
vercel.json
configurationupdated_at
columns to profiles
and comments
tablesapps/backend
directory completely.env
file generationapps/api
consistentlyapps/mockup
to apps/pages
for better clarity and purpose alignmentcommands/use-mockup.js
script and related referencesvercel.json
to apps/web/vercel.json
apps/pages/vercel.json
for static site deployment.env.example
with comprehensive Supabase environment variablesapps/backend
to apps/api
for better semantic clarity.node-version
file)apps/api/$generated/
instead of apps/web/src/lib/$generated/
concurrently
with npm-run-all2
for better performancetailwind.config.js
)nextjs-template
repository to webapp-template