Forking CoverLetterGPT: What I Learned Rebuilding an AI SaaS from an Open-Source Starter

Leader posted 3 min read

One of the better ways to learn a stack is to take a working app and rebuild it your way. I forked CoverLetterGPT — an open-source AI cover letter generator originally built by Vince Loewe as a flagship example app for the Wasp framework — and used it as a launchpad to learn full-stack AI app development. This post is about what I changed, what surprised me, and what I'd do differently.
Credit where it's due: original project at https://coverlettergpt.xyz, source at github.com/vincanger/coverlettergpt. Everything below is about my fork and what I learned from the exercise.
Why fork instead of building from scratch?
Greenfield projects teach you architecture decisions. Forks teach you about integration. CoverLetterGPT has:

OpenAI integration for the actual letter generation
Stripe for paid tiers
Google OAuth for sign-in
Prisma + Postgres for persistence
React + Chakra UI on the frontend
Wasp wiring all of it together

Forking gave me a working baseline for every one of those pieces. The learning came from changing one thing and watching what broke.
What Wasp actually does (and why it surprised me)
Wasp is a config-as-code framework for full-stack apps. You declare your entities, routes, auth methods, and jobs in a .wasp file, and the framework generates the boilerplate around your React + Node code. Coming from Next.js, it felt strange — until I realized how much code it removed.
A rough comparison:
ConcernNext.jsWaspAuthWire up NextAuth/Auth.js, configure providers, write callbacksDeclare auth: { ... googleAuth } in the wasp fileDB queriesWrite Prisma queries + tRPC/route handlersDeclare a query or action, write the functionBackground jobsWire up BullMQ / InngestDeclare a job, write the functionEmailNodemailer + your own abstractionemailSender: { provider: SendGrid }
It's not magic — it's just opinionated code generation. But it makes the integration work fast, which is exactly what you want when you're learning.
What I changed in my fork
Things I actually built on top of the original:

Prompt rework. The original prompt is good but generic. I rebuilt the prompt to extract structured fields from the job posting (role, seniority, top 3 required skills, tone hints) before generating the letter, so the output references specifics instead of platitudes.
Streaming responses. The original waits for the full completion. I added server-sent events so the letter streams token-by-token. Better UX, and it taught me how to plumb a stream through Wasp's API actions.
Versioning. Each generation saves as a versioned draft, so users can compare "tone: confident" vs "tone: humble" side by side instead of regenerating blindly.
Cost guardrails. Per-user daily token cap, falling back to a cheaper model after the cap. Critical if you ever plan to actually expose an OpenAI app to the internet.
Auth providers. Added GitHub OAuth alongside Google — useful for the developer-leaning audience I had in mind.

Things that broke (and what they taught me)

Stripe webhooks in local dev — I'd never wired Stripe end-to-end before. stripe listen --forward-to and idempotent webhook handlers are the lessons.
Prisma migrations on a forked schema — changing the schema after the upstream had already migrated meant I had to be careful with migration history. Lesson: branch the migration history early.
OpenAI rate limits under streaming — streaming responses count differently against limits; I had to add backoff that handles partial completions.
Wasp's escape hatches — Wasp is opinionated, but there are places (custom middleware, raw routes) where you drop into Express. Knowing when to fight the framework vs use the escape hatch is the actual skill.

Would I use Wasp for a production project?
Honestly, for a small-to-medium SaaS with standard requirements (auth, DB, payments, jobs, email) — yes. The boilerplate it removes is exactly the boilerplate I find tedious in Next.js + tRPC + NextAuth + BullMQ + Resend stacks. For anything with unusual architecture (heavy real-time, custom infra, microservices) — probably not.
The honest answer is: forking CoverLetterGPT taught me Wasp faster than any tutorial would have, because I had skin in the game. If you're looking for a way to learn a new stack, find a working open-source app in it and break things.

https://coverlettergpt.xyz

Happy to answer questions about the fork, the framework, or any of the integrations in the comments.

More Posts

What Is an Availability Zone Explained Simply

Ijay - Feb 12

What I Learned Building a Multi-Agent AI System (That No Tutorial Warned Me About)

ag_wizai - May 10

I Built an Open-Source QR Label Designer That Exports to ZPL, PDF & PNG - Here's What I Learned

Shashidhar Naik - Feb 3

How I Built a React Portfolio in 7 Days That Landed ₹1.2L in Freelance Work

Dharanidharan - Feb 9

I Monitor 78 AI Channels So You Don't Have To. Here's What Actually Matters.

dimanegodiuk - Mar 17
chevron_left

Related Jobs

View all jobs →

Commenters (This Week)

1 comment
1 comment
1 comment

Contribute meaningful comments to climb the leaderboard and earn badges!