Set sail with real-time messaging. No charts, no compass - just coordinates and wind.
This be a live connection to the SignalR hub. Open this page in another port to watch messages flow betwixt vessels in real-time.
Copy this bearing and set sail. No registration at port, no credentials to verify - just hoist the flag and go.
<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/8.0.0/signalr.min.js"></script>
<script>
const connection = new signalR.HubConnectionBuilder()
.withUrl("https://signalargh.mikesendpoint.com/hub?channelId=my-fleet&userId=captain-1")
.withAutomaticReconnect()
.build();
connection.on("channelChat", (data) => {
console.log(`${data.userId}: ${data.message}`);
});
await connection.start();
await connection.invoke("SendChannelChat", "my-fleet", "Ahoy from the helm!");
</script>
Think of channels as separate shipping lanes. Vessels in different channels never cross paths - their messages stay isolated to their own waters. Channels chart themselves upon first contact - no harbor master approval needed.
Groups be sub-divisions within a channel. Perfect for organizing the crew or coordinating specific operations.
await connection.invoke("JoinGroup", "officers");
await connection.invoke("PublishToGroupWithUser", "officers", "groupChat", "Starboard crew, report!");
| Command | Parameters | Purpose |
|---|---|---|
SendChannelChat |
channelId, message | Broadcast to all vessels in channel |
SendChannelAnnouncement |
channelId, message | Send priority signal (highlighted) |
JoinGroup |
groupName | Join a formation within your channel |
LeaveGroup |
groupName | Leave formation |
PublishToGroupWithUser |
groupName, topic, payload | Signal to formation members |
| Signal Type | Payload | When Received |
|---|---|---|
channelChat |
{message, userId, timestamp} | Vessel sends message |
systemNotification |
string | Vessel enters/leaves channel |
channelAnnouncement |
{message, userId, timestamp} | Priority signal received |
groupChat |
{message, userId, timestamp} | Formation-specific message |
// npm install @microsoft/signalr
import * as signalR from "@microsoft/signalr";
const channelId = "fleet-" + Date.now();
const userId = "vessel-" + Math.random().toString(36).substr(2, 9);
const connection = new signalR.HubConnectionBuilder()
.withUrl(`https://signalargh.mikesendpoint.com/hub?channelId=${channelId}&userId=${userId}`)
.withAutomaticReconnect()
.build();
connection.on("channelChat", (data) => {
console.log(`${data.userId}: ${data.message}`);
});
connection.on("systemNotification", (message) => {
console.log(`Harbor Master: ${message}`);
});
await connection.start();
console.log("Connected to the aether!");
// Send message
await connection.invoke("SendChannelChat", channelId, "All hands on deck!");
# pip install signalrcore
from signalrcore.hub_connection_builder import HubConnectionBuilder
hub = HubConnectionBuilder() \
.with_url("https://signalargh.mikesendpoint.com/hub?channelId=my-fleet&userId=python-vessel") \
.build()
hub.on("channelChat", lambda data: print(f"{data['userId']}: {data['message']}"))
hub.on("systemNotification", lambda msg: print(f"Harbor: {msg}"))
hub.start()
hub.send("SendChannelChat", ["my-fleet", "Ahoy from Python!"])
using Microsoft.AspNetCore.SignalR.Client;
var connection = new HubConnectionBuilder()
.WithUrl("https://signalargh.mikesendpoint.com/hub?channelId=my-fleet&userId=dotnet-ship")
.WithAutomaticReconnect()
.Build();
connection.On<dynamic>("channelChat", data =>
Console.WriteLine($"{data.userId}: {data.message}"));
connection.On<string>("systemNotification", message =>
Console.WriteLine($"Harbor: {message}"));
await connection.StartAsync();
await connection.InvokeAsync("SendChannelChat", "my-fleet", "Sailing from C#!");
Connection refused: Ensure yer URL includes both channelId and userId as query parameters. Use WebSockets transport with skipNegotiation: true.
Messages not received: Verify all vessels be in the same channel. Set up signal handlers BEFORE calling connection.start().
Check harbor status:
curl https://signalargh.mikesendpoint.com/health