Case study · 06
Whispr gives anyone a personal link where strangers or friends can send fully anonymous text, images, voice notes, and video — mixed in a single message rather than one format at a time.



Overview
A personal-link inbox where anyone can send you anonymous text, photos, voice notes, and video — combined in one message, like a private chat.
The Challenge
Anonymous messaging apps like NGL or Sendit are built around short text only. There was no equivalent for anonymous rich media — a place where someone could send a photo, a voice note, or a video anonymously, let alone combine them with text in one message the way a normal chat app allows.
Approach
Shipped the core loop first — a personal link, anonymous text submission, a private inbox — then layered in media types one at a time (images, then voice, then video), each validated against real device quirks (like iPhone HEIC photos) before widening scope. Deliberately used platform-level solutions over custom infrastructure where they were sufficient: Vercel Firewall rules for rate limiting instead of a hand-rolled limiter, and polling instead of WebSockets for live inbox updates.
Design
Dark, gradient-driven visual language (violet/fuchsia/amber) aimed at feeling playful and confessional rather than corporate. The composer works like a chat app — attach multiple photos/videos plus one voice note alongside text in a single send — after an earlier one-type-at-a-time picker proved too limiting for how people actually wanted to send anonymous media. The message detail view includes a lightbox for browsing multi-photo messages and a one-tap 'Share as image' action that generates a branded card for reposting to Instagram/Snap Stories, which doubles as the app's built-in growth loop.
Engineering
Next.js 16 App Router with Server Actions end to end; Prisma models a Message → Attachment one-to-many relationship so a single message can carry mixed media types. Auth.js v5 runs credentials-based JWT sessions with in-place session refresh (the update() trigger), so changing your username doesn't force a re-login. Media uploads go directly from the browser to Supabase Storage via short-lived signed upload URLs rather than through the Server Action body, avoiding both Next.js's and Vercel's request-size ceilings. Incoming text is auto-classified into a topic taxonomy (Compliment, Confession, Question, etc.) using Groq's free-tier Llama 3.1 model. The share-card feature renders a Story-ready PNG per message server-side with Next's built-in next/og (Satori), compositing a hero image or video frame plus a secondary media strip for messages with several attachments, with reachability checks so one broken asset can't fail the whole render. HEIC/HEIF photos are detected by sniffing the file's actual container bytes (not trusting the extension) and transcoded to JPEG client-side before upload.
Outcome
Live and working end to end at whisprapp.vercel.app: the public send flow, the private dashboard with live polling for new messages, and the Story-card growth feature are all functional. Solo project, actively iterated, no monetization built yet.