README / index.html
AdrianLlopart's picture
Update index.html
74c75d7 verified
<!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; }
/* ── Layout ── */
.page { max-width: 860px; margin: 0 auto; padding: 48px 24px 80px; }
/* ── Header ── */
.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 ── */
.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; }
/* ── Sections ── */
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 block ── */
.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; }
/* ── Code block ── */
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;
}
/* ── Tables ── */
.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; }
/* ── License dot ── */
.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); }
/* ── Architecture ── */
.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 grid ── */
.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 ── */
.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">
<!-- Header -->
<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>
<!-- Badges -->
<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>
<!-- What is it -->
<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>
<!-- Quick start -->
<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>
<!-- Architecture -->
<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>
<!-- What's in this org -->
<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>
<!-- rSkills -->
<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-&lt;name&gt;</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>
<!-- License legend -->
<p style="font-size:12.5px; color: var(--mid);">
<span class="lic lic-green"></span> Free for any use &nbsp;
<span class="lic lic-yellow"></span> Research-permissive weights (check upstream terms) &nbsp;
<span class="lic lic-red"></span> Non-commercial — requires <code>OPENRAL_ACCEPT_NONCOMMERCIAL=1</code>
</p>
<!-- rSkill manifest format -->
<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>
<!-- Robots -->
<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>
<!-- Benchmarks -->
<h2>Benchmarks</h2>
<p>22 benchmark configs across LIBERO, MetaWorld, ManiSkill3, SimplerEnv, RoboCasa, gym-aloha, and gym-pusht. Every rSkill ships reproducible <code>eval/&lt;benchmark&gt;.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>
<!-- Observability -->
<h2>Observability &amp; 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>
<!-- License -->
<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 &lt;$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>
<!-- Footer -->
<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>