Your users already know

Smarter Feedback
Starts Here

Shake. Tap. Report. Ping the founder.
3+Platforms
One
Install
1Inbox
For every app
Meet the inbox

Web FABExpo shakeSwift shakeWears your designREST APIOne prompt · one inbox

The hole in indie shipping

They already know what’s broken.

App Store reviews are theatre. Twitter is a pile-on. Crash reports are stack traces, not “the paywall ate my receipt.” FeedbackFlow is a labeled control in the product — shake, tap, or POST — that lands on you, not a committee.

From iOS · Login2 minutes ago · shake
“Sign in overlaps the home indicator on Pro Max. I can’t tap Continue.”
BugPain 5/5maya@studio.dev
01

Paste one prompt

Cursor, Claude, or Codex detects Next.js, Expo, or Swift and installs the control. The public key is already in the prompt.

02

They shake or tap

Web: a FAB that inherits your type, radius, and accent — plus Ctrl/Cmd+Shift+F. Expo and iOS: the same sheet in your tint, plus shake-to-report.

03

You get pinged

One inbox across every surface. Optional email, Discord, or Slack. Reply like a founder, not a ticket queue.

Product

Prompt-led. Four surfaces. One founder inbox.

Not a voting board. Not crash reporting. A channel for “this is broken” and “I wish it did X,” from the app they already have open.

Web · Expo · iOS · API

Same report. Every stack you actually ship.

Web

Your FAB, not a foreign tab

One script tag. A bottom-right Feedback button on desktop and phone. It inherits the site’s font, radius, and accent. Keyboard: Ctrl/Cmd+Shift+F.

embed.js · .ff-fab · inherits --primaryInstall on the site →
Expo

Shake twice. Stay in Expo Go.

JS-only provider. Two acceleration peaks open the sheet. Optional haptics. One Settings row — no floating button on every screen. If expo-sensors is missing, Settings still works; do not add a FAB.

FeedbackProvider · shake + SettingsWrap the root →
iOS

First-responder shake. No swizzle.

SPM package. ShakeFeedbackHost for first-responder shake. Keep one FeedbackSettingsRow in Settings — not a floating chip.

ShakeFeedbackHost(enableShake: true)Add the package →
API

POST JSON. CORS open.

Anything that can HTTP can report. publicKey, type, message, platform, screen, version, optional screenshot. Rate-limited. Returns 201.

POST https://www.tryfeedflow.com/api/v1/feedbackSee the payload →

Highlighted

Looks like yours

The widget wears your product, not ours.

The install prompt tells Cursor, Claude, and Codex to copy your type, radius, and accent. The web FAB inherits CSS. Expo and iOS use shake + a Settings row — not a floating button on every screen. Colors.tint / Color.accentColor. Shake opens the same sheet.

Website

Storefront

Serif, terracotta, 8px corners — the launcher follows the page.

Expo

Mobile app

Shake to report. One Settings row — no floating chip on every screen.

iOS

Swift sheet

Shake + a Settings row in the app’s accent. Not a floating pill.

Inbox

One HQ. Web, Expo, and iOS sit in the same list.

Filter by type and platform. Open a report, walk prev/next, leave a note, ping yourself again. This is your desk, not a customer forum.

iOS

Login overlaps the home indicator on Pro Max

Shake · Bug
Expo

I wish offline drafts survived a kill

Settings · Idea
Web

Checkout total flashes $0 before tax loads

Ctrl+Shift+F · Bug

Install

Agents paste the prompt. Humans can still copy a snippet.

Sign up, name the app, copy the generated prompt. Agents read /llms.txt, /skill.txt, and /skill.md. The prompt highlights matching your type and accent. Fallback recipes below — the key always starts with ff_pk_.

Website

<script src="https://www.tryfeedflow.com/embed.js" data-project-key="ff_pk_…" async></script>

Expo

