← All work

ghostinterview.dev · LIVE

Ghost

Built for my mom's interview. Then for everyone else's.

An AI interview coach. Type the question you were just asked and get an answer back in under three seconds, in your own voice, built from your resume and your context.

Launched

Jul 2026 · HN + Product Hunt

PH day one

108 visitors · 170 views

SEO pages

20 → 68 in 48 hours

Revenue

$0 · no paying users

Ghost's prep sheet showing generated answers to common interview questions, built from an uploaded resume.
The prep sheet, generating answers from a resume before the interview.

The only reason nobody got hurt is that I have zero paying customers. That is luck, not engineering.

01

Why it exists

My mom had an interview. She is a PhD cancer biologist and a Fulbright alumna, and she still wanted to prepare properly, so I built her something that would sit beside her and help. Then I realised the thing I'd made for one person worked for anyone, and put it online.

02

The ghost is nine thousand particles

The landing page runs a WebGL particle ghost written from scratch — no library, no helper, nine thousand points that scatter away from the cursor and dissolve as you scroll. I wrote it because I wanted to know whether I could, and the honest answer for a while was no.

03

The honesty audit

In July I found my own marketing said five free sessions a day in twelve separate places. The app had been hardcoded to three since the twelfth. Nobody had complained, because nobody had noticed. I rewrote all twelve rather than quietly change the number in the code, and in the same pass I deleted a free-trial button that led nowhere and refused to write a testimonial from a user who didn't exist. Shipping fast is not the same as shipping dishonest.

04

I found a hole in my own payments

One endpoint took an email address straight off the URL and returned that person's Stripe customer ID with no authentication at all. A second endpoint would take that ID and mint a live billing-portal link. Chained together, anyone who knew a customer's email could read their card's last four digits, their billing address and every invoice, and cancel their subscription. I confirmed it against production with curl before touching anything, then fixed it by verifying the session token server-side on every route, and re-ran all four attacks until each one came back 401. The only reason nobody got hurt is that I have zero paying customers. That is luck, not engineering.

The chain, against production
GET /api/find-customer?email=…200

no auth header sent

GET /api/create-portal (that id)200

live billing portal

What that opened

  • Card, last four digits
  • Billing address
  • Every invoice
  • Cancel the subscription

After

Session token verified server-side, on every route. All four attacks re-run.

GET /api/find-customer401
GET /api/create-portal401
Ghost's mobile landing page with the particle ghost and the line: walk in unshakeable.
The nine-thousand-particle ghost, running on a phone.

Built with

  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind 4
  • GSAP
  • Stripe
  • pdf.js

Next

HookForge

51 KB · 0 DEPENDENCIES · GROQ