Mirror of github.com/OpenVibers/OpenVibe.Node
  • Go 55.4%
  • Python 30.4%
  • C++ 9%
  • Shell 5.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-27 04:12:29 -07:00
.github/workflows Vibe by voice: a voice plugin hears the call word on the machine and sends only what follows (voice_ask); the core routes Bot's voice_answer back and passes the owner's voice setting from config (contracts 0.214.0) (#58) 2026-10-25 07:34:08 -07:00
cmd/openvibe-node v0.17.0: deadlines against a bounded clock; every stop names its cause (on_stop / StopInfo) (#63) 2026-10-27 00:17:34 -07:00
docs v0.22.0: a desk's temp folder is short (Chrome closed as it started on a desk host: its SingletonSocket path was too long), and an unused desk stops after desk_idle_s (#68) 2026-10-27 04:12:29 -07:00
esp32 Add an ESP32 client for the device protocol: a portable C++ core, an Arduino transport, and a desktop conformance harness over Bot's fixtures (compile-checked in CI) (#31) 2026-10-05 11:35:04 -07:00
install v0.20.0: install.sh --desk-host: a used machine hosts desks for its owner's agents (its own account, the desk tools installed, max_desks sized to its memory) (#66) 2026-10-27 03:45:22 -07:00
internal v0.19.0: several desks per machine (Desks plan D1) (#65) 2026-10-27 03:21:44 -07:00
plugins v0.22.0: a desk's temp folder is short (Chrome closed as it started on a desk host: its SingletonSocket path was too long), and an unused desk stops after desk_idle_s (#68) 2026-10-27 04:12:29 -07:00
scripts v0.20.0: install.sh --desk-host: a used machine hosts desks for its owner's agents (its own account, the desk tools installed, max_desks sized to its memory) (#66) 2026-10-27 03:45:22 -07:00
.gitignore Add an ESP32 client for the device protocol: a portable C++ core, an Arduino transport, and a desktop conformance harness over Bot's fixtures (compile-checked in CI) (#31) 2026-10-05 11:35:04 -07:00
go.mod v0.18.0: queue and pipe time count against a motion command's deadline (the writer stamps what is left; expires_at_mono_ns on the shared clock); the clock bound is exact to the nanosecond and counts Bot's millisecond stamps; a Node booting latched sets the e-stop before starting its plugins (#64) 2026-10-27 02:14:21 -07:00
go.sum Node: approvals from the desktop — openvibe-node tray (Linux, Windows), Approve/Deny notifications and a macOS dialog; approvals wait out the agent's own clicks (#47) 2026-10-14 18:42:03 -07:00
LICENSE OpenVibe Node: the repository and its build brief (plan T15/T16, ADR-043; ADR-045 to follow): Go core, Python robot plugins (Adeept ADR036, Cozmo via PyCozmo, dry run), WHIP video, safety, installer and CI. 2026-09-29 11:56:06 -07:00
README.md openvibe-node quit: end the running node cleanly (every actuator stopped, nothing latched), for launchers that start and stop it with the rest of a stream setup (#60) 2026-10-26 17:40:29 -07:00
SECURITY.md OpenVibe Node: the repository and its build brief (plan T15/T16, ADR-043; ADR-045 to follow): Go core, Python robot plugins (Adeept ADR036, Cozmo via PyCozmo, dry run), WHIP video, safety, installer and CI. 2026-09-29 11:56:06 -07:00
STATUS.json v0.22.0: a desk's temp folder is short (Chrome closed as it started on a desk host: its SingletonSocket path was too long), and an unused desk stops after desk_idle_s (#68) 2026-10-27 04:12:29 -07:00

OpenVibe Node

One service for your computers, servers, Raspberry Pis, phones and robots: pair it once with OpenVibe and products like OpenVibe.Bot (robots: drive, cameras, sensors, with safety) and OpenVibe.Actor (computer control for AI agents, at the level you set on the machine) can use the device. It connects out, needs no open ports, and keeps a local kill switch.

On a robot's Raspberry Pi (or other Linux computer), the one command:

curl -fsSL https://openvibe.bot/install | sh

It turns on I2C and SPI, installs the camera tools, finds the kit (an Adeept ADR036 4WD, a ROS 2 robot), shows a code to approve at openvibe.bot/link, and pairs: the robot is made, drivable on its panel and, if you chose it, live on your OpenVibe.Live channel (docs/install.md).

With a robot already added on openvibe.bot:

curl -fsSL https://openvibe.bot/install | sh -s -- --robot rob_… --code ABCD-1234 --driver adeept

openvibe.bot shows this command with the robot's id and a fresh code. --driver is adeept, adeept-mecanum, cozmo, ros2, looi (the community's Generic LOOI driver, docs/hardware-looi.md) or none (dry run; the old --robot adeept form still works but is deprecated). A robot paired through OpenVibe.Network gets --network <URL> --pairing pair_… --code ABCD-1234 instead of --robot. Details, manual install, Windows and configuration: docs/install.md.

openvibe-node status     # link, plugins, video, battery, stop latch
openvibe-node stop       # kill switch: stop every motor now and keep it stopped
openvibe-node resume
openvibe-node quit       # end the node cleanly (nothing latched), e.g. from a stream launcher
openvibe-node approvals  # the computer plugin at level ask: what waits; approve <id> / deny <id>
openvibe-node tray       # the same in your notification area, with Approve/Deny notifications (Linux, Windows)

What is in here

  • Core (Go, one static binary per platform): pairing, one outbound WebSocket to wss://openvibe.bot/device (credential in the Authorization header only), heartbeats and a deadman, the safety rules (deadlines, owner limits clamped before any driver sees a value, a persisted e-stop, the local kill switch), the plugin supervisor, WHIP video publishing with pion, and the system service (systemd, launchd, Windows).
  • Plugins (separate processes, JSON lines over stdin/stdout): dryrun, the Adeept 4WD Smart Car Kit adeept_adr036, cozmo through PyCozmo, and relay for existing Live hardware clients, and ros2 for ROS 2 robots (cmd_vel, battery, scan/range, odometry and camera, as a node with rclpy or through rosbridge). LOOI's driver is the community's (docs/hardware-looi.md is its contract). Each plugin stops its own actuators when stdin closes, at a command's deadline and after 1 s without a heartbeat, so the core dying never leaves motors running.
  • ESP32 library (esp32/, OpenVibeNode): the device side of the protocol for ESP32 boards — pairing, the control link, drive/actuator commands, telemetry, heartbeat, deadman and e-stop — but no jobs or video.

Community robots: a profile people submit on openvibe.bot (community.<name>) is reviewed by an OpenVibe admin and signed by Bot (Ed25519 over its canonical JSON). openvibe-node profile verify community.<name> checks that signature against the key Bot publishes (--key-id pins one) and names the plugin the robots run; pairing with a robot on a community profile runs the same check and warns when it fails. Install a community plugin only when it passes (docs/plugins.md).

Your computer for your agents: --computer observe|ask|trusted|full adds the computer plugin (terminal, files, screen, mouse and keyboard, and a browser of its own for OpenVibe.Actor), running as your own account, at the level you set on the machine; ask waits for your answer in the tray, a notification's Approve button or openvibe-node approve <id> (docs/computer.md). With it on, you can also watch the machine's screen live on openvibe.bot. Only you see it, it runs for up to 30 minutes, and openvibe-node stop ends it at once (the live screen).

A machine that runs your jobs: add it on openvibe.bot/machines, which prints the same installer with --worker: the job worker runs each job as an unprivileged user in a sandbox, and the OpenVibe.Codes job runner lets you start a coding task on openvibe.codes/run from any browser and have this machine do it (docs/worker.md).

Docs: protocol (the wire format with OpenVibe.Bot), plugins (the driver protocol, the bundled drivers, and where Actor's computer-control plugin attaches), install. Decisions: ADR-043.

Development

go vet ./... && go test -race ./...                    # the end-to-end tests run the Python dry-run plugin
pip install pytest pillow numpy
for p in sdk dryrun adeept_adr036 cozmo relay ros2 computer; do python3 -m pytest -q plugins/$p/tests; done
scripts/dist.sh v0.0.0-dev                             # every binary, the plugin bundle and SHA256SUMS in dist/

internal/fakebot is a fake OpenVibe.Bot (pairing, device WebSocket, WHIP) used by the tests. Licence: AGPL-3.0 (LICENSE). Security reports: SECURITY.md.