
Recording demonstrations means recording a room. What counts as personal data in a LeRobot dataset, which lawful basis fits, how to redact footage, and why publishing is one-way.
What you need to know
- •A camera aimed at a workbench records a room, not a task. Under Article 4(1) GDPR any frame in which a person is identifiable is personal data.
- •Footage is personal data but usually not Article 9 data. Video becomes biometric data only once it is technically processed to identify someone.
- •The household exemption does not cover a camera pointed outward, and never covers publication. Rynes settled that on 11 December 2014.
- •Blurring is a recognised remedy: the EDPB treats irreversible blurring as erasure. It is also destructive, and on a wrist camera it removes the signal the policy learns from.
- •Publishing is close to one-way. We fetched a file at an old commit SHA on a live LeRobot dataset repo and got HTTP 200.
- •AY-Robots records LeRobot datasets and lists public ones, but has no face blurring. Redaction is your job, and cheapest before anything is recorded.
What is actually in the box
Most people picture a demonstration dataset as a robot arm doing a task. It is everything the cameras could see while the arm did it, plus a precise record of when a human was at the desk. Before arguing about lawful bases, walk the LeRobot dataset directory and name what a regulator would be looking at.
| Path in a LeRobot v3.0 dataset | What it holds | What hides in it |
|---|---|---|
| videos/ | MP4 shards, one tree per camera | Faces, hands, tattoos, badges, monitor contents, whiteboards, paperwork, the view out of a window |
| data/chunk-000/file-000.parquet | Per-frame joint states, actions, timestamps | The working rhythm of whoever drove the arm: session start, break length, speed, hesitation |
| meta/tasks.jsonl | Task strings mapped to integer IDs | Whatever the operator typed. Free-text fields collect names and room numbers |
| meta/info.json | Feature schema, fps, codebase version | Camera keys and robot ids that identify a workstation |
| MP4 container tags | creation_time, encoder, sometimes comment and location | Wall-clock timestamps, and coordinates if the camera wrote them |
| Hub commit history | Author username, commit title, timestamp | Who uploaded what and when, readable through the Hub API |
Article 4(1) covers "any information relating to an identified or identifiable natural person". That bar is deliberately low. A colleague reaching into frame to reset a block is identifiable to everyone in that building, and so is the episode timeline saying they did it 180 times on a Tuesday. The frames are the obvious problem. The timestamps are the one people forget.
Article 9 prohibits processing "biometric data for the purpose of uniquely identifying a natural person". In Guidelines 3/2019 (version 2.0, adopted 29 January 2020) the EDPB states at paragraph 74 that "the video footage of an individual cannot however in itself be considered as biometric data under Article 9, if it has not been specifically technically processed in order to contribute to the identification of an individual". Filming a bystander is ordinary personal data. Running face recognition over the frames is not.
Three questions before you press record
1. Is it personal data, and for whom?
Recital 26 puts anonymous information outside the regulation and sets the test: weigh "all objective factors, such as the costs of and the amount of time required for identification, taking into consideration the available technology at the time of the processing". A moving target by design.
Identifiability is also relative to the holder. In EDPS v SRB (C-413/23 P, 4 September 2025) the Court confirmed that pseudonymised data "must not be regarded as constituting, in all cases and for every person, personal data". A stranger downloading your episodes may genuinely not identify the forearm in frame 4,000. Their colleague next door does it instantly, and you plan for the colleague.
2. Which lawful basis are you relying on?
| Basis | Fit for recording demonstrations | The catch |
|---|---|---|
| Art. 6(1)(a) consent | A small team who genuinely chose to be filmed | Withdrawal must be as easy as giving it, which means re-cutting the dataset |
| Art. 6(1)(b) contract | Rarely fits | Recording a bystander is not necessary to perform a contract with them |
| Art. 6(1)(f) legitimate interests | The usual basis for a lab building its own dataset | Needs a documented three-step test and a real interest. The EDPB says it "must not be fictional or speculative" |
| Art. 9(2)(a) explicit consent | Only if you deliberately process special-category data | If you need this, get advice rather than reading a blog post |
| Art. 89 research safeguards | Common for university groups | Relaxes purpose and storage limitation, not the need for a basis |
The three-step test is short enough to keep in a file beside the dataset: identify the interest, show the processing is necessary for it, show it is not overridden by the rights of the people in frame. Necessity is where robot datasets fail, and they fail on camera count. A third camera that sweeps the room while improving the policy by nothing measurable is not necessary, and Article 5(1)(c) says drop it.
3. Do you need a DPIA?
Article 35(1) triggers where processing "is likely to result in a high risk to the rights and freedoms of natural persons", and 35(3)(c) names "a systematic monitoring of a publicly accessible area on a large scale". One SO-100 on a bench in a closed lab is not that. The same rig in a shop or a corridor moves toward it. Article 35(7) lists what the document needs: four bullet points.
The household exemption will not save a lab bench
People building an arm at home reason that the GDPR is for companies and their kitchen is private. In Rynes (C-212/13, 11 December 2014) a man mounted a camera on his own family home after repeated attacks on it. Because it also covered the public footpath, the data protection rules applied to him personally. The EDPB restates this at paragraph 12: a system that "covers, even partially, a public space and is accordingly directed outwards from the private setting" is not a purely personal or household activity.
The second half matters more here. The EDPB cites Lindqvist for the point that the exemption covers private or family life, "which is clearly not the case with the processing of personal data consisting in publication on the internet so that those data are made accessible to an indefinite number of people". Publishing a dataset is exactly that.

