Nimbus: AI Assistant in SwiftUI
Setup guide for Nimbus, a complete AI Assistant Xcode project in SwiftUI. Install, rename and theme version 1.1.0.
Nimbus is a complete AI Assistant in SwiftUI: an Xcode project you rename and ship. Nimbus, an AI assistant: a complete Xcode project with streaming chat, a conversation library, voice mode, widgets and three brand presets. This guide takes you from download to a running, renamed app. It covers version 1.1.0. See the screens on its library page.
Requirements
- Xcode 26 and an iOS 17.0 or later deployment target
- Tuist 4 (
brew install tuist) - An Apple Developer team for devices, App Groups and Sign in with Apple. The simulator runs without one.
Install
Download
Included with SwiftPieces Pro. Not signed in? The button takes you to sign in or create an account, then starts the download when you're back. Unzip the archive; it contains one folder, Nimbus/.
Make it yours
cd Nimbus
scripts/setup.sh --name YourApp --bundle-id com.you.yourapp --preset nimbus-editorialThe script rewrites the project configuration, renames the paywall product ids, renders the app icon in the chosen preset and runs tuist generate.
Run it
Open YourApp.xcworkspace, choose an iPhone simulator and run the YourApp scheme. The first launch loads sample data so every screen has content.
Screens and flows
Nimbus ships 15 screens, joined by 4 flows. Play each flow step by step on the site:
- First Run: onboarding, 14 steps. Three welcome pages, the microphone, an account and a first question answered live, then Nimbus Pro and the Chat tab.
- Ask And Talk It Through: core journey, 11 steps. A suggestion becomes a streamed reply, a dropped connection recovers with Retry, and a voice call from the toolbar returns to the same chat.
- Pick Up A Saved Chat: core journey, 8 steps. Browse and search the Library, open a past conversation and its menu, then delete a chat with a long press.
- Profile And Settings: profile and settings, 13 steps. The model, response style, memory, voice, Theme and an export of your chats, then the subscription and signing out.
Every screen is a SwiftUI view in the project. Search for its type to find the file.
| Screen | SwiftUI view | Where |
|---|---|---|
| Think Out Loud | OnboardingStack | First run |
| Talk It Through | OnboardingStack | First run |
| Answers That Know You | OnboardingStack | First run |
| Microphone | PermissionSheet | First run |
| Ask Your First Question | TryNimbusView | First run |
| Sign In | SignInView | Account and subscription |
| Nimbus Pro | PaywallView | Account and subscription |
| Chat | ChatScreen | Tabs |
| Library | LibraryScreen | Tabs |
| Voice | VoiceScreen | Tabs |
| Conversation | ConversationScreen | Details and sheets |
| Settings | NimbusSettingsScreen | Profile and settings |
| Pick An Option | SettingsPickerList | Profile and settings |
| Memory | MemoryScreen | Profile and settings |
| Theme | ThemeSettingsView | Profile and settings |
Rebrand options
| Option | What it sets |
|---|---|
--name | Target, scheme and product name. Letters and digits. |
--bundle-id | The bundle id. The widget, modules, tests and the App Group derive theirs from it. |
--display-name | The name under the icon. Copy that mentions the app reads it at runtime. |
--team | Your Apple Developer team id. |
--preset | The starting brand preset. Also re-renders the app icon. |
--product-prefix | App Store Connect product id prefix. Defaults to the bundle id plus .pro. |
The values live in Tuist/ProjectDescriptionHelpers/AppConfig.swift if you prefer to edit them by hand.
Theming
Nimbus reads every color, type size, radius and animation from @Environment(\.spTheme). Its three presets are three different scheme families, so switching changes the whole look: ground, surfaces, color blocks, type and shape. People switch presets and appearance in Settings > Theme, and the widget follows.
| Preset | Id | Look | Type |
|---|---|---|---|
| Neon | nimbus-neon | Void black with electric lime and violet. | Geist |
| Editorial | nimbus-editorial | Serif headlines over scenery, ink and paper. | New York |
| Prism | nimbus-prism | Cool white, luminous color fields and dot-matrix figures. | SF Pro |
- Blocks:
theme.color.tilesholds each family's solid block colors with the ink that reads on them. Use them for categories, charts and highlights, and keep the accent for the primary action. - Numbers and display type:
theme.type.numeral(64)andtheme.type.display(40)set any size in the family's style, scaling with Dynamic Type. - Backdrop:
SPBrandBackdropdraws the family's motif (contours, scenery, shapes, blobs, rings, the Pearl haze, Confetti's sprinkles or Prism's luminous field) behind hero surfaces. - Liquid Glass:
.spGlassuses glass on iOS 26, Material on iOS 17 and 18, and an opaque surface under Reduce Transparency.
To build your own brand, start from the preset closest to it in BrandPresets.swift, copy it, and change its colors; every role and block pairing should keep 4.5:1 contrast. For a quick start from hues, SPBrandConfiguration.custom(...) builds an accessible palette from three OKLCH hues.
Purchases and accounts
PurchaseStorehandles StoreKit 2: products, purchase, restore and transaction updates. The scheme runs withConfiguration/Products.storekit, so purchases work in the simulator before App Store Connect is set up.- Create the products in App Store Connect with the ids in the project's catalog (the product prefix plus
.yearlyand.monthly). AccountStoresigns in with Apple and keeps the account in the Keychain. People can also continue without an account.- Data lives in SwiftData inside the App Group, so the widget reads the same store. Replace the sample data by conforming your own type to the repository protocol.
Launch arguments
Debug builds accept these arguments for demos and screenshots. Release builds ignore them.
| Argument | Effect |
|---|---|
-SPMockStore | Local purchases with the same plans |
-SPMockAccount | A signed-in sample account |
-SPSkipOnboarding | Open on the home screen |
-SPResetOnboarding | Run first launch again |
-SPResetData | Reseed the sample data |
-SPTab followed by a tab id | Open a tab |
-SPPresent paywall | Present the paywall |
-SPPreset nimbus-editorial | Start with a preset |
-SPAppearance dark | Force light or dark |
Changelog
1.1.0
2026-10-05
- New Prism preset (
nimbus-prism) replaces Candy: cool white, seven vivid blocks that glow into each other, and SF Pro display type, so the template no longer bundles DM Sans. Pinned chats, suggestions, voices, the try-it questions and the Memory card fill with Prism's luminous fields, the memory count lights up on a dot matrix, and the voice orb has its own Prism colors for each turn. - Blocks fill through
SPBlockFill, which paints them flat in Neon and Editorial and as fields in Prism. The Candy orb colors stay inVoiceOrb.Palette.nimbus(_:family:)for anyone who sets Candy themselves.
1.0.0
2026-09-16
- Tuist project with feature modules (Onboarding, Chat, Library, Voice, Settings) on a shared DesignSystem.
- One-command setup: name, bundle id, team, product ids, brand preset, URL scheme and app icon.
- Brand presets Neon, Editorial and Candy with Geist display type, switchable in Settings.
- Streaming chat with suggestions, stop, retry and auto-titled conversations, behind an
AssistantClientprotocol with a mock model. - A searchable Library with pinning, rename and delete.
- Voice mode around the Voice Orb shader, a glass ball with a Siri-style wave locked to thinking, with a scripted session, live captions and saved transcripts.
- Memory page, model and response style pickers, voice settings and data controls.
- StoreKit 2 paywall with a free daily allowance, a
.storekitconfiguration and a mock store. - Sign in with Apple, SwiftData in an App Group,
nimbus://deep links, Home and Lock Screen widgets. - Light and dark mode, Dynamic Type, VoiceOver labels, Reduce Motion and Reduce Transparency.
- String catalog, unit tests and a first-run UI test.