Docs

Sprig: Meal Planner in SwiftUI

Setup guide for Sprig, a complete Meal Planner Xcode project in SwiftUI. Install, rename and theme version 1.0.0.

Sprig is a complete Meal Planner in SwiftUI: an Xcode project you rename and ship. Sprig, a meal planning app: a complete Xcode project with recipes that fit your pantry, a week plan, a grocery list, nutrition stats, cook mode, widgets and three brand presets. This guide takes you from download to a running, renamed app. It covers version 1.0.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, Sprig/.

Make it yours

cd Sprig
scripts/setup.sh --name YourApp --bundle-id com.you.yourapp --preset sprig-sol

The 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

Sprig ships 18 screens, joined by 4 flows. Play each flow step by step on the site:

  • First Run: onboarding, 11 steps. From the welcome through four questions, an account and Sprig Plus, to recipes ranked for your pantry.
  • Cook Tonight's Dinner: core journey, 11 steps. Pick a need, open a collection and tonight's recipe, cook it step by step with timers, and see Progress count it.
  • Plan The Week And Shop: core journey, 10 steps. Swap a dinner for one that uses what's about to turn, shop the list aisle by aisle and put it in the pantry.
  • Profile And Settings: profile and settings, 10 steps. Change your diet and theme from the avatar, upgrade to Sprig Plus and start over.

Every screen is a SwiftUI view in the project. Search for its type to find the file.

ScreenSwiftUI viewWhere
WelcomeSprigOnboardingFirst run
DietSprigOnboardingFirst run
AllergiesSprigOnboardingFirst run
HouseholdSprigOnboardingFirst run
Weekly GoalSprigOnboardingFirst run
Sign InSignInViewAccount and subscription
Sprig PlusPaywallViewAccount and subscription
For YouForYouScreenTabs
PlanPlanScreenTabs
PantryPantryScreenTabs
ProgressProgressScreenTabs
CollectionCollectionScreenDetails and sheets
RecipeRecipeDetailScreenDetails and sheets
Cook ModeCookModeViewDetails and sheets
Grocery ListGroceryListScreenDetails and sheets
ProfileSprigSettingsScreenProfile and settings
Change DietSettingsPickerListProfile and settings
ThemeThemeSettingsViewProfile and settings

Rebrand options

OptionWhat it sets
--nameTarget, scheme and product name. Letters and digits.
--bundle-idThe bundle id. The widget, modules, tests and the App Group derive theirs from it.
--display-nameThe name under the icon. Copy that mentions the app reads it at runtime.
--teamYour Apple Developer team id.
--presetThe starting brand preset. Also re-renders the app icon.
--product-prefixApp 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

Sprig 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.

PresetIdLookType
Presssprig-pressNewsprint bone, printing inks, hairline rules.Inter
Solsprig-solSun-bleached sand, marigold and terracotta.Space Grotesk
Candysprig-candyCream, bright friendly blocks, rounded bold type.DM Sans
  • Blocks: theme.color.tiles holds 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) and theme.type.display(40) set any size in the family's style, scaling with Dynamic Type.
  • Backdrop: SPBrandBackdrop draws 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: .spGlass uses 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

  • PurchaseStore handles StoreKit 2: products, purchase, restore and transaction updates. The scheme runs with Configuration/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 .yearly and .monthly).
  • AccountStore signs 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.

ArgumentEffect
-SPMockStoreLocal purchases with the same plans
-SPMockAccountA signed-in sample account
-SPSkipOnboardingOpen on the home screen
-SPResetOnboardingRun first launch again
-SPResetDataReseed the sample data
-SPTab followed by a tab idOpen a tab
-SPPresent paywallPresent the paywall
-SPPreset sprig-solStart with a preset
-SPAppearance darkForce light or dark

Changelog

1.0.0

2026-09-18

  • Tuist project with feature modules (Onboarding, For You, Plan, Pantry, Progress, Settings) on a shared DesignSystem.
  • One-command setup: name, bundle id, team, product ids, brand preset and app icon.
  • Brand presets Press (default), Sol and Candy with Inter, Space Grotesk and DM Sans display type, switchable in Profile.
  • First run with diet, allergies, household size and a weekly goal, then a StoreKit 2 paywall with a .storekit configuration and a mock store for demos.
  • For You on the Recipes screen: drawn collection tiles that re-rank by need, counting only recipes that fit the diet and allergies; tonight's dinner and the best fits for the pantry.
  • Recipe detail with servings scaling and pantry checks, and a full-screen cook mode with step timers that keeps the screen awake.
  • Plan with a week strip, breakfast, lunch and dinner slots, a recipe picker and a grocery list merged, scaled and grouped by aisle, minus what the pantry has.
  • Pantry with an input pill that guesses category and use-by date, use-soon blocks with a recipe for each, categories and check-offs.
  • Progress on the Nutrition screen: food groups as packed bubbles, the plan cooked so far over a dot grid, daily capsule columns.
  • SwiftData persistence in an App Group for the plan, pantry and grocery checks, with sample data and a repository protocol.
  • Tonight (medium, with a mark-cooked button) and Groceries (small) widgets.
  • Light and dark mode, Dynamic Type through the accessibility sizes, VoiceOver labels and actions, Reduce Motion.
  • String catalog, unit tests and a first-run UI test.