openvibers/openvibe.link Commits
Node: the product at openre.stream is OpenRestream (owner, 2026-10-09) (#34)
Changes
@@@ -12,7 +12,7 @@ a Cozmo-based robot).- Chat commands (`!forward`, `!headup`, `!say`…) reached the robot with no permission check; Live fb3957f put them behindthe panel's rules as a stop-gap. Live also generates ~900 lines of Python per Cozmo owner (`routes.js`), becausebuttons are table rows rather than a profile.--- OpenRe's webrtc worker (75a5dd7) takes WHIP ingest and serves viewers; Media records; Events carries events; Network++- OpenRestream's webrtc worker (75a5dd7) takes WHIP ingest and serves viewers; Media records; Events carries events; Networkissues service tokens and delegated grants.- The owner's first robot, the Adeept ADR036, is a Raspberry Pi with Adeept's Robot HAT: a PCA9685 at I²C 0x5f drives thefour DC motors (channels 8–15) and the pan/tilt servos (0, 1); an ADS7830 at 0x48 reads battery voltage; ultrasonic,@@@ -43,8 +43,8 @@ a Cozmo-based robot).virtual environment with a systemd unit and the hardware watchdog.4. **Control runs over one outbound WebSocket per device; video over WHIP.** The device dials Bot(`wss://openvibe.bot/device`), authenticates with its credential, and keeps one connection for commands, telemetry and-- heartbeats; this works behind any home router and on an ESP32. The camera publishes to OpenRe over WHIP; viewers watch-- through OpenRe. Operators reach Bot over a WebSocket from the panel. A WebRTC data channel may be added later as a++ heartbeats; this works behind any home router and on an ESP32. The camera publishes to OpenRestream over WHIP; viewers watch++ through OpenRestream. Operators reach Bot over a WebSocket from the panel. A WebRTC data channel may be added later as asecond control transport when measured latency asks for it; the message set does not change.5. **One message set** (JSON, fields `v`, `seq`, `ts` on every frame): server→device `hello`, `config` (limits, heartbeat,the operator's allowed commands), `command` (`id` as an idempotency key, `kind` drive/actuator/ptz/say/display/halt,@@@ -94,7 +94,7 @@ a Cozmo-based robot).the `bot` service manifest and its events.- Network: a `bot` service principal; the `bot.robot.control` grant for Live and Chat (on behalf of viewers) and forActor agents (delegated).--- OpenRe: per-device publish keys for WHIP sessions created by Bot.++- OpenRestream: per-device publish keys for WHIP sessions created by Bot.- Live: the panel embed on channel pages, then the deletion in decision 10; Extensions `hardware/` becomes a pointer tothe Bot agent.@@@ -360,7 +360,7 @@ The latch file is `latch.json` in the state directory. A corrupt latch file is r## 4. Video (WHIP)Bot hands out only the publish key (in the pairing answer); it does not own media and names no WHIP endpoint (the--camera publishes to OpenRe). So the endpoint is local config, `video.whip_url` in `config.json`; without it video stays++camera publishes to OpenRestream). So the endpoint is local config, `video.whip_url` in `config.json`; without it video staysoff and the log says so. When it is set, the Node publishes one H.264 track (Constrained Baseline,`profile-level-id=42e01f`, packetization-mode 1) to it with `Authorization: Bearer <publish_key>`: `POST` with `Content-Type: application/sdp` → `201` with theanswer and a `Location`; `DELETE <Location>` on shutdown. PLI/FIR from the far end request a keyframe. The session is@@@ -1,4 +1,4 @@--// Package video publishes the device camera to OpenRe over WHIP (RFC 9725) with pion/webrtc: H.264 from a test++// Package video publishes the device camera to OpenRestream over WHIP (RFC 9725) with pion/webrtc: H.264 from a test// pattern, from a child process (rpicam-vid, ffmpeg), or from JPEG frames a plugin writes. Video runs on its own// goroutines and drops frames rather than wait, so it never blocks control.package video
@@ -12,7 +12,7 @@ a Cozmo-based robot).
@@ -12,7 +12,7 @@ a Cozmo-based robot).
- Chat commands (`!forward`, `!headup`, `!say`…) reached the robot with no permission check; Live fb3957f put them behind
- Chat commands (`!forward`, `!headup`, `!say`…) reached the robot with no permission check; Live fb3957f put them behind
the panel's rules as a stop-gap. Live also generates ~900 lines of Python per Cozmo owner (`routes.js`), because
the panel's rules as a stop-gap. Live also generates ~900 lines of Python per Cozmo owner (`routes.js`), because
buttons are table rows rather than a profile.
buttons are table rows rather than a profile.
-- OpenRe's webrtc worker (75a5dd7) takes WHIP ingest and serves viewers; Media records; Events carries events; Network
+- OpenRestream's webrtc worker (75a5dd7) takes WHIP ingest and serves viewers; Media records; Events carries events; Network
issues service tokens and delegated grants.
issues service tokens and delegated grants.
- The owner's first robot, the Adeept ADR036, is a Raspberry Pi with Adeept's Robot HAT: a PCA9685 at I²C 0x5f drives the
- The owner's first robot, the Adeept ADR036, is a Raspberry Pi with Adeept's Robot HAT: a PCA9685 at I²C 0x5f drives the
four DC motors (channels 8–15) and the pan/tilt servos (0, 1); an ADS7830 at 0x48 reads battery voltage; ultrasonic,
four DC motors (channels 8–15) and the pan/tilt servos (0, 1); an ADS7830 at 0x48 reads battery voltage; ultrasonic,
@@ -43,8 +43,8 @@ a Cozmo-based robot).
@@ -43,8 +43,8 @@ a Cozmo-based robot).
virtual environment with a systemd unit and the hardware watchdog.
virtual environment with a systemd unit and the hardware watchdog.
4. **Control runs over one outbound WebSocket per device; video over WHIP.** The device dials Bot
4. **Control runs over one outbound WebSocket per device; video over WHIP.** The device dials Bot
(`wss://openvibe.bot/device`), authenticates with its credential, and keeps one connection for commands, telemetry and
(`wss://openvibe.bot/device`), authenticates with its credential, and keeps one connection for commands, telemetry and
- heartbeats; this works behind any home router and on an ESP32. The camera publishes to OpenRe over WHIP; viewers watch
- through OpenRe. Operators reach Bot over a WebSocket from the panel. A WebRTC data channel may be added later as a
+ heartbeats; this works behind any home router and on an ESP32. The camera publishes to OpenRestream over WHIP; viewers watch
+ through OpenRestream. Operators reach Bot over a WebSocket from the panel. A WebRTC data channel may be added later as a
second control transport when measured latency asks for it; the message set does not change.
second control transport when measured latency asks for it; the message set does not change.
5. **One message set** (JSON, fields `v`, `seq`, `ts` on every frame): server→device `hello`, `config` (limits, heartbeat,
5. **One message set** (JSON, fields `v`, `seq`, `ts` on every frame): server→device `hello`, `config` (limits, heartbeat,
the operator's allowed commands), `command` (`id` as an idempotency key, `kind` drive/actuator/ptz/say/display/halt,
the operator's allowed commands), `command` (`id` as an idempotency key, `kind` drive/actuator/ptz/say/display/halt,
@@ -94,7 +94,7 @@ a Cozmo-based robot).
@@ -94,7 +94,7 @@ a Cozmo-based robot).
the `bot` service manifest and its events.
the `bot` service manifest and its events.
- Network: a `bot` service principal; the `bot.robot.control` grant for Live and Chat (on behalf of viewers) and for
- Network: a `bot` service principal; the `bot.robot.control` grant for Live and Chat (on behalf of viewers) and for
Actor agents (delegated).
Actor agents (delegated).
-- OpenRe: per-device publish keys for WHIP sessions created by Bot.
+- OpenRestream: per-device publish keys for WHIP sessions created by Bot.
- Live: the panel embed on channel pages, then the deletion in decision 10; Extensions `hardware/` becomes a pointer to
- Live: the panel embed on channel pages, then the deletion in decision 10; Extensions `hardware/` becomes a pointer to
the Bot agent.
the Bot agent.
@@ -360,7 +360,7 @@ The latch file is `latch.json` in the state directory. A corrupt latch file is r
@@ -360,7 +360,7 @@ The latch file is `latch.json` in the state directory. A corrupt latch file is r
## 4. Video (WHIP)
## 4. Video (WHIP)
Bot hands out only the publish key (in the pairing answer); it does not own media and names no WHIP endpoint (the
Bot hands out only the publish key (in the pairing answer); it does not own media and names no WHIP endpoint (the
-camera publishes to OpenRe). So the endpoint is local config, `video.whip_url` in `config.json`; without it video stays
+camera publishes to OpenRestream). So the endpoint is local config, `video.whip_url` in `config.json`; without it video stays
off and the log says so. When it is set, the Node publishes one H.264 track (Constrained Baseline,
off and the log says so. When it is set, the Node publishes one H.264 track (Constrained Baseline,
`profile-level-id=42e01f`, packetization-mode 1) to it with `Authorization: Bearer <publish_key>`: `POST` with `Content-Type: application/sdp` → `201` with the
`profile-level-id=42e01f`, packetization-mode 1) to it with `Authorization: Bearer <publish_key>`: `POST` with `Content-Type: application/sdp` → `201` with the
answer and a `Location`; `DELETE <Location>` on shutdown. PLI/FIR from the far end request a keyframe. The session is
answer and a `Location`; `DELETE <Location>` on shutdown. PLI/FIR from the far end request a keyframe. The session is
@@ -1,4 +1,4 @@
@@ -1,4 +1,4 @@
-// Package video publishes the device camera to OpenRe over WHIP (RFC 9725) with pion/webrtc: H.264 from a test
+// Package video publishes the device camera to OpenRestream over WHIP (RFC 9725) with pion/webrtc: H.264 from a test
// pattern, from a child process (rpicam-vid, ffmpeg), or from JPEG frames a plugin writes. Video runs on its own
// pattern, from a child process (rpicam-vid, ffmpeg), or from JPEG frames a plugin writes. Video runs on its own
// goroutines and drops frames rather than wait, so it never blocks control.
// goroutines and drops frames rather than wait, so it never blocks control.
package video
package video