CareBridge Development Standards
This skill provides comprehensive coding standards, architectural patterns, and best practices for developing the CareBridge application - a multi-case eldercare management SaaS platform.
Overview
CareBridge has specific architectural patterns that MUST be followed to ensure:
- Case context preservation across all navigation
- Consistent Stripe integration for SaaS subscriptions and concierge packages
- Next.js 15 compliance with async request APIs
- UI consistency using shadcn/ui components only
- Database security with proper RLS policies and migrations
Breaking these patterns causes critical bugs, build errors, and scalability issues.
When to Use This Skill
ALWAYS use this skill when:
- Adding new features to CareBridge
- Fixing bugs in the CareBridge codebase
- Creating new pages or components
- Implementing navigation or routing
- Working with Stripe payments
- Creating database migrations
- Reviewing or refactoring code
Critical scenarios that require this skill:
- Any page that displays case-specific data
- Any navigation component or link
- Any Stripe checkout or webhook code
- Any new UI component creation
- Any database schema changes
Core Standards
🚨 Rule #1: NEVER Break Case Context
Every navigation link, redirect, or router.push MUST preserve the caseId query parameter.
Bad example:
<Link href="/dashboard">Dashboard</Link>
Good example:
const caseId = searchParams.get('caseId')
<Link href={caseId ? `/dashboard?caseId=${caseId}` : '/dashboard'}>Dashboard</Link>
See references/case-context.md for complete patterns.
🚨 Rule #2: NEVER Create Custom Components
Always use shadcn/ui. Never create custom UI components.
Bad example:
export function CustomButton({ children }) {
return <button className="custom-btn">{children}</button>
}
Good example:
import { Button } from '@/components/ui/button'
<Button variant="default">{children}</Button>
Add components with: npx shadcn@latest add button
See references/component-standards.md for the complete list of available components.
🚨 Rule #3: ALWAYS Await Params in Next.js 15
Next.js 15 requires awaiting params and searchParams.
Bad example:
export default function Page({ params }: { params: { id: string } }) {
const { id } = params // ERROR!
}
Good example:
type Props = { params: Promise<{ id: string }> }
export default async function Page({ params }: Props) {
const { id } = await params
}
See references/nextjs-15-patterns.md for all Next.js 15 changes.
🚨 Rule #4: ALWAYS Use Metadata in Stripe Checkouts
Stripe webhooks route based on metadata.package_type.
Bad example:
const session = await stripe.checkout.sessions.create({
line_items: [...],
mode: 'subscription',
})
Good example:
const session = await stripe.checkout.sessions.create({
line_items: [...],
mode: 'subscription',
metadata: {
clerk_user_id: userId,
package_type: 'concierge_plus',
payment_type: 'subscription',
},
})
See references/stripe-integration.md for the complete integration guide.
🚨 Rule #5: ALWAYS Use Supabase CLI for Migrations
Never create tables via SQL in application code.
Bad example:
await supabase.sql`CREATE TABLE ...` // Don't do this!
Good example:
npx supabase migration new create_table
# Edit the generated .sql file
npx supabase db push
See references/database-patterns.md for migration workflows.
Implementation Workflow
When implementing any feature in CareBridge, follow this workflow:
Step 1: Identify the Domain
Before writing any code, identify which domain(s) you're working in:
- Navigation/Routing → Read
references/case-context.md - Payments/Subscriptions → Read
references/stripe-integration.md - Pages/API Routes → Read
references/nextjs-15-patterns.md - UI Components → Read
references/component-standards.md - Database Operations → Read
references/database-patterns.md
Step 2: Follow the Patterns
Each reference document contains:
- ✅ CORRECT patterns to follow
- ❌ WRONG anti-patterns to avoid
- Executable code examples
- Common mistakes section
- Checklists
Step 3: Validate Against Standards
Before completing any task, verify:
Case Context Checklist:
- [ ] All navigation links preserve
caseIdquery parameter - [ ] Page components await params in Next.js 15
- [ ] Client components use
useEffectforcaseIdto prevent hydration mismatch - [ ] Empty states shown when
caseIdis missing
Stripe Integration Checklist:
- [ ] Pricing uses
src/lib/config/concierge-pricing.tsas single source of truth - [ ] Checkout sessions include proper metadata for webhook routing
- [ ] Webhook handlers check
metadata.package_typefor routing - [ ] Price validation happens before checkout creation
Next.js 15 Checklist:
- [ ] All
paramsare typed asPromise<{ ... }>and awaited - [ ] All
searchParamsare typed asPromise<{ ... }>and awaited - [ ] 'use client' only added when needed (hooks, interactivity, browser APIs)
- [ ] Server components used for data fetching by default
Component Standards Checklist:
- [ ] Using shadcn/ui components (added via
npx shadcn@latest add) - [ ] NO custom UI components created
- [ ] NO custom CSS variables defined
- [ ] Using Tailwind classes instead of inline styles
- [ ] Proper TypeScript types defined
Database Patterns Checklist:
- [ ] Migrations created via
npx supabase migration new - [ ] RLS enabled on all tables
- [ ] RLS policies created for SELECT, INSERT, UPDATE, DELETE
- [ ] Indexes added for frequently queried columns
- [ ] Using
createServerClient()in server components - [ ] Using
createBrowserClient()in client components
Common Mistakes to Avoid
Based on real bugs encountered during development:
- Losing case context - Navigation without preserving caseId
- Not awaiting params - Using Next.js 14 patterns in Next.js 15
- Creating custom components - Instead of using shadcn/ui
- Defining custom CSS variables - Instead of using existing ones
- Forgetting RLS policies - Creating tables without Row-Level Security
- Skipping migrations - Creating tables in application code
- Missing webhook metadata - Webhooks unable to route correctly
- Using client Supabase in server - Wrong client type for component
Project Context
Application: CareBridge - Multi-case eldercare management platform
Tech Stack:
- Next.js 15.5.4 with App Router
- React 19.1.0
- TypeScript 5.x
- Supabase (PostgreSQL with RLS)
- Clerk (Authentication)
- Stripe (Payments)
- shadcn/ui (Components)
- Tailwind CSS (Styling)
Architecture:
- Multi-tenant: Users can manage multiple care cases
- Case-centric: All data scoped to caseId
- SaaS subscription: $19.99/month platform access
- Concierge packages: 4 service tiers (one-time, project-based, subscription)
Resources
This skill includes comprehensive reference documentation in the references/ directory:
references/
-
case-context.md- How caseId preservation works
- Reading case context in server/client components
- Navigation patterns
- Common mistakes and fixes
-
stripe-integration.md- Pricing configuration (single source of truth)
- Creating checkout sessions
- Webhook handling and metadata routing
- Database structure
- Testing checklist
-
nextjs-15-patterns.md- Async params and searchParams
- Server vs client components
- Data fetching patterns
- Metadata API
- Common migration errors
-
component-standards.md- Using shadcn/ui components
- CSS variables (read-only)
- Form patterns with React Hook Form + Zod
- Dialog/modal patterns
- Loading and empty states
-
database-patterns.md- Supabase client patterns
- Migration creation and structure
- RLS policies and patterns
- Query patterns (CRUD, joins, filtering)
- Transaction patterns with RPC
- Error handling
Getting Help
When stuck, refer to the reference documents for:
- Copy-paste ready code examples
- Step-by-step checklists
- Anti-patterns to avoid
- Testing procedures
Remember: These patterns exist because they've been proven through real development. Breaking them leads to bugs, build errors, and technical debt.
Scan to join WeChat group