The problem
Long-distance couples juggle time zones, two timetables and a dozen apps just to share small daily moments. The data involved (where you are, what you write to each other) is as private as data gets.
The product had to feel warm. The backend had to be paranoid.
The product
- Home. Two local clocks, a countdown to the next reunion, an “I want to call” ping, day streaks and a daily question.
- Map. Opt-in live location on both sides; history is deleted after 48 hours.
- Agenda. Shared events across two time zones. A whole school timetable can be imported from PDF, Excel or CSV.
- Memories. Notes, gratitudes, video vlogs and time capsules that stay sealed until a chosen date.
- Notifications. Web push that says who did something, never what it contains.
- Your data is yours. Full export and account deletion, stored files included.
The security model
The app talks to Supabase directly with a public key, on purpose. That only works if the database itself refuses everything that isn't yours.
- Sign-ups are capped at two accounts; linking partners is locked.
- Time capsules are sealed by the database until their date, not hidden by the interface.
- 83 policies were rewritten to evaluate the user once per query instead of once per row.
- Every destructive migration ships with a rollback script.
Decisions worth telling
- Security in the database, not the client. The client is untrusted by design.
- Edge functions check access themselves. Some callers, like a phone shortcut, can't send a session token, so they get revocable tokens and 5-minute signed links.
- Background location through a phone shortcut, because browsers can't read location when the app is closed.
- Privacy as a feature. Content-free notifications and 48-hour location retention.
Quality
430test cases, 32 files
24database migrations
~14.9klines of TypeScript
CI type-checks, lints, tests and builds on every push, and deploys automatically. 87 commits between May and September 2026.