ContentVault
Content packs for Lucky Robots. Each pack contains a metadata.yaml, a thumbnail.png, and a .zip with the pack contents.
Clone
git clone https://huggingface.co/luckyrobots/ContentVault
Content Packs
| Pack | Description |
|---|---|
| Bunglalow | Bungalow environment |
| Go2VelocityTracking | Unitree Go2 velocity tracking |
| Loft | Loft environment |
| MujocoExample | MuJoCo simulation example |
| Office | Office environment |
| Oscillator | Oscillator environment |
| Panda | Franka Panda robot |
| Piper | Piper robot |
| PiperBlockStacking | Piper block stacking task |
| PiperPickPlace | Piper pick and place task |
| PiperUnscrewCap | Piper cap unscrewing task |
| PodGallery | Editable native Pod gallery with materials, articulated exhibits and elastic cables (2026.3+) |
| RobotCafe | Path-traced cafe where a Unitree G1 serves coffee to the tables (2026.3+) |
| SO100PickAndPlace | SO-100 pick and place task |
| Skies-Vol-1 | Sky HDRIs volume 1 |
| UnitreeG1 | Unitree G1 humanoid |
| UnitreeGo2 | Unitree Go2 quadruped |
| UnitreeH1 | Unitree H1 humanoid model (developer pack; no controller) |
| UnitreeH2 | Standard Unitree H2 humanoid (developer pack; fixed hands, no controller) |
| UnitreeH2PlusSharpa | Unitree H2 Plus with articulated Sharpa hands (developer pack; no controller) |
| Welcome | Welcome / intro pack |
Pack engine versions
Project and robot packs that require a legacy-to-Pod migration have separate archives for
engines through 2026.2 and for 2026.3 onward. The newer folder and ZIP names append Pod to the
original pack ID, while keeping the same display name and packs/devpacks
membership. For example, CupCleanerPod/CupCleanerPod.zip contains the Pod
version of CupCleaner. Welcome and the existing WelcomePod already form
this pair; both are indexed under packs.
The public robot packs follow the same pairing:
| Legacy pack (before 2026.3) | Pod pack (2026.3 onward) |
|---|---|
| OpenArmPedestal | OpenArmPedestalPod |
| Panda | PandaPod |
| Piper | PiperPod |
| UnitreeG1ThreeFingers | UnitreeG1ThreeFingersPod |
| UnitreeG1FiveFingers | UnitreeG1FiveFingersPod |
| UnitreeGo2 | UnitreeGo2Pod |
| SO100 | SO100Pod |
Robot Pod archives replace .hmograph files with native .hpodgraph motion
graphs. Meshes, policy models, sensor actions and thumbnails are retained.
The Go2 and G1 three-finger models use the policy-aligned motor gains already
shipped in ApiTestsPod, and G1 policy descriptors reference the adjacent
model_config.json.
The two G1 Pod packs use distinct C# namespaces and explicit script actions,
so they can coexist in one project. Embedded scenes retain their existing
script class identities; policy behavior is unchanged.
SO100 reuses the native graph from SO100PickAndPlacePod, including its event
flow and rig-specific IK settings. Archive roots and action path prefixes keep
the original robot ID; the installer resolves them beneath the selected pack's
folder. Both variants retain the same display name.
The migrated projects carry the same base robot files as the standalone Pod
packs. Scene-specific arm controllers are named MG_Panda_Scenario or
MG_Piper_Scenario and keep their existing asset handles and tool-point
conventions. SimplePick retains its calibrated Piper gripper gains, and
RobotCafe retains its grasping-controller gains and finger contact settings;
these are task-specific adaptations. Extra palm sites and scene wrappers are
also retained. WelcomePod's shared authored files match the engine's bundled
Welcome, including analytic marble colliders, free-rolling contacts and the
aligned upper join with a gentle downhill grade. The archive additionally
includes the separate generated-layout experiment.
EngineVersion.Max is exclusive: the original packs use Max: "2026.3"
to include every 2026.2 release. The new packs use Min: "2026.3". Both use
Behaviour: Hide, so incompatible variants disappear instead of becoming disabled
cards. Existing lower bounds on the original packs are preserved.
The developer-only AnymalC, Nero and UnitreeGo2Lidar legacy archives also
stop at 2026.3 because they still contain .hmograph files.
The new archives use Pod motion and animation graphs, retaining asset handles, scene inputs, clip bindings and script controls. Archives retained for legacy engines are unchanged.
SimplePick already uses Pod and remains one pack with Min: "2026.3" and
Behaviour: Hide. BlankProject contains no graphs, remains one pack without
an engine-version restriction, and continues to serve the editor's starter cards.
CDN
All content packs are served globally via Cloudflare CDN:
https://contentvault.luckyrobots.com/{PackName}/{filename}
For example:
https://contentvault.luckyrobots.com/Loft/metadata.yaml
https://contentvault.luckyrobots.com/Loft/Loft.zip
How sync works
A Cloudflare Worker (worker/) listens for webhooks from HuggingFace. When a push is made to this repo, the Worker:
- Parses the commit diff to find changed files
- Streams each file directly to Cloudflare R2 (no buffering, handles large zip files)
- Deletes removed files from R2
- R2 serves the files through Cloudflare's CDN with a 30-day cache at 300+ edge locations worldwide
Worker setup
cd worker
npm install
Secrets (set via wrangler)
npx wrangler secret put HF_WEBHOOK_SECRET
npx wrangler secret put HF_TOKEN
Deploy
npx wrangler deploy
Setup
# Install huggingface_hub with fast upload backend
pip install -U "huggingface_hub[hf_xet]"
# Login (requires write-access token from https://huggingface.co/settings/tokens)
hf auth login
CLI Commands
Upload entire folder
hf upload luckyrobots/ContentVault <local-folder> . --commit-message "Your message"
Upload a single pack/subfolder
hf upload luckyrobots/ContentVault <local-folder>/<pack-name> <pack-name> --commit-message "Add <pack-name>"
Upload a single file
hf upload luckyrobots/ContentVault <local-file> <path-in-repo> --commit-message "Add file"
Upload large folder (resumable, multi-threaded, auto-retry)
hf upload-large-folder luckyrobots/ContentVault <local-folder>
Delete files remotely
hf upload luckyrobots/ContentVault . . --include="" --delete="<folder-name>/*" --commit-message "Remove <folder-name>"
Tips
- Resumable uploads:
upload_large_folderandhf upload-large-folderare resumable. If interrupted, run the same command again. - Don't use raw
git pushfor large files โ use the CLI/API instead. They handle LFS/Xet automatically. - Write token required: Tokens default to read-only. Enable write access at https://huggingface.co/settings/tokens.
- 50 GB max per file on HuggingFace. Split larger files before uploading.
- Ignore patterns: Use
--includeand--excludeto filter what gets uploaded.