This file contains all the full stack build specifications and prompts that were extracted from the main documentation. These represent future development work for LetsGo!
A monorepo containing two packages:
packages/cli— An npm-publishable CLI tool that scaffolds new projectspackages/core— The template source code that the CLI copies and configures
When a user runs npx create-letsgo-app, the CLI asks questions, then copies the relevant pieces from core/ into a new project directory, customized to their answers.
┌─────────────────────────────────────────────────────┐
│ CLI (create-letsgo-app) │
│ │
│ Prompts → Template Selection → File Generation │
│ ↓ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Generated Project │ │
│ │ │ │
│ │ ┌─────────┐ ┌──────────┐ ┌───────────┐ │ │
│ │ │ Pages │ │ Modules │ │ Config │ │ │
│ │ └────┬────┘ └────┬─────┘ └─────┬─────┘ │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌──────────────────────────────────────┐ │ │
│ │ │ Shared UI Layer │ │ │
│ │ │ (ui/ components, layout, common) │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────────────────────────────────┐ │ │
│ │ │ Supabase Backend │ │ │
│ │ │ Auth │ Database │ Storage │ Edge Fn │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────────────────────────────────┐ │ │
│ │ │ Payment Provider (Stripe/Square) │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
letsgo/
├── packages/
│ ├── cli/ # The npx create-letsgo-app CLI tool
│ │ ├── src/
│ │ │ ├── index.ts # Entry point
│ │ │ ├── prompts.ts # Interactive prompts (inquirer)
│ │ │ ├── scaffold.ts # File generation logic
│ │ │ └── templates.ts # Template registry
│ │ ├── package.json
│ │ └── tsconfig.json
│ │
│ └── core/ # The generated project template
│ ├── public/
│ ├── src/
│ │ ├── components/
│ │ │ ├── ui/ # Shared UI primitives (Button, Card, Input, Modal, etc.)
│ │ │ ├── layout/ # Header, Footer, Sidebar, PageWrapper
│ │ │ └── common/ # ContactForm, SEOHead, MapEmbed, SocialLinks
│ │ │
│ │ ├── modules/ # Pluggable feature modules
│ │ │ ├── booking/ # Appointment/class booking system
│ │ │ │ ├── components/
│ │ │ │ ├── hooks/
│ │ │ │ ├── types.ts
│ │ │ │ └── index.ts
│ │ │ ├── menu/ # Menu display + online ordering
│ │ │ │ ├── components/
│ │ │ │ ├── hooks/
│ │ │ │ ├── types.ts
│ │ │ │ └── index.ts
│ │ │ ├── payments/ # Stripe + Square abstraction
│ │ │ │ ├── providers/
│ │ │ │ │ ├── stripe.ts
│ │ │ │ │ └── square.ts
│ │ │ │ ├── components/
│ │ │ │ ├── hooks/
│ │ │ │ ├── types.ts
│ │ │ │ └── index.ts
│ │ │ └── portal/ # Client portal (login, dashboard, history)
│ │ │ ├── components/
│ │ │ ├── hooks/
│ │ │ ├── types.ts
│ │ │ └── index.ts
│ │ │
│ │ ├── templates/ # Business-type page configurations
│ │ │ ├── restaurant/
│ │ │ │ ├── pages/ # HomePage, MenuPage, OrderPage, AboutPage, ContactPage
│ │ │ │ ├── config.ts # Which modules this template uses
│ │ │ │ └── routes.ts # Route definitions
│ │ │ ├── salon/
│ │ │ │ ├── pages/
│ │ │ │ ├── config.ts
│ │ │ │ └── routes.ts
│ │ │ ├── fitness/
│ │ │ │ ├── pages/
│ │ │ │ ├── config.ts
│ │ │ │ └── routes.ts
│ │ │ └── professional/
│ │ │ ├── pages/
│ │ │ ├── config.ts
│ │ │ └── routes.ts
│ │ │
│ │ ├── config/
│ │ │ ├── site.config.ts # Business name, colors, contact info, social links
│ │ │ └── features.config.ts # Which modules are enabled
│ │ │
│ │ ├── hooks/ # Shared hooks (useAuth, useSupabase, etc.)
│ │ ├── lib/ # Utility functions, Supabase client, constants
│ │ ├── types/ # Global TypeScript types
│ │ ├── App.tsx
│ │ ├── main.tsx
│ │ └── index.css # Tailwind directives + custom CSS variables
│ │
│ ├── supabase/
│ │ ├── migrations/ # Ordered SQL migration files
│ │ │ ├── 00001_core.sql # Users, profiles, settings
│ │ │ ├── 00002_booking.sql
│ │ │ ├── 00003_menu.sql
│ │ │ ├── 00004_payments.sql
│ │ │ └── 00005_portal.sql
│ │ ├── seed.sql # Demo data for development
│ │ └── config.toml
│ │
│ ├── .env.example
│ ├── .eslintrc.cjs
│ ├── .prettierrc
│ ├── tailwind.config.ts
│ ├── tsconfig.json
│ ├── vite.config.ts
│ ├── vercel.json
│ └── package.json
│
├── docs/
│ ├── ARCHITECTURE.md
│ ├── MODULES.md
│ ├── DEPLOYMENT.md
│ └── CONTRIBUTING.md
│
├── .github/
│ └── workflows/
│ └── ci.yml
│
├── CLAUDE.md # This file
├── README.md
├── LICENSE
└── package.json # Monorepo root (workspaces)
Pages:
| Page | Route | Description |
|---|---|---|
| Home | / |
Hero image, featured menu items, hours, location map, reviews |
| Menu | /menu |
Full menu organized by category with prices, dietary tags, images |
| Order | /order |
Online ordering with cart, checkout via Stripe/Square |
| About | /about |
Story, team/chef bios, gallery, values |
| Contact | /contact |
Contact form, hours, map, phone, email |
Modules used: menu, payments
Database tables:
menu_categories— id, name, description, display_order, is_activemenu_items— id, category_id, name, description, price, image_url, dietary_tags[], is_available, display_orderorders— id, user_id (nullable for guest), items (jsonb), subtotal, tax, total, status, payment_id, created_atorder_items— id, order_id, menu_item_id, quantity, price_at_time, special_instructions
RLS:
menu_categoriesandmenu_items: public read, authenticated admin writeordersandorder_items: users read own, admin read all
Pages:
| Page | Route | Description |
|---|---|---|
| Home | / |
Hero, featured services, stylist highlights, testimonials, CTA |
| Services | /services |
Service list with descriptions, durations, pricing |
| Book | /book |
Calendar picker, service selector, stylist selector, time slots |
| Team | /team |
Stylist profiles with bios, specialties, photos |
| Contact | /contact |
Contact form, hours, map, phone |
Modules used: booking, payments
Database tables:
services— id, name, description, duration_minutes, price, category, is_activestaff— id, user_id, name, bio, photo_url, specialties[], is_activestaff_services— staff_id, service_id (which staff can do which services)availability— id, staff_id, day_of_week, start_time, end_timebookings— id, user_id, staff_id, service_id, date, start_time, end_time, status, payment_id, notesbooking_settings— id, business_id, min_advance_hours, max_advance_days, cancellation_policy
RLS:
services,staff,availability: public readbookings: users read own, staff read assigned, admin read all
Pages:
| Page | Route | Description |
|---|---|---|
| Home | / |
Hero, class preview, membership tiers CTA, trainer highlights |
| Classes | /classes |
Weekly class schedule, class descriptions, filter by type/trainer |
| Membership | /membership |
Tier comparison, pricing, signup with payment |
| Trainers | /trainers |
Trainer profiles with bios, certifications, class schedules |
| Contact | /contact |
Contact form, trial signup, location, hours |
Modules used: booking, payments, portal
Database tables:
classes— id, name, description, trainer_id, duration_minutes, max_capacity, category, levelclass_schedule— id, class_id, day_of_week, start_time, room, is_recurringclass_bookings— id, user_id, class_schedule_id, date, statusmembership_tiers— id, name, description, price_monthly, price_yearly, features (jsonb), stripe_price_id, square_plan_idmemberships— id, user_id, tier_id, status, start_date, end_date, payment_provider, payment_subscription_idtrainers— id, user_id, name, bio, photo_url, certifications[], specialties[]
RLS:
classes,class_schedule,membership_tiers,trainers: public readclass_bookings: users read own, trainer read assigned, admin allmemberships: users read own, admin all
Pages:
| Page | Route | Description |
|---|---|---|
| Home | / |
Hero, service overview, credentials, testimonials, CTA |
| Services | /services |
Detailed service descriptions, process explanation, pricing if applicable |
| Team | /team |
Partner/staff bios, credentials, areas of expertise |
| Portal | /portal |
Client login, project dashboard, document sharing, messaging |
| Contact | /contact |
Intake form (customizable fields), office locations, scheduling link |
Modules used: portal, payments (optional)
Database tables:
services— id, name, description, icon, display_orderteam_members— id, user_id, name, title, bio, photo_url, credentials[], areas_of_expertise[]clients— id, user_id, company_name, status, onboarded_atprojects— id, client_id, name, description, status, start_date, due_dateproject_updates— id, project_id, author_id, content, created_atdocuments— id, project_id, name, file_url, uploaded_by, created_atintake_submissions— id, name, email, phone, message, form_data (jsonb), status, created_at
RLS:
services,team_members: public readclients,projects,project_updates,documents: client reads own, team reads assigned, admin allintake_submissions: admin only
Components:
BookingCalendar— Date picker showing available datesTimeSlotPicker— Available time slots for selected dateServiceSelector— Choose service type (with duration/price)StaffSelector— Choose provider (optional, auto-assign if skipped)BookingConfirmation— Summary before paymentBookingStatus— View/cancel existing bookings
Hooks:
useAvailableSlots(date, serviceId, staffId?)— Fetches open time slotsuseCreateBooking()— Creates booking + triggers paymentuseUserBookings()— Lists current user's bookingsuseCancelBooking()— Cancels and handles refund logic
Logic:
- Slot availability calculated from staff
availabilityminus existingbookings - Buffer time between bookings configurable in
booking_settings - Confirmation emails via Supabase Edge Function
- Cancellation respects the policy in
booking_settings
Components:
MenuDisplay— Full menu with category tabs/sectionsMenuCategory— Single category with its itemsMenuItem— Individual item with name, description, price, image, dietary tagsDietaryFilter— Filter by vegan, gluten-free, etc.Cart— Sliding cart panel with item list, quantities, totalsCartItem— Single cart line item with quantity controlsOrderSummary— Pre-checkout review with subtotal, tax, total
Hooks:
useMenu()— Fetches all categories and itemsuseCart()— Cart state management (add, remove, update quantity, clear)useCreateOrder()— Submits order to database + triggers paymentuseOrderStatus(orderId)— Real-time order status tracking
Logic:
- Cart persisted in localStorage (no auth required to browse/add)
- Guest checkout supported (email required at checkout)
- Order status flow:
pending→confirmed→preparing→ready→completed - Tax calculation configurable in
site.config.ts
Provider Interface:
// src/modules/payments/types.ts
export type PaymentProviderType = "stripe" | "square";
export interface CheckoutParams {
items: LineItem[];
customerEmail: string;
successUrl: string;
cancelUrl: string;
metadata?: Record<string, string>;
}
export interface LineItem {
name: string;
description?: string;
amount: number; // in cents
currency: string; // 'usd'
quantity: number;
}
export interface CheckoutSession {
id: string;
url: string; // redirect URL for hosted checkout
status: "open" | "complete" | "expired";
}
export interface SubscriptionParams {
priceId: string; // Stripe price ID or Square plan ID
customerEmail: string;
successUrl: string;
cancelUrl: string;
trialDays?: number;
}
export interface Subscription {
id: string;
status: "active" | "canceled" | "past_due" | "trialing";
currentPeriodEnd: string;
}
export interface WebhookPayload {
provider: PaymentProviderType;
headers: Record<string, string>;
body: string;
}
export interface WebhookResult {
event: string;
handled: boolean;
data?: Record<string, unknown>;
}
export interface PaymentStatus {
id: string;
status: "pending" | "succeeded" | "failed" | "refunded";
amount: number;
currency: string;
}
export interface PaymentProvider {
createCheckoutSession(params: CheckoutParams): Promise<CheckoutSession>;
createSubscription(params: SubscriptionParams): Promise<Subscription>;
handleWebhook(payload: WebhookPayload): Promise<WebhookResult>;
getPaymentStatus(paymentId: string): Promise<PaymentStatus>;
}Stripe Implementation (providers/stripe.ts):
- Uses Stripe Checkout for one-time payments
- Uses Stripe Billing for subscriptions
- Webhook handler for
checkout.session.completed,invoice.paid,customer.subscription.updated - All Stripe calls go through Supabase Edge Functions (secrets stay server-side)
Square Implementation (providers/square.ts):
- Uses Square Checkout API for one-time payments
- Uses Square Subscriptions API for recurring
- Webhook handler for
payment.completed,subscription.updated - All Square calls go through Supabase Edge Functions
Components:
CheckoutButton— Initiates checkout redirectPricingTable— Displays subscription tiers with signup buttonsPaymentHistory— Lists past payments for authenticated users
Hooks:
useCheckout()— Creates checkout session and redirectsuseSubscription()— Manages subscription lifecycleusePaymentHistory()— Fetches payment records
Components:
PortalLayout— Authenticated layout with sidebar navigationPortalDashboard— Overview of projects/bookings/orders depending on templateProjectList— List of client's active projectsProjectDetail— Single project with updates and documentsDocumentList— Uploaded files for a projectMessageThread— Simple messaging between client and business
Hooks:
usePortalData()— Fetches client's dashboard datauseProjects()— Lists projects for current clientuseProjectUpdates(projectId)— Real-time updates feeduseDocuments(projectId)— File list with upload capability
Logic:
- Portal requires authentication — redirect to login if not authenticated
- Different views based on user role (client vs admin/staff)
- Document uploads go to Supabase Storage with RLS on the bucket
- Real-time updates via Supabase Realtime subscriptions
| Component | Description |
|---|---|
Button |
Primary, secondary, outline, ghost, destructive variants. Supports loading state. |
Card |
Container with optional header, footer, padding. |
Input |
Text input with label, error state, helper text. |
Select |
Dropdown select with label and error state. |
Textarea |
Multi-line input with character count. |
Modal |
Dialog overlay with close button, title, actions. |
Toast |
Notification toasts (success, error, info). Uses a toast context provider. |
Badge |
Status badges (open, closed, active, etc.). |
Spinner |
Loading spinner with optional text. |
Skeleton |
Content placeholder for loading states. |
Tabs |
Tab navigation component. |
Avatar |
User/staff photo with fallback initials. |
| Component | Description |
|---|---|
Header |
Sticky nav with logo, links, mobile hamburger menu, CTA button. |
Footer |
Business info, quick links, social links, copyright. |
PageWrapper |
Sets page title, meta tags, consistent padding. |
Section |
Content section with consistent max-width and vertical spacing. |
Container |
Max-width centered container. |
MobileMenu |
Slide-out navigation for mobile. |
| Component | Description |
|---|---|
ContactForm |
Name, email, phone, message. Submits to Supabase. |
SEOHead |
Sets page title, description, Open Graph tags via react-helmet-async. |
MapEmbed |
Google Maps embed with business location pin. |
SocialLinks |
Social media icon links from config. |
HeroSection |
Full-width hero with background image, heading, subtext, CTA. |
TestimonialCard |
Customer review card with name, text, rating. |
TeamCard |
Staff member card with photo, name, title, bio snippet. |
GalleryGrid |
Responsive image gallery with lightbox. |
BusinessHours |
Formatted hours table from config. |
CTABanner |
Call-to-action banner with heading and button. |
export interface SiteConfig {
businessName: string;
tagline: string;
description: string;
url: string;
contact: {
email: string;
phone: string;
address: {
street: string;
city: string;
state: string;
zip: string;
};
};
hours: {
[key: string]: { open: string; close: string } | "closed";
// e.g., monday: { open: '9:00 AM', close: '5:00 PM' }
};
social: {
facebook?: string;
instagram?: string;
twitter?: string;
linkedin?: string;
yelp?: string;
google?: string;
};
theme: {
primaryColor: string; // hex, e.g., '#2563EB'
secondaryColor: string;
fontFamily?: string; // defaults to system font stack
borderRadius?: "none" | "sm" | "md" | "lg" | "full";
logoUrl?: string;
};
seo: {
defaultTitle: string;
titleTemplate: string; // e.g., '%s | Business Name'
defaultDescription: string;
ogImage?: string;
};
maps: {
googleMapsApiKey?: string;
latitude: number;
longitude: number;
};
tax: {
rate: number; // e.g., 0.08 for 8%
inclusive: boolean;
};
}export interface FeaturesConfig {
template: "restaurant" | "salon" | "fitness" | "professional";
modules: {
booking: boolean;
menu: boolean;
payments: boolean;
portal: boolean;
};
payments: {
provider: "stripe" | "square" | "none";
currency: string; // 'usd'
};
auth: {
providers: ("email" | "google" | "facebook")[];
requireEmailVerification: boolean;
};
}Dependencies:
inquirer— Interactive promptschalk— Colored terminal outputora— Spinner animationsfs-extra— File operationsexeca— Shell command execution (git init, npm install)
Flow:
1. Welcome message + version
2. Prompt: Stack type (Full stack / Static site)
3. Prompt: Project name (validate: kebab-case, no conflicts)
4. Prompt: Business type (restaurant / salon / fitness / professional)
5. Prompt: Business name (for config/JSON pre-fill)
6.
7. IF Full Stack:
a. Prompt: Payment provider (Stripe / Square / None)
b. Prompt: Supabase URL + anon key (or skip)
c. Scaffold full stack project (see below)
8.
9. IF Static Site:
a. Scaffold static project:
- Generate site-data.json with business name and type-specific fields pre-filled
- Generate HTML pages for the selected business type
- Generate css/ directory with reset.css, variables.css, styles.css
- Generate js/ directory with data.js, nav.js, forms.js, main.js
- Set CSS custom properties from theme values in site-data.json
- Generate README.md with setup instructions
b. git init + initial commit
c. Print next steps (edit site-data.json, run npx serve, deploy)
10.
11. Full Stack Scaffold:
a. Copy core template files
b. Remove unused module directories based on template
c. Remove unused migration files
d. Generate site.config.ts with provided business name
e. Generate features.config.ts based on selections
f. Generate .env.local with Supabase credentials (if provided)
g. Update package.json with project name
h. Generate appropriate routes.ts for selected template
i. git init + initial commit
j. npm install
k. Print next steps
Template → Module Mapping:
| Template | booking | menu | payments | portal |
|---|---|---|---|---|
| Restaurant | ✗ | ✓ | ✓ | ✗ |
| Salon | ✓ | ✗ | ✓ | ✗ |
| Fitness | ✓ | ✗ | ✓ | ✓ |
| Professional | ✗ | ✗ | Optional | ✓ |
Located in supabase/functions/:
| Function | Purpose |
|---|---|
create-checkout |
Creates Stripe/Square checkout session (keeps API keys server-side) |
create-subscription |
Creates subscription checkout |
webhook-stripe |
Handles Stripe webhook events |
webhook-square |
Handles Square webhook events |
send-email |
Sends transactional emails (booking confirmations, order receipts) |
GitHub Repo
│
├──→ Vercel (frontend)
│ - Auto-deploys on push to main
│ - Preview deploys on PRs
│ - Environment variables configured in dashboard
│
└──→ Supabase (backend)
- Database + Auth + Storage + Edge Functions
- Migrations run via CLI: supabase db push
- Edge Functions deployed via: supabase functions deploy
# Supabase
VITE_SUPABASE_URL=https://xxxxx.supabase.co
VITE_SUPABASE_ANON_KEY=eyJ...
# Stripe (only in Supabase Edge Functions, NOT in frontend)
STRIPE_SECRET_KEY=sk_...
STRIPE_WEBHOOK_SECRET=whsec_...
# Square (only in Supabase Edge Functions, NOT in frontend)
SQUARE_ACCESS_TOKEN=...
SQUARE_WEBHOOK_SIGNATURE_KEY=...
# Frontend-safe Stripe key
VITE_STRIPE_PUBLISHABLE_KEY=pk_...
# Frontend-safe Square key
VITE_SQUARE_APPLICATION_ID=...
VITE_SQUARE_LOCATION_ID=...
- Analytics dashboard — Business owner metrics (bookings, revenue, popular items)
- Email marketing integration — Mailchimp/ConvertKit connector
- Multi-location support — Single dashboard, multiple physical locations
- Internationalization (i18n) — Multi-language support
- Theme marketplace — Community-contributed visual themes
- Plugin system — Third-party module contributions
- Admin panel — Full CRUD admin interface for business owners
- SEO sitemap generation — Auto-generated sitemap.xml
- PWA support — Offline capability and install prompt
Read CLAUDE.md and ARCHITECTURE.md in this repo.
Initialize the LetsGo! monorepo structure:
1. Set up the root package.json with npm workspaces pointing to packages/cli and packages/core
2. Create packages/cli with its own package.json, tsconfig.json, and src/ directory
3. Create packages/core with:
- Vite + React + TypeScript project (use `npm create vite@latest` config but set it up manually, don't run the command)
- Tailwind CSS configured with the default theme from CLAUDE.md
- TypeScript strict mode enabled
- Path alias @ mapped to src/
- All config files: .eslintrc.cjs, .prettierrc, vite.config.ts, tailwind.config.ts, tsconfig.json, vercel.json
4. Create the .env.example file with all environment variable placeholders from ARCHITECTURE.md
5. Create a root .gitignore covering node_modules, dist, .env.local, .env, .DS_Store
6. Do NOT install dependencies yet — just create the files
Follow all conventions from CLAUDE.md exactly.
Read CLAUDE.md and ARCHITECTURE.md.
Create all the shared UI primitive components in packages/core/src/components/ui/:
Build these components following the component pattern from CLAUDE.md:
- Button (variants: primary, secondary, outline, ghost, destructive; sizes: sm, md, lg; loading state with spinner)
- Card (with optional CardHeader, CardContent, CardFooter subcomponents)
- Input (with label, error message, helper text, disabled state)
- Select (with label, error message, options array, placeholder)
- Textarea (with label, error message, character count, max length)
- Modal (overlay, close button, title, children, action buttons footer)
- Toast (success, error, info variants; auto-dismiss timer; toast context provider and useToast hook)
- Badge (variants: default, success, warning, error, info; sizes: sm, md)
- Spinner (sizes: sm, md, lg; optional text label)
- Skeleton (variants: text line, circle, rectangle; configurable width/height)
- Tabs (TabList, Tab, TabPanel with controlled active state)
- Avatar (image with fallback to initials, sizes: sm, md, lg)
Each component should:
- Be fully typed with TypeScript interfaces for props
- Use Tailwind CSS exclusively for styling
- Support className prop for overrides
- Be exported from an index.ts barrel file in the ui/ directory
- Be accessible (proper aria attributes, keyboard navigation where applicable)
Use Lucide React for any icons needed (spinner icon, close icon, etc.).
Read CLAUDE.md and ARCHITECTURE.md.
Create the layout components in packages/core/src/components/layout/:
1. Header
- Sticky top navigation
- Logo/business name on the left (pulled from site.config.ts)
- Navigation links in the center (pulled from route config)
- CTA button on the right (configurable text and link)
- Mobile hamburger menu that triggers MobileMenu
- Smooth scroll behavior
2. Footer
- Three-column layout on desktop, stacked on mobile
- Column 1: Business name, description, address
- Column 2: Quick navigation links
- Column 3: Contact info + social media icons
- Copyright bar at bottom with current year
- All data pulled from site.config.ts
3. MobileMenu
- Slide-in panel from the right
- Full navigation links
- CTA button
- Close button
- Backdrop overlay that closes menu on click
- Body scroll lock when open
4. PageWrapper
- Sets document title via react-helmet-async
- Sets meta description and OG tags
- Wraps content in consistent max-width container with vertical padding
- Accepts title, description props
5. Section
- Consistent vertical padding (py-16 on desktop, py-12 on mobile)
- Max-width container centered
- Optional background color prop
6. Container
- max-w-7xl mx-auto px-4 sm:px-6 lg:px-8
Create the site.config.ts and features.config.ts files in src/config/ with placeholder/demo values for a generic business. Use the exact TypeScript interfaces from ARCHITECTURE.md.
Install react-helmet-async and react-router-dom as dependencies in packages/core/package.json.
Export everything from an index.ts barrel file in layout/.
Read CLAUDE.md and ARCHITECTURE.md.
Create the common components in packages/core/src/components/common/:
1. ContactForm
- Fields: name, email, phone (optional), message
- Client-side validation (required fields, email format)
- Submit handler that inserts into a Supabase "contact_submissions" table
- Success/error toast notifications
- Loading state on submit button
- Honeypot field for basic spam prevention
2. SEOHead
- Uses react-helmet-async
- Props: title, description, ogImage, noIndex
- Applies titleTemplate from site.config.ts
- Sets Open Graph and Twitter Card meta tags
3. MapEmbed
- Google Maps iframe embed
- Uses coordinates from site.config.ts
- Responsive container with rounded corners
- Fallback text if no API key configured
4. SocialLinks
- Renders icons for each social platform in site.config.ts
- Uses Lucide icons (Facebook, Instagram, Twitter, Linkedin)
- Opens in new tab with rel="noopener noreferrer"
- Horizontal layout with configurable size
5. HeroSection
- Full-width section with background image/color
- Heading, subheading text
- One or two CTA buttons
- Dark overlay on background image for text readability
- Responsive text sizing
6. TestimonialCard
- Customer name, review text, star rating (1-5)
- Optional customer photo
- Clean card design with quote icon
7. TeamCard
- Staff photo (Avatar fallback), name, title
- Short bio text
- Optional links (email, social)
- Hover effect
8. GalleryGrid
- Responsive grid (1 col mobile, 2 col tablet, 3 col desktop)
- Images with consistent aspect ratio
- Click to expand (uses Modal component)
- Alt text on all images
9. BusinessHours
- Reads hours from site.config.ts
- Formatted table with day and hours
- Highlights today's hours
- Shows "Closed" for closed days
10. CTABanner
- Full-width colored background section
- Heading text, optional subtext
- CTA button
- Configurable background color (uses primary color by default)
Export everything from an index.ts barrel file.
Read CLAUDE.md and ARCHITECTURE.md.
Set up the Supabase integration in packages/core/:
1. Create src/lib/supabase.ts
- Initialize Supabase client with env vars (VITE_SUPABASE_URL, VITE_SUPABASE_ANON_KEY)
- Export the typed client
2. Create src/hooks/use-auth.ts
- useAuth hook that provides:
- user (current user object or null)
- session (current session or null)
- isLoading (true while checking auth state)
- signIn(email, password)
- signUp(email, password)
- signOut()
- signInWithProvider(provider: 'google' | 'facebook')
- resetPassword(email)
- Listens to onAuthStateChange for real-time updates
- Wraps Supabase auth methods with error handling and toast notifications
3. Create src/components/auth/ directory with:
- AuthProvider — React Context provider wrapping the app, provides useAuth
- LoginForm — Email + password form with "Forgot password?" link
- SignUpForm — Email + password + confirm password form
- ResetPasswordForm — Email-only form for password reset
- AuthGuard — Wrapper component that redirects to /login if not authenticated
- SocialLoginButtons — Google/Facebook buttons based on features.config.ts
4. Create supabase/migrations/00001_core.sql with:
- profiles table (id references auth.users, full_name, avatar_url, role, phone, created_at, updated_at)
- contact_submissions table (id, name, email, phone, message, status, created_at)
- RLS policies for both tables as specified in CLAUDE.md
- Trigger to auto-create profile on user signup
- Updated_at trigger function
5. Create supabase/seed.sql with sample data for development
6. Create src/types/database.ts with TypeScript types matching the database schema
Install @supabase/supabase-js as a dependency.
Read CLAUDE.md and ARCHITECTURE.md.
Set up the routing system and main App shell in packages/core/:
1. Create src/App.tsx
- BrowserRouter wrapping everything
- AuthProvider wrapping routes
- HelmetProvider for SEO
- ToastProvider for notifications
- Header and Footer persistent across routes
- Route outlet area in the middle
2. Create src/routes/ directory with:
- index.tsx — central route configuration that reads from the active template's routes.ts
- A route type definition: { path, component, label (for nav), requiresAuth, showInNav }
3. Create the four template route configs:
- src/templates/restaurant/routes.ts — Home, Menu, Order, About, Contact
- src/templates/salon/routes.ts — Home, Services, Book, Team, Contact
- src/templates/fitness/routes.ts — Home, Classes, Membership, Trainers, Contact
- src/templates/professional/routes.ts — Home, Services, Team, Portal, Contact
4. Create placeholder page components for ONE template (restaurant) to validate the routing works:
- src/templates/restaurant/pages/HomePage.tsx
- src/templates/restaurant/pages/MenuPage.tsx
- src/templates/restaurant/pages/OrderPage.tsx
- src/templates/restaurant/pages/AboutPage.tsx
- src/templates/restaurant/pages/ContactPage.tsx
Each page should use PageWrapper, have a HeroSection, and include placeholder content sections so the app looks and feels real when you run it. Use realistic restaurant copy and layout.
5. Create src/templates/restaurant/config.ts defining which modules this template uses
6. Update main.tsx to render App
7. Make sure the Header navigation dynamically reads from the active template's routes and only shows routes where showInNav is true.
The app should be fully runnable after this prompt — `npm run dev` should show a working restaurant website with navigation between all 5 pages.
Read CLAUDE.md.
Now install all dependencies and verify the project builds:
1. In packages/core, install:
- react, react-dom, react-router-dom
- @supabase/supabase-js
- react-helmet-async
- lucide-react
- @tanstack/react-query
- tailwindcss, postcss, autoprefixer (dev)
- typescript, @types/react, @types/react-dom (dev)
- eslint, prettier and their configs (dev)
- vite, @vitejs/plugin-react (dev)
2. In the root, install any workspace tooling needed
3. Run `npm run dev` in packages/core and fix any TypeScript errors, import issues, or missing dependencies
4. Run `npm run build` and fix any build errors
5. Verify:
- The app renders in the browser
- All 5 restaurant pages are accessible via navigation
- The responsive hamburger menu works on mobile viewport
- No TypeScript errors
- No console errors
Fix everything until it's clean.
Read CLAUDE.md and ARCHITECTURE.md, specifically the Menu Module section.
Build the complete menu module in packages/core/src/modules/menu/:
1. Create all TypeScript types in types.ts matching the ARCHITECTURE.md schema
2. Create the Supabase migration file supabase/migrations/00003_menu.sql with all tables and RLS policies
3. Build all components listed in ARCHITECTURE.md: MenuDisplay, MenuCategory, MenuItem, DietaryFilter, Cart, CartItem, OrderSummary
4. Build all hooks: useMenu, useCart (with localStorage persistence), useCreateOrder, useOrderStatus
5. Create the barrel export in index.ts
6. Update the restaurant template pages to actually USE the menu module:
- MenuPage should render MenuDisplay with DietaryFilter
- OrderPage should render Cart and OrderSummary with checkout flow
7. Add realistic seed data for the menu (categories: Appetizers, Mains, Desserts, Drinks with 4-5 items each)
The menu page should be fully functional with browsing, filtering, adding to cart, and viewing cart. Payment integration comes later.
Read CLAUDE.md and ARCHITECTURE.md, specifically the Booking Module section.
Build the complete booking module in packages/core/src/modules/booking/:
1. Create all TypeScript types in types.ts
2. Create supabase/migrations/00002_booking.sql with all tables and RLS policies
3. Build all components: BookingCalendar, TimeSlotPicker, ServiceSelector, StaffSelector, BookingConfirmation, BookingStatus
4. Build all hooks: useAvailableSlots, useCreateBooking, useUserBookings, useCancelBooking
5. Create index.ts barrel export
6. Create the salon template pages that use this module:
- src/templates/salon/pages/HomePage.tsx — Hero, featured services, testimonials
- src/templates/salon/pages/ServicesPage.tsx — Full service list with prices and durations
- src/templates/salon/pages/BookPage.tsx — Full booking flow (select service → select staff → select date → select time → confirm)
- src/templates/salon/pages/TeamPage.tsx — Staff profiles
- src/templates/salon/pages/ContactPage.tsx — Contact form, hours, map
7. Add realistic seed data (services, staff members, availability schedules)
The booking page should walk through the full flow visually. Actual Supabase calls can gracefully handle missing connection.
Read CLAUDE.md and ARCHITECTURE.md, specifically the Payments Module section.
Build the complete payments module in packages/core/src/modules/payments/:
1. Create all TypeScript types in types.ts — copy the full PaymentProvider interface from ARCHITECTURE.md
2. Create supabase/migrations/00004_payments.sql for payment records table
3. Build the Stripe provider in providers/stripe.ts implementing PaymentProvider interface
4. Build the Square provider in providers/square.ts implementing PaymentProvider interface
5. Create a provider factory: getPaymentProvider() that reads from features.config.ts and returns the correct implementation
6. Build components: CheckoutButton, PricingTable, PaymentHistory
7. Build hooks: useCheckout, useSubscription, usePaymentHistory
8. Create index.ts barrel export
9. Create the Supabase Edge Functions:
- supabase/functions/create-checkout/index.ts
- supabase/functions/create-subscription/index.ts
- supabase/functions/webhook-stripe/index.ts
- supabase/functions/webhook-square/index.ts
10. Wire CheckoutButton into the restaurant OrderPage and the salon BookingConfirmation
Both Stripe and Square implementations should be complete and functional — the active one is determined by features.config.ts.
Read CLAUDE.md and ARCHITECTURE.md, specifically the Portal Module section.
Build the complete portal module in packages/core/src/modules/portal/:
1. Create all TypeScript types in types.ts
2. Create supabase/migrations/00005_portal.sql with all tables and RLS policies
3. Build all components: PortalLayout (sidebar nav), PortalDashboard, ProjectList, ProjectDetail, DocumentList, MessageThread
4. Build all hooks: usePortalData, useProjects, useProjectUpdates, useDocuments
5. Create index.ts barrel export
6. Create the professional services template pages:
- src/templates/professional/pages/HomePage.tsx — Hero, services overview, credentials, testimonials
- src/templates/professional/pages/ServicesPage.tsx — Detailed service descriptions
- src/templates/professional/pages/TeamPage.tsx — Partner/staff bios
- src/templates/professional/pages/PortalPage.tsx — Protected route using AuthGuard, renders PortalLayout with dashboard
- src/templates/professional/pages/ContactPage.tsx — Intake form with customizable fields
7. Add seed data for demo projects, updates, and documents
The portal should have a distinct authenticated layout with sidebar navigation, separate from the public-facing pages.
Read CLAUDE.md and ARCHITECTURE.md.
Create the fitness/gym template that combines booking, payments, and portal modules:
1. Create src/templates/fitness/pages/:
- HomePage.tsx — Hero, class preview cards, membership tier highlights, trainer spotlights
- ClassesPage.tsx — Weekly schedule view (calendar/grid), filter by class type and trainer, book a class button
- MembershipPage.tsx — Tier comparison cards using PricingTable from payments module, signup flow
- TrainersPage.tsx — Trainer profiles with certifications and class schedules
- ContactPage.tsx — Contact form, trial class signup, location, hours
2. Create src/templates/fitness/config.ts and routes.ts
3. Add class-specific database tables to a migration or extend existing ones:
- classes, class_schedule, class_bookings tables
- membership_tiers, memberships tables
4. Add realistic seed data (class types, weekly schedule, trainers, membership tiers)
This template should demonstrate how multiple modules work together in a single project.
Read CLAUDE.md and ARCHITECTURE.md, specifically the CLI Architecture section.
Build the CLI tool in packages/cli/:
1. Install dependencies: inquirer, chalk, ora, fs-extra, execa
2. Create src/index.ts — entry point with shebang line, parses args
3. Create src/prompts.ts — all interactive prompts:
- Project name (validate: lowercase, no spaces, no conflicts with existing directory)
- Business type (restaurant / salon / fitness / professional) with descriptions
- Payment provider (Stripe / Square / None for now)
- Supabase URL and anon key (with "skip for now" option)
- Business name (free text, used to pre-fill site.config.ts)
4. Create src/scaffold.ts — the file generation logic:
- Copies packages/core to the target directory
- Removes module directories not needed by selected template
- Removes unused migration files
- Generates site.config.ts with business name filled in
- Generates features.config.ts with correct template and module flags
- Generates .env.local if Supabase credentials provided
- Updates package.json name field
- Sets the correct template in the route config
5. Create src/templates.ts — template registry mapping template names to their module requirements and descriptions
6. Set up the package.json with bin field pointing to the compiled CLI
7. Set up tsconfig.json for CLI compilation
8. Add a build script that compiles TypeScript to dist/
9. After scaffolding:
- Run git init + git add . + git commit -m "Initial LetsGo! scaffold"
- Run npm install
- Print a styled "success" message with next steps:
a. cd into project
b. Copy .env.example to .env.local and fill in values
c. Run supabase migrations
d. npm run dev
e. Deploy to Vercel
Test the CLI by running it locally and generating a test project.
Read CLAUDE.md and ARCHITECTURE.md.
Create comprehensive documentation for the LetsGo! open-source project:
1. Root README.md — the main project README that includes:
- Project name and tagline with a clean header
- What LetsGo! is (2-3 sentences)
- Feature list
- Quick start (npx create-letsgo-app + 3-4 steps to running)
- Screenshot placeholders (we'll add real ones later)
- Available templates with brief descriptions
- Tech stack badges
- Configuration section explaining site.config.ts and features.config.ts
- Module overview
- Deployment guide (Vercel + Supabase)
- Contributing section
- License (MIT)
2. docs/MODULES.md — detailed documentation of each module's components, hooks, and how to use them
3. docs/DEPLOYMENT.md — step-by-step deployment guide:
- Creating a Supabase project
- Running migrations
- Setting up Stripe/Square
- Deploying to Vercel
- Custom domain setup
- Environment variables checklist
4. docs/CONTRIBUTING.md — contribution guidelines:
- How to add a new template
- How to add a new module
- Code style requirements
- PR process
5. Add a LICENSE file (MIT)
6. Create a .github/workflows/ci.yml that runs:
- TypeScript type checking
- ESLint
- Build verification
- On push to main and PRs
Make the README compelling — this is what people see first on GitHub. It should make someone want to star the repo and try it immediately.
- Prompt 1 — Initialize monorepo
- Prompt 2 — Shared UI components
- Prompt 3 — Layout components
- Prompt 4 — Common components
- Prompt 5 — Supabase + Auth
- Prompt 6 — Routing + Restaurant pages
- Prompt 7 — Install deps + verify build
- Prompt 8 — Menu module
- Prompt 9 — Booking module
- Prompt 10 — Payments module
- Prompt 11 — Portal module
- Prompt 12 — Fitness template
- Prompt 13 — CLI tool
- Prompt 14 — README + docs
-
Wait for completion — Don't paste the next prompt until Claude Code has completely finished the current one and you've verified the output.
-
Fix as you go — If a prompt produces errors, tell Claude Code to fix them before moving on. Say something like: "There are TypeScript errors in [file]. Fix them."
-
Verify visually — After Prompt 7, run the dev server and actually look at the app in a browser. If something looks wrong, describe it to Claude Code.
-
Save your progress — After each prompt, commit to git. This gives you rollback points.
-
Customize the config — After Prompt 3, update site.config.ts with a real business name and details. This makes the visual output more satisfying as you build.
-
The CLAUDE.md is your contract — If Claude Code ever generates something that violates CLAUDE.md conventions, point it out. Say: "This violates the naming convention in CLAUDE.md. Fix it."