import { FeedbackProvider, FeedbackSettingsRow, themeFromHostColors } from "./sdk/expo/src"
<FeedbackProvider
  publicKey="ff_pk_…"
  apiUrl="https://www.tryfeedflow.com"
  enableShake
  theme={themeFromHostColors(Colors)}
>
  <App />
</FeedbackProvider>
// Settings list row — the only persistent tap door. Do not pass showFab.
<FeedbackSettingsRow />

Swift

FeedbackFlow.configure(publicKey: "ff_pk_…", apiUrl: "https://www.tryfeedflow.com")
// Shake + Settings row. Defaults: showFab false — do not pass showFab. Color.accentColor sheet.
ShakeFeedbackHost(enableShake: true) { … }

API

POST https://www.tryfeedflow.com/api/v1/feedback
Content-Type: application/json

{
  "publicKey": "ff_pk_…",
  "type": "bug",
  "message": "Login overlaps the home indicator",
  "platform": "web" | "expo" | "ios"
}

For indies

Pay first. Keep the line open.

Monthly

$19

Pilot of 25 inboxes. No tracked users. No seat tax. Unlimited reporters, 10 apps, 5,000 reports a month, email + webhook.

  • Web FAB + keyboard
  • Expo shake + Settings (Expo Go safe)
  • Swift shake + Settings (no UIWindow swizzle)
  • Public POST /api/v1/feedback
Get a prompt

Lifetime

$349

Same product, paid once — about 18 months of monthly. A license for the inbox as it exists, not an infinite enterprise roadmap.

  • Coming soon: MCP to Slack and Claude
  • Fair-use quota, not an AppSumo fire sale
  • Cancel monthly anytime — access through the period
Pay once

Coming soon

MCP to Slack and Claude. Humans approve features first.

Reports already email the project maker and can POST to Slack or Discord from a saved webhook. Next up is a FeedbackFlow MCP so Cursor or Claude can read inbox items and draft a fix. Bugs may be drafted later. New features and wishes stay in the inbox until a human approves them. No autonomous deploys.

Now

Maker email and founder ping. Slack or Discord JSON webhook. Inbox types already split bugs from wishes.

FAQ

Straight answers.

Does shake work in Expo Go?

Yes. The Expo SDK is JavaScript-only. It uses expo-sensors when present, checks isAvailableAsync, and still opens from the Settings row if sensors are missing. Do not add a global FAB.

How does iOS shake work without breaking my window?

ShakeDetector is a tiny first-responder view controller inside ShakeFeedbackHost. It does not swizzle UIWindow. Keep a FeedbackSettingsRow in Settings as a backup.

Can I send reports without a UI?

POST JSON to /api/v1/feedback with your public key. CORS allows browser apps. Rate limits apply per key + IP.

Where does the web button sit?

Bottom-right, labeled Feedback. Not a right-edge tab. It inherits the host font, radius, and accent (CSS --primary / data-accent). z-index stays above chrome so it remains tappable.

Does the widget look like FeedbackFlow or like my app?

Like your app. The install prompt highlights this: web inherits CSS, Expo takes your Colors.tint, Swift uses Color.accentColor. Navy is only the fallback when a host has no tokens.

Is forgot password a new page?

No. Forgot and reset stay in the same homepage dialog as sign in. /forgot and /reset only open that popup.

Why isn’t this free?

Free-forever trains people not to pay, then the bill jumps when the cap hits — Canny’s tracked-user meter is the famous version. FeedbackFlow is pay-first: $19/mo or $349 lifetime, no trial, unlimited reporters, no seat tax.

What does lifetime include?

The same inbox as monthly: 10 projects, 5,000 reports a month, web / Expo / Swift / API. It is a license for the current product plus that quota — not a promise of every future enterprise feature.

If I cancel monthly, do I lose the inbox today?

No. Access stays through the paid period. After that, the widget still loads but submit returns 402 until you pay again.

Smarter feedback starts here

Ship the control tonight. Read the reports in the morning.