---
title: "Videos"
description: "What the agent did, as a film: recording without the page noticing, rendering into a finished video, presets for how it looks, and a share link that can be revoked."
canonical: "https://scalebrowser.net/docs/agents/videos"
---

> ## Documentation Index
> Fetch the complete documentation index at: https://scalebrowser.net/llms.txt
> Use this file to discover all available pages before exploring further.

# Videos

> What the agent did, as a film: recording without the page noticing, rendering into a finished video, presets for how it looks, and a share link that can be revoked.

Two occasions, one apparatus. A **proof video** shows a customer or an auditor what really happened. A **demo video** shows a prospect what the product does.

## The one rule that outranks the feature
**The page must not be able to tell it is being recorded.** Not "as little as possible": measured against a control run with no recording, inside the control's own spread.

That is not a formality. An agent whose input rhythm measurably changes the moment somebody records has opened a new axis on which a page can tell it from a person. The value of a video is always smaller than the damage of such an axis.

The capture quiets itself while you type or click, which is what keeps it out of the way.

## Recording
`record` is in the default `core` set, because a tool behind a profile nobody enables is a tool that does not exist.

| Action  | What it does                                                                     |
| ------- | ---------------------------------------------------------------------------------- |
| `start` | Begin recording.                                                                  |
| `mark`  | Put a chapter on the timeline here. `label` is the heading, `say` is the narration. |
| `stop`  | End it and keep everything recorded so far.                                        |

<Note>

**Marks are cheap; set them.** A chapter nobody marked has to be guessed later, and guessing produces a film whose sections do not match the work. Mark whenever you begin a distinct part of the task.

</Note>

Recording renders nothing and never returns a file.

## Rendering
`video`, also in `core`, turns a finished recording into a file.

| Action   | What it does                                                                                    |
| -------- | ------------------------------------------------------------------------------------------------- |
| `render` | Queue the work. Answers at once with a video id and the plan, and runs in the background, so releasing the profile is fine. |
| `status` | The whole video row with its progress, and once it is done, a ready address for each file.       |
| `list`   | This profile's videos, running renders included.                                                  |

Pass `plan_only` to see what would be rendered without rendering it.

**The finished file is one plain request away.** When a video is done, `status` answers `files`, one entry per file (`video`, `poster`, subtitles and the rest), each with a `url` and an `expires_at`. A `GET` on that address returns the file without any token, and it keeps working until `expires_at`; ask `status` again for a fresh one.  While a video is still queued or rendering, `files` is empty.

<Warning>

**Rendering is slow and costs minutes.** It is a different operation from recording, on a different clock. Do not wait on it inside a lease.

</Warning>

Progress rides on the [event stream](/docs/events) inside `video_changed`, published every 2 percent or 2 seconds, rather than as a separate job event that could disagree with the row.

## What the film looks like
A **video preset** decides the framing: how the camera moves, whether it zooms the whole canvas or a card, how the cursor is drawn, whether there is narration and in which voice.

Exactly one preset ships, called `default`, without narration. The rest belongs to you: a preset is a taste decision, and shipping a gallery of them would be shipping our taste.

The preset editor shows a picture from the **same renderer** on every change, so a switch that does nothing is visible as a switch that does nothing.

### The cursor is a derivation, not a drawing
The pointer path the page received is the humanized one, with its real timing. What the video draws is a smooth glide between the recorded landings: **place and time of every landing are exact**, and only the travel between them is re-synthesised.

The page saw the real events. The picture is calmer than the reality, and that is the only difference.

## Sharing
`POST /v1/videos/:id/share` creates a public link, `GET` reports its state, and `DELETE` revokes it.

A shared video lives at a public address with an optional access code, and it embeds through oEmbed. Revoking takes it to a `404`.

The person watching leaves a daily-rotating hash and nothing else. There is no viewer identity and no plaintext address anywhere in the counting path.

## Storage
Recordings and rendered files both take disk, and they are managed separately: `GET /v1/recordings` lists the raw material, `GET /v1/videos` the finished films, and `GET /v1/videos/storage` says what it all costs.

Deleting a video can take its raw recording with it or leave it, because re-rendering from the raw material is cheap compared with recording again.

## Codecs, voices and media
Three settings in the management app's **Video** tab:

- **Codecs**, what this machine can encode, with a switch per codec.
- **Voices**, a text-to-speech provider for narration. There is none by default and you bring your own.
- **Media**, images and audio a preset may use.

## Next
- [Activity & runs](/docs/agents/runs): the same work as a trail rather than a film.
- [The management app](/docs/ui): where recordings, videos and presets are managed.
- [Tool reference](/docs/agents/tools): `record` and `video` in the catalog.
