The user-facing voiceprint tool + capture gate. Paste your writing → see a glimpse → drop email/role/handle → unlock your full portrait, archetype, and shareable card. The tool is a mirror, not a judge — it never scores.
npm install
npm run dev # http://localhost:3000 (uses next default port)No API keys needed: the voiceprint engine and lead store both run locally.
idle (paste box) → loading → teaser (glimpse + locked preview + gate) →
revealed (archetype + signature + share card + full portrait + Lightfern CTA).
These are the seams. Both sides are stubbed so Role A is demoable solo; swap in the real thing with no front-end changes.
- Endpoint:
POST /api/voiceprint{ text }→Voiceprint(seelib/types.ts). - Today it's a real local text-analysis engine (
lib/voiceprint.ts) that derives the portrait from rhythm, punctuation, and lexical fingerprint — so every result is genuinely personal, offline. - To swap in Claude: replace the handler body in
app/api/voiceprint/route.ts, keep theVoiceprintresponse shape identical. UI keeps working.
{ id, email, role, handle, writing_sample, voiceprint_json, created_at }
- Endpoint:
POST /api/leadvalidates and persists this row. - Default: writes to
/data/leads.jsonand returns{ rank, total }(newest-on-board). - To forward to B: set
LEAD_FORWARD_URL(+ optionalLEAD_FORWARD_KEY). The route POSTs the same row to B and passes through B's{ rank, total }to the reveal.
Next.js 14 (App Router) · Tailwind · lucide-react · Instrument Serif / DM Sans /
JetBrains Mono. Deploys to Vercel as-is (/data is the only local-only bit —
once B's store is wired, nothing touches the filesystem).