File size: 43,951 Bytes
438d6ba
97f9504
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
438d6ba
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>LeRobot v0.7.0</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,600;9..144,800&family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;600&display=swap" rel="stylesheet">
<style>
:root{
  --ink:#111; --muted:#5b5b5b; --line:#e7e2d8; --paper:#fff; --soft:#faf7f1;
  --orange:#ff9d00; --orange-deep:#e07b00; --yellow:#ffd21e; --term:#0f2730;
  --serif:'Fraunces',Georgia,serif; --sans:'Inter',Helvetica,Arial,sans-serif; --mono:'JetBrains Mono',ui-monospace,monospace;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%;background:#fff;overflow:hidden;color:var(--ink);font-family:var(--sans)}
#viewport{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#fff}
#deck{width:1920px;height:1080px;position:relative;transform-origin:center center;flex:none}
.slide{position:absolute;inset:0;padding:70px 120px 60px;display:flex;flex-direction:column;align-items:center;opacity:0;visibility:hidden;transition:opacity .35s ease;background:var(--paper)}
.slide.active{opacity:1;visibility:visible}
.notes{display:none}

/* type */
.title{font-family:var(--serif);font-weight:800;font-size:92px;letter-spacing:-2px;line-height:1.02;text-align:center}
.title.xl{font-size:150px;letter-spacing:-4px}
.subtitle{font-weight:700;font-size:42px;margin-top:14px;text-align:center;letter-spacing:-.5px}
.lede{font-family:var(--serif);font-size:58px;line-height:1.25;text-align:center;font-weight:400}
.hl{color:var(--orange)}
.small{font-size:26px;color:var(--muted)}
.mono{font-family:var(--mono)}
code{font-family:var(--mono);background:#f3efe6;border-radius:8px;padding:2px 10px;font-size:.88em}
.grow{flex:1;min-height:0;width:100%;display:flex;align-items:center;justify-content:center}
.row{display:flex;gap:48px;align-items:center;justify-content:center;width:100%}
.badge{display:inline-flex;align-items:center;gap:10px;background:var(--orange);color:#fff;font-weight:800;font-size:22px;letter-spacing:1.5px;text-transform:uppercase;padding:8px 18px;border-radius:999px}
.badge.corner{position:absolute;top:44px;right:56px}
.badge.ghost{background:#fff3df;color:var(--orange-deep)}
.kicker{font-weight:800;font-size:24px;letter-spacing:3px;text-transform:uppercase;color:var(--orange-deep)}

/* media */
video,.media{border-radius:18px;display:block;object-fit:cover;background:#000}
.media-contain{object-fit:contain;background:transparent}

/* cards */
.cards{display:grid;gap:32px;width:100%}
.card{border:3px solid var(--line);border-radius:22px;padding:34px 36px;background:#fff;display:flex;flex-direction:column;gap:14px}
.card h3{font-family:var(--serif);font-weight:800;font-size:44px;letter-spacing:-.5px;line-height:1.05}
.card .by{font-size:22px;font-weight:700;color:var(--orange-deep);text-transform:uppercase;letter-spacing:1.5px}
.card p,.card li{font-size:26px;line-height:1.38;color:#2b2b2b}
.card ul{padding-left:26px;display:flex;flex-direction:column;gap:8px}
.card .stat{font-family:var(--serif);font-weight:800;font-size:64px;color:var(--orange);line-height:1;letter-spacing:-1px}
.card .stat small{font-family:var(--sans);font-size:22px;color:var(--muted);font-weight:600;letter-spacing:0;display:block;margin-top:6px}
.card.tint{background:var(--soft)}

/* hub cards (slide 2) */
.hub{display:grid;grid-template-columns:repeat(4,1fr);gap:34px;width:100%;margin-top:60px}
.hub .card{padding:0;overflow:hidden;border-width:3px}
.hub .head{padding:22px 28px;font-size:46px;font-weight:600;border-bottom:3px solid}
.hub .body{padding:26px 28px;font-size:26px;line-height:1.4;display:flex;flex-direction:column;gap:16px}
.hub .body b{font-weight:700}

/* workflow */
.wf{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:1fr 1fr;gap:26px;width:100%;margin-top:40px;flex:1;min-height:0}
.wf .step{border-radius:22px;overflow:hidden;display:flex;flex-direction:column;border:3px solid #111}
.wf .step .h{background:var(--orange);color:#111;font-weight:800;font-size:36px;padding:16px 26px;border-bottom:3px solid #111}
.wf .step .b{background:#fff;padding:20px 26px;display:flex;flex-direction:column;gap:8px;flex:1}
.wf .step .b div{font-size:25px;line-height:1.3}
.wf .step .b .new{color:var(--orange-deep);font-weight:700}
.wf .step .b .new::before{content:"NEW ";font-size:16px;letter-spacing:1px;background:var(--orange);color:#fff;border-radius:6px;padding:2px 7px;margin-right:6px;vertical-align:3px}

/* terminal */
.term{background:var(--term);border-radius:22px;padding:30px 40px 36px;color:#e6f1f3;font-family:var(--mono);font-size:34px;line-height:1.6;box-shadow:0 30px 60px rgba(0,0,0,.12)}
.term .dots{display:flex;gap:12px;margin-bottom:18px}
.term .dots i{width:18px;height:18px;border-radius:50%;display:block}
.term .c{color:#6f8f99}
.term .k{color:var(--yellow)}
.term .p{color:#ff7aa8}
.term .s{color:#b6e36b}
.slide.active .term .ln{opacity:0;animation:typein .4s ease forwards}
@keyframes typein{to{opacity:1}}

/* datasets grid */
.dsgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;width:100%}
.ds{border:2px solid var(--line);border-radius:16px;padding:16px 20px;display:flex;flex-direction:column;gap:4px;background:#fff}
.ds .n{font-weight:800;font-size:25px;line-height:1.15}
.ds .o{font-size:18px;color:var(--muted)}
.ds .e{font-size:19px;color:#333}
.ds .m{display:flex;gap:14px;font-family:var(--mono);font-size:19px;margin-top:4px}
.ds .m b{color:var(--orange-deep)}

/* remote inference diagram */
.diag{display:grid;grid-template-columns:1fr 330px 1fr;align-items:center;gap:0;width:100%}
.node{border:3px solid #111;border-radius:24px;padding:30px 34px;background:#fff}
.node h4{font-family:var(--serif);font-weight:800;font-size:44px;margin-bottom:12px}
.node li{font-size:26px;line-height:1.5;list-style:none}
.node li::before{content:"› ";color:var(--orange);font-weight:800}
.node.gpu{background:#fff8ea}
.pipe{display:flex;flex-direction:column;gap:22px;align-items:stretch;padding:0 18px}
.pipe .arrow{font-weight:700;font-size:22px;text-align:center;padding:14px 10px;border-radius:14px;position:relative}
.pipe .arrow.up{background:#f3efe6}
.pipe .arrow.down{background:var(--orange);color:#fff}
.pipe .zen{text-align:center;font-family:var(--mono);font-size:20px;color:var(--muted)}

/* misc */
.bigstats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:30px;width:100%}
.bigstats .card{align-items:flex-start;justify-content:center}
.bigstats .stat{font-size:76px;white-space:nowrap}
.bigstats .stat small{white-space:normal;font-size:24px;line-height:1.3}
.pill-list{display:flex;flex-wrap:wrap;gap:14px;justify-content:center}
.pill-list span{border:2px solid var(--line);border-radius:999px;padding:10px 22px;font-size:26px;font-weight:600}
.sysbox{display:flex;gap:22px;align-items:stretch}
.sysbox > div{flex:1;border-radius:18px;padding:22px 24px}
.s2{background:#fff3df;border:2px solid #ffd59a}
.s1{background:#f3efe6;border:2px solid var(--line)}
.sysbox h5{font-size:22px;letter-spacing:2px;text-transform:uppercase;color:var(--orange-deep);margin-bottom:8px}
.sysbox p{font-size:25px;line-height:1.35}

/* chrome */
#counter{position:fixed;right:18px;bottom:12px;font:600 14px var(--sans);color:#aaa;z-index:5;user-select:none}
#progress{position:fixed;left:0;bottom:0;height:4px;background:var(--orange);z-index:5;transition:width .3s}
#notes-panel{position:fixed;left:16px;right:16px;bottom:16px;max-height:40vh;overflow:auto;background:rgba(17,17,17,.92);color:#fff;font:17px/1.5 var(--sans);padding:18px 22px;border-radius:12px;z-index:10;display:none}
#notes-panel.show{display:block}
#notes-panel b{color:var(--yellow)}
#help{position:fixed;left:18px;bottom:12px;font:500 13px var(--sans);color:#bbb;z-index:5}
</style>
</head>
<body>
<div id="viewport"><div id="deck">

<!-- ============ 1. Hugging Face ============ -->
<section class="slide">
  <div class="title" style="margin-top:30px">Hugging Face</div>
  <div class="subtitle">The AI community building the future</div>
  <div class="grow" style="flex-direction:column;gap:70px">
    <div class="lede">The platform where the machine learning community collaborates<br>on <span class="hl">models</span>, <span class="hl">datasets</span> and <span class="hl">applications</span> (and <span class="hl">hardware</span>&nbsp;!)</div>
    <img src="media/hf-logo.png" alt="Hugging Face logo" style="width:1050px">
  </div>
  <aside class="notes">Unchanged from the previous deck.</aside>
</section>

<!-- ============ 2. The Hub ============ -->
<section class="slide">
  <div class="title" style="margin-top:30px">Hugging Face</div>
  <div class="subtitle">The AI community building the future</div>
  <div class="hub">
    <div class="card" style="border-color:#b8433c;background:#fdf1ef"><div class="head" style="color:#b8433c;border-color:#b8433c;background:#fff">🗄️ Datasets</div><div class="body"><b>Curated datasets for every ML task</b><span>Saves time in data collection and pre-processing</span><span>Built-in viewer to explore the data</span></div></div>
    <div class="card" style="border-color:#5b55d6;background:#f1f0fd"><div class="head" style="color:#5b55d6;border-color:#5b55d6;background:#fff">🧊 Models</div><div class="body"><b>Pre-trained ML models</b><span>Text, audio, image, video… and robot actions</span><span>Dozens of libraries, including Transformers and LeRobot</span></div></div>
    <div class="card" style="border-color:#2f55d4;background:#eef2fd"><div class="head" style="color:#2f55d4;border-color:#2f55d4;background:#fff">🧩 Spaces</div><div class="body"><b>Build, host and share ML apps</b><span>Thousands of ML-powered demos</span><span>Gradio, Streamlit, Docker or static HTML</span></div></div>
    <div class="card" style="border-color:#c98700;background:#fff8ea"><div class="head" style="color:#c98700;border-color:#c98700;background:#fff">🪣 Buckets</div><div class="body"><b>Storage Buckets for big data</b><span>Checkpoints, logs and terabyte-scale datasets</span><span>LeRobot v0.7.0 trains <b>straight from them</b></span></div></div>
  </div>
  <aside class="notes">Added a 4th card for Storage Buckets: it sets up the v0.7.0 "train without downloading" story later on.</aside>
</section>

<!-- ============ 3. LeRobot ============ -->
<section class="slide">
  <div class="title" style="margin-top:30px">LeRobot</div>
  <div class="subtitle">Bringing AI into the real world</div>
  <div class="grow" style="flex-direction:column;gap:80px">
    <div class="lede">Making AI for robotics more accessible<br>with end-to-end learning</div>
    <img src="media/lerobot-logo.png" alt="LeRobot logo" style="width:1000px">
  </div>
</section>

<!-- ============ 4. LeRobot in numbers ============ -->
<section class="slide">
  <div class="title" style="margin-top:30px">LeRobot today</div>
  <div class="subtitle">An open-source home for Physical AI</div>
  <div class="grow">
    <div class="bigstats">
      <div class="card tint"><div class="stat">~300 TB<small>of open Physical AI data on the Hub, in LeRobot format</small></div></div>
      <div class="card tint"><div class="stat">~30k<small>GitHub stars, and counting</small></div></div>
      <div class="card tint"><div class="stat">20k+<small>members on Discord and X</small></div></div>
      <div class="card tint"><div class="stat">v0.7.0<small>From terabytes to prompting robots</small></div></div>
    </div>
  </div>
  <aside class="notes">Numbers from the v0.7.0 changelog: "almost 300 TB", "closing in on 30,000 stars", "passed 20,000 members". Double-check the star count on the day.</aside>
</section>

<!-- ============ 5. Workflow ============ -->
<section class="slide">
  <div class="title" style="font-size:78px;margin-top:10px">LeRobot: an end-to-end Physical AI workflow</div>
  <div class="wf">
    <div class="step"><div class="h">1. Configure robots</div><div class="b"><div>Unified Python API</div><div>Open hardware designs, plug &amp; play</div><div class="new">YAM, reBot B601, Unitree G1 + SONIC</div></div></div>
    <div class="step"><div class="h">2. Teach &amp; teleoperate</div><div class="b"><div>Leader-follower, VR, keyboard, phone</div><div>Record demonstrations in real time</div><div>…in simulation too, same commands</div></div></div>
    <div class="step"><div class="h">3. Build &amp; stream datasets</div><div class="b"><div>Standardized schema, shared on the Hub</div><div>Language annotations (subtasks, VQA…)</div><div class="new">Stream from Hub, Buckets or LanceDB</div></div></div>
    <div class="step"><div class="h">4. Train policies</div><div class="b"><div>ACT, Diffusion, VLAs (π0.5, GR00T, SmolVLA…)</div><div class="new">World action models + 4 new VLAs</div><div class="new">FSDP2 / HSDP, EMA, Trackio</div></div></div>
    <div class="step"><div class="h">5. Deploy</div><div class="b"><div><code>lerobot-rollout</code> on the real robot</div><div class="new">Talk to it: <code>/subtask</code>, <code>/vqa</code>, <code>/autosteer</code></div><div class="new">Remote inference on a GPU server</div></div></div>
    <div class="step"><div class="h">6. Evaluate &amp; improve</div><div class="b"><div>Simulation benchmarks (LIBERO, …)</div><div class="new">One sim core + RoboLab, Wilson error bars</div><div>Reward models to score your data</div></div></div>
  </div>
  <aside class="notes">Rebuilt the workflow graphic so we can flag what changes in v0.7.0 (orange "NEW" lines). The original image is still in media/workflow-original.png if you prefer it.</aside>
</section>

<!-- ============ 6. v0.7.0 at a glance ============ -->
<section class="slide" style="background:linear-gradient(135deg,#fff 0%,#fff8ea 100%)">
  <span class="badge" style="margin-top:20px">LeRobot v0.7.0</span>
  <div class="title" style="margin-top:26px">From terabytes to prompting robots</div>
  <div class="subtitle" style="font-weight:500;color:var(--muted);font-size:36px">Every policy starts as terabytes of demos and ends as a robot following instructions</div>
  <div class="grow">
    <div class="cards" style="grid-template-columns:repeat(3,1fr)">
      <div class="card"><h3>💬 Language in the loop</h3><p>Switch subtasks, ask questions and autosteer a robot <b>while it works</b></p></div>
      <div class="card"><h3>💾 Data at scale</h3><p>Train on the Hub, Storage Buckets or LanceDB <b>without downloading</b></p></div>
      <div class="card"><h3>⚡ Training at scale</h3><p>FSDP2, HSDP, distributed checkpoints, FP16, EMA, Trackio</p></div>
      <div class="card"><h3>🌍 New models</h3><p>4 world action models + 4 VLAs: Cosmos3, FLUX 3 Action, G0.5, LingBot-VLA 2.0…</p></div>
      <div class="card"><h3>🛰️ Remote inference</h3><p>Big model on a GPU, light computer on the robot: <code>lerobot-policy-server</code></p></div>
      <div class="card"><h3>🧪 Sim &amp; hardware</h3><p>Every simulator on one core · YAM, reBot B601, G1 + SONIC</p></div>
    </div>
  </div>
  <aside class="notes">The "what's new" hook. Each tile maps to one section that follows; the NEW badge in the top-right corner marks slides about v0.7.0.</aside>
</section>

<!-- ============ 7. 1 - Robots ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">1 - Robots</div>
  <div class="subtitle">Real robots…</div>
  <div class="grow" style="gap:90px">
    <div style="display:flex;flex-direction:column;align-items:center;gap:18px"><video src="media/so101.mp4" muted loop playsinline preload="metadata" style="width:380px;height:640px"></video><div class="lede" style="font-size:44px">SO-101 Arm</div></div>
    <div style="display:flex;flex-direction:column;align-items:center;gap:18px"><video src="media/lekiwi.mp4" muted loop playsinline preload="metadata" style="width:380px;height:640px"></video><div class="lede" style="font-size:44px">LeKiwi mobile base</div></div>
  </div>
</section>

<!-- ============ 8. Robots NEW ============ -->
<section class="slide">
  <span class="badge corner">New in v0.7.0</span>
  <div class="title" style="margin-top:10px">1 - Robots</div>
  <div class="subtitle">More arms, more humanoids</div>
  <div class="grow">
    <div class="cards" style="grid-template-columns:1fr 1fr 1.25fr">
      <div class="card"><div class="by">I2RT</div><h3>YAM</h3><ul><li>One arm or two: bimanual setups composed from single arms</li><li>Gravity feed-forward from the arm's inertial model</li></ul></div>
      <div class="card"><div class="by">Seeed Studio</div><h3>reBot B601</h3><ul><li>6-DoF arm, paired with the reBot Arm 102 leader</li><li>RobStride <i>or</i> Damiao motors with one <code>motor_family</code> setting, even mixed bimanual</li></ul></div>
      <div class="card tint"><div class="by">Unitree × NVIDIA</div><h3>G1 + SONIC</h3><ul><li>Policy outputs a <b>64-d motion token</b> instead of 29 joint targets</li><li>Onboard decoder → 50 Hz whole-body joint targets</li><li>Works with remote inference: policy on a GPU, decoder on the G1's Jetson</li><li>New <b>23-DoF G1</b> variant (GR00T &amp; Holosoma locomotion)</li></ul></div>
    </div>
  </div>
  <aside class="notes">YAM lands with PR #4855: confirm it's merged before presenting.</aside>
</section>

<!-- ============ 9. 2 - Control ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">2 - Control &amp; teleoperation</div>
  <div class="grow" style="margin-top:30px"><video src="media/teleop.mp4" muted loop playsinline preload="metadata" style="width:1440px;height:810px"></video></div>
</section>

<!-- ============ 10. 3 - Datasets ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">3 - Datasets</div>
  <div class="subtitle">The ChatGPT moment of robotics?</div>
  <div class="grow" style="gap:60px">
    <div style="display:flex;flex-direction:column;align-items:center;gap:10px;width:720px">
      <img src="media/datasets-chart.png" alt="Cumulative number of LeRobot datasets on the Hub over time" style="width:720px">
      <div style="font-family:var(--sans);font-weight:800;font-size:110px;letter-spacing:-3px">~300 TB</div>
      <div class="small">of open Physical AI data in LeRobot format</div>
    </div>
    <video src="media/dataset-viz.mp4" muted loop playsinline preload="metadata" style="width:900px;height:560px;object-fit:contain"></video>
  </div>
  <aside class="notes">Updated "+200 TB" → "~300 TB" (v0.7.0 changelog). The chart is the old one; refresh it if you have a newer screenshot.</aside>
</section>

<!-- ============ 11. Datasets NEW: streaming ============ -->
<section class="slide">
  <span class="badge corner">New in v0.7.0</span>
  <div class="title" style="margin-top:10px">3 - Datasets</div>
  <div class="subtitle">Train on terabytes without downloading them</div>
  <div class="grow" style="flex-direction:column;gap:34px">
    <div class="cards" style="grid-template-columns:repeat(3,1fr)">
      <div class="card"><h3>Disk-less streaming</h3><div class="stat">2.1–2.5×<small>samples/s with 4 DataLoader workers</small></div><p>Fetch only the video byte ranges you need, from the Hub or a Storage Bucket. Every frame once per epoch, deterministic resume.</p></div>
      <div class="card"><h3>LanceDB backend</h3><div class="stat" style="font-size:50px">local-disk speed<small>from object storage, true global shuffle</small></div><p>Lance tables keep the original MP4s as blobs: nothing re-encoded, training starts right away.</p></div>
      <div class="card"><h3>GPU augmentation</h3><div class="stat">2.8× / 3.3×<small>faster ACT training on H100 / A100</small></div><p>Augment once per batch on the GPU, plus 8 robotics-oriented transforms (motion blur, shadows, JPEG…).</p></div>
    </div>
    <div class="term" style="font-size:28px;padding:22px 36px;width:100%">
      <span class="k">from</span> lerobot.datasets <span class="k">import</span> LeRobotDataset<br>
      dataset = LeRobotDataset(<span class="s">"lance-format/pusht-lance"</span>)&nbsp;&nbsp;<span class="c"># same API, Lance under the hood</span><br>
      <span class="c"># or: lerobot-train --dataset.streaming=true --dataset.image_transforms.backend=gpu ...</span>
    </div>
  </div>
</section>

<!-- ============ 12. Datasets: new big datasets ============ -->
<section class="slide">
  <span class="badge corner">New on the Hub</span>
  <div class="title" style="margin-top:10px;font-size:80px">3 - Datasets</div>
  <div class="subtitle" style="font-size:36px">Some of the largest open robot datasets landed in the past months</div>
  <div class="grow">
    <div class="dsgrid">
      <div class="ds"><div class="n">WANDA</div><div class="o">LeCAR Lab (CMU)</div><div class="e">Synthetic demos from 1 real demo/task</div><div class="m"><span><b>~248</b> h</span><span><b>0.27</b> TB</span></div></div>
      <div class="ds"><div class="n">AXIS Franka v2</div><div class="o">AXIS Robotics</div><div class="e">Sim, browser teleop, 1,000+ tasks</div><div class="m"><span><b>~3,300</b> h</span><span><b>11.0</b> TB</span></div></div>
      <div class="ds"><div class="n">OpenNeoData</div><div class="o">NeoteAI</div><div class="e">Visuotactile, 5 platforms + handhelds</div><div class="m"><span><b>5,000+</b> h</span><span><b>9.1</b> TB</span></div></div>
      <div class="ds"><div class="n">HiFi-UMI-2K</div><div class="o">Simple World Lab</div><div class="e">Robot-free capture, 6 camera views</div><div class="m"><span><b>2,000</b> h</span><span><b>16.0</b> TB</span></div></div>
      <div class="ds"><div class="n">PrimeBot Household</div><div class="o">PrimeBot / Swancor</div><div class="e">Laundry &amp; clothes folding, bimanual</div><div class="m"><span><b>700+</b> h</span><span><b>5.2</b> TB</span></div></div>
      <div class="ds"><div class="n">EgoSuite-Open100K</div><div class="o">LightWheel</div><div class="e">Egocentric human video + 3D pose</div><div class="m"><span><b>100,000</b> h</span><span><b>13+</b> TB</span></div></div>
      <div class="ds"><div class="n">EgoSteer-RealWorld</div><div class="o">EgoSteer</div><div class="e">Glove teleop in RGB-D, dexterous hands</div><div class="m"><span><b>192</b> h</span><span><b>3.2</b> TB</span></div></div>
      <div class="ds"><div class="n">RW-RL-HIL</div><div class="o">BodenAI</div><div class="e">Deployments with human takeovers</div><div class="m"><span><b>82</b> h</span><span><b>0.19</b> TB</span></div></div>
      <div class="ds"><div class="n">EgoSteer-Egocentric</div><div class="o">EgoSteer</div><div class="e">3D hand labels for 8 ego datasets</div><div class="m"><span><b>~3,200</b> h</span><span><b>0.40</b> TB</span></div></div>
      <div class="ds"><div class="n">SharpaDex v1.0</div><div class="o">Sharpa Robotics</div><div class="e">Tactile + force, 22-DoF hands</div><div class="m"><span><b>300</b> h</span><span><b>7.7</b> TB</span></div></div>
      <div class="ds"><div class="n">RoboQuest</div><div class="o">DeCLaRe Lab</div><div class="e">Sim, explore-then-act kitchen tasks</div><div class="m"><span><b>366</b> h</span><span><b>0.34</b> TB</span></div></div>
      <div class="ds" style="border-color:var(--orange);background:#fff8ea"><div class="n">FineART</div><div class="o">Scale AI × Hugging Face</div><div class="e">530k+ human-written subtask labels</div><div class="m"><span><b>1,718</b> h</span><span><b>1.9</b> TB</span></div></div>
    </div>
  </div>
  <aside class="notes">In order of release. Real robots, handheld grippers, human video, simulation and live deployments, many beyond RGB (tactile, depth, torques, dense language). FineART is highlighted because it comes back in the "Language in the loop" section.</aside>
</section>

<!-- ============ 13. 4 - Models: ACT ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">4 - Models</div>
  <div class="subtitle">A first step in AI models for robotics</div>
  <div class="grow" style="flex-direction:column;gap:30px">
    <img src="media/act.png" alt="ACT architecture diagram" style="width:1600px">
    <div style="font-weight:800;font-style:italic;font-size:38px;text-align:center">Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware<br>Action Chunking with Transformers (ACT)</div>
  </div>
</section>

<!-- ============ 14. 4 - Models: VLA ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">4 - Models</div>
  <div class="subtitle">Vision-Language-Action models (VLAs)</div>
  <div class="grow" style="flex-direction:column;gap:26px">
    <img src="media/gr00t.png" alt="GR00T N1.7 architecture diagram" style="width:1350px">
    <div style="font-weight:800;font-style:italic;font-size:40px">NVIDIA Isaac GR00T N1.7 - A Foundation Model for Generalist Robots</div>
  </div>
</section>

<!-- ============ 15. 4 - Models: gif ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">4 - Models</div>
  <div class="grow"><img class="media" src="media/models.gif" alt="Policy rollouts from the community" style="width:1500px;height:820px;object-fit:contain;background:transparent"></div>
</section>

<!-- ============ 16. VLAs NEW ============ -->
<section class="slide">
  <span class="badge corner">New in v0.7.0</span>
  <div class="title" style="margin-top:10px">4 - Models</div>
  <div class="subtitle">The VLA zoo keeps growing</div>
  <div class="grow">
    <div class="cards" style="grid-template-columns:repeat(4,1fr)">
      <div class="card"><div class="by">OpenGalaxea</div><h3>G0.5</h3><p>Qwen3.5-2B VLA that <b>thinks out loud</b>: chain of thought (subtask, boxes) and actions in one stream. System 1 or System 2.</p><p class="small">Non-commercial license</p></div>
      <div class="card"><div class="by">Robbyant</div><h3>LingBot-VLA 2.0</h3><p>Qwen3-VL-4B + sparse MoE action expert (32 experts, top-4), 55-d cross-embodiment actions.</p><div class="stat" style="font-size:48px">756 → 120 ms<small>per chunk with CUDA graphs + compile</small></div></div>
      <div class="card"><div class="by">Dexmal</div><h3>DM0.5</h3><p>Gemma3-4B VLM + 680M flow-matching action expert, ported from OpenDM onto standard LeRobot.</p><div class="stat" style="font-size:48px">197/200<small>LIBERO reproduction check</small></div></div>
      <div class="card"><div class="by">X Square Robot</div><h3>Wall-OSS-0.5</h3><p>4B VLA, now native on Transformers. Its VL expert <b>generates text</b>: answers <code>/vqa</code> and plans its own subtasks.</p></div>
    </div>
  </div>
  <aside class="notes">G0.5 lands with PR #4445: confirm before presenting. G0.5 code and weights are under the non-commercial G0.5 Community License, not Apache-2.0.</aside>
</section>

<!-- ============ 17. WAMs NEW ============ -->
<section class="slide">
  <span class="badge corner">New in v0.7.0</span>
  <div class="title" style="margin-top:10px">4 - Models</div>
  <div class="subtitle">World action models: imagine, then act</div>
  <div class="small" style="margin-top:14px;font-size:28px">Predict the future (video or latents) <b>and</b> the next action chunk, together</div>
  <div class="grow">
    <div class="cards" style="grid-template-columns:repeat(4,1fr)">
      <div class="card"><div class="by">NVIDIA</div><h3>Cosmos3</h3><p>Cosmos 3 world foundation models for robots. Nano (16.5B) and Edge (4.6B): full FSDP2 or LoRA fine-tuning.</p><div class="stat">97.9%<small>LIBERO avg. (Nano &amp; Edge)</small></div></div>
      <div class="card"><div class="by">Black Forest Labs</div><h3>FLUX 3 Action</h3><p>Frozen video VAE + text encoder feed a diffusion transformer; only actions come out at inference.</p><div class="stat" style="font-size:44px">base · SO-101 · DROID<small>checkpoints, inference + LoRA</small></div></div>
      <div class="card"><div class="by">RLinf</div><h3>LaWAM</h3><p>Dynamics in latent space: Qwen3-VL backbone, latent action &amp; world model, flow-matching head.</p><div class="stat">98.5%<small>LIBERO (1,970 / 2,000)</small></div></div>
      <div class="card"><div class="by">NVIDIA LongLive</div><h3>Long-WAM</h3><p>Built for long context. IDM imagines future latents without decoding a frame; COD denoises video + actions jointly.</p><div class="stat">99.0%<small>LIBERO avg. (IDM)</small></div></div>
    </div>
  </div>
  <aside class="notes">v0.6.0 brought the first 3 WAMs; v0.7.0 adds 4. Cosmos3 lands with PR #5134, and its LIBERO checkpoints and datasets must be public before presenting. Long-WAM COD: 98.45%.</aside>
</section>

<!-- ============ 18. Training at scale NEW ============ -->
<section class="slide">
  <span class="badge corner">New in v0.7.0</span>
  <div class="title" style="margin-top:10px">4 - Models</div>
  <div class="subtitle">A training stack built for 6B–16B parameter models</div>
  <div class="grow">
    <div class="cards" style="grid-template-columns:1.2fr 1fr 1fr">
      <div class="card tint"><h3>FSDP2, HSDP &amp; distributed checkpoints</h3><p>Sharding, gradient accumulation, PEFT under sharding, and checkpoints that resume on a <b>different number of GPUs</b>.</p>
        <div style="display:flex;gap:30px;margin-top:8px"><div class="stat">3.81×<small>faster checkpoint saves</small></div><div class="stat">42.6 GB<small>peak/GPU on resume (was OOM at 143.8 GB)</small></div></div>
        <p class="small">6B FastWAM on 8×H200</p></div>
      <div class="card"><h3>Large-model recipes</h3><ul><li>FP16 with loss scaling on every topology, one <code>dtype</code> for all policies</li><li>EMA of policy weights</li><li>Warmup-stable-decay schedule</li><li>Fused Adam / AdamW</li></ul></div>
      <div class="card"><h3>Trackio</h3><p>Hugging Face's open-source experiment tracker <b>replaces Weights &amp; Biases</b>.</p><ul><li>No account needed locally</li><li>Syncs to a Space to share</li><li>Records launch command and console output, tracebacks included</li></ul></div>
    </div>
  </div>
  <aside class="notes">W&amp;B integration is removed entirely; the installation docs include a migration table.</aside>
</section>

<!-- ============ 19. Language in the loop NEW ============ -->
<section class="slide">
  <span class="badge corner">New in v0.7.0</span>
  <div class="title" style="margin-top:10px">Talk to your robot</div>
  <div class="subtitle">Language in the loop: interactive rollouts</div>
  <div class="grow" style="gap:60px">
    <div class="term" style="width:1000px">
      <div class="dots"><i style="background:#ff5f57"></i><i style="background:#febc2e"></i><i style="background:#28c840"></i></div>
      <div class="ln" style="animation-delay:.1s"><span class="p">$</span> lerobot-rollout <span class="s">--interactive=true</span> ...</div>
      <div class="ln" style="animation-delay:.5s"><span class="k">/start</span></div>
      <div class="ln" style="animation-delay:.9s"><span class="k">/subtask</span> pick up the red cube</div>
      <div class="ln" style="animation-delay:1.3s"><span class="k">/vqa</span> how many cubes are left?</div>
      <div class="ln c" style="animation-delay:1.7s">&nbsp;&nbsp;→ "Two: one blue, one green."</div>
      <div class="ln" style="animation-delay:2.1s"><span class="k">/autosteer</span> clear the table</div>
      <div class="ln" style="animation-delay:2.5s"><span class="k">/stop</span></div>
    </div>
    <div style="width:600px;display:flex;flex-direction:column;gap:28px">
      <div><div class="kicker">/subtask</div><div style="font-size:30px;line-height:1.35">Switch the instruction on the fly, without stopping</div></div>
      <div><div class="kicker">/vqa</div><div style="font-size:30px;line-height:1.35">Ask the policy what it sees</div></div>
      <div><div class="kicker">/autosteer</div><div style="font-size:30px;line-height:1.35">Hand it a goal, it picks its own subtasks until you take back control</div></div>
      <div class="small">Robot, weights and processors stay loaded between instructions. You can record episodes while you steer.</div>
    </div>
  </div>
  <aside class="notes">The VQA answer line is illustrative. /vqa and /autosteer need a text-generating policy (FineART-VLA, Wall-OSS-0.5, G0.5) or an external VLM planner (next slide).</aside>
</section>

<!-- ============ 20. Language: who does the talking ============ -->
<section class="slide">
  <span class="badge corner">New in v0.7.0</span>
  <div class="title" style="margin-top:10px">Talk to your robot</div>
  <div class="subtitle">Who does the thinking?</div>
  <div class="grow">
    <div class="cards" style="grid-template-columns:1.25fr 1fr 1fr">
      <div class="card tint"><div class="by">Scale AI × Hugging Face</div><h3>FineART-VLA</h3><p>π0.5 + a language head, trained on <b>FineART</b>: 40k+ bimanual episodes, 1.7k+ hours, 530k+ subtask annotations.</p>
        <div class="sysbox"><div class="s2"><h5>System 2</h5><p>Predicts its next subtask in words</p></div><div class="s1"><h5>System 1</h5><p>Flow-matching action expert carries it out</p></div></div>
        <p class="small">Knowledge insulation keeps action training from degrading the VLM.</p></div>
      <div class="card"><h3>External VLM planner</h3><p>Any VLM behind an OpenAI-compatible API: <code>transformers serve</code>, vLLM or Inference Providers.</p><p>Turns "tidy up" into precise instructions your VLA understands, optionally restricted to the subtasks it was trained on.</p></div>
      <div class="card"><h3>Train your own</h3><p>YAML recipes turn <code>lerobot-annotate</code> labels (subtasks, plans, memory, VQA, speech) into chat-style training targets.</p><p>Recipes ship inside the policy config, so training and inference render language the same way. Annotation runs on HF Jobs.</p></div>
    </div>
  </div>
  <aside class="notes">Check the FineART-VLA checkpoint name before presenting: lerobot/FineART-VLA-subtask-midtrained (fineart_vla_base redirects to it).</aside>
</section>

<!-- ============ 21. 5 - Inference ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">5 - Inference</div>
  <div class="grow" style="gap:50px">
    <img class="media" src="media/inference-arms.gif" alt="Bimanual SO arms running a policy" style="width:820px;height:460px">
    <video src="media/inference-humanoid.mp4" muted loop playsinline preload="metadata" style="width:820px;height:460px"></video>
  </div>
</section>

<!-- ============ 22. Remote inference NEW ============ -->
<section class="slide">
  <span class="badge corner">New in v0.7.0</span>
  <div class="title" style="margin-top:10px">5 - Inference</div>
  <div class="subtitle">Big models, light robots: remote inference</div>
  <div class="grow" style="flex-direction:column;gap:36px">
    <div class="diag">
      <div class="node"><h4>🤖 Robot computer</h4><ul><li>Laptop or single-board computer</li><li>Cameras, motors, teleop, recording</li><li>Executes buffered actions</li></ul>
        <div class="term" style="font-size:22px;padding:14px 20px;margin-top:16px;line-height:1.5">lerobot-rollout <span class="s">--inference.type=remote</span> ...</div></div>
      <div class="pipe">
        <div class="arrow up">observations + instructions →</div>
        <div class="zen">Zenoh · TLS · ACL</div>
        <div class="arrow down">← action chunks</div>
      </div>
      <div class="node gpu"><h4>🖥️ GPU server</h4><ul><li>Runs the big VLA / WAM</li><li>Computes the next chunk while the robot moves</li><li>Real-time chunking (RTC) when supported</li></ul>
        <div class="term" style="font-size:22px;padding:14px 20px;margin-top:16px;line-height:1.5">lerobot-policy-server <span class="s">--config_path=server.yaml</span></div></div>
    </div>
    <div class="small" style="font-size:28px;text-align:center">Overlapping inference and execution hides latency · expired steps dropped, overlaps blended · interactive sessions work remotely too</div>
  </div>
  <aside class="notes">Replaces lerobot.async_inference and the lerobot[async] extra, both removed in v0.7.0. Install the "remote" extra instead.</aside>
</section>

<!-- ============ 23. 6 - Benchmark ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">6 - Benchmark</div>
  <div class="grow" style="gap:60px">
    <video src="media/libero.mp4" muted loop playsinline preload="metadata" style="width:900px;height:620px;object-fit:contain"></video>
    <div style="width:700px;display:flex;flex-direction:column;gap:26px">
      <span class="badge" style="align-self:flex-start">New in v0.7.0</span>
      <div><div class="kicker">One simulation core</div><div style="font-size:29px;line-height:1.38">Every simulator behind one vector-env core: batched <code>lerobot-eval</code>, or a sim robot for rollout, recording and teleop. In-process or in Docker via <code>lerobot-env-server</code>.</div></div>
      <div><div class="kicker">RoboLab</div><div style="font-size:29px;line-height:1.38">NVIDIA's 120 tabletop tasks for DROID Franka on Isaac Lab</div></div>
      <div><div class="kicker">Error bars</div><div class="term" style="font-size:21px;padding:14px 20px;line-height:1.5;margin-top:6px">Success rate 90.0% (9/10 episodes,<br>95% Wilson interval 59.6% to 98.2%)</div></div>
    </div>
  </div>
  <aside class="notes">Sim core lands with PR #4888 (RoboLab needs #5194). Optional: mention reward models here: new lerobot-score CLI writes frame-aligned scores to a sidecar, and RynnValue predicts seconds remaining until task completion (only if #4553–#4555 land).</aside>
</section>

<!-- ============ 24. Community ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">What makes LeRobot special?</div>
  <div class="subtitle">Its community, of course!</div>
  <div class="grow" style="gap:50px">
    <video src="media/community.mp4" muted loop playsinline preload="metadata" style="width:1150px;height:700px;object-fit:contain"></video>
    <div style="display:flex;flex-direction:column;gap:30px;width:420px">
      <div class="card tint"><div class="stat">20k+<small>Discord &amp; X members</small></div></div>
      <div class="card tint"><div class="stat">~30k<small>GitHub stars</small></div></div>
      <div class="card tint"><h3 style="font-size:34px">LeRobot LIVE</h3><p style="font-size:22px">First edition on Discord on Oct 8. Next one in December!</p></div>
    </div>
  </div>
</section>

<!-- ============ 25. Possibilities ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">What makes LeRobot special?</div>
  <div class="subtitle">Its endless possibilities</div>
  <div class="grow"><video src="media/possibilities.mp4" muted loop playsinline preload="metadata" style="width:1300px;height:731px"></video></div>
</section>

<!-- ============ 26. Who is using ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">Who is using LeRobot?</div>
  <div class="grow"><img src="media/users.png" alt="Logos of organizations using LeRobot" style="width:1500px"></div>
  <aside class="notes">Consider adding v0.7.0 contributors: Black Forest Labs, RLinf, Robbyant, Dexmal, OpenGalaxea, LanceDB, Alibaba DAMO, Seeed Studio, I2RT…</aside>
</section>

<!-- ============ 27. Get started ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">How to get started?</div>
  <div class="grow" style="flex-direction:column;gap:40px">
    <div class="term" style="width:1350px;font-size:32px">
      <div class="dots"><i style="background:#ff5f57"></i><i style="background:#febc2e"></i><i style="background:#28c840"></i></div>
      <div class="c"># Beginner mode</div>
      <div>pip install lerobot</div>
      <br>
      <div class="c"># Advanced mode</div>
      <div><span class="p">git clone</span> <span class="s">https://github.com/huggingface/lerobot.git</span></div>
      <div><span class="p">cd</span> lerobot</div>
      <div>pip install -e <span class="s">".[many-cool-options]"</span></div>
      <br>
      <div class="c"># New in v0.7.0: talk to your robot</div>
      <div>lerobot-rollout <span class="s">--interactive=true</span> ...</div>
    </div>
    <div class="lede" style="font-size:46px">And let's go 🚀</div>
  </div>
  <aside class="notes">v0.7.0 ships with PyTorch 2.15 and one CUDA 13 build from PyPI for both uv sync and pip install (lands with #5210).</aside>
</section>

<!-- ============ 28. More than LeRobot ============ -->
<section class="slide">
  <div class="title" style="margin-top:10px">More than just LeRobot</div>
  <div class="grow" style="flex-direction:column;gap:40px">
    <img src="media/reachy-duck.png" alt="Reachy Mini and a duck-shaped biped robot" style="width:1050px">
    <div class="pill-list"><span>LeLab</span><span><code>@huggingface/lerobot</code> for JavaScript</span><span>Machine-translated docs</span><span>Third-party hardware &amp; integrations</span></div>
  </div>
</section>

<!-- ============ 29. Thank you ============ -->
<section class="slide">
  <div class="grow" style="flex-direction:column;gap:50px">
    <div class="title xl">Thank you</div>
    <img src="media/lerobot-logo.png" alt="LeRobot logo" style="width:620px">
    <div class="small" style="font-size:30px">github.com/huggingface/lerobot · huggingface.co/lerobot</div>
  </div>
</section>

</div></div>

<div id="progress"></div>
<div id="counter"></div>
<div id="help">← → navigate · F fullscreen · N notes</div>
<div id="notes-panel"></div>

<script>
(function(){
  var deck=document.getElementById('deck'), slides=[].slice.call(document.querySelectorAll('.slide'));
  var counter=document.getElementById('counter'), progress=document.getElementById('progress'), notes=document.getElementById('notes-panel'), help=document.getElementById('help');
  var i=0;
  function fit(){var s=Math.min(window.innerWidth/1920,window.innerHeight/1080);deck.style.transform='scale('+s+')';}
  function show(n){
    i=Math.max(0,Math.min(slides.length-1,n));
    slides.forEach(function(s,k){
      var on=k===i; s.classList.toggle('active',on);
      s.querySelectorAll('video').forEach(function(v){ if(on){v.currentTime=0;var p=v.play();if(p&&p.catch)p.catch(function(){});} else v.pause(); });
    });
    counter.textContent=(i+1)+' / '+slides.length;
    progress.style.width=((i+1)/slides.length*100)+'%';
    var nt=slides[i].querySelector('.notes');
    notes.innerHTML='<b>Slide '+(i+1)+'</b> · '+(nt?nt.innerHTML:'<i>No notes</i>');
    if(location.hash!=='#'+(i+1)) history.replaceState(null,'','#'+(i+1));
  }
  document.addEventListener('keydown',function(e){
    if(['ArrowRight','PageDown',' ','Enter'].indexOf(e.key)>=0){e.preventDefault();show(i+1);}
    else if(['ArrowLeft','PageUp','Backspace'].indexOf(e.key)>=0){e.preventDefault();show(i-1);}
    else if(e.key==='Home')show(0); else if(e.key==='End')show(slides.length-1);
    else if(e.key==='f'||e.key==='F'){ if(!document.fullscreenElement)document.documentElement.requestFullscreen&&document.documentElement.requestFullscreen(); else document.exitFullscreen(); }
    else if(e.key==='n'||e.key==='N'){notes.classList.toggle('show');}
  });
  document.getElementById('viewport').addEventListener('click',function(e){ if(e.clientX<window.innerWidth/4)show(i-1); else show(i+1); });
  var tx=null; document.addEventListener('touchstart',function(e){tx=e.touches[0].clientX;},{passive:true});
  document.addEventListener('touchend',function(e){if(tx===null)return;var dx=e.changedTouches[0].clientX-tx;if(Math.abs(dx)>40)show(i+(dx<0?1:-1));tx=null;});
  setTimeout(function(){help.style.opacity='0';help.style.transition='opacity 1s';},4000);
  window.addEventListener('resize',fit); fit();
  var h=parseInt(location.hash.slice(1),10); show(isNaN(h)?0:h-1);
})();
</script>
</body>
</html>