Cadence, a subscription habit tracker: a complete Xcode project with onboarding, a StoreKit 2 paywall, SwiftData, widgets and three brand presets.
A complete subscription app. First run is the Onboarding screen with a notifications request and a StoreKit 2 paywall as the handoff; after that the app opens on a five-tab shell. What's New, Settings, restoring the paywall and signing out back to first run are all connected.
$199 once, every piece included. See how installing works · Sign in
The screens this template wires together, in the order someone meets them.
First run
Welcome pages, a notifications request and the StoreKit 2 paywall. Runs once, then records completion.
Tabs
Today, Habits, Projects, Insights and Profile on the App Shell. Projects starts from a ghost state.
From the tabs
What's New opens from Today. Settings opens from Profile, reopens the paywall and signs out to first run.
SwiftUI source you own, built on Apple frameworks only.
SubscriptionApp, with your product ids and completion key as parametersOnboarding, Welcome, Purchase, Paywall, App Shell, Lessons, Projects, What's New, Settings. Installed together, automatically.
In-App Purchase capability
Subscription Utility (brief). Your agent builds around this template in the same design.
How it behaves, what it handles, and the decisions behind it.
SubscriptionApp is one root view. On first launch it shows the Onboarding screen: three welcome pages, a notifications request, then the Purchase screen's StoreKit 2 paywall as the handoff. Purchasing, restoring or closing the paywall finishes onboarding and records it under a completion key, so the root switches to the home on its own.
Home is the App Shell with five tabs: Today, Habits, Projects, Insights and Profile. Today presents What's New for the 2.0 release as a sheet. Projects starts from a ghost state. Profile pushes Settings, where Manage subscription reopens the paywall full screen and Sign out clears the completion key and returns the app to first run.
productIDs. Until they exist, the paywall shows its designed "plans didn't load" state and its close button still finishes onboarding.completionKey is the UserDefaults key the flow writes and the root reads. Change it to show onboarding to everyone again, for example after a redesign.OnboardingFlowScreenExample.pages and .permission, the tabs in CadenceTab, projects in GhostStateBlockExample, release notes in BentoGridBlockExample, and the account and settings rows at the top of SubscriptionApp.swift..environment(\.spTheme, PaperTheme()) or your own theme once on SubscriptionApp to re-skin the whole app.@main: put SubscriptionApp() in your own WindowGroup.Pieces that work well next to this one.