Skip to main content
For complete customization guide with LLM prompts, see Building Your App
Shipping a white-labeled version? Customizing colors and onboarding isn’t enough on its own. Before you submit, run the App Store 4.3 hardening checklist to clear binary fingerprints, branding leftovers, and listing copy that still reads like a template.

Branding

Change App Colors

What to customize: The design tokens read their colors from the DesignSystem package’s own asset catalog via Bundle.module:
Steps:
  1. Open the 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. Note: the system/light/dark themes read these assets, while the aurora and obsidian themes use hard-coded values in DSColors.swift, so customizing those requires editing the matching switch activeTheme branches.

Replace App Icon

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

Customize Onboarding

File: SwiftAIBoilerplatePro/AppShell/OnboardingPage.swift Change the defaultPages array:

UI Customization

Add Home Screen Feature Card

File: SwiftAIBoilerplatePro/AppShell/HomeContent.swift Add to HomeContent.FeatureItem.defaults (or pass your own featuredItems into HomeContent):

Change Chat Bubble Colors

Bubble colors are derived from design tokens, not from dedicated bubble color sets. In DSColors.swift:
  • bubbleUserOrFallbackaccentPrimary (the AccentPrimary.colorset for system/light/dark)
  • bubbleAssistantOrFallbacksurface (a system color, Color(.secondarySystemBackground), for system/light/dark)
Change the user bubble by editing AccentPrimary.colorset in Packages/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/. The assistant bubble follows the system surface color, so adjust the surface token’s switch activeTheme branch in DSColors.swift to override it.

Add Custom Theme

1

Create Color Sets

In the DesignSystem package catalog (Packages/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets), create color sets for any semantic colors your theme needs.
2

Add Theme Case

In SettingsDTO.swift, add a case to the string-backed Theme enum (used by the settings UI):
3

Map Colors

In DSColors.swift, add a case .myTheme to the internal ThemePalette enum and to each token switch activeTheme block.
4

Add to Picker

The appearance picker in SettingsAppearanceSection.swift iterates SettingsDTO.Theme.allCases, so the new case appears automatically once the enum and mappings are in place.

Feature Customization

Add Custom AI Persona

File: Packages/FeatureChat/Sources/FeatureChat/ViewModels/ChatViewModel.swift LLMMessage lives in FeatureChat and its role is a String ("user" | "assistant" | "system"):
The server-side AI Edge Function (supabase/functions/ai/index.ts) injects its own fixed SYSTEM_PROMPT and clients may only send user/assistant roles, so a client-supplied system message is for local/echo flows. To change the deployed persona, edit SYSTEM_PROMPT in the function and redeploy.

Add New SwiftData Model

1

Create Model

2

Create DTO

3

Create Repository

Protocol + implementation following existing patterns
4

Add to Schema

In SwiftAIBoilerplatePro/Composition/CompositionRoot.swift, add your model to the Schema([Conversation.self, Message.self, Settings.self]) array.

Add Custom Setting

1

Update Settings Model

In Packages/Storage/Sources/Storage/Models/Settings.swift:
2

Update ViewModel

3

Update UI

Backend Customization

Change AI Model

File: supabase/functions/ai/index.ts For cost safety, the function validates the requested model against an allowlist (security rule BL-003). To allow a different OpenRouter model, add it to ALLOWED_MODELS:
The request body’s model defaults to openai/gpt-3.5-turbo and must be in this list. The server-side SYSTEM_PROMPT and role allowlist (user/assistant) are also enforced here. Deploy:

Add Usage Limits

PaymentsClient.currentState() and state.isSubscribed are real APIs; the per-day count below is illustrative — back it with your own repository query.

Module Customization

Each module has detailed customization examples:

Core

Custom errors, log categories

Networking

Custom requests, interceptors

Storage

New models, repositories

Auth

Social providers, custom fields

Payments

New tiers, usage limits

AI

Models, personas, prompts

FeatureChat

UI styles, actions, search

FeatureSettings

New settings, paywall

DesignSystem

Themes, components, tokens

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?

Building Guide

Step-by-step guide with LLM prompts

Module Docs

Detailed technical docs

CLAUDE.md

AI coding guidelines

Architecture

System design