How Voxline is built
The architecture, the guardrail decisions, and what's changed release by release \u2014 for anyone who wants more than the demo.
Architecture
Next.js and Vercel for the app, Supabase for auth and data, and the Claude API for both the voice analysis and the drafting itself. The one decision worth explaining is where content moderation sits.
You paste a comment you want to reply to.
Claude drafts a reply in your voice profile.
The draft — not the comment — is checked for tone.
You edit or approve. Nothing posts on its own.
Moderation runs on the drafted reply, not the pasted comment. Early versions gated on the comment's tone, which meant a hostile comment could block someone from replying to it at all \u2014 punishing the person being harassed, not the one doing it. Checking the draft instead fixed that.
Release notes
Privacy hardening
- Stopped storing raw writing samples after voice analysis — only the derived score, traits, and style guide are kept.
- Added a plain-language privacy page, a “Delete my data” button, and a daily job that clears anything older than 30 days.
- Added a lightweight scrubber that redacts emails, phone numbers, and card-like numbers before anything is saved.
Guardrail redesign
- Built a 58-case test set to stress-test content moderation — sarcasm, backhanded compliments, and the hardest case: someone reporting hostility said to them.
- Compared three moderation approaches and fixed a real false positive with a two-signal design (toxicity, and whether it targets a person).
- Redesigned enforcement to check Voxline's own drafted reply instead of the incoming comment, after realizing the original design punished the person being harassed, not the one doing it.
Rebuilt on a self-owned stack
- Migrated off a no-code platform onto Next.js, Supabase, and the Claude API, with full control over auth, data, and deployment.
- Shipped the core loop: paste a writing sample, get a voice score, draft replies in that voice.
Voxline is in a small private test right now. Request an invite.