Skip to content

feat: anonymous end-to-end encrypted rooms (/r/<room>#k=<key>) + pairux room - #138

Merged
ralyodio merged 1 commit into
masterfrom
feat/anon-rooms
Oct 12, 2026
Merged

ralyodio merged 1 commit into
masterfrom
feat/anon-rooms

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

A room link is the whole room: a 128-bit id and the 32-byte media key in the
URL fragment, which browsers never send to PairUX. Anyone with the link joins
with no account; every frame is encrypted in the browser by
@profullstack/pairux-embed and the SFU only forwards ciphertext.

  • /r/[room]: name + Voice/Video, mounts the embed call; /r makes a new room
  • POST /api/v1/rooms/token: no auth, anon- LiveKit namespace (never
    recorded or analysed), random identity, 16-person cap, 20/min per IP
  • pairux room in the agent CLI prints a fresh link, made locally
  • web depends on the embed workspace package; Dockerfile and web-bun CI
    build every web dependency (@pairux/web^...)

qrypt.chat's /voice and qc voice mint the same links.

Tested: vitest (anon-rooms lib, rooms/token route, agent-cli room), web tsc + eslint clean, next build lists /r, /r/[room], /api/v1/rooms/token.
Not yet tested: a real two-browser call (same gap as the partner embed: dev2's Chromium has no network).

🤖 Generated with Claude Code

…rux room`

A room link is the whole room: a 128-bit id and the 32-byte media key in the
URL fragment, which browsers never send to PairUX. Anyone with the link joins
with no account; every frame is encrypted in the browser by
@profullstack/pairux-embed and the SFU only forwards ciphertext.

- /r/[room]: name + Voice/Video, mounts the embed call; /r makes a new room
- POST /api/v1/rooms/token: no auth, anon-<room> LiveKit namespace (never
  recorded or analysed), random identity, 16-person cap, 20/min per IP
- `pairux room` in the agent CLI prints a fresh link, made locally
- web depends on the embed workspace package; Dockerfile and web-bun CI
  build every web dependency (@pairux/web^...)

qrypt.chat's /voice and `qc voice` mint the same links.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

47 finding(s)

HIGH/CRITICAL: 4 | MEDIUM: 27 | LOW: 16

Severity Rule Location
HIGH sh-eval-expansion .githooks/pre-commit:33
HIGH js-electron-node-integration apps/desktop/src/main/window.ts:49
HIGH sh-unquoted-expansion-destructive apps/installer/scripts/install.sh:715
HIGH sh-unquoted-expansion-destructive apps/installer/scripts/install.sh:917
MEDIUM sh-remote-script-execution apps/installer/scripts/install.sh:691
MEDIUM sh-remote-script-execution apps/installer/scripts/install.sh:820
MEDIUM sh-remote-script-execution apps/installer/scripts/install.sh:822
MEDIUM sh-remote-script-execution apps/installer/scripts/install.sh:1078
MEDIUM sh-remote-script-execution apps/installer/scripts/install.sh:1080
MEDIUM sh-remote-script-execution apps/livekit/setup-livekit-server.sh:93
MEDIUM sh-remote-script-execution apps/turn/deploy-droplet.sh:62
MEDIUM js-unescaped-html-sink apps/web/src/app/blog/[slug]/page.tsx:48
MEDIUM js-unescaped-html-sink apps/web/src/app/blog/[slug]/page.tsx:73
MEDIUM js-unescaped-html-sink apps/web/src/app/c/[handle]/page.tsx:196
MEDIUM js-open-redirect apps/web/src/app/cli/authorize/consent.tsx:66
MEDIUM js-unescaped-html-sink apps/web/src/app/l/[joinCode]/page.tsx:129
MEDIUM js-unescaped-html-sink apps/web/src/app/l/[joinCode]/page.tsx:213
MEDIUM js-unescaped-html-sink apps/web/src/app/layout.tsx:141
MEDIUM js-unescaped-html-sink apps/web/src/app/live/page.tsx:145
MEDIUM js-unescaped-html-sink apps/web/src/app/page.tsx:123
MEDIUM js-unescaped-html-sink apps/web/src/app/pricing/page.tsx:286
MEDIUM js-open-redirect apps/web/src/app/pricing/UpgradeButton.tsx:50
MEDIUM js-unescaped-html-sink apps/web/src/app/u/[username]/page.tsx:282
MEDIUM js-open-redirect apps/web/src/hooks/useDesktopHandoff.ts:24
MEDIUM redos-nested-quantifier apps/web/src/lib/deliverable.ts:11
MEDIUM js-unescaped-html-sink apps/web/src/lib/player/player.ts:124
MEDIUM js-unescaped-html-sink apps/web/src/lib/player/player.ts:393
MEDIUM js-unescaped-html-sink apps/web/src/lib/player/player.ts:396
MEDIUM js-unescaped-html-sink apps/web/src/lib/player/player.ts:405
MEDIUM js-unescaped-html-sink apps/web/src/lib/player/player.ts:608
MEDIUM sql-template-interpolation packages/ai-core/src/prompts.ts:36
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:138
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:139
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:340
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:341
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:371
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:372
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:383
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:397
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:398
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:405
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:415
LOW secret-generic-credential apps/desktop/src/main/agent-cli/commands.test.ts:416
LOW secret-generic-credential apps/livekit/fly.toml:12
LOW secret-generic-credential apps/turn/fly.toml:11
LOW secret-generic-credential docs/API.md:747
LOW secret-generic-credential docs/API.md:753

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit a0a2581 into master Oct 12, 2026
15 checks passed
@ralyodio
ralyodio deleted the feat/anon-rooms branch October 12, 2026 21:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant