Inspiration
Most feedback tools are built for marketing teams collecting testimonials — five-star reviews, curated quotes, things that make a product look good. I wanted the opposite: a place where founders could find out what users actually think, including the parts that sting. Blunt is the whole pitch in one word — anonymous, no accounts, no friction, and no incentive for anyone to be nice about it.
What it does
Blunt gives any founder a public feedback page in under a minute. Share the link, or drop one script tag into your site, and users can leave honest text or voice feedback with zero sign-up. Behind that simple surface: a live dashboard with real-time updates via Supabase Realtime, an AI-generated one-line digest of recent sentiment, AI-clustered feedback themes, and a public Wall of Love for the feedback worth showing off. The embeddable SDK widget means founders don't have to send people away from their own product to collect feedback — it floats right on top, on any site, not just mine.
How I built it
TanStack Start was my original framework choice, paired with Supabase for auth/data/realtime and GroqAI for the AI digest and theme clustering. Partway through, I migrated the routing layer to React Router after running into deploy-target friction on Vercel — a call made under time pressure that turned out to simplify the SDK's resource-route handling considerably.
The embeddable widget itself (/api/sdk.js) is hand-rolled vanilla JS with zero dependencies, generated server-side from a template so it can inject the right API URL per-deployment, and renders via direct DOM manipulation rather than a framework, keeping it small enough to embed on any third-party site without weighing it down.
Novus is the part of this build I'm most genuinely excited about. I didn't bolt it on for the eligibility checkbox — I used it the way I'd use Google Analytics, except built for actual product behavior instead of pageviews. Every widget load, every text and voice submission, every dashboard visit is a tracked event. That gave me something I didn't have building solo: a second pair of eyes on my own product. I was building, breaking, and fixing things fast, alone, under a deadline — Novus was the thing that told me, objectively, whether a fix actually worked in the real world, not just whether the code compiled on my screen.
Challenges I ran into
Most of my challenges were in the last mile between "looks done" and "actually works for a stranger." I hit a Git merge conflict in my Pendo/Novus tracking code that, if merged blindly, would have silently mislabeled every live submission as a test — exactly the kind of bug that quietly corrupts your own analytics without ever throwing a visible error. Catching it mattered because Novus data is only as honest as the events feeding it.
I deployed the SDK against a v0 preview URL before realizing it was authentication-gated — a real visitor would've hit an "Unauthorized" page instead of my widget. Once on the real domain, the root route 404 from a TanStack Start/Vercel adapter mismatch, which I resolved by migrating to React Router. After that, /sdk.js itself returned HTML instead of JavaScript because it wasn't registered as a true resource route.
Each bug was small on its own. Working alone, with no second engineer to catch what I missed, Novus became my second pair of eyes — every time I shipped a fix, I could watch real events come in and know, not guess, whether it actually worked.
Accomplishments that I'm proud of
Getting the embeddable widget to actually survive contact with a real third-party site — not just my own dashboard — felt like the real "shipped" moment. It handles being placed in <head> or <body>, works across origins via CORS, and degrades gracefully if it's misconfigured.
I'm especially proud of how Novus closes the loop on whether Blunt is real. It's not enough to say it's live — Novus lets me show it's live, with actual tracked behavior from actual sessions: widget installs, submission events, engagement on a totally separate site, my own portfolio, proving the SDK genuinely works outside my own controlled environment. As a solo builder with no team to sanity-check my work, that visibility wasn't a nice-to-have. It was the only honest feedback loop I had.
What I learned
The riskiest part of an AI-assisted build isn't the AI-generated code being wrong — it's that wrong code can look completely plausible until it meets a real, unauthenticated, cross-origin request. Every bug I hit passed a casual glance. None of them would have surfaced without testing from outside my own logged-in session, and without Novus giving me a behavioral source of truth to check my assumptions against. Building alone, "works for me" and "works for a stranger" are different bars — Novus was what actually let me tell which one I'd cleared, instead of just hoping.
What's next for Blunt
Publishing an actual npm install blunt-sdk package, wiring voice feedback through to real audio storage and transcription, building out webhook notifications so founders get pinged the moment unfiltered feedback comes in — and leaning further into Novus's behavioral data to see which parts of the feedback flow founders actually engage with most, since that's exactly the kind of signal Blunt itself exists to give other people.
Built With
- javascript
- novusai
- react
- typescript
- vite

Log in or sign up for Devpost to join the conversation.