Skip to content

optr

A cloud-native runtime for building real-time robot brains.

optr lets teams build autonomous programs that keep seeing, thinking, and acting across edge devices, cloud GPUs, browsers, and connected services.

It is similar in role to ROS2 or Dora, but designed for distributed cloud and edge workflows instead of one robot on a local network.

optr is an open-source framework with a Rust core and Python SDK. Apps are graphs of nodes connected by streams. A node can run on a Raspberry Pi, a cloud GPU, a browser tab, or a local machine.

Nodes find each other by identity, connect directly over QUIC with automatic NAT traversal, and exchange data without a central router.

Most real-time AI apps follow the same loop: [See] -> [Think] -> [Act]. optr makes that loop explicit. Define nodes, wire streams, run locally, then deploy the graph when it is ready.

A node is a function that processes data. It can be written in Python or Rust, or wrap a model such as ONNX.

from optr import node
@node
def detect(frame):
return yolo.detect(frame)

A stream is a typed continuous connection between nodes, with delivery rules.

camera.out("image") >> detect.inp("frame")
camera.out("image") >> vlm.inp("frame", Latest)

A graph is a group of nodes and streams. It can run locally for development or deploy to Fabric for production.

graph = camera >> detect >> alert
graph.run() # local dev
graph.deploy() # production on Fabric

Delivery rules include All, Latest, Queue(N), and Backpressure. Placement targets include CPU, GPU, edge devices, browser, and local development.

The same graph can move from local development to distributed production without changing the app code.

  • Same process: in-memory channel, about 1 microsecond.
  • Same machine: shared memory, about 10 microseconds.
  • Same network: Iroh direct QUIC, about 1 millisecond.
  • Across the internet: Iroh hole-punch QUIC, about 20 to 100 milliseconds.
  • Behind NAT: Iroh relay QUIC, about 50 to 200 milliseconds.
  • To browser: WebTransport, about 20 to 100 milliseconds.
  • Sources: optr-camera, optr-screen, optr-video, optr-mujoco, and optr-microphone.
  • Transforms: optr-onnx, optr-vlm, optr-llm, optr-encode, and optr-blend.
  • Sinks: optr-robot, optr-desktop, optr-browser, optr-recorder, and optr-websocket.
  • Connectors: optr-viam, optr-ros2, and optr-mavlink.

Every operator can have a cryptographic identity linked to payment and service discovery. Operators can pay for compute, register as services, record actions, and get paid for services they offer.

  • ROS2: designed around robots on a local network. Cloud deployment, NAT traversal, and browser streaming usually need extra work.
  • Dora: useful for local dataflow, but focused on single-machine setups.
  • optr: uses Iroh P2P QUIC, supports NAT traversal, browser streaming through WebTransport, Python graph definitions, and Fabric deployment through graph.deploy().

optr runs on top of Fabric when graphs need distributed compute. Fabric handles machine provisioning, GPU scheduling, networking, and billing. optr adds stream graphs, delivery rules, node composition, identity, and browser streaming.

They also work independently: Fabric can run request-response jobs, and optr can run local graphs. Together they cover real-time streaming workloads across edge, cloud, and browser targets.

Rust core, Python SDK through PyO3, Rust CLI, and a node library in Python and Rust. The project is MIT-licensed.