I'm a junior SRE during the day. For the last few months I've spent nights and weekends building ResumeSnap, a tool that takes your experience plus a job posting and writes a resume tuned to that role in about a minute. Six people have paid for it so far. That's real money from strangers who found it on their own, and the build taught me more than any course did.
Here is how it works and where it bit me.
The stack
Next.js 16 with the App Router, TypeScript, Tailwind v4. Claude Haiku does the generation because it's cheap and fast and the output is good enough for structured resume content. Stripe Checkout handles payments. Vercel hosts it on the hobby plan. Upstash Redis stores the results.
The whole thing costs me a dollar or two a month plus API usage, and the API usage only goes up when someone pays.
Why I charge once instead of monthly
Every other tool in this space runs a subscription. Usually a cheap trial that quietly renews into something that stings. People hate it, and they say so loudly on Reddit. So I charge once and never bill you again. On paper that's worse for revenue. In practice it's the only thing an unknown brand can offer that the big players won't: you don't have to worry about getting trapped. I'd make the same call again.
The part that actually broke: the free preview
The AI was the easy bit. The hard part was deciding what a free user sees. Give away too much and nobody pays. Give too little and it feels like a con. I settled on a preview that shows the real structure and a chunk of the content, with the contact details and the back half blurred. The generation is the same quality whether you pay or not, so you can see it's good before you decide.
The bug that ate a weekend: my result store lived in memory. On Vercel's serverless functions, the request that unlocked a paid resume often hit a different instance than the one that generated it, so the result was just gone. Moving it to Redis with a one hour expiry fixed it, and I felt pretty dumb for not seeing it sooner.
Payments without a user table
I didn't want accounts. No passwords, no personal data sitting in a database I'd have to keep safe. So payment state is a signed token the server issues after Stripe confirms the charge. The browser holds it and sends it with each request, and the server checks the signature. For one person maintaining this, that decision removed a whole pile of problems.
SEO is slower than anyone tells you
I generated around 5,600 pages: resume examples by job title, by skill, by city. Real content, not junk, but Google takes months to trust a new domain. Three months in I'm sitting at roughly 40,000 impressions and a painful 0.2% click rate. The lesson I keep relearning is that good content alone does nothing if no other site links to you. You stay buried. That's part of why I wrote this.
What's next
Cleaner onboarding, and a traffic channel that isn't "wait for Google to notice me." If you've taken a side project past its first few sales, I'd actually like to know what worked for you, because I'm still figuring that part out.
If you're job hunting and want to try it, it's at resumesnap.io. Free preview, no card needed.
Top comments (0)