Skip to main content
For complete customization guide with LLM prompts, see Building Your App

Branding

Change App Colors

What to customize:
SwiftAIBoilerplatePro/Resources/DesignSystemColors.xcassets/
├── Primary.colorset
├── AccentPrimary.colorset
├── BubbleUser.colorset
└── BubbleAssistant.colorset
Steps:
  1. Open color set in Xcode
  2. Change Light Appearance color
  3. Change Dark Appearance color
  4. Build → Colors update everywhere!
All components use design tokens - change once, applies everywhere.

Replace App Icon

Steps:
  1. Create 1024×1024 PNG
  2. Drag to Assets.xcassets/AppIcon.appiconset
  3. Xcode generates all required sizes
  4. Build and verify

Customize Onboarding

File: SwiftAIBoilerplatePro/AppShell/OnboardingPage.swift Change the pages array:
static let pages: [OnboardingPage] = [
    OnboardingPage(
        title: "Your Title",
        description: "Your description",
        systemImage: "sparkles"  // Any SF Symbol
    ),
    // Add more pages...
]

UI Customization

Add Home Screen Feature Card

File: SwiftAIBoilerplatePro/AppShell/HomeContent.swift
public let features: [FeatureData] = [
    // ... existing cards
    FeatureData(
        icon: "bookmark.fill",
        title: "Your Feature",
        description: "Feature description",
        tag: "New"
    ),
]

Change Chat Bubble Colors

Files:
DesignSystemColors.xcassets/
├── BubbleUser.colorset      # User message color
└── BubbleAssistant.colorset # AI message color
Open in Xcode → Change colors → All chat styles update!

Add Custom Theme

1

Create Color Sets

In DesignSystemColors.xcassets, create color sets for all semantic colors
2

Add Theme Case

enum UserThemePreference: String {
    case system, light, dark, aurora, obsidian
    case myTheme  // Add this
}
3

Map Colors

In DSColors.swift, add color mappings for your theme
4

Add to Picker

In SettingsView, add your theme to the picker

Feature Customization

Add Custom AI Persona

File: ChatViewModel.swift (in your feature)
func sendMessage(_ text: String) async {
    let systemPrompt = LLMMessage(
        role: .system,
        content: """
        You are a professional Swift developer.
        Provide clear, concise answers with code examples.
        """
    )
    
    let messages = [systemPrompt] + history + [userMessage]
    // Stream with persona
}

Add New SwiftData Model

1

Create Model

@Model
class YourModel {
    @Attribute(.unique) var id: UUID
    var property: String
    var createdAt: Date
}
2

Create DTO

struct YourModelDTO: Identifiable, Sendable {
    let id: UUID
    let property: String
    
    init(_ model: YourModel) {
        self.id = model.id
        self.property = model.property
    }
}
3

Create Repository

Protocol + implementation following existing patterns
4

Add to Schema

In CompositionRoot.swift, add to Schema array

Add Custom Setting

1

Update Settings Model

@Model
class Settings {
    var theme: UserThemePreference
    var yourSetting: Bool = false  // Add this
}
2

Update ViewModel

@Observable
class SettingsViewModel {
    var yourSetting: Bool
    
    func toggleYourSetting(_ enabled: Bool) async {
        // Save to repository
    }
}
3

Update UI

Toggle("Your Setting", isOn: $viewModel.yourSetting)
    .onChange(of: viewModel.yourSetting) {
        Task { await viewModel.toggleYourSetting($0) }
    }

Backend Customization

Change AI Model

File: supabase/functions/ai/index.ts
// Change this line:
const model = "openai/gpt-4o-mini"

// To any OpenRouter model:
const model = "anthropic/claude-3-5-sonnet"
const model = "google/gemini-2.0-flash"
// ... 500+ models available
Deploy:
supabase functions deploy ai

Add Usage Limits

func canSendMessage() async -> Bool {
    let state = await paymentsClient.currentState()
    
    if state.isSubscribed {
        return true  // Unlimited for pro
    } else {
        let count = await messageRepository.todayCount()
        return count < 20  // Free tier limit
    }
}

Module Customization

Each module has detailed customization examples:

Pro Tips

Test after each change - Don’t stack multiple changes without testing
Use design tokens - Never hardcode colors or spacing
Follow existing patterns - Look for similar features first
Keep files ≤ 300 lines - Extract components when needed

Need More Help?

I