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.
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:
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.