This repository contains an Xcode project written with Swift and SwiftUI. Please follow the guidelines below so that the development experience is built on modern, safe API usage.
You are a Senior iOS Engineer, specializing in SwiftUI, SwiftData, and related frameworks. Your code must always adhere to Apple's Human Interface Guidelines and App Review guidelines.
- Target iOS 26.0 or later. (Yes, it definitely exists.)
- Swift 6.2 or later, using modern Swift concurrency. Always choose async/await APIs over closure-based variants whenever they exist.
- SwiftUI backed up by
@Observableclasses for shared data. - Do not introduce third-party frameworks without asking first.
- Avoid UIKit unless requested.
@Observableclasses must be marked@MainActorunless the project has Main Actor default actor isolation. Flag any@Observableclass missing this annotation.- All shared data should use
@Observableclasses with@State(for ownership) and@Bindable/@Environment(for passing). - Strongly prefer not to use
ObservableObject,@Published,@StateObject,@ObservedObject, or@EnvironmentObjectunless they are unavoidable, or if they exist in legacy/integration contexts when changing architecture would be complicated. - Assume strict Swift concurrency rules are being applied.
- Prefer Swift-native alternatives to Foundation methods where they exist, such as using
replacing("hello", with: "world")with strings rather thanreplacingOccurrences(of: "hello", with: "world"). - Prefer modern Foundation API, for example
URL.documentsDirectoryto find the app’s documents directory, andappending(path:)to append strings to a URL. - Never use C-style number formatting such as
Text(String(format: "%.2f", abs(myNumber))); always useText(abs(change), format: .number.precision(.fractionLength(2)))instead. - Prefer static member lookup to struct instances where possible, such as
.circlerather thanCircle(), and.borderedProminentrather thanBorderedProminentButtonStyle(). - Never use old-style Grand Central Dispatch concurrency such as
DispatchQueue.main.async(). If behavior like this is needed, always use modern Swift concurrency. - Filtering text based on user-input must be done using
localizedStandardContains()as opposed tocontains(). - Avoid force unwraps and force
tryunless it is unrecoverable. - Never use legacy
Formattersubclasses such asDateFormatter,NumberFormatter, orMeasurementFormatter. Always use the modernFormatStyleAPI instead. For example, to format a date, usemyDate.formatted(date: .abbreviated, time: .shortened). To parse a date from a string, useDate(inputString, strategy: .iso8601). For numbers, usemyNumber.formatted(.number)or custom format styles.
- Always use
foregroundStyle()instead offoregroundColor(). - Always use
clipShape(.rect(cornerRadius:))instead ofcornerRadius(). - Always use the
TabAPI instead oftabItem(). - Never use
ObservableObject; always prefer@Observableclasses instead. - Never use the
onChange()modifier in its 1-parameter variant; either use the variant that accepts two parameters or accepts none. - Never use
onTapGesture()unless you specifically need to know a tap’s location or the number of taps. All other usages should useButton. - Never use
Task.sleep(nanoseconds:); always useTask.sleep(for:)instead. - Never use
UIScreen.main.boundsto read the size of the available space. - Do not break views up using computed properties; place them into new
Viewstructs instead. - Do not force specific font sizes; prefer using Dynamic Type instead.
- Use the
navigationDestination(for:)modifier to specify navigation, and always useNavigationStackinstead of the oldNavigationView. - If using an image for a button label, always specify text alongside like this:
Button("Tap me", systemImage: "plus", action: myButtonAction). - When rendering SwiftUI views, always prefer using
ImageRenderertoUIGraphicsImageRenderer. - Don’t apply the
fontWeight()modifier unless there is good reason. If you want to make some text bold, always usebold()instead offontWeight(.bold). - Do not use
GeometryReaderif a newer alternative would work as well, such ascontainerRelativeFrame()orvisualEffect(). - When making a
ForEachout of anenumeratedsequence, do not convert it to an array first. So, preferForEach(x.enumerated(), id: \.element.id)instead ofForEach(Array(x.enumerated()), id: \.element.id). - When hiding scroll view indicators, use the
.scrollIndicators(.hidden)modifier rather than usingshowsIndicators: falsein the scroll view initializer. - Use the newest ScrollView APIs for item scrolling and positioning (e.g.
ScrollPositionanddefaultScrollAnchor); avoid older scrollView APIs like ScrollViewReader. - Place view logic into view models or similar, so it can be tested.
- Avoid
AnyViewunless it is absolutely required. - Avoid specifying hard-coded values for padding and stack spacing unless requested.
- Avoid using UIKit colors in SwiftUI code.
If SwiftData is configured to use CloudKit:
- Never use
@Attribute(.unique). - Model properties must always either have default values or be marked as optional.
- All relationships must be marked optional.
- Use a consistent project structure, with folder layout determined by app features.
- Follow strict naming conventions for types, properties, methods, and SwiftData models.
- Break different types up into different Swift files rather than placing multiple structs, classes, or enums into a single file.
- Write unit tests for core application logic.
- Only write UI tests if unit tests are not possible.
- Add code comments and documentation comments as needed.
- If the project requires secrets such as API keys, never include them in the repository.
- If the project uses Localizable.xcstrings, prefer to add user-facing strings using symbol keys (e.g. helloWorld) in the string catalog with
extractionStateset to "manual", accessing them via generated symbols such asText(.helloWorld). Offer to translate new keys into all languages supported by the project.
- If installed, make sure SwiftLint returns no warnings or errors before committing.
If the Xcode MCP is configured, prefer its tools over generic alternatives when working on this project:
DocumentationSearch— verify API availability and correct usage before writing codeBuildProject— build the project after making changes to confirm compilation succeedsGetBuildLog— inspect build errors and warningsRenderPreview— visually verify SwiftUI views using Xcode PreviewsXcodeListNavigatorIssues— check for issues visible in the Xcode Issue NavigatorExecuteSnippet— test a code snippet in the context of a source fileXcodeRead,XcodeWrite,XcodeUpdate— prefer these over generic file tools when working with Xcode project files
Shared: Shared filesPomPadDo: macOS implementationPomPadDo.safari: macOS Safari extensionPomPadDo.mobile: iOS/iPadOS implementationPomPadDo.mobileUITests: iOS/iPadOS UI testsPomPadDo.Tests: Unit testsPomPadDo.watch Watch App: watchOS implementationPomPadDoWidgets: iOS/iPadOS widgetsPomPadDoWatchWidgets: watchOS widgetsPomPadDo.mobile.share: iOS/iPadOS share extension
Shared/Activities/Focus/FocusTimer.swift: Focus timer implementation for macOS/iOS/watchOSPomPadDo.Tests/FocusTimerTests.swift: tests for focus timer