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.

frame 0 / 1229
t 0.00s
pos 0, 1, -3
quat 0, 0, 0, 1
insert 3ms (stored)
credits 0
41s recorded

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.

isolated local postgres 14.15 — production holds zero rows

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 rows

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

x / y translation, metresRecorded on a local instance · production holds zero rows

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.

82 credits at 41s, then revokedsession elapsed, seconds

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 rows

What a revocation does

Revocation at 41s failed re-validation and the row moved to "paused". Application-level, in session.ts — not a database trigger.

licence revokedlease activesession pausedRecorded on a local instance · production holds zero rows

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

Studio Munich Assistant
VoiceCosmos
Studio Assistant
Back to top