Playground/Games & simulations/Jev plays Doom
API ACTIVITY

Usage & budget

PLAYGROUND SAFETY LIMITS

Steady requests. Visible limits.

0 active · 0/20 queued

Browser: one start every 1.2 seconds (at most 50/minute), up to 2 active calls and 20 waiting. Shared by examples in this tab. Waiting requests cancel when their run is stopped; a full queue rejects new work without an API call.

Server: 60 requests per rolling 60 seconds and 2 concurrent calls per key, per server instance. Other tabs using the same key share that instance’s allowance. This in-memory safeguard resets on restart and is not a distributed or account-wide quota.

Source: playground policy in lib/requestRateLimit.ts. TypeSafe may impose separate limits. Provider HTTP 429 pauses calls until its reported reset; without a reset time, retry requires your action. HTTP 402 is a budget/billing failure, not a pacing limit. No automatic retries or background replay.

Your TypeSafe API key

Import your key to override the shared server default.

Saved on this browser until removed or site data is cleared. Masked on screen; sent only with Jev requests through this app. The saved value is never displayed.

Connecting
Reactive decisions · browser arena

JevDoom.

Ten actions. One tiny decision at a time. Play the first-person 3D shooter, then hand the controls to Jev.

WORKSPACE GUIDE

Jev plays Doom

Enter JevDoom’s fullscreen 3D arena and compare human, Jev and random play.

Arena stateAllowed actionsOne game tick

What you provide

An original arena, controller mode, and structured game state. Human play uses keyboard or touch controls.

What happens

Jev chooses among permitted actions, or a human or seeded random controller drives the simulation. Game rules apply the action to the current state.

What you get

The arena view, run statistics, and a decision log. Jev receives structured observations rather than screenshots.

Walk through a run

  1. 01

    Enter the arena

    Play with the keyboard or touch controls; fullscreen is available.

  2. 02

    Compare controllers

    Switch between human, Jev, and seeded random control.

  3. 03

    Inspect a decision

    Pause and review the observed state, permitted action, and run log.

Try this

Play a few steps, pause to inspect the state, then compare Jev and random controllers under the same setup.

Execution limits

JevDoom is an original game with no Doom engine or assets. Jev sees structured state, not screenshots.

Explore the example. Check the evidence.
JevDoom✦TINY BOT. BIG TROUBLE.
SECTOR 01 • A LITTLE CHAOS, CLASSIFIED.TypeSafe AI · Powered by Jev
Who is in control?
JEV / SECTOR 01PAUSED · HUMAN
Initializing 3D arena…
Tactical map+A+A
HEALTH 100AMMO 32KILLS 0/5
Seed 7 · tick 0

Focus the arena: W/S move · A/D strafe · Q/E or ←/→ turn · Space shoot · F door · R item. Drag the 3D view to turn; click or tap to fire.

Changing controls or chaos starts a fresh run. The optional tactical map shows the whole arena; Jev gets only the inspectable visibility features. No Doom assets or emulator are required.

Inside the decision

Your latest actionIdleNo model call
Decision latency (batch)—
Classifications / second—
Blink challenge200ms target

Jev waits for each response, then applies one action. Turns toward a visible enemy stop at its bearing; Jev still chooses when to turn and shoot. Throughput = valid classifications ÷ elapsed request time, including the safety queue and network. The 200ms target is a demo challenge, not a claim about human perception. One newest decision can control the arena per batch.

Switch to Jev control to watch live classification.

All ten allowed actions

Move forward
—
Move backward
—
Strafe left
—
Strafe right
—
Turn left
—
Turn right
—
Shoot
—
Open door
—
Use nearby item
—
Idle
—
Inspect exactly what Jev sees No request yet

Deterministic geometry supplies these features. Jev receives no pixels, source code, or hidden map. Visible targets must be within eight tiles, a 90° horizontal field of view, and an unobstructed line of sight.

enemy_visibletrue
enemy_distancemedium
enemy_angle_degrees0
enemy_bearingcenter
health_pct100
ammo_pct80
wall_aheadfalse
wall_leftfalse
wall_rightfalse
door_aheadfalse
item_visiblefalse
item_nearbyfalse
item_kindnone
item_bearingnone
last_actionidle
Current live features
{
  "enemy_visible": true,
  "enemy_distance": "medium",
  "enemy_angle_degrees": 0,
  "enemy_bearing": "center",
  "health_pct": 100,
  "ammo_pct": 80,
  "wall_ahead": false,
  "wall_left": false,
  "wall_right": false,
  "door_ahead": false,
  "item_visible": false,
  "item_nearby": false,
  "item_kind": "none",
  "item_bearing": "none",
  "last_action": "idle"
}
Decision trace 0 batches

Only the newest frame may set the action, and only while it is still current. Simulation waits during the request. Each accepted choice executes once; earlier frames are classification samples, never queued controls. The last eight batches are retained.

Same arena. Three controllers.

Kills0
Damage taken0
Time survived0.0s
Shot accuracy—
ControllerKillsDamageSurvivalAccuracyJev decisions/s
Human ————No model call
Jev —————
Random ————No model call

Same seed, 200ms simulation ticks, 90s simulation limit. Jev pauses the simulation while awaiting each decision; API wait time does not count as survival. Its chosen turns use visible-target precision. Human and random controls run continuously. These are session observations, not a controlled model benchmark. Jev decisions/s counts valid frame classifications per second of elapsed request time, including the safety queue and network; only the newest frame can control the arena. Switching mode saves this run and resets the arena.