Skip to main content
This guide gets you running fast. For a full production setup with real backends, follow the step-by-step instructions in the setup guides.

1. Prerequisites

Ensure you have:
  • ✅ macOS 15+
  • ✅ Xcode 26.2+ (iOS 26 SDK, Swift 6.0)
  • ✅ 10 minutes
v2.2.0 ships with iOS 26 Liquid Glass. Runtime still supports iOS 17+ thanks to a Material fallback in SAIGlass, but the build requires Xcode 26.2+. Stuck on older Xcode? Pin the v1.9.0 tag.

2. Clone and Open

Xcode will automatically resolve Swift Package dependencies. Wait ~30 seconds for this to complete.

3. Run Immediately (No Configuration Needed!)

Press ⌘ + R in Xcode - that’s it!
The app works immediately with placeholder configuration:
  • MockAuthClient - Sign in with any email/password
  • EchoLLMClient - AI echoes your messages back
  • All features work for exploration
  • No API keys or setup required
To use real services (Supabase, OpenRouter, RevenueCat), follow the Production setup path below.

4. Explore the App

What You’ll See

1

Onboarding

Swipe through 3 onboarding pages → tap “Get Started”
2

Sign In

Tap “Debug Sign In” (or use any email/password in mock mode)
3

Home Screen

See feature cards, quick actions, and subscription status
4

Chat

Tap “Start Chat” → send a message → receive echo response
Success! If you can send chat messages, you have a working AI app foundation.

5. Explore Features

Try These Flows

Chat UI Styles:
  • Tap the style switcher icon (top-right in chat)
  • Switch between bubble style (WhatsApp) and centered style (ChatGPT)
Profile:
  • Tap profile icon → edit display name
  • Try uploading a photo (iOS 17+ PhotosPicker)
  • Check subscription status
Settings:
  • Open Settings tab
  • Try different themes (5 included: System, Light, Dark, Aurora, Obsidian)
  • Toggle preferences
Chat Management:
  • Create multiple conversations
  • Rename conversations (long press)
  • Delete conversations (swipe left)
  • Search conversations

Verify Everything Works

  • Sign in with any email/password (mock mode)
  • Sign out and sign back in
  • Profile persists across restarts
  • Create conversation
  • Send messages
  • Receive echo responses
  • Switch UI styles
  • Rename/delete conversations
  • Edit display name
  • Upload photo (compresses automatically)
  • View subscription status
  • Change themes (instant update)
  • Toggle preferences
  • All settings persist

What’s Running in Mock Mode

The app automatically detects missing backend configuration and uses mocks:
Mock mode is perfect for:
  • Learning the codebase
  • UI development
  • Testing without API costs
  • Demo purposes

Next Steps

Jump straight to customization:Change branding (5 minutes):
  1. App display name: set appDisplayName in Packages/DesignSystem/Sources/DesignSystem/Tokens/BrandConfig.swift (and the target’s Display Name under Xcode → General). Set the bundle ID via APP_BUNDLE_ID in Config/App.xcconfig.
  2. Colors: Edit SwiftAIBoilerplatePro/Resources/DesignSystemColors.xcassets
  3. Icon: Replace in Assets.xcassets/AppIcon.appiconset
Full customization guide in project →

Run Tests

Verify everything with the test suite:
Expected: ~598 tests pass across 12 package test targets + the app test suites (one Boilerplate.xctestplan run). ✅

Troubleshooting

Cause: Liquid Glass APIs (Glass, glassEffect, GlassEffectContainer) are iOS 26 SDK symbols. Older toolchains cannot compile them, even behind #available checks.Solution: Upgrade to Xcode 26.2+ (the repo pins 26.3 via .xcode-version), or stay on the v1.9.0 tag until you can upgrade.
.tabBarMinimizeBehavior(.onScrollDown) is iOS 26 only. On iOS 17–25 the saiTabBarMinimize(_:) modifier is a no-op and returns the same view. No action needed; behaviour is progressive.
Cause: You (or downstream code) applied DSColors.background.ignoresSafeArea() or .background(.black) under the container. These block the Material SwiftUI already provides and fight Liquid Glass on iOS 26.Solution: Remove the manual background. SwiftUI handles sheet materials for you on iOS 26. See the Migration Guide section “Fighting glass cleanup”.
Swift 6 enforces explicit any on protocol-typed stored properties and parameters. The boilerplate has been audited for this already; your own types may need updates. See the Migration Guide.
Cause: MessageRepositoryImpl, ConversationRepositoryImpl, and SettingsRepositoryImpl are now @MainActor-pinned in v2.0.Solution: Create repositories from the main thread, or await when constructing them from a background context.
Solution:
Cause: Running in Release modeSolution:
  1. Product → Scheme → Edit Scheme
  2. Run → Build Configuration → Debug
  3. Clean and rebuild
Solution:

Production Setup Path

When you are ready to leave mock mode, set up real services in this order:
1

Configure Supabase

Create the Supabase project, copy Config/Secrets.example.xcconfig to Config/Secrets.xcconfig, and add your project URL and anon key.Supabase setup guide
2

Configure authentication providers

Keep mock auth while exploring. Set up Apple, Google, and email auth when you are ready for real accounts.Authentication guide
3

Deploy the AI proxy

Add your OpenRouter key to the Supabase Edge Function and deploy the ai function so API keys stay server-side.Deployment guide
4

Configure subscriptions

Set up RevenueCat products, entitlements, and API keys before testing paywalls.RevenueCat setup guide
5

Add optional production services

Add Crashlytics, OneSignal push notifications, chat sync, and profile photos only when your app needs them.Crashlytics · OneSignal · Chat Sync · Profile Photos

Quick Reference

File Locations

Key Files for Customization

Useful Commands

What You’ve Learned

You now have:
  • ✅ A running AI chat app
  • ✅ Working authentication (mock mode)
  • ✅ Functional chat with dual UIs
  • ✅ Profile management
  • ✅ Theme system (5 themes)
  • ✅ Understanding of mock vs production

Ready to Build?

Customize

Change branding, features, and UI

Architecture

Learn the system design

Deploy

Ship to production
Pro tip: Use the Building Your App guide which includes ready-to-use LLM prompts for Cursor/Claude to speed up customization!
The App Generator — a standalone macOS app that drives your own coding-agent CLI (Claude Code, Codex, Gemini, or Cursor) to generate a differentiated app from this template — is a separate product (coming soon). See pricing & license for details.