Skip to content
Back to projects
EnterpriseShipped11 months

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

ReactNext.jsZustandNode.jsAWS S3Tailwind CSS

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.