Open source · MIT · Self-hostable

Hear what your users think, right inside your app

retro adds a feedback button to any app: bug reports, praise or complaints, feature requests — screenshot included. Everything lands in one inbox per project, becomes a public roadmap people can vote on, and ships as a changelog.

Early access: every account gets full access, free. Plans come later, with notice.

Three ways to collect feedback

Pick the one that fits each app. They all land in the same inbox.

Drop-in widget

One script tag, or a <retro-widget> element in any framework. Users pick bug / feedback / idea, write, attach a screenshot and send. Follows your theme and language.

<script src="https://retro.3m4.net/widget.js"
        data-project-key="retro_pub_…" defer></script>

Ingest API

A single POST with the project's public key, from curl, fetch, a plain HTML form or your backend. Perfect for games, CLIs and apps without a DOM.

curl -X POST https://retro.3m4.net/api/ingest/feedback \
  -H "X-Project-Key: retro_pub_…" \
  -H "Content-Type: application/json" \
  -d '{"type": "bug", "message": "Export does nothing on Safari"}'

Public board

Every project can publish a board: roadmap columns with votes, a changelog, and a form to submit ideas. Link it from your app or your footer.

https://retro.3m4.net/b/my-app

How it works

1. Create a project

One project per app. You get a public key for the widget and the API, and a board slug.

2. Add the widget or the API call

Paste the snippet from the project settings. Feedback starts arriving in the inbox immediately.

3. Triage and close the loop

Set status, priority and tags, add notes, promote requests to the roadmap and announce them in the changelog.

From inbox to roadmap to changelog

Feedback is only useful if something happens with it. retro keeps the whole loop in one place.

  • Inbox. Filter by type, status, sentiment, priority or tag. Open an item to see the screenshot, the page, the version and the user's notes.
  • Roadmap. Promote a request to a planned / in progress / done item in one click. Users vote on the public board; linked feedback follows the status.
  • Changelog. Write release notes in Markdown, keep drafts, publish when it ships.
Inbox3 new
  • #42Export button does nothing on SafariNew
  • #41Dark mode for the editorPlanned
  • #40Love the new kinegram preview!Done

An ingest API you can call from anywhere

The project's public key is not a secret — it ships inside your app. Abuse is contained by rate limits, size caps and a honeypot field, and you can rotate the key at any time. CORS is open, so a plain fetch from the browser works.

Public keys can only submit feedback. They can never read or change anything.

Read the docs
Request
curl -X POST https://retro.3m4.net/api/ingest/feedback \
  -H "X-Project-Key: retro_pub_…" \
  -H "Content-Type: application/json" \
  -d '{"type": "bug", "message": "Export does nothing on Safari"}'
Response
{ "id": "…", "number": 42, "status": "new",
  "board_url": "https://retro.3m4.net/b/my-app" }
Model Context Protocol

Let your AI agent triage the inbox

retro ships an MCP server. Connect it to Claude Code, Claude Desktop, Cursor or any MCP host and ask things like “summarise this week's feedback for kinegram and tag the duplicates” or “promote the three most requested ideas to the roadmap”

  • Role-scoped keys. A viewer key never even sees the delete tool; editor and admin unlock more. Enforced by the API too.
  • Human in the loop. Destructive actions ask you to confirm before anything happens.
  • Audit trail. Every change and every refused call is logged, server-side and agent-side.
  • Local or remote. Run it over stdio with npx retro-feedback-mcp (npm) or point your host at https://retro.3m4.net/mcp with your key.
Claude Code · local (npm)
claude mcp add retro --scope user --env RETRO_API_KEY=retro_live_… -- npx -y retro-feedback-mcp
Claude Code · remote (nothing to install)
claude mcp add --transport http retro https://retro.3m4.net/mcp --header "Authorization: Bearer retro_live_…"
Any MCP host (JSON)
{
  "mcpServers": {
    "retro": {
      "command": "npx",
      "args": ["-y", "retro-feedback-mcp"],
      "env": { "RETRO_API_KEY": "retro_live_…" }
    }
  }
}

Create a key with the role you want under Dashboard → API keys.

Start listening today

Create a project, paste one script tag and receive your first feedback in under five minutes.

Early access. Every account has full access at no cost right now. Plans and limits will be introduced later, with notice before anything changes.

Self-host it (MIT, open source)

The entire stack — Flask API, widget, MCP server and this Qwik app — is MIT-licensed. Run it on your own VPS with onedocker compose up. No billing code, no limits beyond what you configure.

View on GitHub