Skip to main content
Back to work

LDR Sync & Communication PWA

First Light

<50ms Real-Time Sync

A private command center for long-distance couples: live timezone/status sync, time-locked morning messages, and one-tap pings, delivered as an installable PWA with native push and no app store required.

Next.jsSupabaseRealtimePWA
Visit live project
First Light dual dashboard showing both partners' local time and status

[ architecture.snippet / first-light ]

> profiles(timezone, status)

> connections(streak_count)

> capsules(unlocks_at: 6am local)

> realtime.subscribe(connections)

[ GALLERY ]

First Light time-locked morning capsule message

[ TRANSLATION LAYER ]

// FOR_FOUNDERS

The Business Story

The Challenge

Long-distance couples and friends don't need another generic chat app. They need something that actually closes the distance: knowing what time it is for the other person, feeling connected without constant messaging, and having a small daily ritual that makes the relationship feel present.

My Approach

I built a dedicated command center for two people: a live dashboard showing both people's local time, weather, and status at a glance, a one-tap "thinking of you" ping that shows up instantly on the other person's phone, and a time-locked morning message that only unlocks at 6am their time, turning "good morning" into a daily habit instead of a text you forget to send.

The Result

The app delivers native-feeling push notifications on iOS without needing an App Store listing, keeps both people's screens in sync in under 50 milliseconds, and is built to spread organically: each user can create a new "Space" for every relationship in their life, not just one.

// FOR_ENGINEERS

The Tech Specs

Stack

Next.js (App Router)TypeScriptTailwind CSSFramer MotionSupabase RealtimePostgreSQL + RLSnext-pwaWeb Push API

Engineering highlights

  • >Shipped native-feeling iOS push notifications via the Web Push API, with no Apple Developer fees and no App Store review.
  • >Standardized all timestamps to UTC and handled timezone math client-side with Intl.DateTimeFormat, keeping the server thin.
  • >Subscribed the client directly to Postgres row changes via Supabase Realtime, achieving <50ms status/ping updates without polling.