chore(collab): moved the public relay and share endpoints to my.omp.sh

- Changed `DEFAULT_RELAY_URL` in `@oh-my-pi/pi-wire` from `wss://relay.omp.sh` to `wss://my.omp.sh` and updated the constants, collab-link, and join-command tests asserting the old origin.
- Added `DEFAULT_SHARE_URL` (`https://my.omp.sh/s`) to pi-wire with its changelog entry; it shares a changed run with the relay constant and is consumed by the upcoming /share work.
- Updated collab-web canonical/OG/twitter URLs in `index.html`, `robots.txt`, `sitemap.xml`, README, and the `local-relay.ts` doc comment to the new domain.
- Refreshed the `/collab` entry in the coding-agent changelog to reference the new relay origin.
This commit is contained in:
can1357
2026-06-12 14:59:00 +02:00
parent 371846167b
commit ca85d9fe69
12 changed files with 23 additions and 19 deletions
+1 -1
View File
@@ -27,7 +27,7 @@
- Updated collab link handling to accept compact `roomId#key` links and relay hosts without explicit scheme when joining or starting sessions
- Added `/collab stop` and `/collab status` options to control and inspect active shared sessions
- Added `/collab`, `/join`, and `/leave` for live session sharing: the host shares an end-to-end encrypted link (AES-256-GCM key only in the link fragment; the relay sees opaque bytes) and guests render the session natively in their own TUI — streaming text, tool cards, footer state, ctrl+o expansion, `/dump` — and can prompt or interrupt the host's agent. Guest prompts render with an author badge; session-mutating commands stay host-only. Defaults to the public `relay.omp.sh` relay (`collab.relayUrl`); a self-hostable Go relay lives in the pi-www repo as `omp-collab-relay`
- Added `/collab`, `/join`, and `/leave` for live session sharing: the host shares an end-to-end encrypted link (AES-256-GCM key only in the link fragment; the relay sees opaque bytes) and guests render the session natively in their own TUI — streaming text, tool cards, footer state, ctrl+o expansion, `/dump` — and can prompt or interrupt the host's agent. Guest prompts render with an author badge; session-mutating commands stay host-only. Defaults to the public `my.omp.sh` relay (`collab.relayUrl`); a self-hostable Go relay lives in the pi-www repo as `omp-collab-relay`
- Added `collab.relayUrl` and `collab.displayName` settings plus a `collab` status-line segment showing the participant count (host) or guest role. Guests mirror the host's real model/thinking state into their replica agent and the host's subagent ecosystem end-to-end: the live subagent HUD, the Agent Hub table with live progress, hub chat/kill/revive (routed to the host), and on-demand subagent transcript viewing
- Added `omp join <link>` subcommand that launches the interactive TUI and immediately runs `/join <link>`
@@ -102,7 +102,7 @@ describe("collab link format", () => {
});
it("parses the scheme-less display form of web deep links", () => {
const parsed = parseCollabLink(`relay.omp.sh/#${formatCollabLink(DEFAULT_RELAY_URL, roomId, key)}`);
const parsed = parseCollabLink(`my.omp.sh/#${formatCollabLink(DEFAULT_RELAY_URL, roomId, key)}`);
if ("error" in parsed) throw new Error(parsed.error);
expect(parsed.wsUrl).toBe(`${DEFAULT_RELAY_URL}/r/${roomId}`);
expect(Buffer.from(parsed.key)).toEqual(Buffer.from(key));
@@ -137,7 +137,7 @@ describe("collab link format", () => {
it("keeps the key out of web-link path and query", () => {
const webLink = formatCollabWebLink(DEFAULT_RELAY_URL, roomId, key);
const url = new URL(webLink);
expect(url.origin).toBe("https://relay.omp.sh");
expect(url.origin).toBe("https://my.omp.sh");
expect(url.pathname).toBe("/");
expect(url.search).toBe("");
expect(url.hash).toBe(`#${roomId}#${Buffer.from(key).toString("base64url")}`);
@@ -9,8 +9,8 @@ import { isSubcommand, resolveCliArgv } from "@oh-my-pi/pi-coding-agent/cli-comm
describe("join command is registered as a top-level subcommand", () => {
test("CLI runner routes `join <link>` to the join command, not launch", () => {
expect(isSubcommand("join")).toBe(true);
expect(resolveCliArgv(["join", "wss://relay.omp.sh/s/abc#key"])).toEqual({
argv: ["join", "wss://relay.omp.sh/s/abc#key"],
expect(resolveCliArgv(["join", "wss://my.omp.sh/s/abc#key"])).toEqual({
argv: ["join", "wss://my.omp.sh/s/abc#key"],
});
});
});
+2 -2
View File
@@ -20,10 +20,10 @@ Host a session from any omp instance (`/collab`, or `/collab ws://localhost:7466
bun run build # static site in dist/
```
`dist/` is a fully static SPA — host it anywhere. JS/CSS bundles are content-hashed; favicons, `manifest.webmanifest`, `robots.txt`, `sitemap.xml`, and `og-image.png` come from `public/` and are emitted at the site root under stable names (canonical URL: `https://relay.omp.sh/`). Two runtime requirements:
`dist/` is a fully static SPA — host it anywhere. JS/CSS bundles are content-hashed; favicons, `manifest.webmanifest`, `robots.txt`, `sitemap.xml`, and `og-image.png` come from `public/` and are emitted at the site root under stable names (canonical URL: `https://my.omp.sh/`). Two runtime requirements:
- **Secure context**: room keys are unwrapped with WebCrypto (`crypto.subtle`), which browsers expose only on `https://` or `localhost`.
- **Relay reachability**: the client connects straight to the relay over WebSocket (`wss://` for anything that isn't localhost). The default relay is `wss://relay.omp.sh`; bare `<roomId>#<key>` links resolve against it.
- **Relay reachability**: the client connects straight to the relay over WebSocket (`wss://` for anything that isn't localhost). The default relay is `wss://my.omp.sh`; bare `<roomId>#<key>` links resolve against it.
The room key never leaves the URL fragment — it is not sent to the relay or any server.
+6 -6
View File
@@ -12,7 +12,7 @@
content="Guest client for omp collab sessions: watch a live coding-agent session — streaming transcript, tool calls, subagents — and prompt the host agent from any browser. End-to-end encrypted; the room key never leaves the URL fragment."
/>
<meta name="author" content="can1357" />
<link rel="canonical" href="https://relay.omp.sh/" />
<link rel="canonical" href="https://my.omp.sh/" />
<meta name="robots" content="index, follow, max-image-preview:large" />
<link rel="icon" type="image/svg+xml" href="./public/favicon.svg" />
@@ -26,13 +26,13 @@
<!-- Open Graph -->
<meta property="og:site_name" content="omp" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://relay.omp.sh/" />
<meta property="og:url" content="https://my.omp.sh/" />
<meta property="og:title" content="omp collab — live agent session in your browser" />
<meta
property="og:description"
content="Watch a live omp session and prompt the host agent from any browser. End-to-end encrypted; the key stays in the URL fragment."
/>
<meta property="og:image" content="https://relay.omp.sh/og-image.png" />
<meta property="og:image" content="https://my.omp.sh/og-image.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
@@ -41,13 +41,13 @@
<!-- Twitter / X -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://relay.omp.sh/" />
<meta name="twitter:url" content="https://my.omp.sh/" />
<meta name="twitter:title" content="omp collab — live agent session in your browser" />
<meta
name="twitter:description"
content="Watch a live omp session and prompt the host agent from any browser. End-to-end encrypted; the key stays in the URL fragment."
/>
<meta name="twitter:image" content="https://relay.omp.sh/og-image.png" />
<meta name="twitter:image" content="https://my.omp.sh/og-image.png" />
<meta name="twitter:image:alt" content="omp collab — your agent, live in any browser" />
<!-- Structured data: WebApplication -->
@@ -56,7 +56,7 @@
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "omp collab",
"url": "https://relay.omp.sh/",
"url": "https://my.omp.sh/",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Any",
"description": "Browser guest client for omp collab live sessions: streaming transcript, tool calls, subagent panel, and a composer that prompts the host agent. End-to-end encrypted.",
+1 -1
View File
@@ -2,4 +2,4 @@ User-agent: *
Allow: /
Disallow: /r/
Sitemap: https://relay.omp.sh/sitemap.xml
Sitemap: https://my.omp.sh/sitemap.xml
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://relay.omp.sh/</loc>
<loc>https://my.omp.sh/</loc>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>
+1 -1
View File
@@ -1,5 +1,5 @@
/**
* Offline stand-in for the public collab relay (`wss://relay.omp.sh`).
* Offline stand-in for the public collab relay (`wss://my.omp.sh`).
*
* Speaks the exact relay contract the real clients expect:
* - `GET /r/<roomId>?role=host|guest` upgrades to a WebSocket.
+1 -1
View File
@@ -60,7 +60,7 @@ describe("collab link parsing", () => {
});
it("parses web deep links (https://<relay>/#<link>)", () => {
const bare = parseCollabLink(`https://relay.omp.sh/#${ROOM}#${KEY_TEXT}`);
const bare = parseCollabLink(`https://my.omp.sh/#${ROOM}#${KEY_TEXT}`);
if ("error" in bare) throw new Error(bare.error);
expect(bare.wsUrl).toBe(`${DEFAULT_RELAY_URL}/r/${ROOM}`);
expect(bare.key).toEqual(KEY);
+1
View File
@@ -6,6 +6,7 @@
- Added `readOnly` flags to participant and session payload types to indicate when a guest is connected via a read-only (view) link
- Added `writeToken` to `GuestFrame` hello payloads and parsed collaboration links so full-access links can carry and expose a write-capability token
- Added `ROOM_KEY_BYTES` and `WRITE_TOKEN_BYTES` constants for room key and write-token sizing in the wire protocol
- Added `DEFAULT_SHARE_URL` (`https://my.omp.sh/s`), the default share viewer/upload base for `/share` links
## [15.11.8] - 2026-06-12
+4 -1
View File
@@ -364,7 +364,10 @@ export const ROOM_KEY_BYTES = 32;
export const WRITE_TOKEN_BYTES = 16;
/** Default public relay; bare `<roomId>#<key>` links resolve against it. */
export const DEFAULT_RELAY_URL = "wss://relay.omp.sh";
export const DEFAULT_RELAY_URL = "wss://my.omp.sh";
/** Default share viewer/upload base; `/share` links resolve against `<base>/<id>#<key>`. */
export const DEFAULT_SHARE_URL = "https://my.omp.sh/s";
export interface ParsedCollabLink {
/** wss://host[:port]/r/<roomId> — no query, no fragment. */
+1 -1
View File
@@ -13,6 +13,6 @@ describe("collab wire constants", () => {
expect(COLLAB_PROMPT_MESSAGE_TYPE).toBe("collab-prompt");
expect(ENVELOPE_HEADER_LENGTH).toBe(4);
expect(ROOM_ID_BYTES).toBe(16);
expect(DEFAULT_RELAY_URL).toBe("wss://relay.omp.sh");
expect(DEFAULT_RELAY_URL).toBe("wss://my.omp.sh");
});
});