Remember
Live ProductionOpen SourceConsumer SaaS · Collaboration
A shared journal for the people you keep: one private Space per couple, family, or friend group.
Shared memories usually end up scattered across camera rolls, chat threads, and calendars. Remember gives each group a private Space with a milestone timeline, a photo gallery, a shared schedule, and a realtime notes board, isolated at the database rather than in the UI. It began as an anniversary site for my girlfriend and me; I rebuilt it into a multi-tenant product over seven releases in one week.
- Launched
- May 2026
- Releases Shipped
- 7
- Multi-tenant Rebuild
- 7 days
Explore the interactive case study
Clickable recreations of the shipped interface, plus the architecture, data model, and build log. No account needed.
Core features
- One account, many Spaces: switching swaps the whole app (timeline, photos, schedule, notes, even the background)
- Milestone timeline where every member writes their own side of each memory
- Photo albums as a grid or a map of places, with HEIC-to-JPEG conversion and downscaling in the browser before upload
- Time-zone-aware schedule: each event keeps the zone it was written in and shows every viewer their local time, in list or calendar view
- Realtime notes board and notification bell, with unread indicators that carry across Spaces
- Friends-first invitations and owner/member roles, enforced in the database
Architecture & tech stack
- Next.js 16
- React 19
- TypeScript
- Tailwind CSS
- Supabase Postgres + RLS
- Supabase Auth
- Supabase Realtime
- Vercel
Architecture Highlights(6)
Tenant isolation, enforced in Postgres
Every content row carries a space_id, and Row Level Security lets you touch a row only when you're a member of its Space. Membership checks live in SECURITY DEFINER helpers (is_space_member, is_space_owner, shares_space_with) so the policies never recurse.
Narrow reads across the boundary
Screens that need data about people outside your Spaces, like an incoming friend request, call purpose-built functions (search_profile, get_friends_overview, get_notifications) instead of loosening profile policies. Search matches an exact @handle or email only, so profiles can't be enumerated.
No separate backend
Server Actions call Supabase through a request-scoped client that carries the user's session, so Postgres itself decides what each request may read or write. Realtime pushes changes straight to the browser, and a signup trigger provisions a profile, @handle, personal Space, and owner membership in one transaction.
Security rules tested, not assumed
Each policy change ships with an integration script that creates throwaway owner, member, and outsider accounts against the live database and asserts real behavior: members can't edit each other's events, outsiders see nothing, author IDs can't be forged.
Calendar-correct time handling
Events store their original time zone and convert in each viewer's browser. The anniversary counter counts calendar months with month-end clamping and derives leftover days from wall-clock components, so a daylight-saving shift can't turn 27 days into "26 days, 23 hours."
Reversible migrations, revertible features
Numbered SQL migrations, each paired with a rollback, are mirrored into a single schema.sql. Features land as focused commits squash-merged to main, which auto-deploys to Vercel with a versioned changelog. I direct Claude Code as the engineer within this workflow.
Build Log(7)
- v0.1.0
Multi-tenant foundation
Forked the single-couple prototype and introduced Spaces, membership, Supabase Auth, and Row Level Security across every content table.
- v0.2.0
Identity & Spaces
Handle-based identity, the Space switcher, tabbed settings, avatar upload, and light/dark theme.
- v0.3.0
Shared collaboration model
Replaced fixed two-person fields with per-member journey comments and member-attributed schedule events with joint participants.
- v0.4.0
Friends, notifications, Space management
Named the product Remember and added the friends graph, a unified notification inbox, and a Space manager.
- v0.5.0
Time zones & profile polish
Per-event time zones with viewer-local conversion, past-event browsing, per-Space backgrounds, and searchable handles.
- v0.6.0
Calendar view
A month grid with per-day events and navigation, alongside the existing list.
- v0.7.0
Realtime
Moved notifications and the notes board onto Supabase Realtime: live unread state, glowing new notes, and cross-Space indicators.