Track changes for robot training data.
Real pre-computed results · this page runs no code
Compare two versions of a LeRobot dataset and see exactly which episodes changed.
Run it locally:
pip install robot-data-diff robot-data-diff diff lerobot/pusht@855546dc lerobot/pusht@main
Give the tool two versions of a dataset. It compares them episode by episode and sorts every episode into Added, Removed, Changed, or Unchanged.
This page shows real, pre-computed diffs — the same reports the tool produces. It cannot run a new pair in the browser (this is a free Static Space: pages only, no Python). To diff your own pair, run it locally:
50 → 50 · 0 added · 0 removed · 50 changed · 0 unchanged. Two joint dims remapped on every episode.
One block per episode — all 50 changed.
Changed: 50 Unchanged: 0
dim 1: v3 = 90 − v2 new value = 90 minus the old value
dim 2: v3 = v2 − 90 new value = the old value minus 90
Dims 0, 3, 4, 5 did not change — identical in v2.1 and v3.0.
========================================================================
robot-data-diff — episode-aware dataset diff
========================================================================
A: lerobot/svla_so100_pickplace@a440cbb2 (v2.1, 50 episodes, 30 fps)
B: lerobot/svla_so100_pickplace@main (v3.0, 50 episodes, 30 fps)
Episodes: 50 -> 50 (+0 added, -0 removed, ~50 changed, =0 unchanged)
CHANGED EPISODES (50):
[ep 0] length 454 -> 454 (+0 frames)
d(action_min) [+0.0000, -184.5703, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -184.5703, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -213.7291, -89.9998, +0.0000, +0.0001, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 1] length 468 -> 468 (+0 frames)
d(action_min) [+0.0000, -178.0664, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -178.0664, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -204.3904, -89.9998, +0.0000, -0.0000, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 2] length 420 -> 420 (+0 frames)
d(action_min) [+0.0000, -192.5684, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -192.5684, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -224.8841, -89.9997, +0.0000, +0.0002, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 3] length 416 -> 416 (+0 frames)
d(action_min) [+0.0000, -179.3848, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -179.3848, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -208.7897, -89.9999, +0.0000, -0.0000, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 4] length 401 -> 401 (+0 frames)
d(action_min) [+0.0000, -195.9961, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -195.9961, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -227.6912, -89.9998, +0.0000, -0.0001, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 5] length 354 -> 354 (+0 frames)
d(action_min) [+0.0000, -190.9863, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -190.9863, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -223.9423, -89.9999, +0.0000, +0.0000, -0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 6] length 357 -> 357 (+0 frames)
d(action_min) [+0.0000, -180.7910, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -180.7910, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -219.5686, -89.9998, +0.0000, +0.0000, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 7] length 351 -> 351 (+0 frames)
d(action_min) [+0.0000, -180.9668, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -180.9668, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -221.6553, -89.9998, +0.0000, +0.0000, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 8] length 368 -> 368 (+0 frames)
d(action_min) [+0.0000, -186.5918, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -186.5918, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -216.8870, -89.9997, +0.0000, +0.0000, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 9] length 388 -> 388 (+0 frames)
d(action_min) [+0.0000, -181.9336, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -181.9336, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -213.1301, -89.9998, +0.0000, +0.0000, -0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 10] length 364 -> 364 (+0 frames)
d(action_min) [+0.0000, -161.6309, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -161.6309, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -172.2101, -90.0000, +0.0000, -0.0000, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 11] length 377 -> 377 (+0 frames)
d(action_min) [+0.0000, -166.3770, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -166.3770, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -197.8757, -89.9999, +0.0000, -0.0001, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 12] length 369 -> 369 (+0 frames)
d(action_min) [+0.0000, -157.1484, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -157.1484, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -188.0868, -89.9998, +0.0000, +0.0001, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 13] length 357 -> 357 (+0 frames)
d(action_min) [+0.0000, -164.8828, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -164.8828, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -206.6688, -89.9999, +0.0000, +0.0000, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 14] length 375 -> 375 (+0 frames)
d(action_min) [+0.0000, -163.4766, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -163.4766, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -200.9436, -89.9999, +0.0000, +0.0000, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 15] length 384 -> 384 (+0 frames)
d(action_min) [+0.0000, -167.9590, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -167.9590, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -203.6738, -89.9998, +0.0000, +0.0001, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 16] length 365 -> 365 (+0 frames)
d(action_min) [+0.0000, -164.1797, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -164.1797, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -191.1779, -89.9999, +0.0000, -0.0000, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 17] length 409 -> 409 (+0 frames)
d(action_min) [+0.0000, -156.7090, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -156.7090, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -187.6610, -89.9998, +0.0000, -0.0001, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 18] length 385 -> 385 (+0 frames)
d(action_min) [+0.0000, -167.2559, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -167.2559, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -196.9664, -89.9999, +0.0000, +0.0000, -0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 19] length 367 -> 367 (+0 frames)
d(action_min) [+0.0000, -173.7598, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -173.7598, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -206.0649, -89.9998, +0.0000, +0.0000, +0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 20] length 366 -> 366 (+0 frames)
d(action_min) [+0.0000, -190.7227, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -190.7227, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -223.5961, -89.9997, +0.0000, +0.0000, -0.0000]
d(idle_ratio) +0.0000
d(spikes) +0
[ep 21] length 370 -> 370 (+0 frames)
d(action_min) [+0.0000, -188.9648, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_max) [+0.0000, -188.9648, -90.0000, +0.0000, +0.0000, +0.0000]
d(action_mean) [+0.0000, -222.3631, -89.9997, +0.0000, +0.0000, +0.0000]
d(idle_ratio) +0.0000
… (full per-episode list truncated for the page — run the tool locally for the complete report.)
50 → 50 · 0 added · 0 removed · 0 changed · 50 unchanged. A bit-perfect migration.
One block per episode — all 50 unchanged.
Changed: 0 Unchanged: 50
========================================================================
robot-data-diff — episode-aware dataset diff
========================================================================
A: lerobot/svla_so101_pickplace@50920d7c (v2.1, 50 episodes, 30 fps)
B: lerobot/svla_so101_pickplace@main (v3.0, 50 episodes, 30 fps)
Episodes: 50 -> 50 (+0 added, -0 removed, ~0 changed, =50 unchanged)
No changed episodes (same index + identical stats).
TASK INVENTORY (episodes per task: A -> B):
pink lego brick into the transparent box 50 -> 50
Schema: identical feature sets.
QUALITY SUMMARY (heuristic, CPU-only):
mean idle-frame ratio: 0.2302 -> 0.2302 (+0.0000)
total action spikes: 14 -> 14 (+0)
========================================================================
206 → 206 · 0 added · 0 removed · 206 flagged · 0 unchanged — but only the task-label formatting changed; the episode data is untouched.
One block per episode — all 206 flagged (labels only).
Changed: 206 Unchanged: 0
========================================================================
robot-data-diff — episode-aware dataset diff
========================================================================
A: lerobot/pusht@855546dc (v2.1, 206 episodes, 10 fps)
B: lerobot/pusht@main (v3.0, 206 episodes, 10 fps)
Episodes: 206 -> 206 (+0 added, -0 removed, ~206 changed, =0 unchanged)
CHANGED EPISODES (206):
[ep 0] length 161 -> 161 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 1] length 118 -> 118 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 2] length 141 -> 141 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 3] length 159 -> 159 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 4] length 159 -> 159 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 5] length 157 -> 157 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 6] length 69 -> 69 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 7] length 169 -> 169 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 8] length 80 -> 80 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 9] length 134 -> 134 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 10] length 188 -> 188 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 11] length 149 -> 149 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 12] length 140 -> 140 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 13] length 125 -> 125 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 14] length 107 -> 107 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 15] length 153 -> 153 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 16] length 126 -> 126 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 17] length 102 -> 102 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 18] length 86 -> 86 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 19] length 75 -> 75 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 20] length 142 -> 142 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 21] length 115 -> 115 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 22] length 109 -> 109 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 23] length 110 -> 110 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 24] length 98 -> 98 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 25] length 133 -> 133 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 26] length 158 -> 158 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 27] length 112 -> 112 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 28] length 107 -> 107 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 29] length 115 -> 115 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 30] length 84 -> 84 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 31] length 95 -> 95 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 32] length 148 -> 148 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 33] length 120 -> 120 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 34] length 142 -> 142 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 35] length 143 -> 143 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 36] length 142 -> 142 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 37] length 121 -> 121 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 38] length 186 -> 186 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 39] length 99 -> 99 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 40] length 139 -> 139 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 41] length 73 -> 73 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 42] length 136 -> 136 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 43] length 118 -> 118 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 44] length 127 -> 127 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 45] length 152 -> 152 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 46] length 83 -> 83 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 47] length 109 -> 109 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 48] length 138 -> 138 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 49] length 83 -> 83 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 50] length 69 -> 69 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 51] length 73 -> 73 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 52] length 136 -> 136 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 53] length 173 -> 173 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 54] length 205 -> 205 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 55] length 106 -> 106 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 56] length 105 -> 105 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 57] length 83 -> 83 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 58] length 118 -> 118 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 59] length 122 -> 122 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 60] length 60 -> 60 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 61] length 150 -> 150 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 62] length 67 -> 67 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 63] length 140 -> 140 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 64] length 103 -> 103 (+0 frames)
tasks: ["['Push the T-shaped block onto the T-shaped target.']"] -> ['Push the T-shaped block onto the T-shaped target.']
[ep 65] length 166 -> 166 (+0 frames)
… (full per-episode list truncated for the page — run the tool locally for the complete report.)