A feedback tab on the edge of the screen lets people tell you what is wrong without leaving your app. This guide adds one to a SwiftUI app with the Nitpick Swift package. It takes four steps, and a coding agent can do all of them from a single prompt if you prefer: see Claude Code with SwiftUI or Codex with SwiftUI.
What your users will see
A small tab labelled Feedback sits on the screen edge. Tapping it opens a panel with two choices. General is a comment about the app as a whole. Point at something lets the user tap the part of the screen they mean, and then shows a form with a preview of the screenshot, a button to remove it, a comment field and Send. Under Send it says: "Your feedback goes to the maker of this app." The panel follows the language of the device and is translated into 20 languages.
1. Add the Swift package
In Xcode choose File > Add Package Dependencies, pick a dependency rule and add the Nitpick product to your app target. The package needs iOS 17 or newer, has no third-party dependencies and uses only public Apple APIs. Open the target settings and check that the deployment target is 17.0 or higher.
2. Configure it once at launch
import SwiftUI
import Nitpick
@main
struct MyApp: App {
init() { Nitpick.configure(appKey: "npk_YOUR_PUBLIC_KEY") }
var body: some Scene {
WindowGroup { RootView().nitpick() }
}
}
The app key is public. It can only create reports for one app, so it is safe to ship. You get it by creating an app: npx -y @nitpickhq/cli@latest login opens your browser, where you create an account and start the subscription. Then npx -y @nitpickhq/cli@latest init in the app folder creates the app and prints its public key. The component lives in its own windows above your app, so .nitpick() on the root view is optional.
3. Name your screens and elements
A report is only useful if it says where the user was. Give each screen a name and each button, field or card that people may point at a name that leads to your code:
CheckoutView()
.nitpickScreen("Checkout")
Button("Pay") { pay() }
.nitpickElement("checkout.pay_button")
When a user taps, the component picks the smallest named element that contains the tap. If the tap is outside every element but within 44 points of one, that one counts as the nearest. Otherwise the report has the screen name only. The screens, elements and masking page has the full rules.
4. Try it in the simulator
To see the panel without sending anything, turn on the dry run. It shows the tab at once and sends no requests at all:
Nitpick.configure(appKey: "npk_YOUR_PUBLIC_KEY", options: NitpickOptions(dryRun: true))
Build and launch the app in a simulator, tap the Feedback tab, choose Point at something, tap your Pay button and press Send. Remove the dry run option before you ship, so that real reports reach you.
Where the reports go
Reports show up in your dashboard, in nitpick feedback list and in your coding agent through the MCP server. Nitpick costs $9 a month per account for unlimited apps. If you want your agent to read and fix reports, continue with bug reports from users in SwiftUI or look at how the screenshot works. The install details are in Install for SwiftUI.