| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
| <title>OpenRAL — Runtime for VLA Robot Agents</title> |
| <style> |
| *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } |
| |
| :root { |
| --black: #0f0f0f; |
| --off-white: #f8f7f4; |
| --mid: #6b6b6b; |
| --border: #e0ddd8; |
| --accent: #1a1a1a; |
| --code-bg: #f1f0ed; |
| --green: #16a34a; |
| --yellow: #ca8a04; |
| --red: #dc2626; |
| } |
| |
| body { |
| font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; |
| background: var(--off-white); |
| color: var(--black); |
| line-height: 1.6; |
| font-size: 15px; |
| } |
| |
| a { color: var(--black); text-underline-offset: 3px; } |
| a:hover { opacity: 0.65; } |
| |
| |
| .page { max-width: 860px; margin: 0 auto; padding: 48px 24px 80px; } |
| |
| |
| .header { |
| display: flex; |
| align-items: center; |
| gap: 20px; |
| margin-bottom: 32px; |
| padding-bottom: 32px; |
| border-bottom: 1px solid var(--border); |
| } |
| .header img { width: 56px; height: auto; flex-shrink: 0; } |
| .header-text h1 { font-size: 28px; font-weight: 700; letter-spacing: -0.5px; } |
| .header-text p { color: var(--mid); margin-top: 4px; font-size: 15px; max-width: 580px; } |
| |
| |
| .badges { display: flex; flex-wrap: wrap; gap: 8px; margin: 20px 0 32px; } |
| .badge { |
| display: inline-flex; |
| align-items: center; |
| gap: 5px; |
| padding: 4px 10px; |
| border: 1px solid var(--border); |
| border-radius: 20px; |
| font-size: 12px; |
| font-weight: 500; |
| text-decoration: none; |
| color: var(--black); |
| background: white; |
| white-space: nowrap; |
| } |
| .badge:hover { background: var(--code-bg); opacity: 1; } |
| |
| |
| h2 { font-size: 18px; font-weight: 700; margin: 40px 0 16px; letter-spacing: -0.3px; } |
| h3 { font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--mid); margin: 28px 0 12px; } |
| p { margin-bottom: 12px; color: #2a2a2a; } |
| |
| |
| .pitch { |
| background: white; |
| border: 1px solid var(--border); |
| border-radius: 10px; |
| padding: 24px; |
| margin-bottom: 32px; |
| } |
| .pitch ul { padding-left: 20px; } |
| .pitch li { margin-bottom: 8px; } |
| .pitch li strong { font-weight: 600; } |
| |
| |
| pre { |
| background: var(--code-bg); |
| border: 1px solid var(--border); |
| border-radius: 8px; |
| padding: 16px 20px; |
| font-family: "SF Mono", "Fira Code", "Cascadia Code", monospace; |
| font-size: 13px; |
| line-height: 1.65; |
| overflow-x: auto; |
| margin-bottom: 24px; |
| } |
| code { font-family: inherit; } |
| p code, li code, td code { |
| background: var(--code-bg); |
| border: 1px solid var(--border); |
| border-radius: 4px; |
| padding: 1px 5px; |
| font-size: 12.5px; |
| } |
| |
| |
| .table-wrap { overflow-x: auto; margin-bottom: 24px; } |
| table { width: 100%; border-collapse: collapse; font-size: 13.5px; } |
| th { |
| text-align: left; |
| padding: 8px 12px; |
| border-bottom: 2px solid var(--border); |
| font-weight: 600; |
| color: var(--mid); |
| font-size: 12px; |
| text-transform: uppercase; |
| letter-spacing: 0.4px; |
| } |
| td { padding: 9px 12px; border-bottom: 1px solid var(--border); vertical-align: top; } |
| tr:last-child td { border-bottom: none; } |
| tr:hover td { background: #faf9f6; } |
| |
| |
| .lic { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 4px; vertical-align: middle; } |
| .lic-green { background: var(--green); } |
| .lic-yellow { background: var(--yellow); } |
| .lic-red { background: var(--red); } |
| |
| |
| .arch { |
| display: grid; |
| grid-template-columns: 1fr; |
| gap: 6px; |
| margin-bottom: 24px; |
| } |
| .arch-row { |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| padding: 10px 14px; |
| background: white; |
| border: 1px solid var(--border); |
| border-radius: 8px; |
| } |
| .arch-num { |
| font-size: 11px; |
| font-weight: 700; |
| color: var(--mid); |
| width: 16px; |
| flex-shrink: 0; |
| } |
| .arch-name { font-weight: 600; font-size: 13.5px; width: 130px; flex-shrink: 0; } |
| .arch-desc { font-size: 13px; color: var(--mid); } |
| .arch-tag { |
| margin-left: auto; |
| font-size: 11px; |
| padding: 2px 8px; |
| border-radius: 10px; |
| font-weight: 500; |
| white-space: nowrap; |
| flex-shrink: 0; |
| } |
| .tag-green { background: #dcfce7; color: #15803d; } |
| .tag-yellow { background: #fef9c3; color: #854d0e; } |
| .tag-gray { background: #f1f0ed; color: #6b6b6b; } |
| |
| |
| .robot-group { margin-bottom: 20px; } |
| .robot-group h3 { margin-top: 0; } |
| .robot-chips { display: flex; flex-wrap: wrap; gap: 6px; } |
| .chip { |
| padding: 4px 10px; |
| border-radius: 16px; |
| font-size: 12.5px; |
| font-weight: 500; |
| border: 1px solid var(--border); |
| background: white; |
| } |
| .chip-green { border-color: #86efac; background: #f0fdf4; } |
| .chip-blue { border-color: #93c5fd; background: #eff6ff; } |
| .chip-gray { background: var(--code-bg); } |
| |
| |
| .footer { |
| margin-top: 56px; |
| padding-top: 24px; |
| border-top: 1px solid var(--border); |
| display: flex; |
| flex-wrap: wrap; |
| gap: 20px; |
| font-size: 13px; |
| color: var(--mid); |
| } |
| .footer a { color: var(--mid); } |
| |
| @media (max-width: 600px) { |
| .header { flex-direction: column; align-items: flex-start; gap: 12px; } |
| .arch-name { width: 100px; } |
| .arch-desc { display: none; } |
| } |
| </style> |
| </head> |
| <body> |
| <div class="page"> |
|
|
| |
| <div class="header"> |
| <img src="/spaces/OpenRAL/README/resolve/main/openral-logo.svg" alt="OpenRAL logo" /> |
| <div class="header-text"> |
| <h1>OpenRAL</h1> |
| <p>The runtime layer between VLA models and real robots. Open-source, typed, layered — composable like LangGraph, distributable like Hugging Face.</p> |
| </div> |
| </div> |
|
|
| |
| <div class="badges"> |
| <a class="badge" href="https://github.com/AdrianLlopart/openral">⬛ GitHub</a> |
| <a class="badge" href="https://docs.openral.dev">📄 Docs</a> |
| <a class="badge" href="https://discord.gg/ZdNyUT4V5">💬 Discord</a> |
| <span class="badge">Apache-2.0</span> |
| <span class="badge">ROS 2 Jazzy</span> |
| <span class="badge">Python 3.12</span> |
| <span class="badge">16 robots · 20 rSkills · 22 benchmarks</span> |
| </div> |
|
|
| |
| <div class="pitch"> |
| <p>A VLA model alone can't run on your robot. It needs a camera pipeline, an observation normaliser, an action de-normaliser, a safety wrapper, a replanning layer when it fails, and a way to log everything for later fine-tuning. <strong>OpenRAL is that infrastructure.</strong></p> |
| <br/> |
| <ul> |
| <li><strong>Typed runtime</strong> — eight well-defined layers connected by Pydantic v2 contracts. No magic globals, no hidden retries.</li> |
| <li><strong>rSkill format</strong> — Hub repos containing weights, a <code>rskill.yaml</code> manifest, quantisation hints, latency budgets, and reproducible <code>eval/</code>. Install like a model.</li> |
| <li><strong>Dual-system planning</strong> — a fast visuomotor policy (S1, 30–200 Hz) and a slow LLM planner (S2) emitting typed tool-calls. Replanning is bounded and explicit.</li> |
| <li><strong>Safety kernel</strong> — deny-by-default, Python proposes, C++ disposes. <code>ROSSafetyViolation</code> is never silently caught.</li> |
| </ul> |
| </div> |
|
|
| |
| <h2>Get started</h2> |
| <pre><code># Install (no clone needed) |
| curl -fsSL https://raw.githubusercontent.com/AdrianLlopart/openral/master/scripts/install.sh | bash |
| openral doctor |
|
|
| # Browse and install a skill |
| openral rskill list |
| openral rskill install OpenRAL/rskill-smolvla-libero |
|
|
| # Run a simulated rollout |
| just sim-libero |
|
|
| # Deploy to hardware |
| openral deploy run --config deployments/so100_pickplace.yaml</code></pre> |
|
|
| |
| <h2>Architecture</h2> |
| <div class="arch"> |
| <div class="arch-row"> |
| <span class="arch-num">0</span> |
| <span class="arch-name">HAL</span> |
| <span class="arch-desc">Per-robot adapters — uniform connect / read_state / write_command Protocol</span> |
| <span class="arch-tag tag-green">shipped</span> |
| </div> |
| <div class="arch-row"> |
| <span class="arch-num">1</span> |
| <span class="arch-name">Sensors</span> |
| <span class="arch-desc">SensorSpec → ROS 2 streams (RGB-D, F/T, IMU, lidar, tactile)</span> |
| <span class="arch-tag tag-green">shipped</span> |
| </div> |
| <div class="arch-row"> |
| <span class="arch-num">2</span> |
| <span class="arch-name">World State</span> |
| <span class="arch-desc">tf2-aware 30 Hz snapshot; carries lifted detected_objects</span> |
| <span class="arch-tag tag-green">shipped</span> |
| </div> |
| <div class="arch-row"> |
| <span class="arch-num">3</span> |
| <span class="arch-name">rSkill (S1)</span> |
| <span class="arch-desc">Fast visuomotor policy — VLA, 30–200 Hz, async action chunks</span> |
| <span class="arch-tag tag-green">shipped</span> |
| </div> |
| <div class="arch-row"> |
| <span class="arch-num">4</span> |
| <span class="arch-name">Reasoning (S2)</span> |
| <span class="arch-desc">Slow LLM planner emitting typed ReasonerToolCall tool-calls</span> |
| <span class="arch-tag tag-yellow">partial</span> |
| </div> |
| <div class="arch-row"> |
| <span class="arch-num">5</span> |
| <span class="arch-name">WAM</span> |
| <span class="arch-desc">World Action Model — mental simulation, failure anticipation</span> |
| <span class="arch-tag tag-gray">planned</span> |
| </div> |
| <div class="arch-row"> |
| <span class="arch-num">6</span> |
| <span class="arch-name">Safety</span> |
| <span class="arch-desc">C++ separate process, deny-by-default, certifiable, E-stop on fault</span> |
| <span class="arch-tag tag-yellow">partial</span> |
| </div> |
| <div class="arch-row"> |
| <span class="arch-num">7</span> |
| <span class="arch-name">Observability</span> |
| <span class="arch-desc">OpenTelemetry spans + LeRobotDataset v3 flywheel</span> |
| <span class="arch-tag tag-green">shipped</span> |
| </div> |
| </div> |
|
|
| |
| <h2>What's in this organization</h2> |
| <div class="table-wrap"> |
| <table> |
| <thead><tr><th>Type</th><th>What</th><th>Count</th></tr></thead> |
| <tbody> |
| <tr><td><code>rskill-*</code> models</td><td>Policy rSkills — VLA weights + manifest + eval</td><td>18</td></tr> |
| <tr><td><code>rskill-*</code> models</td><td>Perception rSkills — RT-DETR object-detection</td><td>2</td></tr> |
| <tr><td><code>dataset-*</code></td><td>LeRobotDataset v3 demonstration datasets</td><td>growing</td></tr> |
| </tbody> |
| </table> |
| </div> |
|
|
| |
| <h2>Policy rSkills</h2> |
| <p>Each rSkill is a self-contained Hub repo: <code>rskill.yaml</code> manifest, <code>model.safetensors</code> weights, <code>eval/</code> results, and a model card with runnable examples. Install with <code>openral rskill install OpenRAL/rskill-<name></code>.</p> |
|
|
| <div class="table-wrap"> |
| <table> |
| <thead><tr><th>rSkill</th><th>Backbone</th><th>Target robot</th><th>License</th></tr></thead> |
| <tbody> |
| <tr> |
| <td><code>rskill-smolvla-libero</code></td> |
| <td>SmolVLA</td><td>Franka Panda</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| <tr> |
| <td><code>rskill-smolvla-metaworld</code></td> |
| <td>SmolVLA</td><td>Rethink Sawyer</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| <tr> |
| <td><code>rskill-smolvla-maniskill-franka</code></td> |
| <td>SmolVLA × ManiSkill3</td><td>Franka Panda</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| <tr> |
| <td><code>rskill-xvla-libero</code></td> |
| <td>xVLA (Florence-2)</td><td>Franka Panda</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| <tr> |
| <td><code>rskill-act-libero</code></td> |
| <td>ACT</td><td>Franka Panda</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| <tr> |
| <td><code>rskill-act-aloha</code></td> |
| <td>ACT</td><td>ALOHA bimanual</td> |
| <td><span class="lic lic-green"></span>MIT</td> |
| </tr> |
| <tr> |
| <td><code>rskill-act-aloha-insertion</code></td> |
| <td>ACT (peg insertion)</td><td>ALOHA bimanual</td> |
| <td><span class="lic lic-green"></span>MIT</td> |
| </tr> |
| <tr> |
| <td><code>rskill-diffusion-pusht</code></td> |
| <td>Diffusion Policy</td><td>PushT 2-D</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| <tr> |
| <td><code>rskill-molmoact2-libero-nf4</code></td> |
| <td>MolmoAct2 NF4 (~5.5 B)</td><td>Franka Panda</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| <tr> |
| <td><code>rskill-molmoact2-so101-nf4</code></td> |
| <td>MolmoAct2 NF4</td><td>SO-101</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| <tr> |
| <td><code>rskill-pi05-libero-nf4</code></td> |
| <td>π0.5 NF4</td><td>Franka Panda</td> |
| <td><span class="lic lic-yellow"></span>Research (weights non-Apache)</td> |
| </tr> |
| <tr> |
| <td><code>rskill-pi05-so101-pickplace-nf4</code></td> |
| <td>π0.5 NF4</td><td>SO-101</td> |
| <td><span class="lic lic-yellow"></span>Research (weights)</td> |
| </tr> |
| <tr> |
| <td><code>rskill-pi05-openarm-vision-nf4</code></td> |
| <td>π0.5 NF4 bimanual</td><td>OpenArm v2</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| <tr> |
| <td><code>rskill-pi05-robocasa365-human300-nf4</code></td> |
| <td>π0.5 NF4</td><td>Panda Mobile</td> |
| <td><span class="lic lic-yellow"></span>Research (weights)</td> |
| </tr> |
| <tr> |
| <td><code>rskill-rldx1-pt-nf4</code></td> |
| <td>RLDX-1 foundation (Qwen3-VL-8B, ~6.9 B)</td><td>Franka Panda</td> |
| <td><span class="lic lic-red"></span>RLWRLD non-commercial</td> |
| </tr> |
| <tr> |
| <td><code>rskill-rldx1-ft-libero-nf4</code></td> |
| <td>RLDX-1 fine-tuned</td><td>Franka Panda</td> |
| <td><span class="lic lic-red"></span>RLWRLD non-commercial</td> |
| </tr> |
| <tr> |
| <td><code>rskill-rldx1-ft-gr1-nf4</code></td> |
| <td>RLDX-1 (GR1 bimanual)</td><td>Fourier GR1</td> |
| <td><span class="lic lic-red"></span>RLWRLD non-commercial</td> |
| </tr> |
| <tr> |
| <td><code>rskill-rldx1-ft-simpler-widowx-nf4</code></td> |
| <td>RLDX-1 (SimplerEnv)</td><td>WidowX</td> |
| <td><span class="lic lic-red"></span>RLWRLD non-commercial</td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
|
|
| <h2>Perception rSkills</h2> |
| <p>Emit <code>ObjectsMetadata</code> (2D detections lifted to 3D via depth) rather than an <code>Action</code>. Plug directly into the <code>openral deploy</code> graph.</p> |
| <div class="table-wrap"> |
| <table> |
| <thead><tr><th>rSkill</th><th>Backbone</th><th>Notes</th><th>License</th></tr></thead> |
| <tbody> |
| <tr> |
| <td><code>rskill-rtdetr-coco-r18</code></td> |
| <td>RT-DETR R18</td><td>Lightweight ONNX</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| <tr> |
| <td><code>rskill-rtdetr-v2-r50vd</code></td> |
| <td>RT-DETR v2 R50vd</td><td>Higher accuracy</td> |
| <td><span class="lic lic-green"></span>Apache-2.0</td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
|
|
| |
| <p style="font-size:12.5px; color: var(--mid);"> |
| <span class="lic lic-green"></span> Free for any use |
| <span class="lic lic-yellow"></span> Research-permissive weights (check upstream terms) |
| <span class="lic lic-red"></span> Non-commercial — requires <code>OPENRAL_ACCEPT_NONCOMMERCIAL=1</code> |
| </p> |
|
|
| |
| <h2>rSkill manifest format</h2> |
| <pre><code># rskills/smolvla-libero/rskill.yaml (excerpt) |
| name: "OpenRAL/rskill-smolvla-libero" |
| version: "0.1.0" |
| license: "apache-2.0" |
| role: "s1" |
| embodiment_tags: ["franka_panda"] |
| sensors_required: |
| - modality: "rgb" |
| vla_feature_key: "observation.images.camera1" |
| latency_budget_ms: 120 |
| quantization: null</code></pre> |
|
|
| |
| <h2>Supported robots</h2> |
|
|
| <div class="robot-group"> |
| <h3>Hardware + sim</h3> |
| <div class="robot-chips"> |
| <span class="chip chip-green">SO-100</span> |
| <span class="chip chip-green">SO-101</span> |
| <span class="chip chip-green">ALOHA bimanual</span> |
| </div> |
| </div> |
|
|
| <div class="robot-group"> |
| <h3>Sim — HW bring-up in progress</h3> |
| <div class="robot-chips"> |
| <span class="chip chip-blue">Franka Panda</span> |
| <span class="chip chip-blue">UR5e</span> |
| <span class="chip chip-blue">UR10e</span> |
| </div> |
| </div> |
|
|
| <div class="robot-group"> |
| <h3>Sim (eval only)</h3> |
| <div class="robot-chips"> |
| <span class="chip chip-gray">Unitree H1</span> |
| <span class="chip chip-gray">Unitree G1</span> |
| <span class="chip chip-gray">Flexiv Rizon 4</span> |
| <span class="chip chip-gray">Enactic OpenArm v2</span> |
| <span class="chip chip-gray">Rethink Sawyer</span> |
| <span class="chip chip-gray">Fourier GR1</span> |
| <span class="chip chip-gray">Panda Mobile</span> |
| <span class="chip chip-gray">Google Robot</span> |
| <span class="chip chip-gray">WidowX</span> |
| <span class="chip chip-gray">PushT 2D</span> |
| </div> |
| </div> |
|
|
| |
| <h2>Benchmarks</h2> |
| <p>22 benchmark configs across LIBERO, MetaWorld, ManiSkill3, SimplerEnv, RoboCasa, gym-aloha, and gym-pusht. Every rSkill ships reproducible <code>eval/<benchmark>.json</code> you can regenerate locally:</p> |
| <pre><code>openral benchmark run \ |
| --suite libero_spatial \ |
| --vla smolvla:rskill://OpenRAL/rskill-smolvla-libero |
|
|
| openral benchmark report</code></pre> |
|
|
| |
| <h2>Observability & data flywheel</h2> |
| <p>Every skill execution is an OpenTelemetry span — weights revision pinned, camera frames captured, LLM prompts logged. Traces replay as LeRobotDataset v3 rows, closing the loop from deployment back to training data.</p> |
| <pre><code>openral dashboard # OTLP receiver at :4318, live trace viewer</code></pre> |
|
|
| |
| <h2>License</h2> |
| <p>Everything in this organization is <strong>Apache-2.0</strong> open core. A planned commercial tier (PolyForm SBL 1.0.0) will cover agentic orchestration features — free for teams under 100 people or <$1M revenue, and free for academic research at any size.</p> |
| <p>rSkill weights are governed by their upstream licenses (Apache-2.0 / MIT / research-permissive / RLWRLD non-commercial). The loader surfaces the posture at install time.</p> |
|
|
| |
| <div class="footer"> |
| <a href="https://github.com/AdrianLlopart/openral">GitHub</a> |
| <a href="https://docs.openral.dev">Docs</a> |
| <a href="https://discord.gg/ZdNyUT4V5">Discord</a> |
| <a href="mailto:hello@openral.dev">hello@openral.dev</a> |
| <a href="mailto:safety@openral.dev">safety@openral.dev</a> |
| <span>Apache-2.0 · © OpenRAL contributors</span> |
| </div> |
|
|
| </div> |
| </body> |
| </html> |