Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 38 additions & 66 deletions leash.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,34 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>leash — safe robot control from CLI, HTTP, and MCP | specdog</title>
<meta name="description" content="Leash is an open-source Rust runtime for robot control. Start in simulation, use CLI, HTTP, or MCP, and connect real hardware behind explicit safety checks.">
<meta name="description" content="Leash is an open-source Rust runtime for safe robot control across CLI, HTTP, MCP, simulation, agents, ROS 2, CUDA, and real hardware.">
<link rel="icon" type="image/svg+xml" href="/dotdog/assets/dog.svg">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #fff; color: #1a1a2e; max-width: 760px; margin: 0 auto; padding: 24px 24px 40px; line-height: 1.7; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #fff; color: #1a1a2e; max-width: 780px; margin: 0 auto; padding: 24px 24px 40px; line-height: 1.7; }
nav { display: flex; justify-content: center; align-items: center; gap: 18px; flex-wrap: wrap; width: min(calc(100vw - 48px), 960px); margin: 0 auto 32px; padding: 8px 0 0; position: relative; left: 50%; transform: translateX(-50%); }
nav a { color: #6b7280; text-decoration: none; font-size: .9em; font-weight: 500; line-height: 1.4; }
nav a:hover, nav a.active { color: #d97706; }
h1 { font-size: 2.4em; margin-bottom: 8px; }
h2 { font-size: 1.35em; margin: 38px 0 12px; border-bottom: 1px solid #e5e7eb; padding-bottom: 6px; }
h3 { font-size: 1.05em; margin: 24px 0 8px; }
p { margin: 10px 0; }
ul { margin: 10px 0 10px 22px; }
li { margin: 5px 0; }
a { color: #d97706; }
code { background: #f1f5f9; padding: 1px 5px; border-radius: 4px; font-size: .9em; }
pre { background: #f1f5f9; border: 1px solid #cbd5e1; border-radius: 8px; padding: 14px 18px; font-size: .85em; overflow-x: auto; margin: 12px 0; }
pre code { background: none; padding: 0; }
table { width: 100%; border-collapse: collapse; margin: 16px 0; }
th, td { text-align: left; vertical-align: top; padding: 9px 10px; border-bottom: 1px solid #e5e7eb; }
th { font-size: .85em; color: #6b7280; font-weight: 600; }
td { font-size: .92em; }
.hero-art { display: block; width: 108px; height: 108px; margin: 0 auto 20px; }
.lead { font-size: 1.12em; color: #374151; }
.sublead { color: #4b5563; }
.sublead { color: #4b5563; max-width: 650px; }
.badge-row { display: flex; gap: 10px; align-items: center; margin: 18px 0; flex-wrap: wrap; }
.actions { display: flex; gap: 10px; margin: 18px 0 28px; flex-wrap: wrap; }
.button { display: inline-block; padding: 8px 13px; border: 1px solid #d97706; border-radius: 7px; text-decoration: none; font-weight: 600; }
.button.primary { background: #d97706; color: white; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 12px; margin: 16px 0; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; margin: 16px 0; }
.card { border: 1px solid #e5e7eb; border-radius: 8px; padding: 14px; }
.card strong { display: block; margin-bottom: 5px; }
.muted { color: #6b7280; font-size: .92em; }
.callout { border: 1px solid #f59e0b; background: #fffbeb; border-radius: 10px; padding: 16px 18px; margin: 16px 0; }
.links { display: flex; gap: 14px; flex-wrap: wrap; margin: 12px 0; }
footer { margin-top: 48px; padding-top: 24px; border-top: 1px solid #e5e7eb; text-align: center; font-size: .85em; color: #9ca3af; }
</style>
<link rel="canonical" href="https://specdog.github.io/leash">
Expand All @@ -58,11 +53,12 @@

<h1>leash</h1>
<p class="lead"><strong>Safe robot control from the CLI, HTTP, and MCP.</strong></p>
<p class="sublead">Leash is an open-source Rust runtime for controlling robots. Start in simulation. Connect real hardware when you're ready.</p>
<p class="sublead">Open-source Rust runtime for simulation, replay, agents, navigation, ROS 2, CUDA, and real robots — with one safety boundary before motion.</p>

<div class="actions">
<a class="button primary" href="#quick-start">Get started</a>
<a class="button" href="https://github.com/specdog/leash">GitHub</a>
<a class="button" href="https://github.com/specdog/leash/tree/main/talks/geek-on-a-leash">Demo</a>
</div>

<div class="badge-row">
Expand All @@ -73,79 +69,55 @@ <h1>leash</h1>
</div>

<h2 id="quick-start">Quick start</h2>

<pre><code>cargo install leash-harness
leash run sim-http</code></pre>

<p>Then, in another terminal:</p>

<pre><code>leash health --url http://127.0.0.1:8000
curl -s http://127.0.0.1:8000/telemetry | jq</code></pre>
<p>This runs entirely in simulation. No robot required.</p>

<p>This runs entirely in simulation. It cannot move physical hardware.</p>

<p>For MCP:</p>

<pre><code>leash run sim-mcp</code></pre>

<h2>What it does</h2>

<h2>Features</h2>
<div class="grid">
<div class="card"><strong>Control</strong><span class="muted">CLI, HTTP, WebSocket/SSE, and MCP.</span></div>
<div class="card"><strong>Simulate</strong><span class="muted">Run and test without a robot connected.</span></div>
<div class="card"><strong>Replay</strong><span class="muted">Record runs and replay them through the same telemetry path.</span></div>
<div class="card"><strong>Navigate</strong><span class="muted">Submit bounded goals, patrols, cancellations, and verified stops.</span></div>
<div class="card"><strong>Connect hardware</strong><span class="muted">Use feature-gated robot adapters when you're ready to leave simulation.</span></div>
<div class="card"><strong>Process sensor data</strong><span class="muted">Run bounded CPU jobs and optional CUDA acceleration.</span></div>
<div class="card"><strong>CLI, HTTP, and MCP</strong><span class="muted">One runtime across human, app, and agent clients.</span></div>
<div class="card"><strong>Simulation and replay</strong><span class="muted">Develop without hardware and replay recorded runs deterministically.</span></div>
<div class="card"><strong>Agent workflows</strong><span class="muted">Persistent sessions, browser console, scoped capabilities, and supervised tasks.</span></div>
<div class="card"><strong>Bounded navigation</strong><span class="muted">Goals, patrols, status, cancellation, deadlines, and verified stop.</span></div>
<div class="card"><strong>CPU and CUDA</strong><span class="muted">Bounded sensor processing with CPU-authoritative GPU qualification and fallback.</span></div>
<div class="card"><strong>ROS 2 and hardware</strong><span class="muted">Mapping and planning inputs plus feature-gated robot adapters; Waveshare UGV included.</span></div>
</div>

<h2>Safety</h2>

<p>Leash owns the final command sent to the robot.</p>

<p>A planner, ROS 2 node, model, app, or agent can ask Leash to do something. It cannot write to the motors directly.</p>

<p>Physical motion is off by default. Hardware commands pass authorization, approval, sensor freshness, deadman, collision, distance-limit, Stop, and E-Stop checks before reaching the robot.</p>

<p><strong>Agents can request motion. Leash decides whether motion is allowed.</strong></p>

<h2>Real hardware</h2>
<h2>Demo</h2>
<div class="callout">
<strong>Geek on a Leash</strong><br>
A full Rust Tuesdays walkthrough of Leash: runtime, safety boundary, ROS 2, CUDA, and a bounded UGV demo. Includes editable deck source, PDF, PowerPoint, speaker notes, preflight tooling, and a recorded fallback.
</div>
<p><a href="https://github.com/specdog/leash/tree/main/talks/geek-on-a-leash">Open the demo package →</a></p>

<p>The current hardware implementation is the <a href="https://github.com/specdog/leash/tree/main/implementations/waveshare-ugv">Waveshare UGV stack</a>.</p>
<h2>Safety boundary</h2>
<p><strong>Leash owns the final command sent to the robot.</strong> Agents, planners, ROS 2 nodes, CUDA jobs, and apps can request work or provide evidence; they do not become another motor writer.</p>
<p>Physical motion is off by default and passes authorization, approval, freshness, deadman, collision, distance, Stop, and E-stop checks. Simulation and replay never actuate hardware.</p>

<p>Robot-specific device paths, calibration, deployment, rollback, and field evidence stay outside the reusable core. ROS 2 can provide mapping, localization, and navigation data; Leash remains the motor owner.</p>
<h2>Explore</h2>
<div class="grid">
<div class="card"><strong>Agents</strong><span class="muted">Run durable sessions and bounded capability calls.</span><br><a href="https://github.com/specdog/leash/blob/main/README.md#agent-workflows">Agent workflows →</a></div>
<div class="card"><strong>Navigation</strong><span class="muted">Submit and supervise bounded goals.</span><br><a href="https://github.com/specdog/leash/blob/main/docs/NAVIGATION_API.md">Navigation API →</a></div>
<div class="card"><strong>Compute</strong><span class="muted">Use authenticated CPU/CUDA spatial jobs.</span><br><a href="https://github.com/specdog/leash/blob/main/docs/COMPUTE_API.md">Compute API →</a></div>
<div class="card"><strong>Hardware</strong><span class="muted">Waveshare UGV, calibration, ROS 2, deployment, and field proof.</span><br><a href="https://github.com/specdog/leash/tree/main/implementations/waveshare-ugv">Waveshare stack →</a></div>
</div>

<h2>Open source</h2>

<h3>Contributors</h3>

<pre><code>git clone https://github.com/specdog/leash.git
cd leash
npm ci
cargo build
cargo run -- run sim-http</code></pre>
<p>MIT licensed. Human contributors start with <a href="https://github.com/specdog/leash/blob/main/CONTRIBUTING.md">CONTRIBUTING.md</a>; coding agents start with <a href="https://github.com/specdog/leash/blob/main/AGENTS.md">AGENTS.md</a>.</p>

<p>Work from current <code>main</code> on a branch. Keep hardware changes feature-gated and test the simulation path without hardware.</p>

<p><a href="https://github.com/specdog/leash/blob/main/CONTRIBUTING.md">Contributing guide</a></p>

<h3>Coding agents</h3>

<p>Start with the repository's <a href="https://github.com/specdog/leash/blob/main/AGENTS.md">AGENTS.md</a>. Project structure is available through the compiled DotDog graph:</p>

<pre><code>npm ci
npx dotdog serve</code></pre>

<p>Agents query <code>specs/leash/leash.dag</code>. Humans own the <code>.dog</code> source.</p>

<h2>Learn more</h2>

<p>
<a href="https://github.com/specdog/leash">GitHub</a> ·
<a href="https://github.com/specdog/leash/blob/main/README.md">README</a> ·
<a href="https://github.com/specdog/leash/tree/main/docs">Docs</a> ·
<div class="links">
<a href="https://github.com/specdog/leash">GitHub</a>
<a href="https://github.com/specdog/leash/blob/main/README.md">README</a>
<a href="https://github.com/specdog/leash/tree/main/docs">Docs</a>
<a href="https://github.com/specdog/leash/issues">Issues</a>
</p>
</div>

<footer>
<a href="https://github.com/specdog">specdog</a> · MIT
Expand Down
Loading