Skip to content

Show recordings in Cassini's published embed instead of vendored source - #7

Draft
silviot wants to merge 4 commits into
mainfrom
feat/d-838-use-published-embed
Draft

silviot wants to merge 4 commits into
mainfrom
feat/d-838-use-published-embed

Conversation

@silviot

@silviot silviot commented Sep 28, 2026 •

Copy link
Copy Markdown
Member

The players load gocassini's published <cassini-meeting> embed from dist.gocassini.com, pinned to one exact version. This repository no longer contains any AGPL viewer source. Part of D-838.

Important

Draft until the pin moves. src/lib/viewer/embed.ts pins main-ac7ff29b, the one embed build on dist today. That build predates what this PR relies on: layout="inline", the --cassini-color-* palette hooks, Space kept inside the viewer, and playbackerror. Those come in codemyriad/gocassini#340. Before merging, set CASSINI_EMBED_VERSION to the first gocassini release that includes #340, once that release is published to dist.

CI enforces this: npm run check:embed fails while the pin lacks any feature the site uses, so this PR's CI stays red until the pin moves.

before after
Viewer vendored MeetingView (AGPL) + sync-viewer.mjs patches, compiled by this site <script src="https://dist.gocassini.com/embed/<version>/viewer.js">, loaded like any other page
Look embedding.css injected into the shadow root, targeting internal markup the embed's documented hooks: layout="inline", --cassini-color-*, --cassini-font-sans, theme
Playback errors patched playbackerror Svelte event the element's playbackerror DOM event
Tests upstream suites + adapter tests (test:viewer) npm test: the pin is one exact version on dist. The viewer's own tests run in gocassini
Licensing AGPL rows in LICENSE.md for site/src/lib/vendor/** and site/src/lib/viewer/** none. All site code is CC0; the viewer lives in gocassini

Checked in headless Chromium. I built the site with VITE_CASSINI_EMBED_SRC pointing at a local build of gocassini#340.

  • Home example: 126 words rendered in the inline layout with the site's palette.
  • /try/: a local .opus opened through a blob: URL rendered 872 words.
  • The site's light/dark switch changed the viewer's theme.
  • Space on the page scrolled the page and didn't start playback.
  • No console errors.
  • npm run check reported 0 errors, npm test passed, and the production build passed.

This run found a bug in gocassini: narrow embeds showed a back arrow that led nowhere. The fix is in #340.

Notes
  • CassiniEmbed.svelte creates the element itself, so every attribute is set before it connects: the embed reads its attributes on arrival.
  • The "Recorded with Cassini" badge is hidden, because a file opened on /try/ may come from any producer.
  • Removed dependencies: @lucide/svelte, dompurify, daisyui, tailwindcss, @tailwindcss/cli. Only the vendored viewer used them.
  • The player is visually close to before, but not identical: the old embedding.css also restyled tags, badges and muted text through selectors on internal markup, which the contract deliberately doesn't allow.

🤖 Generated with Claude Code

silviot and others added 4 commits September 28, 2026 16:20
The players mounted a vendored, patched copy of gocassini's AGPL MeetingView
(site/src/lib/vendor/cassini-viewer, synced by scripts/sync-viewer.mjs, with
embedding.css reaching into its markup). They now load the published
<cassini-meeting> embed from dist.gocassini.com, pinned to one exact version
in src/lib/viewer/embed.ts, the way any other page would (D-838).

- CassiniEmbed.svelte hands the element a blob URL of the bytes Player has
  already read. It uses layout="inline" and maps the site palette onto the
  embed's --cassini-color-* properties. It follows the site's light/dark
  switch through theme, and turns playbackerror into the existing notice.
  If the viewer script cannot load, the plain <audio> fallback is shown.
- The vendored source, the sync script, the generated stylesheet, the
  adapter, and the dependencies only they used are gone. So are the upstream
  test suites, which run in gocassini. `npm test` checks that the pin is one
  exact version.
- LICENSE.md, the README and the footer no longer describe AGPL code in
  this repository.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
scripts/check-embed.mjs fetches the pinned viewer.js and viewer.css and
checks that the bundle carries each feature CassiniEmbed.svelte relies on:
layout="inline", the palette and font properties, the live theme attribute
and the playbackerror event. CI runs it before building. A pin to an older
build would otherwise load and quietly misbehave. The current pin,
main-ac7ff29b, fails it until a release containing gocassini#340 is on dist.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01THU7Hzppt6iW8AXHGd9cBf
CI runs npm run check:embed before building. The documented hand-deploy
path did not, so it could ship a pin without the features the site uses.
The check is not part of npm run build: it needs the network, and builds
for offline previews should still work. Found in review.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01THU7Hzppt6iW8AXHGd9cBf
… run build

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01THU7Hzppt6iW8AXHGd9cBf
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