M Mindie
Launch postmortem · 2026-05-17

I shipped a Canny alternative and the demo was broken for 12 hours.

By the Mindie team · 6 min read · discuss on HN

Yesterday I shipped InboxKit — a $9/mo Canny alternative for indie founders. Cold-emailed 25 leads from HN comments matching "feature request management" and "upvoty alternative." Felt the dopamine.

This morning I noticed something. The 8-line embed code I was telling people to paste? It pointed to inboxkit.eventium.com/widget.js. That domain doesn't exist. I never set it up.

The widget script itself was being served from inbox.mindie.dev/widget.js (correct). It just defaulted, when no data-api attribute was provided, to a hardcoded inboxkit.eventium.com API endpoint that also didn't exist. So anyone who copied the snippet from the landing page got:

To anyone in the 25 cold-emailed leads who actually tried the demo: I'm sorry. Your test feedback went nowhere. The widget looked alive but was effectively a dead end.

How it happened

Earlier this year, I had a different brand in mind for this product: Eventium. The plan was a 5-product umbrella (Eventium-D for kids' parties, Eventium-A for weddings, etc.) with InboxKit slotted as a future API monitor. I scaffolded the widget under inboxkit.eventium.com.

Then I pivoted. The "Eventium" umbrella was killed by a deeper market research pass (long story, but TLDR: kids' party planning niche is owned by Mom-blogger SEO, weddings is The Knot/Zola, neither was beatable solo). I moved everything to mindie.dev, set up the new domain in Cloudflare, deployed via Dokploy, ran pnpm build, and shipped.

What I didn't do: grep -r eventium across the codebase. The hardcoded URL was a default fallback in apps/widget/src/widget.ts line 4, and a literal string in the demo code snippet on the landing page. The build picked up both, dutifully.

What the bug looked like in code

// apps/widget/src/widget.ts (before)
const apiBase = script?.dataset.api || "https://inboxkit.eventium.com";

// apps/web/src/app/page.tsx (before)
<pre>{`<script
  src="https://inboxkit.eventium.com/widget.js"
  data-board="YOUR_BOARD_ID"
  async></script>`}</pre>

Both should have been inbox.mindie.dev. The widget JS bundle is built once and copied into apps/web/public/widget.js. So even though I'd rebuilt widget after moving the brand, the rebuilt file still had the broken default because the source file still had the broken default. Lesson 1.

The fix

Three lines of code, one rebuild, one Dokploy redeploy. Total: 22 minutes.

// apps/widget/src/widget.ts (after)
const apiBase = script?.dataset.api || "https://inbox.mindie.dev";

// apps/web/src/app/page.tsx (after)
src="https://inbox.mindie.dev/widget.js"

I also re-uploaded the production tarball, updated the CODE_TGZ_URL in Dokploy's compose env, and forced a clean container restart (compose.stop + compose.start via Dokploy API). The compose's init container had FORCE_REINIT=true already, so the old .installed flag was cleared and fresh source pulled.

What I'd do differently

  1. Test the demo code from the live landing page as a real user would. Curl the widget.js URL, paste it into a fresh HTML page, click "Send Feedback," watch the network tab. I never did this between the rebrand and the cold-email batch. Would have caught the bug in 60 seconds.
  2. Grep aggressively when you rebrand. git grep -i 'old-brand-name' across the whole repo. Don't trust that the build will catch it — built artifacts contain string literals.
  3. Send 5 emails before 25. If 5/5 say "your demo doesn't work," you'd have caught it in 30 minutes instead of 12 hours.
  4. Add a smoke test for the demo embed. CI step that loads the landing page, extracts the script tag, evaluates it in a headless browser, clicks the button, POSTs a feedback, and asserts the API returned 200. Two hours to write, prevents 12 hours of broken demos forever.

What InboxKit actually is, now that it works

Same job as Canny — collect feedback, show roadmap. Different price: $9/mo Pro vs Canny's $79. Different positioning: built for the solo founder doing $30 MRR who can't justify $79.

What's in v1:

Free tier covers 1 board + 50 feedback/mo. Pro is $9. Comparison vs 8 other Canny alternatives here if you want the full landscape.

Early-user offer

I'm onboarding 5 early users today. $3/mo for 2 months total with code EARLY10 (pre-applied on the link below). I'll personally install the widget on your site over a 15-min Loom or Zoom — pick whichever.

Claim a spot — $3/mo for 2 months →

What about the rest of the umbrella?

InboxKit is the headline. We also ship four siblings under the same account:

All five live under Mindie — a small umbrella for indie SaaS tools, with one login across the suite.

If you're in the 25 cold-emailed

If you got my email this morning and tried the demo before noon UTC: it works now. Try again. Sorry for the dead-end.

If you didn't get the email but the product looks useful: the early-user link above is the same offer.