For humans and agents

Install in one paste.

Prefer the generated prompt on a project page: it already carries your key. If you are an agent, read /llms.txt, /skill.txt, and /skill.md.

Start here.

One prompt. Four surfaces.

Shake. Tap. Report. One prompt installs a labeled Feedback control in Next.js, Expo, or Swift. User problems land in one inbox and can ping you by email or webhook.

  1. Sign up and pay

    The popup on the homepage, then monthly, yearly, or lifetime.

  2. Name the app

    You get a public key that is safe in client code.

  3. Copy the prompt

    The key is already inside. You should not paste keys by hand.

Pay first. Three ways in.

$19/month, $99/year (about $8/mo), or a $349 lifetime seat in a numbered run of 20. Unlimited reporters. Owner email on every report. If they left an email, they hear when you mark it fixed. Screenshot markup and console lines travel with the report.

Pick your surface.

Next.js or any website

One script. A bottom-right Feedback button that inherits the site’s font, radius, and accent, plus Ctrl/Cmd+Shift+F. Optional data-accent. The open sheet shows a small www.tryfeedflow.com credit only when the project setting is on. It is off by default.

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

Expo

Copy sdk/expo (same package as packages/expo). It is JS-only, so Expo Go keeps working. Wrap the root with FeedbackProvider and pass theme from your existing Colors.tint. Shake opens the sheet. Put FeedbackSettingsRow on Settings, not a floating chip.

Defaults: showFab: false, enableShake: true. First install and first launch after an update show “Shake your device to send a report to the founder.” once. If expo-sensors is missing, the Settings row still works; do not fall back to a global FAB.

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 tap door
<FeedbackSettingsRow />

Swift

Add the local package in sdk/swift (or packages/swift). Call FeedbackFlow.configure, wrap the root in ShakeFeedbackHost (first-responder shake, no swizzle, showFab: false), and put FeedbackSettingsRow on Settings. First install and post-update tip: “Shake your device to send a report to the founder.” The sheet uses Color.accentColor.

FeedbackFlow.configure(publicKey: "ff_pk_…", apiUrl: "https://www.tryfeedflow.com")

ShakeFeedbackHost(screen: "Home", enableShake: true) {
    ContentView()
}

// Settings list row
FeedbackSettingsRow()

Match the host design

Required. The launcher is not a FeedbackFlow-branded overlay. Web inherits CSS variables and font-family. Expo takes a theme object from your tokens (use themeFromHostColors(Colors)). Swift uses Color.accentColor. The generated prompt spells this out so agents do not hardcode FeedbackFlow’s colors.

For agents.

Crawl this product

AI agents can fetch /llms.txt or request Accept: text/markdown on / and /docs. They get a clean Markdown brief, not an HTML dump.

Markdown on request

Requests with Accept: text/markdown get Markdown instead of HTML.

Crawlers welcome

robots.txt allows GPTBot, ClaudeBot, Google-Extended, and other AI crawlers, and points them at /llms.txt and /skill.txt.

API

The sheet uses the thread endpoint. A one-shot report can still POST to /api/v1/feedback. Metadata is a JSON object the app passes in, for example { "userId": "user_123", "plan": "pro" }.

POST https://www.tryfeedflow.com/api/v1/conversations
Content-Type: application/json
X-Thread-Token: stored on the device after the first reply

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

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

{
  "publicKey": "ff_pk_…",
  "type": "bug" | "feature" | "general",
  "message": "Login overlaps the home indicator",
  "platform": "web" | "expo" | "ios",
  "reporterEmail": "optional@user.dev",
  "screen": "Login",
  "appVersion": "1.4.2",
  "screenshotBase64": "data:image/png;base64,…"
}

Account and host.

Forgot password

Forgot password opens the homepage dialog. We email a one-hour link that opens /?auth=reset. In local development, if email isn’t sending, the dialog can show a one-time link for that request. Everywhere else, reset is email-only.

Host

The public URL, install prompts, emails, and Stripe return URLs use www.tryfeedflow.com (https://www.tryfeedflow.com). The apex redirects there.