PingKit is a lightweight, privacy-first feedback SDK for iOS. It gives your users a native SwiftUI modal to send text and screenshots, while you get a dashboard to triage everything. Two lines of Swift to integrate.
Prerequisites:
PingKit is distributed via Swift Package Manager. No CocoaPods, no Carthage, no binary frameworks.
In Xcode, go to File → Add Package Dependencies and enter the repository URL:
Set the dependency rule to Up to Next Major Version from 1.0.0.
Add PingKit to your package dependencies:
Call PingKit.configure() once at app launch -typically in your App initializer. You'll find your API key in the dashboard settings.
Pass a PingKitOptions struct for additional configuration:
| Option | Default | Description |
|---|---|---|
| endpoint | "https://pingkit.dev" | API endpoint URL |
| enableAppAttest | true | Enable Apple App Attest for device verification |
| maxImageSizeMB | 5 | Maximum screenshot size in MB before JPEG compression |
| verbose | false | Enable debug logging to the console |
Call PingKit.show() to present the native feedback modal. Attach it to any button, gesture, or event in your app.
Control whether the email field appears and how it behaves:
Add a category picker so users can classify their feedback:
Attach arbitrary key-value pairs that show up in the dashboard:
Don't want the built-in modal? Use PingKit.submit() to send feedback from your own UI. The dashboard, webhooks, and all backend features work exactly the same.
The SDK provides typed errors you can handle in headless mode:
Customize the feedback modal to match your app's look. Pass a PingKitTheme to configure().
| Property | Default | Description |
|---|---|---|
| accentColor | .accentColor | Buttons and interactive elements |
| backgroundColor | .systemBackground | Modal background color |
| cardColor | nil | Section card background (nil uses iOS default) |
| cornerRadius | 20 | Modal corner radius in points |
| font | .body | Base font for modal text |
Pingkit uses Apple App Attest to verify that feedback submissions come from a genuine instance of your app running on real Apple hardware. This prevents API abuse from bots, scripts, and modified app builds.
To enable App Attest, add the capability to your Xcode project:
This adds the com.apple.developer.devicecheck.app-attest entitlement to your app. No additional code is needed -the SDK detects the capability and uses it automatically.
App Attest is not available on the iOS Simulator or older devices. The SDK handles this gracefully:
enableAppAttest: false in your PingKitOptions, or toggle off "Require App Attest" in dashboard SettingsEach project has a Require App Attest toggle in the dashboard settings. When enabled, requests without a valid App Attest assertion are rejected with a 403 ATTEST_REQUIRED error. Disable this if you need to accept requests from non-iOS clients or during development.
The Pingkit dashboard is where you triage feedback, manage projects, and configure your account. Everything your users submit lands here in real time.
Sign in with your GitHub account. Pingkit uses GitHub OAuth -no passwords to manage, no separate auth system. After signing in, you'll land on your feedback list or the onboarding flow if it's your first time.
Each project represents one iOS app. When you create a project, Pingkit generates an API key (prefixed with pk_) that you pass to PingKit.configure() in your app. You can create multiple projects for different apps or environments (e.g. staging vs. production).
The feedback page shows every submission across your project. You can filter by status (new, in progress, resolved), search by text content, and narrow by date range. Feedback is sorted by newest first, with pagination for large volumes.
Each row shows the feedback text preview, status badge, device info, and timestamp. Click any row to open the detail view.
The detail view shows the full feedback text, any attached screenshot, device metadata (model, OS version, app version, locale, timezone), and custom metadata you passed via the SDK. From here you can:
In settings you can manage your project's API key, webhook URL, and billing. Key features:
Pingkit ships an MCP server so your AI coding assistant can read, search, and triage feedback without leaving the editor. Works with Claude Code, Cursor, Codex, Windsurf, and any tool that supports the Model Context Protocol. The server is open source on GitHub.
1. Create a personal access token in the dashboard settings under "Personal Access Tokens". The token is shown once -copy it immediately.
2. Add to your project's MCP config. Create or edit .mcp.json in your project root:
That's it. Your AI tool will pick up the config and connect to Pingkit automatically. Requires Node.js 18+.
.mcp.json to your .gitignore if it contains a real tokenThe MCP server exposes seven tools your AI assistant can call:
| Tool | Description |
|---|---|
| list_feedback | Search and filter feedback with pagination. Filter by status, app version, date range, or free-text search. |
| get_feedback | Get full details of a single feedback item including metadata and notes. |
| update_feedback | Update status (new, acknowledged, resolved, archived) or add internal notes. |
| bulk_feedback | Perform bulk actions (acknowledge, archive, delete) on up to 100 items at once. |
| feedback_stats | Get submission timeline and app version breakdown for analytics. |
| list_projects | List all your projects with their configuration. |
| get_quota | Check your current plan, submission count, and quota. |
Three built-in prompts give your AI assistant a starting point for common workflows:
| Prompt | What it does |
|---|---|
| triage | Reviews all unresolved feedback, groups by theme, and suggests priorities. |
| release_review | Summarizes feedback for a specific app version -great before or after a release. |
| trends | Analyzes submission volume, version distribution, and emerging patterns. |
You can also talk to your assistant naturally -it will call the right tools automatically. Try things like "What are users complaining about in v2.3?" or "Mark all dark mode feedback as resolved".
Every feedback submission automatically includes device context. You don't need to collect or pass this -the SDK handles it.
| Field | Example |
|---|---|
| Device Model | iPhone 15 Pro |
| OS Version | 18.2 |
| App Version | 1.2.0 |
| Build Number | 42 |
| Locale | en_US |
| Timezone | Europe/Zurich |
Pingkit is built with privacy as a core principle. Here's exactly what data flows through the system and how it's handled.
Feedback is automatically deleted after 6 months (180 days), including associated screenshots. This runs daily via an automated cleanup job.
The iOS SDK is fully open source with zero third-party dependencies. You can audit every line of code that ships inside your app at github.com/pingkitdev/pingkit-swift.
You can export all your data or delete your account entirely from the dashboard settings page. Account deletion removes all users, projects, feedback, sessions, and stored screenshots permanently.
Effective date: February 14, 2026. By using Pingkit, you agree to these terms.
Pingkit provides an in-app feedback SDK for iOS and a web dashboard for managing user feedback. The service includes feedback collection, screenshot storage, webhook notifications, and an MCP server for AI coding tools.
You must sign in with a GitHub account that has a verified email address. You are responsible for maintaining the security of your account and API keys. You must be at least 16 years old to use the service.
You agree not to:
Pingkit offers two plans: Indie ($5/mo, 1 project) and Pro ($9.99/mo, unlimited projects), billed through Stripe. You can cancel anytime from the dashboard settings page. Cancellation takes effect at the end of the current billing period. No refunds are issued for partial months. If payment fails, your account may be downgraded or suspended after a grace period.
Your use of Pingkit is also governed by our Privacy Policy, which describes what data we collect, how we store it, and your rights under GDPR. Feedback data is retained for 180 days (6 months) and then automatically deleted.
You retain full ownership of all feedback data submitted through your projects. Pingkit does not claim any rights to your content. The Pingkit platform, SDK, dashboard, API, and documentation are owned by Pingkit. The iOS SDK is licensed under the Apache 2.0 open source license.
We strive to keep Pingkit available and reliable, but we do not guarantee any specific uptime or SLA. The service runs on Cloudflare's global edge network. We may perform maintenance or updates that temporarily affect availability. We will make reasonable efforts to notify you of planned downtime in advance.
Pingkit is provided "as is" without warranties of any kind, express or implied. To the maximum extent permitted by law, Pingkit shall not be liable for any indirect, incidental, special, or consequential damages, including loss of data, revenue, or business opportunities. Our total liability is limited to the amount you paid for the service in the 12 months preceding the claim.
Either party may terminate the agreement at any time. You can delete your account from the dashboard settings page. Upon account deletion, all your data (projects, feedback, screenshots, sessions) is permanently and irreversibly removed. We may suspend or terminate accounts that violate these terms, with notice where practical.
We may update these terms from time to time. When we make material changes, we will notify you via the email address associated with your GitHub account. Continued use of the service after changes take effect constitutes acceptance of the updated terms.
For questions about these terms, contact us at hello@pingkit.dev.
PingKit.submit() in headless mode to send feedback from any custom view. The dashboard, webhooks, and all backend features work the same way regardless of which submission method you use.PingKit.submit() in headless mode from any UIKit view controller. Build your own UIKit form and call submit() with the text, image, and metadata. The backend works identically.PingKitOptions for development.