An unlisted text classification game. Match every displayed range, then press Enter or the submit button. Fewer words earn more points. Normal editing is the default. Settings → Hard mode makes text append-only: no Backspace, Delete, cut, undo or replacement of committed text. Pasting appends at the end; uncommitted IME composition remains editable. The mode preference is saved locally. The same text field remains mounted and keeps focus between rounds. There is no transcription API.
The interface uses literal labels, a fixed viewport and no page scrolling. While the keyboard is open, targets use the available space above a single-line entry with inline submit. The title row is compact and secondary footer links are hidden; classifications remain available in Settings. The footer returns when the keyboard closes. Other classifications open in an overlay. Settings contains Hard mode, success sound, the front-camera toggle, restart and measured usage. Remix on Val Town is prominent below the game when the keyboard is closed. The front camera is a mirrored local preview in the bottom half, with a saved 1×–3× digital zoom slider. It shrinks at keyboard heights to keep the game visible. It is for the user's own screen recorder. The app does not record, save, upload or request microphone access.
| Completed levels | Axes | Window width |
|---|---|---|
| 0–1 | 1 | 30 percentage points |
| 2 | 1 | 20 points |
| 3–4 | 2 | 24 points |
| 5–7 | 3 | 20 points |
| 8 onward | 3 | 10 points |
Targets use warmth, urgency, conviction, formality and passive-aggressiveness. Four original five-level rubric scores map to 0–100. Passive-aggressive is Jev's yes-probability, not an intensity measure. Values round to one decimal before both display and inclusive range checks. Multi-axis combinations were adjusted against 18 actual Jev sentence probes to avoid obviously conflicting targets; the internal difficulty values remain provisional, not empirical Elo ratings.
Scoring: (100 × axes + max(0, 300 − 15 × words)) × multiplier. The multiplier increases every three consecutive clears, capped at four. Skipping resets the streak and changes the prompt without increasing difficulty. Every run has its own random seed, shuffled target order, shuffled multi-axis selections and slightly varied ranges. Refreshing preserves that run; restarting draws a new seed. Progress and drafts persist locally; simulated and live progress are separate.
All 16 original classifications run together on every live request. Inactive results appear in Other classifications without another request. Outputs are free, but their question instructions still add input tokens.
The serial request scheduler uses a 130ms debounce and a 450ms scheduling window, coalesces edits, ignores stale responses for scoring and records their actual token usage. Up to 80 identical results are cached in memory. Errors require an explicit retry; there is no polling or retry loop.
Jev's published price, verified September 16, 2026, is $0.042 per million input tokens; free output. Primary source.
Ten short-sentence probes using all 16 classifications averaged 873 input tokens per update. The ten requests used 8,730 tokens and cost $0.00036666. At this measured token size, $5 buys approximately 136,364 updates.
| Assumed updates per completed level | Levels per $5 |
|---|---|
| 10 | 13,636 |
| 25 | 5,455 |
| 50 | 2,727 |
These are explicit scenarios, not measured averages of human gameplay. One million updates of this size cost about $36.67. One million levels at 25 updates each cost about $916.65. Hosting is excluded. Longer text and different request content change token usage. Settings shows a local projection using actual input tokens divided by observed clears, including requests on skipped/unfinished rounds. It excludes unresolved failed requests and is not a representative multiplayer sample.
The inherited SQLite budget defaults to $2, independently of the $5 comparison above. Atomic reservations reconcile successful calls against actual usage and conservatively retain ambiguous failed reservations. Text is limited to 800 characters, with inherited per-IP/global burst controls.
Store TYPESAFE_API_KEY server-side in environment variables. The model defaults to jev-latest. No key appears in client code. Without a key, the interface explicitly labels simulated scoring and leaves model-only extra readings blank.
tests/game.ts: range boundaries, incomplete results, all-axis scoring, brevity, streak cap and 1,000 generated rounds.tests/budget.ts: rejects an over-budget reservation without spending tokens.tests/live-probe.ts: ten small actual-model probes; will consume a fraction of a cent when explicitly run with a key.tests/playtest-results.json: 18 observed readings used to select compatible multi-axis targets.tests/mobile.html: phone and keyboard-height iframe layout checks, including a synthetic camera fixture that exercises the production zoom component without a physical camera or Jev calls.Browser checks cover live scoring, Enter advancement, retained focus, stale-result protection and mobile layout. Physical iPhone dictation, camera permissions and OS screen recording require device verification. Front-camera failure is handled in the interface; closing it or leaving the page stops camera tracks.
HTML/API responses are uncached; browser modules have immutable version URLs. Application logs include timing, usage and outcome metadata without user text or camera data.
Run scripts/stats.ts in Val Town to inspect durable per-level totals and difficulty breakdowns. analytics.ts stores anonymous level snapshots in this val's SQLite database; /api/events accepts bounded, validated batches. There is no public stats endpoint or new UI. Starts require nonempty text; clears, skips, restarts, and unfinished attempts remain distinct. Exact targets, stage, normal/Hard mode, edits, submissions, active-time estimates, requests, input tokens, final word count, and points are stored without text or IP addresses. Stable level IDs and revisions deduplicate retries/reloads; terminal outcomes survive delayed updates. The browser queues updates locally, batches checkpoints, and attempts delivery on page exit. These are client-reported counts, not an audited leaderboard; blocked storage/network or abrupt device shutdown can lose events.
Historical browser completion/skip totals are recovered once per anonymous browser, separately from new events. This cannot reconstruct the complete pre-tracking total and may include development play. Test with ?analytics=test; those events and simulated mode are excluded from live totals. scripts/test-analytics.ts checks validation, duplicate/out-of-order events and late usage, then removes its synthetic rows. Existing all-time budget calls are scoring requests, not completed levels.
All 16 original classifiers remain identical to Steve's source. Five are game targets; the other 11 still appear in Other classifications. Future difficulty calibration should use target range/width, axes together, and editing mode—not just classifier name. Keep incomplete attempts separate from losses and wait for representative player outcomes before fitting Elo.