Product with Attitude

Product with Attitude

Premium Resources

Valentine's App 2026 - Full Source Code

Full source code for a full-stack scratch card game: React + TypeScript frontend, Express + PostgreSQL backend, animated with Framer Motion

Karo (Product with Attitude)'s avatar
Karo (Product with Attitude)
Feb 13, 2026
∙ Paid
TL;DR: I shipped a working Valentine’s Day scratch-and-win app in 33 minutes using Replit. React, Drizzle, shadcn, Postgres. One scratch per email per day, persistent progress, fully customizable. Full source code below — fork it, swap the hearts for whatever you want, run it for your own newsletter.

Read this article first. This code is the companion resource.

I shared the Valentine’s Day scratch card app. The DMs were unanimous: give us the code.

So here it is. The whole thing. Tweak it, ship it, run it for your own list.

Section divider

The Stack

Nothing exotic. Every piece is something a vibe coder can paste into Replit, Lovable, or Cursor and get a working build on the first try.

Tech stack table for the Valentine's scratch card app listing React and TypeScript frontend, Tailwind styling, Framer Motion animations, shadcn/ui components, Node.js Express backend, and PostgreSQL with Drizzle ORM.
Section divider

Three Things Worth Stealing

One scratch per day, per participant.

This is enforced where it matters: in the database.

There’s a unique constraint on (participant_id, date), which means the backend only accepts one scratch per person per day.

Even if someone clears cookies, opens an incognito window, or tries to outsmart the frontend, the second scratch gets rejected.

No flimsy client-side check. The constraint is the rule.

Progress also persists across sessions.

Enter your email a week later, and the app remembers which hearts you already scratched and which prizes you won.

Persistent state is the difference between a one-day traffic spike and a week of actual engagement.

Everything is swappable in one file.

Change the hearts to stars, gift boxes, pumpkins, tiny judgmental raccoons. Whatever fits your brand. Swap the prizes for discount codes, free chapters, 1:1 calls, paid-tier upgrades, bonus templates, or secret links.

The structure is clean enough that you’ll be done in 33 minutes.

  • Progress is persistent. When someone returns and enters their email again, the app remembers which hearts they already scratched and shows their previous prizes.

  • Change the hearts to stars, gift boxes, anything.

  • Swap the prizes to fit your audience.

  • Adjust the colors to match your brand.

  • The structure is clean enough to make it yours in 33 minutes.

Section divider

You Might Also Enjoy

Source Code: The Runaway Subscribe Button

Source Code: The Runaway Subscribe Button

Karo (Product with Attitude)
·
May 26
Read full story
Section divider

Paid subscribers get the full source code drop below: every file, the Drizzle schema, the Express routes, the React components, and the deploy config.

Source Code

Paste into your vibe coding tool and ask to build this exact app and ask what parts you want to customize.

This post is for paid subscribers

Already a paid subscriber? Sign in
© 2026 Karolina Zieminski · Privacy ∙ Terms ∙ Collection notice
Start your SubstackGet the app
Substack is the home for great culture