The robotheca.yaml guide
robotheca.yaml is a small file at the root of a robot's repository. It describes the robot in a standard way, so that any website or tool, starting with Robotheca, can understand it: what it is, what it costs, how hard it is, under which licenses, and where its files are.
robotheca.yaml version 1.0. Last updated: 8 November 2026. The full text of the standard: the robotheca.yaml specification.
Make my robotheca.yaml
Paste your repository: Robotheca reads it as its import does and proposes your file, ready to check and copy. What your files do not say is left for you to fill in.
What it is and where it goes
Put it at the root of the repository, named robotheca.yaml in lower case. Robotheca does not look for it in a folder, or under another name such as robotheca.yml.
Its first name was robot.yaml. A file with that name is still read, the same way, and always will be. When a repository has both, Robotheca reads robotheca.yaml. Another tool, Robocorp, also uses the name robot.yaml for software robots: such a file does not describe a robot, and Robotheca leaves it out.
It is a YAML file of at most 64 KB. Your files stay in the repository: robotheca.yaml only says where they are, by their paths.
category and difficulty take fixed English values, so that tools can filter and compare robots. Only the fields on this page are allowed: an unknown field, or a typo such as summery, makes the file invalid.
The format is versioned: format_version is required. The current version is 1.0. Files written for 0.1 stay valid, forever; the fields marked “New in 1.0” need format_version: "1.0".
You don't need a robotheca.yaml to import a robot: without one, Robotheca reads the files and the README (section F). And you don't have to write it by hand: once you have published your own robot, the import's last step offers its robotheca.yaml to download and add to your repository.
Required fields
Every robotheca.yaml has these 8 fields.
format_versionText:"1.0"or"0.1"The version of the format. Write it in quotes: without them, YAML reads a number, and the file is refused. Use
"1.0"for a new file. A file that says"0.1"stays valid, but the fields marked “New in 1.0” are allowed only in a file that says"1.0".nameText, at most 80 charactersThe robot's name, as people should see it. The address of its page on Robotheca is made from it: Example Hexapod H6 becomes
/robots/example-hexapod-h6.summaryText, at most 200 charactersOne or two sentences: what the robot is and what it does.
categoryOne valueThe kind of robot. Robotheca shows it as the robot's type, with the label in brackets when it differs from the value.
hexapodis for robots with six legs.Values:
arm(Robot arm),rover(Wheeled),humanoid,quadruped,hexapod,drone,self_driving_scale(Self-driving 1:10),homeorotherdifficultyOne valueHow hard the robot is to build, shown as its level.
Values:
beginner,intermediateoradvancedlicense.hardwareSPDX license expressionThe license of the hardware designs: the CAD files, the parts to print, the boards. For example
CERN-OHL-S-2.0orCC-BY-NC-SA-4.0.license.softwareSPDX license expressionThe license of the code. For example
Apache-2.0, orMIT OR Apache-2.0.source.repositoryWeb addressThe repository's home page, starting with
https://orhttp://.
Licenses
Licenses are SPDX identifiers or expressions, such as MIT, CERN-OHL-S-2.0, MIT OR Apache-2.0 or GPL-2.0-only WITH Classpath-exception-2.0: see the SPDX license list (opens in a new tab). Hardware and software are separate because they are usually under different licenses. A non-commercial license (CC-BY-NC…) means that kits and parts cannot be sold.
When you import your own robot, the robot card checks that each license is a valid SPDX expression.
Optional fields
Fill in what applies to your robot. Paths and web addresses follow the rules of section D.
statusOne valueWhere the project stands. An idea or a project in progress is never labelled “Ready to build”. A project at its end of life shows “End of life”: it can still be built from its files, but nobody updates it.
Values:
idea(designed, not built),in_progress(being built),built(it works),tested(tested on real hardware, with tested.date) orend_of_life(you stopped the project; new in 1.0)license.documentationSPDX license expressionThe license of the guide, its text and pictures, for example
CC-BY-SA-4.0. It decides whether others may reuse or adapt the guide, translations included. Without it, the hardware and software licenses apply to the guide.source.refTextThe tag or commit this description refers to, for example
v1.2.0.estimated_costamountandcurrency, thenamount_maxandnoteThe price of the parts to build the whole robot once: the parts it needs, with the cheapest option where there is a choice; without tools, optional parts or shipping.
amountis a number, 0 or more;currencyis a three-letter ISO 4217 code in capitals, such asEUR,USDorCNY. Both are needed. The cost is kept in its own currency, as you wrote it. For a range,amountis the low end andamount_maxthe high end, at leastamount.notesays what the figure covers, at most 200 characters, for example “without the camera”.amount_maxandnote: New in 1.0.build_time_hoursNumber, 0 or moreHands-on time to build the robot, in hours.
print_time_hoursNumber, 0 or more3D printer time, in hours.
toolsList of textThe tools needed to build it. Robotheca recognises these words:
3D printer,Soldering iron,Multimeter,Oscilloscope,CNC machine,Laser cutterandMicrocontroller programmer. Any other word is allowed.files.urdfPathThe robot description (a
.urdffile). Robotheca builds the 3D view from it and its STL meshes.files.parts_3dPathThe folder of parts to print (STL, 3MF or OBJ), for example
stl/. Without a URDF, its STL files make the 3D view.files.cadPathThe CAD source files: STEP, Fusion 360, SolidWorks, FreeCAD… With neither a URDF nor STL parts to show, Robotheca can turn its STEP files into the 3D view.
files.electronicsPathThe circuit files: KiCad, .brd or Gerber files.
files.bomPathThe parts list: a CSV, TSV or Markdown table, one line per part with its name, quantity and price. Robotheca reads it into the robot page's parts list.
files.docsPathThe documentation folder.
files.simulationPathSimulation files, for MuJoCo, Gazebo, Webots or Isaac.
files.mujocoPathThe robot's main MuJoCo file, an
.xmlfile (MJCF), for examplemjcf/scene.xml. Robotheca then uses your choice instead of guessing it from the file names. New in 1.0.files.imagesList of pathsPictures of the robot. The first is its photo: a JPEG, PNG, WebP or GIF file (never SVG), at most 5 MB, or 25 MB for an animated GIF.
software.frameworkTextThe software framework the robot runs on, for example
lerobotorros2.software.ros_versionTextThe ROS version, when the robot uses ROS.
ai_modelsList ofname,urlandlicenseAI models made for the robot, for example on Hugging Face. Each has a
nameand aurl; both are needed.licenseis the licence of the model's weights, an SPDX expression, when it differs from the code's.license: New in 1.0.specsFree keys: text, number or true/falseSpecifications, one
key: valueper line, with the unit in the key:height_cm,weight_kg,reach_mm,dof,power…build_stepsList of stepsThe build steps, in order. Each has a
title(needed), and may havehoursand where its instructions are:doc, a file in the repository (docs/assembly.md), orurl, a web page such as a docs site or a video. Not both.part_linksFree keys: a whole number, 1 or moreLinks a link or mesh of the 3D model, by its name, to a line of the parts list. The first line of the parts list is 1.
testedon_hardwareanddateon_hardware:trueorfalse.date: the day of the test, written YYYY-MM-DD.maintainersList ofnameandgithubThe people who look after the project: a
name(needed) and their GitHub user name.external_linksList oftype,urlandlabelResources kept outside the repository, for example a parts spreadsheet or a build video.
type(one of the values below) andurlare needed;labelis optional, at most 80 characters.codeis code kept in another repository, such as firmware;datasetis recorded data, such as demonstrations.codeanddataset: New in 1.0.Values:
bom,docs,video,forum,cad,shop,code(1.0) ordataset(1.0)closed_partsList ofname,noteandkindWhat the robot needs whose design is not open, for example a control board that is only sold. Both are needed:
nameat most 120 characters,noteat most 200.kindispart(the default) orsoftware, for closed software such as a driver published as a program only.kind: New in 1.0.
Paths and limits
Web addresses
source.repository, ai_models[].url, external_links[].url and build_steps[].url are full web addresses that start with http:// or https://. Other kinds (javascript:, data:, file:…) are refused.
File paths
files.*, files.images[] and build_steps[].doc are paths from the repository's root, with / between folders, that stay inside the repository: no / or ~ at the start, no .. folder, no backslash, no scheme or drive (https:, C:), no control characters. End a folder's path with /, as in stl/. A path points to a file in the repository, never to a copy kept elsewhere.
Free keys
The keys of specs and part_links can be any text except __proto__.
Reading the file
A schema cannot describe the file itself, so Robotheca also applies these limits:
- UTF-8 text, at most 64 KB.
- One YAML 1.2 document, whose top level is a mapping.
- No key twice, at any level.
- Only plain YAML values: text, numbers, true or false, null, lists and mappings. No tags such as
!!binaryor!!python/…, and merge keys (<<) are not applied. - At most 32 levels of nested lists and mappings.
- Aliases (
*name) are allowed; Robotheca expands at most 50.
A full example
An example only: Example Hexapod H6 is a fictional robot, and its repository and links do not exist. The file uses every field of version 1.0 and is valid. Copy it, then keep only what applies to your robot.
# An example only: Example Hexapod H6 is a fictional robot.
# Its repository and its links do not exist.
format_version: "1.0"
name: Example Hexapod H6
summary: A six-legged walking robot with 18 servos, printed in PLA and run by a Raspberry Pi, that walks and turns on flat ground.
category: hexapod
difficulty: intermediate
status: tested
license:
hardware: CERN-OHL-S-2.0
software: Apache-2.0
documentation: CC-BY-SA-4.0
source:
repository: https://github.com/example/hexapod-h6
ref: v1.2.0
estimated_cost:
amount: 320
amount_max: 380
currency: EUR
note: The higher figure is with metal-gear servos.
build_time_hours: 12
print_time_hours: 40
tools: ["3D printer", "Soldering iron", "hex keys"]
files:
urdf: hexapod_h6_description/urdf/hexapod_h6.urdf
parts_3d: stl/
cad: hexapod_h6_description/cad/
electronics: electronics/
bom: bom.csv
docs: docs/
simulation: simulation/
mujoco: simulation/mjcf/scene.xml
images: ["docs/img/hexapod-h6.jpg"]
software:
framework: ros2
ros_version: jazzy
ai_models:
- name: Hexapod H6 walking policy
url: https://huggingface.co/example/hexapod-h6-walk
license: Apache-2.0
specs:
legs: 6
dof: 18
weight_kg: 1.6
battery: 2S LiPo
build_steps:
- { title: Print the parts, hours: 40, doc: docs/01-print.md }
- { title: Assemble the legs, hours: 5, doc: docs/02-legs.md }
- { title: Wire the servo board, hours: 3, doc: docs/03-wiring.md }
- { title: Install the software, hours: 1, doc: docs/04-software.md }
- { title: Calibrate the legs, hours: 1, url: https://example.org/hexapod-h6/calibrate }
part_links:
coxa_link: 1
femur_link: 2
tibia_link: 3
tested:
on_hardware: true
date: "2026-09-15"
maintainers:
- { name: Example Maker, github: example }
external_links:
- { type: video, url: https://example.org/hexapod-h6/build-video, label: Build video }
- { type: forum, url: https://example.org/hexapod-h6/forum, label: Questions and answers }
- { type: code, url: https://example.org/hexapod-h6/firmware, label: Servo board firmware }
- { type: dataset, url: https://example.org/hexapod-h6/walking-data, label: Recorded walks }
closed_parts:
- name: Servo driver board
note: Bought ready-made; its design is not published.
- name: Servo board configuration tool
note: Published as a program only, without its source.
kind: softwareHow the importer uses it
With a robotheca.yaml
When you import a public GitHub repository, Robotheca reads it at its latest commit (or at the branch of a /tree/… link) and looks for robotheca.yaml at the root. It reads every file as data, and never runs anything from the repository.
- A valid robotheca.yaml fills in the robot card as you wrote it, with no automatic fill-in.
- Its
files.bomis the first parts list Robotheca tries. - The robot is pinned to the commit Robotheca read, and its source is the repository you imported:
source.refis not used for that. - When someone else suggests your robot, its licenses come only from the repository's license files. If robotheca.yaml gives other licenses than those files, the suggestion cannot be sent: only you can publish it.
- A robotheca.yaml that is not valid is shown under “Files we found” with its first problems, and the card is filled in as if there were none.
What Robotheca finds by itself
With or without robotheca.yaml, Robotheca looks through the whole repository, by the names of files and folders:
- Robot description: every
.urdffile, in any folder, read with its meshes; the most complete first. A mesh written aspackage://my_robot_description/meshes/base.stlis found by its path after the package name, so the package folder can have any name. The 3D view needs STL meshes: other mesh files count as missing..xacrofiles are found but never expanded (xacro can run code): add the generated.urdfto the repository. - Parts to print: STL, 3MF and OBJ files, in the folder that holds most of them. The URDF's meshes are not counted, nor files in simulation or robot description folders (
sim,simulation,mujoco,mjcf,gazebo,isaac…,maniskill, and every folder whose name ends indescription, such asmy_robot_description). - CAD files: STEP, IGES, Fusion 360, SolidWorks, FreeCAD and OpenSCAD files, in any folder.
- Electronics: KiCad,
.brdand Gerber files, in any folder. - Parts list: files named like
bom.csv,parts_list.mdorbill_of_materials.tsv, then a README in a parts, hardware or design folder, then the main README; the first with a parts table is used. - Documentation: a
docs,docordocumentationfolder at the root. - Photo: the repository's pictures, those the README shows first; pictures whose names say they are not a photo (a logo, a diagram, a schematic…) are left out.
- Licenses: read from the license files (
LICENSE,COPYING, files such asHARDWARE-LICENSE.txt, or aLICENSES/folder), never from GitHub's license label.
Without robotheca.yaml, the rest of the card (name, summary, type, level…) is filled in from the README when automatic fill-in is available, and every field filled in that way is marked “Please check”.
Files in folders with other names
Your files can be in any folder, for example a ROS package called my_robot_description. To say exactly which file or folder you mean, name it in files:
files:
urdf: my_robot_description/urdf/my_robot.urdf
cad: my_robot_description/cad/On the robot card you check before publishing, the URDF, the folder of parts to print, the parts list and the photo are chosen from what Robotheca found; your robotheca.yaml's choice is selected when it is one of them. A URDF is offered when Robotheca can read it and at least one of its meshes is an STL file in the repository. The other paths (cad, electronics, docs, simulation) are kept as you wrote them.
When you publish
The card becomes the robotheca.yaml that will be published, shown at the review step. It goes through the same checks as every robot on Robotheca: each path must be in the repository at the pinned commit, the parts list is read, the 3D view is prepared, and each part_links entry must point to a line of the parts list and to a link or mesh of the 3D model. If a check fails, its problems are listed and nothing is published.
Some fields count in the buildability score: build_steps (from 3 steps), software.framework, a folder named in files.parts_3d, files.cad or files.simulation, external_links of type bom or cad, and closed_parts, which take points off. See how we score.
Check your file
Check your file on Robotheca: paste it or choose it on your computer, and each problem is shown in plain words, with its line. It is checked in your browser: nothing is sent or kept.
To check it on every change, add a GitHub Action to your repository. robotheca/validate-robot-yaml (opens in a new tab) is a GitHub Action that checks robotheca.yaml against the same schema robotheca.org uses. Each problem appears as an annotation on its line, and it runs free in public repositories. Add this file to your robot's repository:
name: robotheca.yaml
on: [push, pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: robotheca/validate-robot-yaml@v1
with:
path: robotheca.yamlFor a file still named robot.yaml, leave out the two lines with: and path:. It checks the required fields, their types and allowed values, and that there are no unknown fields. It does not check that your paths exist, nor the limits of section D: Robotheca checks those when you import and publish.
The schema itself, robot.schema.json (JSON Schema 2020-12), is published in the same repository under the Apache-2.0 license, for tools that read robotheca.yaml files.