The Ithura Blog
Product5 min read

Async video, native to Ithura

Record a screen or webcam clip from any wiki page or issue comment; it uploads to your workspace's own storage and drops in as an inline HTML5 player. No Loom subscription, no external service, no data leaving your infrastructure.

A five-minute Loom is worth ten messages in a comment thread. Everyone knows this. Nobody wants to pay Loom $28/seat/month for it, or send a link to a third-party service to record a bug reproduction against their own product.

Ithura now records async video natively. Open any wiki page, issue description, or issue comment, click the Video button on the toolbar, and record a screen or webcam clip. It uploads to your workspace's own storage and drops in as an inline <video> player. No external service touches the file.

An issue comment with an inline video
ARAlicecommented on PAR-482 · Aug 3

Reproduction of the SAML JIT bug in 45 seconds. The IdP returns the assertion but the ACS drops the group claim on re-login. Recorded against the local test IdP so I can share this without exposing customer data:

Video · 0:45 · WebM (VP9 / Opus)

The dropped claim starts at 0:22 in the recording. Full logs are attached below.

The recorder follows you around

A recording that dies the moment you navigate elsewhere is useless for anything real. So the recorder is not a modal anymore. Click Start and a floating pill pops out of the bottom-right of the app with the elapsed timer and a Stop button. The pill stays visible on every page you visit. Click around the app to grab context, open another task to check a repro, jump to a wiki page to demo it. The recording keeps going. When you're done, click Stop on the pill (or press Cmd+Shift+S) and the video inserts back into the editor you started in. If you navigated away, a toast gives you a Copy URLaffordance so you can paste the embed anywhere.

Cmd+Shift+R also starts a recording from any page in the app, whether or not you have an editor open. It lands in the keyboard shortcuts panel under a new Recording section.

How it works

The recorder is the browser's own MediaRecorder API, which negotiates VP9 or VP8 with Opus audio into a WebM container. The Ithura editor wraps it in a small React modal: pick camera or screen, click Start, click Stop. The blob uploads to your workspace's object store (RustFS on Ithura Cloud, or your S3-compatible bucket on self-hosted) via the same presigned-POST flow that handles images, and inserts as a Tiptap video-attachment node.

Playback is a plain HTML5 <video controls>. No player library, no plugin, no third-party embed. The wiki reader mode plays the video the same way the editor does.

Why it's here and not a Loom link

  • Data path. A recording of your product, your bug, or your customer never leaves your infrastructure. Self-hosted Ithura keeps every byte in your rack; Ithura Cloud keeps every byte in the EU.
  • Cost. No per-seat charge. Recording is part of the plan you already pay for.
  • Context. The video is attached to the exact issue or wiki page it's about. No link rot, no "which Loom folder was that in?"
  • One tool. Your comment thread doesn't need "click here to watch the recording" anymore.

Limits in v1

  • 10 minutes per recording. Longer explainers split into two clips.
  • WebM is the recorded format. Uploads also accept MP4 if you bring one in from another tool.
  • Storage counts against the workspace quota. See the plans page.

Where async video goes next

  • Transcript search via self-hostable Whisper. Search a recording by what was said, not just its title.
  • Chapters the presenter marks live during the recording.
  • Comments pinned to timecodes for reviewer-friendly async feedback.
  • Signed share links with per-viewer expiry and view-count analytics, so a recording can leave the workspace on a controlled leash.

API surface

Automations and integrations upload via the existing workspace assets endpoint, with an entity_type of VIDEO_RECORDING:

POST /assets/v2/workspaces/{slug}/
{
  "name": "recording-2026-08-03.webm",
  "type": "video/webm",
  "size": 4823901,
  "entity_type": "VIDEO_RECORDING"
}

# then POST the blob to the presigned URL from the response, then

PATCH /assets/v2/workspaces/{slug}/{asset_id}/

Related

  • docs/features/async-video, the full recorder + playback + storage contract.
  • docs/features/huddles, the live-video sibling. Async and live share the same object store and the same playback path.
  • docs/sovereign. The recorder runs in the browser, uploads to your storage, streams from your API. Zero external service in the loop.