Afterwords
Confidential legacy-messaging platform (name changed for confidentiality)
Overview
Afterwords lets a user record text, audio, or video messages for the people in their life and control exactly when those messages get delivered. A network of Notifiers confirms when the user has passed, Trustees handle messages tied to future events rather than death, and Recipients simply receive what was left for them — all built around four distinct roles (Owner, Recipient, Trustee, Notifier) and five core modules: Dashboard, Messages, Notifiers, Trustees, and Profile.
Key Features
- Four role-scoped portals — Owner, Recipient, Trustee, Notifier — each seeing only what their role needs
- Message composer supporting text and in-platform audio/video recording, with per-message recipient and delivery-timing rules
- Multi-notifier confirmation flow: a life event is only confirmed once enough independent notifiers corroborate it
- Trustee-managed delivery for event-specific messages (e.g. a future birthday) kept separate from the death-confirmation path
- Chunked, resumable upload pipeline for large in-platform video recordings
My Responsibilities
- Built the Dashboard, Messages, Notifiers, Trustees, and Profile modules end-to-end
- Implemented the multi-notifier confirmation workflow that gates message delivery on corroborated confirmation rather than a single report
- Built the message composer, including in-platform video/audio recording and delivery-timing configuration
- Designed and implemented the trustee-managed, event-specific delivery flow as a path separate from death confirmation
- Owned the video upload pipeline end-to-end, including the performance rework below
Challenges & Solutions
In-platform video messages could run into the gigabytes, and the first working version uploaded straight to S3 as a single request — a 1.8GB recording took 12-15 minutes to upload, long enough that users would back out or lose the recording on a flaky connection.
Rebuilt the upload path around S3 multipart upload: the recording is split into fixed-size chunks in a Web Worker so encoding doesn't block the UI, chunks move through a bounded upload queue backed by a small worker pool instead of one request at a time, each chunk retries independently on failure, and the parts are batched into S3's complete-multipart-upload call once everything succeeds. The same 1.8GB file went from 12-15 minutes to 90-100 seconds.
The death-confirmation flow is the most sensitive part of the product — it can't act on a single false report, but it also can't be so strict that a real event goes unconfirmed.
Modeled confirmation as a quorum: each notifier's report is logged independently, and message delivery only unlocks once a configurable number of notifiers corroborate the same event, with trustees notified at each stage so there's a human check before anything is sent.
Architecture
- Frontend
- Next.js with role-scoped portals (Owner, Recipient, Trustee, Notifier) sharing a common module shell
- State
- Zustand for session/role state, plus a dedicated upload-queue store tracking chunk status per in-progress video
- Styling
- Tailwind CSS
- Testing
- Focused test coverage on the notifier-quorum logic and chunked-upload retry paths, given how costly a bug in either would be
At a glance
- 1.8GB video upload time
- 12-15 min → 90-100 sec
- User roles
- 4 (Owner, Recipient, Trustee, Notifier)
- Core modules
- 5
Technologies
This is an enterprise project built for a company I've worked with, so I'm not able to share source code or a live demo here — happy to walk through the code and architecture in person.