---
title: Shared recording rich previews + embeddable player
---
# Shared recording rich previews + embeddable player

## What it is

When you share a screen recording by link, the link now shows a **rich preview** — a thumbnail, the recording's title, and a short description — when you paste it into Slack, Notion, Gmail, and other apps that unfurl links, instead of a bare URL. The recording can also be **embedded** as a small inline player on another site (a Notion embed block, a blog, a Twitter/X player card) via a dedicated `/embed` link.

### What you see

- Paste a shared-recording link (`https://shares.omniscio.com/s/<id>/run`) into Slack / Notion / Gmail → a preview card with the recording's poster image, its title, and a one-line description (pulled from the transcript when there is one).
- Embed `https://shares.omniscio.com/s/<id>/embed` in an `<iframe>` on another page → Omniscio's one video player — the same controls, speed menu and keyboard shortcuts as everywhere else — sized to fit the frame.
- Nothing changes for you at share time — the preview and the embed are produced automatically when you share; you still copy the one link as before.

## Where to find it

Nothing to open: this is what a shared recording link does once it is posted. The preview and the embed are produced automatically at share time, from the screen recorder's own share control.

## How it behaves

### The viewer page

Opening the link itself (not just unfurling it) shows a polished, on-brand page — not a bare browser video. It carries the Omniscio look: a **"Shared recording" eyebrow with the orb**, the recording title, the video in a **glassy, aurora-ringed frame** played by Omniscio's one video player (play, seek, volume, an always-visible speed menu, captions, download and full screen, with the same keyboard shortcuts as in the app), a **Copy link** button, the transcript, and a **"Made with Omniscio"** footer showing the real orb + Satoshi wordmark. The image-snip page and the "still uploading" placeholder share the same look. It stays fully self-contained (no external fonts, scripts, or stylesheets), so it renders identically under the strict share sandbox — on desktop and mobile, in light and dark.

A video published from a file rather than recorded — an agent's MP4, an onboarding tour or a feedback video — opens on the same page, labelled **"Shared video"** with a "· Video" browser-tab title and a "Video" link-preview line when it has no transcript. Only a real screen recording says "Shared recording". A page keeps the wording it was published with, so a video shared before this change needs republishing to pick up the new label.

## For agents

### How it works (under the hood)

- A shared recording is served as a single top-level page at `/s/<token>/run`. That page's `<head>` carries **OpenGraph + Twitter Card** tags (`og:title`, `og:description`, `og:image`, `og:type=video.other`, and a Twitter **player** card) so a link-unfurling crawler reads them directly. Builder: [screen-recorder-viewer-html.ts](../../src/main/services/screen-recorder/screen-recorder-viewer-html.ts).
- The preview **thumbnail** is the recording's poster frame, re-encoded to PNG and uploaded to `/s/<token>.png` when you share ([screen-recorder-share-thumbnail.ts](../../src/main/services/screen-recorder/screen-recorder-share-thumbnail.ts)). It is best-effort: if the thumbnail can't be made, the link still previews with a title + description (a plain text card), and sharing is never blocked.
- The **embed player** is served at `/s/<token>/embed` by the share Cloud Function — the same one video player, streaming the same recording; its script is the only one the page's security policy lets run, pinned by a fingerprint of its own text. Unlike the normal viewer, the embed response sets **no `X-Frame-Options`**, which is what lets other sites frame it; that is safe because the embed is a pure media player with no login, cookies, or actions to hijack. Route + headers: [serve-share.ts](../../firebase/functions/src/serve-share.ts) + [share-headers.ts](../../firebase/functions/src/share-headers.ts).
- The preview, thumbnail, and embed all respect the share's protection: a revoked, expired, or password-protected recording does not preview or embed (the crawler / embedder is refused just like a direct viewer without the password).
- The page is **fully self-contained + on-brand**: the orb and the "Omniscio" wordmark are inlined as base64 PNGs from [share-brand-assets.ts](../../src/shared/share-brand-assets.ts). The wordmark is a RENDERED IMAGE of Satoshi, not the webfont — Satoshi's Fontshare licence forbids self-serving the font on the web and the page loads nothing external (a rasterised logo is permitted; see [brand-font-contract.md](../../.claude/memory/contracts/brand-font-contract.md) `no-web-self-serve`). Regenerate `WORDMARK_PNG_BASE64` if the brand font or the aurora gradient changes. The video itself plays in the one video player (see [The video player](video-player.md)), inlined into the page as a single script, so the page still loads nothing external; the transcript and watch beacon are unchanged.

### CLI access

There is no separate control-server route — the rich preview and embed are produced automatically whenever a recording is shared (the normal Share action, or `POST /capture/:id/share`). The shareable link the user already gets is the one that previews and embeds.

## Related

- **Video recordings only.** Image snips (screenshots) are shared without a player or a preview card.
- **Cloud deploy:** the `/embed` player card resolves once the share Cloud Function is deployed (`npm run share:deploy`); before that, a shared link still shows the thumbnail + text preview card, and the thumbnail image works immediately (it uses the existing share-image route).
- The one-time **sharing privacy notice**, link **expiry**, and **password** options are unchanged — the preview + embed sit on top of the existing share.