Before you press record: the fixes that cost nothing
Everything after this section is repair work, and repair is lossy. The EDPB advises controllers to "consider physical and technical means, for example blocking out or pixelating not relevant areas". In a workspace you have a better option: aim the camera so the irrelevant area is never in frame.
- 1Frame against a wall, not against the room
Put the arm between the camera and a blank surface: pegboard, foam board, a curtain. One afternoon of rearranging removes more personal data than any blurring pipeline.
bash# Preview each camera first, and look past the arm lerobot-find-cameras # writes test frames to lerobot/outputs/captured_images - 2Count your cameras and justify each one
A top view and a wrist view is the common setup. A third camera needs a reason you would write down.
bashlerobot-record \ --robot.type=so101_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_follower_arm \ --robot.cameras="{ top: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30} }" \ --teleop.type=so101_leader \ --teleop.port=/dev/ttyACM1 \ --dataset.repo_id=${HF_USER}/so101_dataset_test \ --dataset.num_episodes=30 \ --dataset.single_task="put the red brick in a bowl" - 3Write the task string as if a stranger will read it
The --dataset.single_task value lands in meta/tasks.jsonl and ships with the dataset. "put the red brick in a bowl" is fine. "sort Dr Weber's samples, bench 3" is a disclosure you will not notice until someone else does.
- 4Tell the room in writing, before the first episode
Guidelines 3/2019 describes two layers: a sign carrying purpose, controller identity and data subject rights, pointing at a fuller notice elsewhere. Paragraph 113 adds that people must be able to tell which area is covered so they can avoid it.
- 5Set the retention period now
Article 5(1)(e) applies to rejected takes too. Sweep them on a schedule.
bashfind ~/lerobot_raw -type d -name 'rectest_*' -mtime +30 -print
The minimum episode count on this platform is 50 for GR00T N1.7, Pi0.5 and ACT, and 30 for SmolVLA. That is a bounded amount of footage of one short repeatable motion. Treat recording as something you switch on and off deliberately, not a camera that lives on the ceiling.
Redacting footage you already have
If the episodes exist and people are in them, three free tools work. The order below runs from least to most destructive to the signal your imitation learning run depends on.
- 1Strip container metadata, because it is free
We tested this: a file tagged with a comment and a location keeps both until stripped, and -map_metadata -1 removes them while leaving major_brand, minor_version, compatible_brands and encoder behind. Harmless residue, but check rather than assume.
bashffprobe -v error -show_entries format_tags -of default in.mp4 ffmpeg -i in.mp4 -map_metadata -1 -c copy out.mp4 ffprobe -v error -show_entries format_tags -of default out.mp4 - 2Mask a fixed region if the problem never moves
A doorway in the corner, a monitor at the edge of frame, a window. For a static region drawbox is exact and provably irreversible. ffmpeg defaults are color=black and thickness=3, so pass t=fill for a solid box rather than an outline.
bashffmpeg -i in.mp4 -vf "drawbox=x=0:y=0:w=200:h=160:color=black:t=fill" -c:a copy out.mp4 # boxblur defaults are luma_radius=2 and luma_power=2, which is far too weak to redact ffmpeg -i in.mp4 -vf "boxblur=luma_radius=20:luma_power=3" out.mp4 - 3Run a face detector if people move through the frame
deface is the pragmatic choice: MIT licensed, pip installable, CenterFace on ONNX Runtime, and it globs directories. The defaults that matter are --thresh 0.2, --mask-scale 1.3 and --replacewith blur. It discards audio by default.
bashpython3 -m pip install deface deface videos/top/chunk-000/*.mp4 \ --replacewith solid \ --mask-scale 1.6 \ --thresh 0.15 - 4Use EgoBlur when faces are small, turned away or motion blurred
EgoBlur (arXiv 2308.13093, August 2023, Apache 2.0) ships two FasterRCNN detectors, face and licence plate, about 400 MB each at roughly 104 million parameters, trained on 23 million images and 790 million boxes. Heavier than deface, better on hard frames.
bashegoblur-gen1 \ --input_video_path episode_000.mp4 \ --output_video_path episode_000_blur.mp4 \ --face_model_path ego_blur_face.jit \ --face_model_score_threshold 0.9 \ --nms_iou_threshold 0.3 \ --scale_factor_detections 1.15 - 5Re-check the format after re-encoding
Rewriting MP4 shards outside the LeRobot tooling is what breaks datasets. Frame counts must still match the offsets in meta/episodes/, and codebase_version must match what the trainer expects.
bashpython3 -c "import json;d=json.load(open('meta/info.json'));print(d['codebase_version'], d['total_episodes'], d['fps'])"
Face detectors produce false positives on skin, on rounded objects, on anything with two dark spots above a lighter region. In a close-up wrist view that is constant, and every false positive blanks part of the region the gripper is closing on. The result is not a crash but a policy that reaches correctly and then fails to grasp, which is far harder to debug. Blur the scene cameras and re-frame the wrist camera instead. See gripper does not close.
- An evening of compute instead of a week of teleoperation
- A recognised remedy: the EDPB treats blurring "with no retroactive ability to recover the personal data that the picture previously contained" as erasure (paragraph 103)
- Auditable. Keep the detector version, thresholds and command line beside the dataset as evidence
- Works on data you inherited, where re-recording is not an option
- Every false positive removes real signal, and they cluster on hands and objects
- Re-encoding costs a generation of quality and can desynchronise frame offsets from meta/episodes/
- It does nothing about timestamps, task strings, room geometry or a face reflected in a polished surface
- You still hold the unblurred originals, so your exposure is unchanged until you delete them
Two ways to run this
Full local control and full responsibility. You own the room, the cameras, the retention schedule and the upload decision. The tooling is open source, but nothing reminds you to use it.
- 1Record, then look before publishing
lerobot-record uploads under the repo id you give it. Inspect the result before treating it as public.
bashlerobot-record \ --robot.type=so101_follower \ --robot.port=/dev/ttyACM0 \ --dataset.repo_id=${HF_USER}/pick_place_private \ --dataset.num_episodes=50 \ --dataset.single_task="put the red brick in a bowl" - 2Audit every camera tree
People wander into shot at episode 34. Sample across the whole set, not just episode zero.
bashfor f in videos/*/chunk-*/*.mp4; do ffmpeg -loglevel error -i "$f" -vf fps=1/10 "audit/$(basename $f .mp4)_%03d.jpg" done - 3Redact, then gate or stay private
Blur with deface, then choose a private repo or a gated public one.
bashdeface videos/top/chunk-000/*.mp4 --replacewith blur --thresh 0.15
The desktop client records LeRobot-format datasets from a leader-follower session, and the training form accepts a Hugging Face repo id or a dataset on your own machine. That second option matters: you can train without publishing anything.
- 1Record, keep the dataset local
Episodes, camera streams and joint states are written in LeRobot format on your machine.
- 2Redact with the same open tools
There is no blur button in the product. deface and ffmpeg run on the same files either way.
- 3Point training at the local dataset
The backend rents a GPU by required VRAM and writes checkpoints to object storage. Your frames go to that pod, which is a transfer you have to accept.
- 4Publish only when you decide to
The public directory is opt-in. Training on a dataset does not list it.
GR00T N1.7, GR00T N1.5 and Pi0.5 are cloud-only here, so choosing one sends footage to a rented A100 or H100. Only ACT and SmolVLA also run locally. Separately, /live streams a physical arm to anyone with no signup. It is a public camera by design.
Publishing: licence, gate, and the delete that is not a delete
Published datasets are how the field moves. DROID gathered 76,000 trajectories and 350 hours across 564 scenes and 84 tasks from 50 collectors, and Open X-Embodiment pooled 60 datasets from 34 labs into over a million trajectories. None of that exists if everyone stays private. The question is what you publish and on what terms.

| Option | Who gets the frames | Good for |
|---|---|---|
| Private repo | You and anyone you add | Anything with identifiable people, and anything you have not audited |
| Gated, automatic approval | Any logged-in user, after sharing username and email | Datasets you want used but want a record of who took them |
| Gated, manual approval | Only people you accept, one at a time | Workplace footage, or anywhere the balancing test was close |
| Public with a licence | Everyone, forever, including mirrors | Datasets recorded against a blank wall with nobody else in the room |
Gating is a few lines of YAML, with one consequence people miss. Hugging Face then collects the username and email of everyone requesting access and hands you a report containing user, fullname, status, email, time and reviewedAt. You solved one problem by creating a smaller one, and you control that list too.
---
license: apache-2.0
gated: true
extra_gated_heading: "Request access to this dataset"
extra_gated_description: "Recorded in a working lab. Access is reviewed manually."
extra_gated_prompt: "You agree not to attempt to identify any person appearing in this footage."
extra_gated_fields:
Institution: text
Country: country
I want to use this dataset for:
type: select
options:
- Research
- Education
- label: Other
value: other
I agree not to redistribute the raw video: checkbox
---We checked this against a live LeRobot dataset repo. Fetching meta/info.json at an old commit SHA instead of main returned HTTP 200 and served the old content. A Hub repo is a git repo, and a commit that removes a file leaves the earlier revision addressable by anyone who noted the SHA. The huggingface_hub API offers super_squash_history, and its docs are blunt: "Once squashed, the commit history cannot be retrieved. This is a non-revertible operation." That handles your copy, not the clones. Article 17 gives a right to erasure; the internet does not.
Does the trained policy still carry the data?
In Opinion 28/2024, adopted 17 December 2024, the EDPB held that AI models trained with personal data "cannot, in all cases, be considered anonymous", and set a two-part test: both the likelihood of extracting personal data directly from the model and of obtaining it from queries must be "insignificant", judged against all the means reasonably likely to be used.
For a manipulation checkpoint emitting joint angles, the risk of reconstructing a face from the weights is low. It is not zero, and not a claim to make casually about a vision-language-action model with a large pretrained backbone. The EDPB's own position is case by case, with the burden on you. A fine-tuning run costs 4 to 12 USD on the A100 tier, so re-running on a cleaned dataset is cheap. Re-recording is not.
When someone else does the recording

Paying people to record changes the analysis twice over. The driver becomes a data subject in an employment relationship, and the per-frame timestamps record their working behaviour. In Germany, section 26(1) BDSG permits processing employee data where necessary for that relationship, and 26(2) requires you to assess whether consent was genuinely voluntary given "the dependency of the employee within the employment relationship". That is the statute warning you that employee consent is weak ground.
Section 87(1) No. 6 of the Betriebsverfassungsgesetz gives the works council a co-determination right over the introduction and use of technical devices designed to monitor employee behaviour or performance. A camera rig recording an employee performing a task, timestamped to the frame, is squarely what this covers. Bring them in at the framing stage, while changing the camera angle is still free.
A second-order point the RoboTurk work hit early: teleoperation means an operator elsewhere sees a live view of your room, which is a real-time disclosure whether or not anything is recorded. If you use remote operators, the operator guide is where to set expectations on both sides.
Where this platform does not help you
It would be convenient to end with a feature that solves this. There is not one, and pretending otherwise would be worse than useless.
- No face detection or blurring. The client records what the cameras see. Redaction happens in your pipeline with deface, EgoBlur or ffmpeg.
- No consent management or signage. No register of who agreed to be filmed, no notice generator. That is a folder and a laminated sheet in your building.
- Cloud training moves your frames. The backend rents a GPU on a spot market and writes checkpoints to object storage. GR00T and Pi0.5 are cloud-only.
- No retention automation for raw takes. Rejected episodes live wherever you put them, and Article 5(1)(e) still applies.
- /live is a public stream by design. A physical arm streams there with no signup. Keep that workspace empty of anyone else.
- Remote inference has a latency ceiling anyway. The control loop runs 20 to 485 ms per action step, and internet round trips turn a working policy into a hesitant one. Fast tasks need inference next to the servos. That is physics, not a privacy feature.
What the platform does give you is the option to train from a dataset on your own machine rather than a published repo, and to run ACT or SmolVLA locally on a 24 GB card. If footage cannot leave the site, that combination is the answer, and the security and dataset documentation are the next pages. If footage cannot contain identifiable people, the answer is upstream, in how you pointed the camera.
Is a robot dataset with people in the background personal data?▾
Yes, if anyone in frame is identifiable. Article 4(1) covers "any information relating to an identified or identifiable natural person". It is ordinary personal data rather than Article 9 data: the EDPB states in Guidelines 3/2019 paragraph 74 that footage is not biometric data unless specifically technically processed to identify someone. The per-frame timestamps are personal data too.
Does blurring faces make the dataset anonymous?▾
It can. The EDPB recognises irreversible blurring as erasure in Guidelines 3/2019 paragraph 103. But Recital 26 judges anonymity against "all objective factors, such as the costs of and the amount of time required for identification". A blurred face on someone in a distinctive uniform, in a room with three employees, is not anonymous to anyone who works there.
Can I rely on consent from my own employees?▾
Be careful. Section 26(2) BDSG requires you to assess whether consent was genuinely voluntary given the dependency inherent in employment, which is a statutory warning that the basis is fragile. Legitimate interests under Article 6(1)(f) with a documented three-step test is usually sounder, and where a works council exists, section 87(1) No. 6 BetrVG gives it a co-determination right.
Do I need a DPIA for one arm and two cameras?▾
Usually not. Article 35(1) triggers on processing likely to result in high risk, and 35(3)(c) names systematic monitoring of a publicly accessible area on a large scale. One SO-100 recording 30 to 50 episodes of a specific motion is not that. It changes if the rig sits in a shop or a corridor, or if the same employees are filmed for weeks.
If I delete the dataset from the Hub, is it gone?▾
Not from history. We verified that fetching a file at an old commit SHA on a live LeRobot dataset repo returns HTTP 200 with the old content after the repo moved on. huggingface_hub offers super_squash_history, whose documentation warns that "this is a non-revertible operation", but nothing reaches copies other people already downloaded.
See what a published robot dataset actually looks like
The public dataset directory lists LeRobot datasets you can inspect, stream and train from. It is also the fastest way to calibrate what you are comfortable publishing: open a few, look at what is in the background, and decide where your own line sits.
Browse the dataset directorySources
- GDPR Article 4: Definitions (personal data, pseudonymisation, biometric data)
- GDPR Article 6: Lawfulness of processing
- GDPR Article 9: Processing of special categories of personal data
- GDPR Article 35: Data protection impact assessment
- GDPR Recital 26: Not applicable to anonymous data
- EDPB Guidelines 3/2019 on processing of personal data through video devices, version 2.0, adopted 29 January 2020
- EDPB Opinion 28/2024 on data protection aspects of AI models, adopted 17 December 2024
- CJEU press release 175/14: Rynes, Case C-212/13, 11 December 2014
- CJEU press release 107/25: EDPS v SRB, Case C-413/23 P, 4 September 2025
- BDSG section 26: Datenverarbeitung fuer Zwecke des Beschaeftigungsverhaeltnisses
- BetrVG section 87: Mitbestimmungsrechte, No. 6 on technical monitoring devices
- ORB-HD/deface: video anonymization by face detection (CenterFace, MIT licence)
- EgoBlur: Responsible Innovation in Aria (Raina et al., arXiv 2308.13093)
- LeRobotDataset v3.0 format and directory layout
- Hugging Face Hub: gated datasets and extra_gated_fields
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started