Engineering blog

Notes from the build

We write when we ship something interesting. Deep dives on the pipeline, the infra, and the decisions behind turning user feedback into merged code.

Deduping user feedback with pgvector and Vercel AI Gateway
April 21, 20267 min read

Deduping user feedback with pgvector and Vercel AI Gateway

How we kill '500 error' spam on the public roadmap: cosine similarity on OpenAI embeddings, HNSW indexes on Neon, auto-link above 0.92, and a dashboard review queue for the gray zone.

By FeedbackIQ team

SEO without bloat: llms.txt, nano-banana OG images, a sitemap that knows about blog posts
April 18, 20266 min read

SEO without bloat: llms.txt, nano-banana OG images, a sitemap that knows about blog posts

robots.ts, sitemap.ts, a programmatic llms.txt route, one buildMetadata helper, and Gemini 2.5 Flash Image generating unique OG cards for every marketing page.

By FeedbackIQ team

URL-synced filters for a PR list that actually scales
April 12, 20265 min read

URL-synced filters for a PR list that actually scales

searchParams as source of truth, 200ms-debounced URL writes, server-side Prisma filtering, a clear button that doesn't flash, and why client-side filtering fell over at 400 PRs.

By FeedbackIQ team

A liquid-glass UI pass: snake borders, noise, conic gradients
April 5, 20266 min read

A liquid-glass UI pass: snake borders, noise, conic gradients

Rotating conic-gradient borders with @property, backdrop-filter glow cards, SVG feTurbulence noise, and the things we deliberately didn't do. The CSS behind why the dashboard feels different.

By FeedbackIQ team

Closing the loop: merged PRs → changelog → upvoter emails → RSS
March 30, 20266 min read

Closing the loop: merged PRs → changelog → upvoter emails → RSS

GitHub webhook verification, LLM-written changelog drafts a human reviews, Resend for fan-out, and a first-class Atom feed because RSS is deeply uncool and still works.

By FeedbackIQ team

Upvote routing: when duplicates exist, the parent wins
March 20, 20265 min read

Upvote routing: when duplicates exist, the parent wins

Toggle semantics, duplicate-aware target ID, optimistic updates, localStorage-backed voter state, and the tiny invariant that keeps the public roadmap sane.

By FeedbackIQ team

Letting Claude open real pull requests from your feedback inbox
March 10, 20267 min read

Letting Claude open real pull requests from your feedback inbox

GitHub App installation, short-lived per-repo tokens, an agent loop that typechecks before committing, branch reuse with force-push, and auto-mode vs review-only semantics.

By FeedbackIQ team

Auto-tagging feedback: category, priority, tags — none typed by the user
February 26, 20266 min read

Auto-tagging feedback: category, priority, tags — none typed by the user

Structured outputs with Zod schemas, Claude Haiku on Vercel AI Gateway, project-aware tag hints, and a hand-written priority rubric that keeps the model from either under- or overreacting.

By FeedbackIQ team

Auto-detecting a site's theme so the widget doesn't look pasted-in
February 14, 20265 min read

Auto-detecting a site's theme so the widget doesn't look pasted-in

Reading CSS custom properties, sampling existing buttons, deriving panel chrome from background luminance. How the widget paints itself to match whichever site it's embedded on.

By FeedbackIQ team

A one-line embed: rebuilding the feedback widget in vanilla JS
February 2, 20266 min read

A one-line embed: rebuilding the feedback widget in vanilla JS

Shadow DOM, 7KB gzipped, lazy-loaded screenshot capture, offline queue, and zero framework runtime. The smallest piece of code and the most scrutinized-at-3am piece of code.

By FeedbackIQ team

Picking the stack for a solo-founder SaaS that needs to scale
January 20, 20266 min read

Picking the stack for a solo-founder SaaS that needs to scale

Next.js 16 with Turbopack, Prisma on Neon, Clerk, Vercel AI Gateway, Resend. Why each, and what I deliberately did not pick.

By FeedbackIQ team

How a LinkedIn post at midnight became a SaaS
January 8, 20265 min read

How a LinkedIn post at midnight became a SaaS

A short demo video showed a feedback form spinning up a GitHub PR in real time. The commenters called it a toy. They were wrong, and here's why that 30-second clip became FeedbackIQ.

By FeedbackIQ team