Skip to content

Repository files navigation

Typeset by vibe

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.

Run

pnpm install
pnpm dev

Set 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.

Where things live

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.

Fonts

  • 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.

Releases

Packages

Contributors

Languages