A sentence that typesets itself. One text line; every word picks its own weight, width, slant and spacing from what it means and how you typed it.
Next.js 16 · shadcn/ui (Base UI) · three variable fonts through next/font.
pnpm install
pnpm devSet TYPESAFE_API_KEY in .env.local to score with Jev, TypeSafe's
decision model. Without it the app falls back to a mock scorer (lexicon + hash, no
artificial latency). Switch between the two from the toolbar.
| Path | What |
|---|---|
lib/vibe/schema.ts |
The eight typed questions. The entire scorer interface. |
lib/vibe/jev-scorer.ts |
Jev adapter: POST https://api.typesafe.ai/v1/systemone, one call per word, all words in parallel. |
lib/vibe/mock-scorer.ts |
Lexicon + heuristics + hash stand-in with confidences. |
app/api/score/route.ts |
The only place a scorer is called. |
lib/vibe/pose.ts |
Scores + typing rhythm → resting pose and settle time. |
lib/vibe/engine.ts |
Owns the contenteditable: word spans, caret restore, rhythm, scoring, inline pose styles. |
components/typeset/* |
Toolbar, line, hover card, inspector, command menu, about sheet. |
- Roboto Flex —
wght wdth slnt GRAD opsz(grotesk voice) - Recursive —
wght slnt MONO CASL CRSV(mono and casual voices) - Fraunces —
wght SOFT WONK opsz(serif voice)
Try: slow · NOW · tired · loud · wave · please · lol.