Design approach
The interface is mobile-first because the primary experience is two people using their phones. Tablet and desktop layouts create more room for shared memories and navigation without changing that priority.
CASE STUDY · FEATURED PROJECT
A mobile-first private shared-space web app for couples to keep memories, answer daily prompts, exchange letters, and revisit small moments together.
ROLE
Product design, full-stack implementation, and privacy-focused architecture
STACK
Next.js · TypeScript · Better Auth · Drizzle · Neon PostgreSQL · Cloudinary · Resend
PRODUCT PREVIEW
This preview uses fictional sample content only. No private couple data is shown.

Watch 1-minute walkthroughYouTube · Opens in a new tabCONTEXT
The challenge. Build a personal shared-space app where every feature respects a two-person privacy boundary, while keeping the experience calm and comfortable on a phone.
The approach. I separated a fictional public preview from authenticated private routes, then scoped private reads and writes through the signed-in member’s couple membership.
PRODUCT DIRECTION
The interface is mobile-first because the primary experience is two people using their phones. Tablet and desktop layouts create more room for shared memories and navigation without changing that priority.
Progressive Web App support and a dedicated mobile app are planned as future iterations. They are product direction, not current functionality.
KEY FEATURES
Members can create, edit, and confirm deletion of memories, attach authenticated image or video assets, and revisit milestone stories, galleries, and an anniversary countdown.
The owner creates an email-bound link that expires after seven days. Its token is stored only as a hash, and acceptance atomically provisions or joins the invited partner.
Each person writes privately. Both answers appear only after both have responded; a rest request requires the other person’s decision, and completed prompts remain in history.
Love letters have individual read receipts. Little Jar notes can be tucked away for the other person to discover later, then answered with a small reaction.
An approximate last-active status refreshes only while someone uses the private app, avoiding exact tracking while still giving a gentle sense of presence.
A scheduled worker triggers privacy-safe unanswered-question reminders and celebration emails, with database records that make retries safe.
IMPLEMENTATION
Better Auth sessions resolve into a couple membership before private actions run. The invitation flow validates the recipient and uses one transaction to prevent an expired, reused, or concurrent invite from adding an unintended member.
Question answers are stored per member and the other answer is deliberately not serialized before both responses exist. The round state handles answering, rest requests, reveal, and rest outcomes.
Private media is delivered through authenticated app routes after membership checks. The /demo routes use fictional content only and do not read or save private couple data.
A Cloudflare Worker invokes protected app jobs for reminders and celebrations. Per-member, per-event database keys prevent duplicate delivery if the scheduler retries.
EXPLORE THE PROJECT
Use the public demo to explore the project workflow, then review the repository for its implementation details.