In-App Feedback for iOS in Two Lines of Swift

Most feedback never reaches you. App Store reviews are biased, support emails get lost, and in-app surveys have low response rates. Here is a better way.

The problem

For every user who writes a 1-star review, dozens silently delete your app. The users who care enough to give feedback rarely have a good way to do it.

Here is what most indie devs rely on today:

  • App Store reviews - biased toward extremes. You hear from the delighted and the furious, never the majority in between. And Apple's review system gives you one reply, no conversation.
  • Support email - friction kills response rates. Users have to leave your app, open Mail, compose a message, describe the problem with no context. Less than 1% bother.
  • Google Forms / Typeform - same problem, different wrapper. A web link in your app settings that nobody clicks.
  • Enterprise SDKs - Instabug, UserVoice, and similar tools are built for teams of 50+. Per-MAU pricing means your bill grows before your revenue does.

The feedback you actually need - "this button doesn't work on my iPhone 13" or "I expected X but got Y" - never arrives.

What PingKit is

PingKit is a lightweight, privacy-first in-app 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 to integrate:

That's it
import PingKit PingKit.configure(apiKey: "pk_your_key") PingKit.show()

How it works

The flow is simple:

  1. Your user taps a "Send Feedback" button (you place it wherever makes sense)
  2. A native SwiftUI sheet appears with a text field and optional screenshot attachment
  3. The SDK sends the feedback to the PingKit API (Cloudflare Workers at the edge)
  4. You see it instantly in the dashboard, get a webhook notification, and triage it

The SDK ships with zero third-party dependencies. It is fully open source, so you can audit every line that ships inside your app.

Key features

Native SwiftUI modal with theming

The feedback modal matches your app's look. Set accent color, background, corner radius, and font via a simple theme struct:

Theming
PingKit.configure( apiKey: "pk_your_key", theme: PingKitTheme( accentColor: .blue, backgroundColor: .systemBackground, cardColor: .secondarySystemBackground, cornerRadius: 16 ) )

Screenshot attachment

Users can attach a screenshot from their photo library. Screenshots are always user-initiated (no auto-capture). All EXIF metadata is stripped before storage for privacy. Images are stored privately and served via time-limited signed URLs.

MCP integration for AI coding tools

PingKit ships an MCP server so Claude Code, Cursor, Codex, Windsurf, and any MCP-compatible tool can read, search, and triage your feedback without leaving the editor. Ask your AI assistant things like "What are users saying about v2.3?" or "Mark all dark mode feedback as resolved."

Headless mode for custom UI

Don't want the built-in modal? Call PingKit.submit() directly from any view, including UIKit:

Headless mode
let result = try await PingKit.submit( text: "The save button doesn't work", image: screenshotData, metadata: ["screen": "editor"] )

Privacy by default

  • Open source SDK with zero dependencies
  • No analytics, no tracking, no background data collection
  • No network calls until the user taps Send
  • EXIF metadata stripped from all screenshots
  • API keys stored as SHA-256 hashes
  • Data auto-deleted after 6 months

Pricing

$9.99/mo flat. Unlimited projects, unlimited feedback, unlimited team members. No per-MAU pricing, no usage tiers, no surprise bills. Cancel anytime from the dashboard.

That is less than one cup of coffee per week. Your users' feedback is worth more than that.

Get started

Read the full documentation for integration details, or jump straight to the code:

Ready to add feedback to your app?

Two lines of Swift. Dashboard and alerts from day one. $9.99/mo flat.

Get Started