Securely manage configurations, execute tasks, and monitor system health across any number of remote agents via a centralized, real-time relay server.
Our primary goal with WobotRelay is to make device onboarding and distributed fleet management
effortless and hassle-free.
One Tool for everthing you need whether it's Edge AI or the Cloud AI processing.
We aim to enable true one-click device onboarding—whether it's for the Edge AI or the Cloud AI processing. Simplify your deployment process and get your devices connected and managed in no time.
Say goodbye to countless guides, tedious port-forwards, and juggling half a dozen tools just to get connected.
Imagine skipping all of that—and going live with a single click.
WobotRelay handles everything—from connectivity to configuration—to get your streams and commands flowing in seconds.
WobotRelay is a powerful server-client system designed to manage distributed fleets of devices with ease. It provides centralized control over remote agents, enabling configuration management, task execution, and real-time monitoring through a secure relay server.
End-to-end encrypted communication with bcrypt hashing for credentials
Bi-directional WebSocket communication for instant updates and commands
Designed to handle thousands of clients with efficient resource usage
Less than ~10mb agent size.
Relay Server
Admin UI
Client 1
Client 2
Client N
The WobotRelay system consists of three main components: the central Relay Server, Admin UIs for management, and multiple Client agents that connect to the server. All communication flows through the Relay Server which acts as the central hub.
The WobotRelay server acts as the central hub for all communication between admin interfaces and client agents. It handles authentication, message routing, and state management for the entire system.
| Endpoint | Method | Description |
|---|---|---|
| /ws | GET | Initial client handshake endpoint |
| /ws/status/:requestID | GET | Client polling endpoint for approval status |
| /ws?clientID=... | GET | Persistent WebSocket connection for clients |
| /ws/admin?ticket=... | GET | WebSocket connection for admin UIs |
| /api/auth/ws-ticket | POST | Generates WebSocket tickets for admin UIs |
The WobotRelay client is a managed agent that connects to the central server, executes commands, and reports status. It handles local process management and can perform tasks like speed tests when requested.
The client progresses through these states during its lifecycle, with potential transitions back to earlier states when errors occur or when re-authentication is needed.
name: "Client-1"
handshakeKey: "group-default123"
clientID: "" # Will be populated after approval
clientSecret: "" # Will be populated after approval
logLevel: "info"
commandRestartMaxDelay: "5m"
paths:
service-A:
runOnInit: "/usr/bin/my-service --config /etc/my-service.conf"
runOnInitRestart: "yes" # Restart if it crashes
environment:
- "ENV=production"
- "LOG_LEVEL=debug"
backup-job:
runOnInit: "/usr/local/bin/backup --daily"
runOnInitRestart: "no" # Only run once on start
The initial handshake key should be treated as sensitive and ideally rotated periodically or used for temporary client registration only.
Client secrets are long-lived credentials for persistent connections. They should be stored securely on the client and server.
Admin API keys grant significant control. They should be protected and used over HTTPS. WebSocket tickets provide a safer alternative for direct WebSocket connections.
Always deploy the Relay Server with TLS/SSL enabled to ensure all communication is encrypted in transit.
Communication between the Admin UI/API and the Relay Server, and between the Relay Server and Clients, is primarily handled via WebSocket messages. Messages follow a standard JSON structure.
{
"type": "message_type", // e.g., "command", "config_update", "speed_test_result"
"correlationID": "unique_request_id", // Used to match requests and responses
"clientID": "target_client_id", // Optional: Specifies target client for server->client messages
"payload": {
// Message-specific data
}
}
The correlationID is crucial for asynchronous communication, allowing the sender to associate a response message with its original request.
This is not an exhaustive list. Refer to the server source code for the complete set of message types and their payloads.
A basic client configuration file looks like this:
serverAddress: "wss://your-relay-server.com/ws"
handshakeKey: "your-initial-handshake-key"
clientID: "" # Will be populated after approval
clientSecret: "" # Will be populated after approval
logLevel: "info"
commandRestartMaxDelay: "5m"
paths:
# Define processes to manage
my-app-service:
runOnInit: "/opt/my-app/start.sh"
runOnInitRestart: "yes" # Restart if it crashes
environment:
- "APP_ENV=production"
data-collector:
runOnInit: "/usr/local/bin/collect-data"
runOnInitRestart: "no" # Only run once on start
The clientID and clientSecret fields are initially empty and are populated by the server during the authentication and approval process.
To execute a command on a specific client via the WebSocket API, you would send a JSON message like this:
{
"type": "execute_command",
"correlationID": "cmd-xyz123", // Unique ID for this request
"clientID": "client-abc-123", // The ID of the target client
"payload": {
"command": "ls",
"args": ["-l", "/home/user"]
}
}
The server would then route this message to the client with ID "client-abc-123". The client would execute ls -l /home/user and send back a command_output message with the same correlationID.
To update a client's configuration, send an update_client_config message:
{
"type": "update_client_config",
"correlationID": "cfg-update-789",
"clientID": "client-abc-123",
"payload": {
"config": {
"logLevel": "debug",
"paths": {
"my-app-service": {
"runOnInit": "/opt/my-app/start.sh",
"runOnInitRestart": "yes",
"environment": [
"APP_ENV=staging" // Change environment variable
]
}
}
}
}
}
The client will receive this update, save it to its local config.yaml, and trigger a reload if necessary (or if reload_config is sent).