Simulator · read live at 2026-09-16 04:27 UTC
The rails are deployed. The engine is not.
Every count on this page is a live query, taken when you loaded it. They are zero because nothing has run through these tables, not because something is being kept back — and if that ever changes, this page will say so without anyone editing it.
0
Sessions run
0
Telemetry frames
0
Consent leases
17
Tenants on this instance
The session, played back
Every position below was read out of a camera_pose column in a row that a real session wrote. Press play and it runs at the speed it was recorded, and stops where it stopped.
Playback of 1230 rows, one per frame — nothing is interpolated, so the scrubber lands on a stored row rather than between two. The camera is drawn because the camera is what the data describes: there is no frame engine, so there is nothing for it to be looking at. It ends at 41s because the licence was revoked and the session paused, which is also why the credit count stops at 82 rather than reaching 120. The insert figure reads 0ms on most frames because latency_ms is an integer column and the write finished inside a millisecond — 1,166 of the 1,230 rows rounded to zero, with a 6ms worst case. That is a local socket, not a network, and the column cannot tell you the difference.
The same run, four ways
Rather than draw a session that never happened, we ran one. An isolated Postgres, this schema, 1,230 telemetry rows written and read back, insert latency measured rather than asserted, and a licence revoked at 41 seconds so the session paused the way the code pauses it. The credits and the carbon below come from the platform’s own constants.
It is a local instance, not this one. Production holds the zero above, and every panel says so.
What a telemetry row holds
camera_pose and prompt_event are jsonb — verified live. One column, because a pose is one thing: splitting it across six flat reals makes every read a reassembly and every change a six-column migration.
camera_pose {
"position": { "x": 1.4832, "y": -0.921, "z": -3.4067 },
"rotation": { "qx": 0, "qy": 0.4794, "qz": 0, "qw": 0.8776 },
"fov": 45.0
}
prompt_event {
"triggerIntent": "LIGHTING_SHIFT",
"payload": { "targetLayer": "L2_Lighting",
"modifierPrompt": "transition to sunset rain",
"strength": 0.75 }
}Recorded on a local instance · production holds zero rowsThe trace, read back out of the rows
205 points read back out of camera_pose, from the 1230 rows this session wrote. No AR client exists, so the input was generated — the storage, the jsonb round-trip and this read-back were real.
The debit loop
2 credits per second. The line stops at 41s and 82 credits because the lease was revoked there — it is not drawn to sixty.
co2e_accumulated_g was written on this run — credits_charged × 0.000167, which came to 0.013694 g. That calculation is not in the application; it was done here, by hand, for the run. In production nothing writes the column and it stays null.
Recorded on a local instance · production holds zero rowsWhat a revocation does
Revocation at 41s failed re-validation and the row moved to "paused". Application-level, in session.ts — not a database trigger.
What is deployed
simulator_sessions
One row per streaming session. Carries its own metering rather than deriving it later, so a session abandoned mid-stream has already accounted for itself. co2e_accumulated_g is now written on close — derived from credits at the published constant, not sampled.
job_id · scene_unit_id · status · active_model_id · physics_preset · rolling_window_frames · seconds_metered · credits_charged · co2e_accumulated_g
simulator_telemetry
One row per frame of director input. camera_pose and prompt_event are jsonb — a pose is one thing, and splitting it across six flat columns makes every read a reassembly.
session_id · frame_index · camera_pose (jsonb) · prompt_event (jsonb) · latency_ms
simulator_license_leases
The consent lease. Acquired before a session opens, re-validated on every heartbeat, revoked the moment the licence behind it stops being valid.
session_id · licence linkage · status · closed_at
metering
2 credits per second, charged through the samespend_credits RPC as the rest of the platform. A balance that runs out mid-stream pauses the session in the same call.
What is not built
The frame engine
Autoregressive next-frame prediction. Gated on a real-time world model being rentable at commercial terms — not on our work.
The AR-grip client
No mobile client streams camera pose. The column it would write to exists.
simulator_events
The promptable-event log. Today one event rides on the telemetry row.
On the carbon column
A well-named column is a promise nobody consciously made. co2e_accumulated_g reads like a live meter and is not one. The constant it would use is 0.000167 g per credit, so the figure is a multiplication away from credits_charged. It stays null until a session has actually run, and that constant is a stated assumption rather than a measurement of any GPU we own.
The frame engine is the blocker and it is not ours to unblock. This was built so that the day a real-time world model is rentable, the consent rail, the metering and the telemetry table are already here and only the predictor is new.
VoiceCosmos — Design Director
Tap to speak