Jev reads a whole novel in under a minute. Every passage becomes a row of colour.
Frankenstein: 601 passages, 6,010 typed decisions, 37 seconds in this capture (about 22 s without the screen recorder), 3 cents. Played back at 4× speed.
Each ~90-word passage is sent to Jev (TypeSafe's System One decision model) with ten parallel typed questions: a 0–3 score for each of nine emotions, plus overall intensity. Jev never sees pixels and never writes prose; it only returns scores with calibrated probabilities. The aurora draws one feathered row per passage, each emotion a curtain whose width and brightness follow its score. When the book is done, the whole strip is the book's emotional weather, and you can save it as a poster.
bun install
bun run dev # Vite on :5173, Bun API server on :4319Set OPENROUTER_API_KEY (Jev via OpenRouter's /api/alpha/decisions, model typesafe/jev-1.13) or
TYPESAFE_AI_API_KEY (native api.typesafe.ai) in .env or your shell. With neither, the app runs in
a keyword-driven mock mode so you can work on the visuals.
Optional: JEV_MODEL, JEV_CONCURRENCY (default 6), JEV_TIMEOUT_MS (default 8000), JEV_HEDGE_MS
(default 1500; a duplicate request fires if the first has not answered by then), PORT (default 4319).
URL parameters: auto starts reading on load, book=<id> picks a book, kiosk hides the controls for
screen recording, look=aligned switches from the flowing aurora to fixed labelled columns.
Drop any plain-text novel into books/ as <id>.txt. Project Gutenberg files work as-is: the header and
licence are stripped, Title: / Author: are read, and CHAPTER … headings become the ticks along the
ribbon. Only public-domain texts belong in books/. Anything in books/private/ is git-ignored, for
reading books you own locally; the resulting poster contains no text, only colour.
The server listens on 127.0.0.1 only, refuses cross-site browser requests to /api/read, and never
receives your key from the browser: the key lives in the server process. Every read costs real money
(about 3 cents for Frankenstein), so if you expose it (HOST=0.0.0.0 or a public deploy) add your own
rate limiting and a spending cap first. Book text is sent to the Jev API as data; passages are rendered
with textContent, never as HTML.
bun run build && bun run start # serves dist/ and the API from one Bun processTexts in books/ are from Project Gutenberg and in the public domain.
MIT. Book texts are public domain via Project Gutenberg.

