Skip to content

dinesh-git17/always-us

Repository files navigation

Always Us

A Relationship Contract Disguised as an iOS App

Status: Committed Build: Passing Userbase: 1 Terms: Non--Refundable


A Note for Recruiters

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 love letter I built for my girlfriend, Carolina.

If you're evaluating my technical skills, go look at my other repos. This one has exactly one user, and she doesn't care about your tech stack requirements.

Still reading? Fine. But don't say I didn't warn you. The only stakeholder here was love, and the only acceptance criteria was tears of joy.


Why This Exists

Most apps I build have dashboards, analytics, and product managers asking about DAUs. This one has exactly zero metrics, and the only KPI is "did she smile?"

I wanted to create something that couldn't be downloaded from the App Store. Something that would make her feel loved, page by page, word by word. Something that said "I choose you" in the only language I'm truly fluent in: TypeScript with strict mode enabled.

The production environment? Her heart.

The deployment target? Forever.


The Tech Stack (Overengineered with Love)

Did I need 14 different animation timing curves for what's essentially a fancy slideshow? No.

Did I need to implement spring physics with stiffness 260 and damping 30 for page transitions? Absolutely not.

Did I need to calculate optical alignment corrections measured in hundredths of an em? The answer is obviously no.

But when the user base is "The Love of My Life", you don't ship MVP.

You ship the version that makes her cry (happy tears only).

Layer Tech Why
Framework React 19 Because component-based love is more maintainable
Language TypeScript (strict: true) No any types. No ambiguity. Just commitment.
Build Vite 7 Fast builds for fast heartbeats
Native Capacitor 8 Because "it works on web" wasn't romantic enough
Animation Framer Motion For entrances that feel like a first kiss
State Zustand Lightweight. No boilerplate. Like our morning coffees.
Styling CSS Modules Scoped styles for scoped love (wait that sounds weird)
Auth Face ID + Passcode Fort Knox-level security for love letters

Latency: 0ms (when we're together)

Uptime: 100% (I'm not going anywhere)

Technical debt: Just the emotional kind


The Experience

Always Us opens like a ritual. Authenticate with Face ID. Enter the passcode (it's our anniversary). Then begin a 16-page journey through promises, memories, and words that were chosen very, very carefully.

The journey:

  1. Welcome - "Exhale." That's it. That's the page.
  2. We Chose Each Other - The opening argument of our relationship contract.
  3. Where It All Began - Origin story vibes.
  4. Why I Made This - Meta, but make it romantic.
  5. What This Means to Us - Alignment on the important stuff.
  6. What I Promise You - The vows (with 0.6s stagger because promises need weight).
  7. How I Show Up Every Day - The boring-but-important stuff.
  8. On the Hard Days - When things aren't easy.
  9. Trust and Loyalty - The foundation.
  10. What We're Building Together - Future tense. Optimistic animations.
  11. The Non-Refundable Clause - Legally binding in the heart.
  12. Signatures & Sealing - With breathing animation because the app is alive.
  13. Eternal Validity - No expiration date.
  14. Final Words - The closing arguments.
  15. Whenever You Need This - For the hard days.
  16. I love you, Carolina. - That's it. That's the page.

Every page transition has spring physics. Every text reveal is timed for emotional impact. Every animation was chosen, not defaulted.

Because she deserves software that doesn't just work. It feels.


Patch Notes

v1.0.0 - "The Full Commit"

  • Shipped 16 pages of carefully chosen words
  • Implemented 10 unique animation timing curves (because one "fade in" felt lazy)
  • Added Face ID authentication (her face is literally the password)
  • Built passcode system that recognizes when the right person opens it
  • Added ambient background music at 18% volume (sits beneath your thoughts)
  • Rotating quotes each session (so returning feels slightly different)
  • Daily notification system with morning and evening messages
  • Bugs: None (she's perfect)
  • Known Issues: May cause happy tears

v0.0.1 - "The Commit"

  • git init
  • Committed to forever

The Labors of Love

Things I did that no reasonable developer would do for a personal project:

  • Created 10 animation configs with names like REASSURANCE, ANCHOR, CEREMONIAL, and FINALE
  • Tuned stagger delays until the pacing felt "emotionally correct"
  • Implemented a breathing animation (1.0 to 0.85 opacity over 4 seconds) so the final page feels alive
  • Built a swipe hint component that appears exactly 10.6 seconds after page load
  • Calculated epigraph delays as (last element delay + animation duration + 0.3s buffer)
  • Darkened the muted text color from #6b635b to #5a524c for low-light legibility
  • Added optical margin correction of -0.03em on serif titles
  • Tested at 2am on an actual iPhone, not the simulator
  • Wrote zero unit tests for the love letter content (some things you just ship)

Total time invested: More than I'll admit.

Regrets: Zero.


Technical Decisions (For the Curious)

Q: Why 16 pages? A: Because that's how many things I needed to say. The architecture followed the content, not the other way around.

Q: Why spring physics for transitions? A: CSS ease-in-out feels mechanical. Springs feel organic. Love should feel organic.

Q: Why Zustand over Redux? A: This app has more emotional state than technical state. Zustand lets me focus on what matters.

Q: Why no analytics? A: I don't need to know her scroll depth. I just need to know she smiled.

Q: Why the breathing animation? A: After the final words appear, the page should feel alive. Like it's waiting with her. 4-second cycle, subtle opacity shift. You barely notice it, but you'd notice if it wasn't there.


For Other Developers

If you're here because you want to build something like this for someone you love: do it.

The hard parts are solved:

  • iOS safe area handling? Figured out.
  • Capacitor Face ID integration? Done.
  • 60fps animations on mobile Safari? Handled.
  • Swipe gestures that don't conflict with iOS back gesture? Solved.
  • Background audio that fades in slowly and pauses on app background? Implemented.

What you write in the pages? That's yours.

License: MIT. Take it. I don't need credit. I already got the girl.


The Final Page

When Carolina reaches page 16, she sees this:

I love you, Carolina.

No title. No subtitle. No navigation UI. Just those words, breathing gently, waiting for as long as she wants to stay.

It's not much. Just four words on a screen.

But it means everything.


Final Transmission

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. I love you. Thanks for being my favorite edge case.


Built with late nights, mass amounts of boba tea, 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. Always.");

About

A personal iOS app built for one person. A relationship contract, disguised as software.

Topics

Resources

Stars

Watchers

Forks

Contributors