Stop here. This repository is not a portfolio piece. It's not a demo. It's not a "look what I can build" flex for your hiring pipeline.
This is a Christmas gift I built for my girlfriend, Carolina.
If you're evaluating my technical skills, go look at my other repos. This one has a user base of exactly one person, and she doesn't care about your job req.
Still reading? Fine. But don't say I didn't warn you—the only stakeholder here was love, and the only deadline was December 25th.
Most code I write is for tickets, deadlines, and stakeholders who speak in acronyms. Sprint velocity. Story points. Acceptance criteria. The feedback loop is Jira comments and Slack threads.
This repo is different.
The only stakeholder was my girlfriend. The deadline was Christmas morning. The KPI was a smile. The production environment? Her heart.
I wanted to build something that couldn't be bought in a store. Something that would make her laugh, then maybe cry a little, then definitely laugh again. Something that said "I love you" in the only language I'm truly fluent in: code that compiles on the first try.
Did I need to build a full parallax star field with frame-synced animations? No.
Did I need 60fps native performance on a PWA with offline support? Absolutely not.
Did I need to hand-tune every CSS transition, implement a custom game loop with delta-time physics, and deploy to iOS via Capacitor with a custom splash screen? The answer is obviously no.
But when the user base is "The Love of My Life", you don't ship MVP.
You ship the full feature set.
| Layer | Tech | Why |
|---|---|---|
| Framework | Next.js 16 (App Router) | Because React Server Components are romantic |
| Language | TypeScript (strict: true) | No any types. No ambiguity. Just commitment. |
| Styling | Tailwind CSS 4 | Pixel-perfect love requires pixel-perfect utilities |
| Animation | Framer Motion | For entrances that feel like a first kiss |
| State | Zustand | Lightweight. No boilerplate. Like our weeknight dinners. |
| Native | Capacitor | Because "it works on web" wasn't enough |
| Confetti | canvas-confetti | Obviously |
| Snow | react-snowfall | For the vibes |
Latency: 0ms (when we're together)
Uptime: 100% (I'm not going anywhere)
Legacy code: The memories we've already made
Holiday.exe boots like a classified terminal, authenticates via fingerprint and passcode, then launches Carolina on a mission through the stars.
The journey:
- Boot Sequence — Hacking-movie aesthetics. Flickering text. The works.
- Biometric Auth — Fingerprint scanner and passcode entry (the code is our anniversary).
- Mission Briefing — Objective: RESTORE CONNECTION.
- The Game — Side-scrolling parallax space flight. Collect hearts. Dodge obstacles. Guide Carolina home.
- The Room — A cozy reunion scene. Two otters. One hug. Snowfall outside.
- Memory Match — A zero-gravity mini-game with photos from our life.
- Intel Briefing — An encrypted message that decrypts into a love letter.
- The Cipher — Terminal Wordle with three romantic words. Hints from a holographic Dinn.
- The Proposal — Matrix rain. A final letter. A rescue certificate. A text message link.
Every screen transition is eased. Every button has haptic feedback. Every asset is preloaded before she sees a single frame.
Because she deserves software that doesn't buffer.
- Added Matrix Rain finale sequence
- Added proposal page with rescue certificate
- Added SMS deep linking (for the important question)
- Implemented terminal Wordle with progressive hints
- Bugs: None (she's perfect)
- Known Issues: May cause tearing up
- Shipped core experience: auth → game → room → letter
- 60fps animations on mobile Safari (this was harder than it sounds)
- Offline PWA support (love doesn't need WiFi)
- Features: Infinite loops of gratitude
git init- Committed to forever
Things I did that no reasonable developer would do for a side project:
- Hand-drew sprite sheets for Carolina's run animation (frame by frame)
- Tuned parallax layers until the depth felt "emotionally correct"
- Implemented delta-time physics so the game runs identically at 60Hz and 120Hz
- Built a custom Wordle engine with a 4-guess limit and holographic hint system
- Created a Matrix Rain effect with mixed Katakana and Latin characters
- Tested on actual hardware at 2am on Christmas Eve
- Wrote zero unit tests for the love letter component (some things you just ship)
Total time invested: More than I'll admit.
Regrets: Zero.
If you're here because you want to build something like this for someone you love: do it.
Fork this repo. Rip out Carolina's name and put in your person's. Replace the otter sprites with your inside jokes. Swap the encrypted letter for your own words. Keep the terminal aesthetic or burn it down entirely.
The hard parts are solved:
- iOS audio autoplay restrictions? Handled.
- PWA offline caching? Done.
- 60fps mobile animations? Figured out.
- Capacitor native deployment? Documented in the codebase.
What you write in the final letter? That's yours.
License: MIT. Take it. I don't need credit. I already got the girl.
When Carolina completes the final cipher, she receives this:
It's not much. Just two otters hugging. But it means everything.
Carolina, if you're reading this README instead of opening the app: close this tab and go experience the real thing. The source code isn't the gift.
But also: hi. Merry Christmas. I love you.
Thanks for being my favorite production environment.
Built with late nights, questionable amounts of coffee, and the kind of focus that only appears when you're making something for someone who actually matters.
— Dinesh
console.log("I love you, Carolina. Forever.");
