FeedbackRun
Product-feedback & roadmap SaaS — for humans and AI agents. Voting portal, embeddable widget, AI triage, and revenue-weighted prioritization.
The problem
Every product team drowns in feedback scattered across tickets, sales calls, and Slack — and none of it answers the only question that matters: what should we build next, and what is it worth? Existing tools (Canny, Featurebase) treat every vote as equal and stop at a list. FeedbackRun set out to be the source of truth for what to build next: collect feedback everywhere, prioritize it by real revenue impact, let AI do the triage, and — a category first — let AI agents operate the whole thing over a standard protocol.
What I built
A TypeScript monorepo with four apps and four shared packages: a Next.js 16 web app serving three experiences (marketing, public portal, dashboard) via route groups; a GraphQL-first Fastify API; a Preact embeddable widget (Shadow DOM, one script tag); a BullMQ worker fleet; plus shared DB, Zod schemas, email templates, and a dedicated MCP package.
Engineering highlights
GraphQL-first with directive-enforced multi-tenancy
Access control is declarative at the schema level via custom directives (@auth, @superAdmin, @requireFeature, @rateLimit). Every multi-tenant query filters on workspaceId and resolvers re-verify ownership; GraphQL Armor caps query depth/cost so the public API can't DoS the DB.
Embeddable widget with a hard size budget
One <script> tag, rendered inside a Shadow DOM so it never inherits host styles. Built in Preact, bundled as an IIFE, with its ~26 KB gzipped size enforced as a CI gate — over budget fails the build.
AI triage on pgvector
Incoming feedback is embedded and stored in pgvector for semantic duplicate detection, plus sentiment, priority scoring, drafted replies, and weekly summaries — all run as background jobs so the request path stays fast.
Agent-native via MCP
A Model Context Protocol server exposes the product to AI assistants (Claude Desktop, Cursor, Windsurf) as a first-class operator, alongside a public REST API and a natural-language query endpoint.
Stripe billing that survives the real world
Idempotent signed webhooks, plans stored as data (not enums), proration, and failed-payment grace periods with cascade-pruning of out-of-plan resources.
Results
- ✓A live, production SaaS: marketing site, multi-tenant portal, dashboard, widget, and worker.
- ✓Genuinely agent-native (MCP + REST) — ahead of the category, not a bolt-on.
- ✓~117 unit/integration cases (Vitest + testcontainers) and Playwright e2e running in CI on every PR, alongside CodeQL and size-budget checks.
- ✓Operable on a single VPS via Docker Compose, with full observability and proven-restorable backups.
Full tech stack
Built at Nextbit — the source lives in a private repository, so it isn't publicly available. A live screen-share demo and code walkthrough are available on request for hiring managers.