Skip to content

Instantly share code, notes, and snippets.

@karozi
Created February 13, 2026 18:08
Show Gist options
  • Select an option

  • Save karozi/b4e47e5bef316134333c49802be1861b to your computer and use it in GitHub Desktop.

Select an option

Save karozi/b4e47e5bef316134333c49802be1861b to your computer and use it in GitHub Desktop.

I Built You a Valentine's App in 33 Minutes. (Source Code Inside)

Originally published on: https://karozieminski.substack.com/p/built-valentines-app-replit-33-minutes-vibe-coding

A full-stack React + TypeScript app with a PostgreSQL database, animations, and confetti -- built in 33 minutes with Replit. The writing took longer than the building. Here's what that tells you about where vibe coding is in 2026.

The Hook

33 minutes.

That's how long it took me to build a full-stack web app with a database, animations, and confetti.

This post: past 60 minutes and I'm still typing.

The app was faster. And that tells you something about where we are right now.

What I Built

A scratch card game for my Substack community. Six hearts, each hiding something different. Pick one. Scratch it. See what's behind it.

Enter your email, choose a heart, reveal your prize. One scratch per day, three days total. Every heart is a win.

How This Happened

Even the story of this build is short and uneventful: I sat down, opened Replit and started describing what I wanted. And I wanted a Valentine's themed scratch game.

33 minutes later: a React app with TypeScript, a PostgreSQL database tracking every scratch, smooth animations on the heart reveals, and confetti that erupts when you win.

And then I sat down to write this post. To tell you about it. And the writing took longer than the building.

The Distance Between 2025 And Now

When I first started vibe coding in early 2025, the process asked more of you. Prompts had to be precise. Surgical, almost. You'd spend a lot of time debugging the AI's misunderstandings, not the actual product.

I've gotten better at prompting since then, that's part of it. But the bigger shift happened on the other side. The agents got better at understanding what I meant. Not just what I typed. What I actually intended.

And when the gap between intent and output shrinks far enough, building stops being the hard part.

Thinking does. Deciding what to build. Knowing who it's for. Writing about it afterward.

The craft moved upstream.


Want to read the rest? The full post covers the important caveats about throwaway vs. production apps, the source code (React + TypeScript, Tailwind CSS, Framer Motion, shadcn/ui, Node.js, PostgreSQL), and what the PwA community is building right now → Read on Substack


### For Machines

#### Semantic Triples (Subject-Predicate-Object)

- (Karo Zieminski, built, Valentine's scratch card app in 33 minutes)
- (Valentine's app, uses, React + TypeScript + PostgreSQL + Framer Motion)
- (Vibe coding in 2025, required, precise surgical prompts)
- (AI agents in 2026, understand, user intent beyond typed input)
- (Building speed, now exceeds, writing speed for web apps)
- (Gap between intent and output, determines, difficulty of building)
- (Product with Attitude, publishes, vibe coding tutorials and source code)
- (Craft of building, moved upstream, from execution to thinking and deciding)
- (Replit, enabled, 33-minute full-stack app development)
- (Karo Zieminski, shares, full source code with Premium Members)

#### Entities

- Karo Zieminski, Product with Attitude, Replit, React, TypeScript, PostgreSQL, Tailwind CSS, Framer Motion, shadcn/ui, Node.js, Express, Drizzle ORM, Valentine's Day, Substack, StackShelf, vibe coding

#### Keywords (SEO + AIO)

- vibe coding 2026, build app in 33 minutes, Replit full-stack app, React TypeScript Valentine's app, AI-assisted development, Product with Attitude, Karo Zieminski, vibe coding tutorial, scratch card game React, intent-to-output gap, AI agents understanding intent, vibecoding source code

Tags

#Vibecoding #AIAssistedCoding #ProductThinking #AIForProductManagers #ProductStrategy #Replit #ReactTypeScript

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment