Streams
One bundle holds one world and one PT day. Each stream is a folder of segments with a manifest beside them.
| stream | records | framing | path in a bundle | what it holds |
|---|
| p1-in | capture-p1/2 | p1-frames-dt, zstd | p1-in/<player>/<session>/ | the packets one player's client sent through the door in one session: movement, chat, interaction; for a Bedrock player (the session manifest's edition is bedrock), the Java packets Geyser on the door made from the Bedrock client's input, not the Bedrock packets |
| p1-out | capture-p1/2 | p1-frames-dt, zstd | p1-out/<player>/<session>/ | the packets the door sent that player: chunks and entities by reference, state changes; for a Bedrock player, the Java packets Geyser on the door received to translate for the Bedrock client |
| p2 | capture-p2/1 and capture-p2-plugin/1 | JSON lines, zstd | p2/<world>/<run>/ | player actions the server saw: blocks, inventory, items, entities, trades, deaths, teleports, commands; plugin events by kind |
| p3 | capture-p3/1 | JSON lines, zstd | p3/<world>/<run>/ | a census each interval: every entity's position and, for players, their id |
| p4 | capture-ctl/1 | JSON lines, zstd | p4/<world>/<run>/ | pins: each world save with the players present, and the run's control frames |
| p5 | capture-p5/1 | JSON lines, zstd | p5/<player>/<session>/ | chat lines one accepted adult typed in one door session, each after the scrubber replaced personal information by placeholders (the record's body is ChatLine); a line the scrubber dropped, or that could not reach it, has no record |
| chunks and blobs | sha256-named | zstd | chunks/<sha256>.zst, blobs/<sha256>.zst | the chunk and blob payloads the P1 frames reference by hash |
Versions
P1 is recorded at the client protocol in the table, whatever version the world runs. P2, P3 and P4 are recorded on every Minecraft version listed, and each run’s manifest names its version in game_version. A run with no game_version was recorded before the field existed, on 26.3.
| Minecraft version of the world | data version | P1 client protocol | P1 client |
|---|
| 26.3 | 5023 | 777 | Minecraft 26.3 |
| 1.21.11 | 4671 | 777 | Minecraft 26.3 |
| 26.2 | 4903 | 777 | Minecraft 26.3 |
| 1.21.1 | 3955 | 767 | Minecraft 1.21.1 |
The record line
Every P2, P3 and P4 record is one JSON line with these fields, then the fields its type carries. Player ids in a bundle are pseudonyms, the same id for a player on every day.
| field | type | meaning |
|---|
| schema | string | the record schema: capture-p2/1, capture-p2-plugin/1, capture-p3/1 or capture-ctl/1 |
| server_tick | integer | the server tick the record was taken on |
| wall_ns | integer | wall-clock time in nanoseconds since the Unix epoch |
| community | string | the world's id |
| world | string | the Minecraft world name |
| placement_generation | integer | the generation of the placement that ran the world |
| writer_instance | string | the writer that recorded the run |
| run_id | string | the run the record belongs to |
| type | string | a P2 event type, or kind: a plugin event kind, each listed below |
| player_uuid | string | the subject; in a dataset bundle a pseudonym of the form p:<32 hex> |
| opt_in, level, world_age, then the type's fields | varies | the subject's consent at the time, the level name, the world age in ticks, then the fields the type carries (pos, block, item, entity, target) |
P2 event types
The type field of a capture-p2/1 record is one of these.
advancementbed_enterbed_leaveblock_breakblock_multi_placeblock_placebucket_emptybucket_fillcommanddimension_changeentity_damageentity_damage_by_entityentity_deathentity_interactentity_spawninventory_clickinventory_closeinventory_openitem_dropitem_moveitem_pickupplayer_deathplayer_killplayer_quitplayer_respawnpokemon_battle_endpokemon_battle_startpokemon_capturepokemon_evolvepokemon_hatchpokemon_receivepokemon_traderecording_startteleporttradetrade_select
Plugin event kinds
A capture-p2-plugin/1 record carries one of these kinds in its kind field, with the payload fields listed; a trailing question mark marks an optional field. Types: str, int, num, bool, uuid, loc (world, x, y, z), item, items (item and count), obj, list, enum.
Plugin record types
The type field of a plugin record is one of these.
Envelope and manifests
When the recorder relays a record it wraps the line in RecordingEvent; each stream folder carries a RunManifest (server runs) or a SessionManifest (door sessions) whose segments are CaptureSegment rows; a PinRecord marks a world save. Field types come from the recorder’s JSON Schema.
CaptureSegment
| field | type | present |
|---|
| blob_refs | integer | always |
| bytes | integer | always |
| chunk_refs | integer | always |
| first_tick | integer or null | optional |
| first_wall_ns | integer or null | optional |
| gaps | list of CaptureGap | always |
| generation | integer | always |
| last_tick | integer or null | optional |
| last_wall_ns | integer or null | optional |
| mono_ns_start | integer | always |
| name | string | always |
| packets | integer | always |
| placement_generation | integer | always |
| raw_bytes | integer | always |
| records | integer | always |
| seq | integer | always |
| sha256 | Sha256 | always |
| t0_ms | integer or null | optional |
| wall_ns_start | integer | always |
ChatLine
| field | type | present |
|---|
| placeholders | object | always |
| scrubber_version | string | always |
| text | string | always |
| world | string | always |
PinRecord
| field | type | present |
|---|
| opt_in | boolean | always |
| pin_id | string | always |
| player_uuids | list of string | always |
| reason | string | always |
| save_ms | integer or null | optional |
| saved | boolean | always |
| wall_ns | integer | always |
| world_saved_tick | integer or null | optional |
| world_saved_wall_ns | integer or null | optional |
RecordingEvent
| field | type | present |
|---|
| body | any JSON | always |
| line | integer | always |
| player_uuid | string or null | optional |
| stream | Stream | always |
| tick | integer or null | optional |
| wall_ns | integer | always |
RunManifest
| field | type | present |
|---|
| closed | boolean | always |
| community | string | always |
| end | CaptureEnd or null | optional |
| game_version | GameVersion | optional |
| gaps | integer | always |
| orphans | list of CaptureOrphan | always |
| pins | list of PinRecord | always |
| producer_lines | integer | always |
| records | integer | always |
| run_id | string | always |
| segments | list of CaptureSegment | always |
| sequence | integer | always |
| stream | Stream | always |
| world | string | always |
| writer_instance | string | always |
SessionManifest
| field | type | present |
|---|
| bytes | integer | always |
| closed | boolean | always |
| edition | Edition or null | optional |
| end | SessionEnd or null | optional |
| opt_in | boolean or null | optional |
| player_uuid | string | always |
| protocol | integer | optional |
| segments | list of SessionSegment | always |
| world | string | always |