Skip to content

A party's room is a page: nixamp.com/live/<slug>, open to read, with the chat - #218

Merged
ralyodio merged 1 commit into
mainfrom
feat/party-room-page
Sep 17, 2026
Merged

ralyodio merged 1 commit into
mainfrom
feat/party-room-page

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Why

bittorrented.com's watch parties are bridged into nixamp as rooms (PR #127), and the web app, the CLI, MCP and the desktop app all hand people the room link nixamp.com/live/<slug>. nixamp.com had no route for that path: it drew the ordinary player, so "Open room" and the invite-code form were dead ends on the one surface that shares the room's address. Reading a party also needed a session, so a share link on a TV or in a terminal showed nothing to someone not signed in yet.

What

  • /live/<slug> is a page (like /directory): title, where the film is as a clock that keeps counting while it plays, Join party to the site with the film (new tab), Copy room link, End party for the host, and the room's chat.
  • The chat is live_event_chat, polled every 4 s and posted with the nixamp session. It is the same chat bittorrented.com's party page reads and writes through the OAuth bridge (profullstack/media-streamer PR, opened alongside this one), so one conversation reaches every surface.
  • GET /api/v1/watch-parties/<ref> is open for a non-private party, by slug, room id or code (any origin: a person typing a code into nixamp.com is not asked which site it came from). The list and every write still need a session or a token with the parties scope.
  • README says so.

Tests

  • test/oauth-server.test.ts: a party is readable signed out by slug and room id, host is false, the list and writes still 401, a missing one 404s.
  • web/test/web.test.ts: the room's markup, the route, the chat wiring, no innerHTML, the clock only counts while playing, the account event re-draws.
  • Full suite: 846 pass, 8 skip (Postgres-gated). bun run typecheck clean. web builds.

After merge

nixamp.com auto-deploys main. Then curl -s https://nixamp.com/api/v1/watch-parties/<slug> should answer 200 signed out for an unlisted party. No CLI release is needed: nothing here touches the servers.

🤖 Generated with Claude Code

…the chat

"Open room" and the invite-code form sent people to nixamp.com/live/<slug>,
and nixamp.com drew the ordinary player there: the web app had no route for
the path, so the room every other surface could open was a dead end on the
one surface that shares its address. And reading a party needed a session,
so a share link on a television or in a terminal had nothing to show a
person who was not signed in yet.

Now /live/<slug> is a page, the way /directory is: the party's title, where
the film is as a clock that keeps counting while it plays, Join party to the
site that has the film (bittorrented.com, in a new tab), Copy room link, and
the room's chat -- the same live_event_chat the party's own page reads and
writes through the OAuth bridge, so a line said on a TV is the line everybody
sees. The host sees End party. Signing in re-draws who may say something.

GET /api/v1/watch-parties/<ref> answers without a session for a party that is
not private, by slug, room id or code (across origins, since a person typing
a code into nixamp.com is not asked which site it came from). The list, and
every write, still need a session or a token with the parties scope.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@ralyodio
ralyodio marked this pull request as ready for review September 17, 2026 13:58
@ralyodio
ralyodio merged commit 833d8eb into main Sep 17, 2026
4 checks passed
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