Images are the easy case. Video goes to a streaming service and needs time to encode before anyone can play it; audio accepts exactly one format; and documents accept everything, because “document” is what a file becomes when Leed does not recognize it as anything else. This page covers the three of them: what each accepts, what happens after you press Submit, and what you can set on the asset afterwards.
All three uploads are free on every plan, and so is playback on your published site. Reading the transcript Leed makes from a video or an audio file needs Starter, and the viewer figures on this page need Growth; both are marked where they appear.
Three upload flows, three destinations
Start any of them from New asset at the top of the Assets panel and pick the type, or drag the file onto any screen in the CMS and let Leed route it. Where the bytes end up differs by type, and that difference is the reason the three flows feel different.
- Video
- Audio
- Document
The Upload Video dialog takes a Name and a Description, previews the file locally so you can check you picked the right one, and then uploads it to Cloudflare Stream over a resumable connection with a live percentage. Resumable means the upload survives a wobble in your connection instead of starting over.
Two things happen before the bytes move: Leed reserves a placeholder asset so the upload has somewhere to land, and it fingerprints your file to check you have not uploaded this exact video before. When the transfer finishes the placeholder is finalized with the real video id and the transcription workflow starts.
sequenceDiagram
participant You
participant Leed
participant Stream as Cloudflare Stream
You->>Leed: Choose a file, add Name and Description
Leed->>You: Local preview of the chosen file
Leed->>Leed: Reserve a placeholder asset
Leed->>Leed: Fingerprint the bytes to check for a duplicate
Leed->>Stream: Resumable upload, reporting progress as a percentage
Stream-->>Leed: Upload finalized
Leed-->>You: Asset page, showing Processing…
The Upload Audio dialog also takes a Name and a Description. Audio does not go to Stream — Leed asks for a one-time upload URL, your browser sends the file straight to object storage, and then the asset row is created and the transcription workflow starts. There is no encoding step and no processing wait: the player works as soon as the asset exists.
Audio is fingerprinted for exact duplicates the same way video is.
The Upload Document dialog takes a Name and a Description and accepts any file. It is the catch-all: anything whose type is not a recognized image, video or audio format is routed here, which is why a ZIP, a CSV or a file the browser reports no type for all upload rather than being refused.
Like audio, the file goes straight to object storage over a one-time URL. If the extension is PDF, DOC or DOCX, Leed also starts a text-extraction workflow; every other extension is stored and served without one.
All three run the same exact-duplicate check before uploading: a SHA-256 of the file’s bytes, compared against what you already hold. A match opens a dialog headed This file is already uploaded — An identical file already exists in your media library. — with Cancel and Not a duplicate — upload anyway. Unlike images, there is no near-duplicate detection for these types: a re-encoded video or a re-saved PDF is a different file and will not be caught. Images have both checks; uploading images explains the difference.
Video formats
Thirteen distinct formats, matched by MIME type rather than by extension.
| Extension | MIME type | Notes |
|---|---|---|
.mp4 | video/mp4 | the safe default for anything you record or export yourself |
.mkv | video/x-matroska | |
.mov | video/quicktime | what most Apple devices and Final Cut produce |
.avi | video/x-msvideo | |
.flv | video/x-flv | |
.ts | video/mp2t | MPEG transport stream |
.ps | video/mp2p | MPEG program stream |
.mxf | application/mxf | broadcast interchange |
.lxf | video/vnd.lxf | broadcast interchange |
.gxf | application/gxf | broadcast interchange |
.3gp | video/3gpp | older mobile capture |
.webm | video/webm | |
.mpg | video/mpeg |
Anything else whose type begins with video/ is refused rather than falling through to the document flow — you get Unsupported video type. Supported video formats: … naming the list above. (video/quicktime is registered twice in the accepted list, which is why the message ends with mov repeated. It is accepted once and the duplicate is cosmetic.)
Audio is MP3 only
One format is live today: MP3, MIME type audio/mpeg. That is not a summary of a longer list — it is the list.
| Extension | MIME type | Status |
|---|---|---|
.mp3 | audio/mpeg | accepted |
WAV, OGG, AAC, M4A and WebM audio are present in the product’s source but switched off, so a file in any of them is refused with Unsupported audio type. Supported audio formats: mp3. rather than being quietly turned into a document. Convert to MP3 before uploading.
“Processing…” and what ends it
A freshly uploaded video is not immediately playable. The asset page shows a gray panel reading Processing… where the player will be, with the Name and Description fields already usable beneath it.
stateDiagram-v2
[*] --> Uploading: bytes move to Cloudflare Stream
Uploading --> Processing: upload finalizes
Processing --> Playable: Stream reports the encode done
Playable --> [*]
While the asset sits in Processing… the player area is a gray panel, but the asset is already real: Name and Description are editable and save normally, and the asset has an id you can reference. Only playback is unavailable.
What ends that state is not Cloudflare finishing the encode — it is Leed noticing. The transcription workflow that starts when the upload finalizes polls Stream, and the moment Stream reports the video ready it flips the asset’s status and captures the playback URL. It polls up to 120 times at 30-second intervals, so it will keep watching for about an hour before giving up.
sequenceDiagram
autonumber
participant B as Your browser
participant L as Leed
participant S as Cloudflare Stream
participant W as Transcription workflow
B->>L: New asset → Video
L-->>B: Placeholder asset reserved
B->>L: Request an upload destination
L->>S: Ask for a resumable upload URL
S-->>L: Upload URL
L-->>B: Upload URL
B->>S: Upload the file (resumable, with progress)
S-->>B: Transfer complete
B->>L: Finalise the asset with the video id
L->>W: Start the transcription workflow
Note over B,L: The asset now shows "Processing…"
loop up to 120 times, 30s apart
W->>S: Is this video ready?
S-->>W: Not yet
end
S-->>W: Ready, here is the playback URL
W->>L: Mark the asset ready
Note over B,L: Reload the asset — the player appears
The step ordering is the answer to the question people actually ask: why does it still say Processing when Cloudflare already has my video? Because the flag that governs the player is written by Leed’s workflow on its next poll, not by Stream directly.
My video is still Processing
Work through these in order.
- Reload the page. The asset page never updates itself. This is the fix nine times out of ten.
- Give it time proportional to the file. A long or high-bitrate video takes Stream real minutes to encode; the poll runs for about an hour before it stops.
- If it is still Processing after that, re-upload. A genuinely failed encode does not currently surface as an error — the asset simply stays on Processing rather than telling you something went wrong. Upload the file again (a fresh upload creates a new asset) and delete the stuck one. This gap is listed in known limitations.
Choosing the poster frame
The still shown before someone presses play is the frame at 0 s unless you choose otherwise, and the first frame of a video is very often black.
To pick a better one: play or scrub the player on the asset page to the frame you want, then press Set Thumbnail from Current Position. Leed records the timestamp on the asset and tells Stream about it, so that frame becomes the poster everywhere at once — in the CMS asset grid, on the asset page itself, and in the embedded player on your published site. There is nothing to re-publish and no second place to set it.
Playback options
Both video and audio carry a collapsible Player Settings panel on the asset page. Every checkbox saves the moment you tick it.
| Option | Applies to | Default | Effect on the published embed |
|---|---|---|---|
| Show Controls | video | on | off hides the play bar entirely — the viewer cannot start, pause or seek |
| Autoplay | video, audio | off | the player attempts to start on its own when the page loads |
| Muted | video | off | starts silent; the viewer can unmute from the controls |
| Loop | video, audio | off | restarts at the end instead of stopping |
| Allow fullscreen | video | on | the embed always permits fullscreen; there is no control for this in the CMS |
| Thumbnail timestamp | video | unset — the frame at 0s | set by Set Thumbnail from Current Position, not by a checkbox |
Only values that differ from the defaults are written into the embed URL, so a video left on its defaults produces a clean embed with no query string at all. The audio player’s controls are always on in the snippet Leed generates and have no checkbox of their own.
Documents
A PDF gets an inline preview on its asset page — the real document in a scrollable frame, so you can confirm you uploaded the right revision without downloading it. Every other extension shows a generated file-type icon instead.
| Extension group | Preview in the CMS | Text extraction attempted | Served as |
|---|---|---|---|
| inline document preview | yes | a download from a /f/… URL | |
| DOC, DOCX | file-type icon | yes | a download from a /f/… URL |
| everything else | file-type icon | no | a download from a /f/… URL |
The Filename shown under File Details is what a visitor’s browser will name the file when they download it. It is display-only here — the link a visitor follows is keyed on the asset id, not on the filename, so nothing breaks if the underlying file was named something unhelpful. Asset delivery and protection explains the /f/… URL and what it does and does not protect.
The Description field on a document, a video or an audio asset is internal metadata. It helps you and your colleagues recognize the asset in a year’s time; it is not published copy, it does not appear beside the file on your site, and it is not the alt text (only images have one of those). Text pulled out of a document, on the other hand, is real content — it powers search and AI answers about your site — and that is covered in transcription and text extraction, along with the Starter gate on reading it back.
A document attached to a form’s response email is an ordinary document asset — nothing special is uploaded for it. See response emails and gated downloads.
Per-asset engagement
Video and audio asset pages carry an Analytics section in the body, between the marketing-approval checkbox and the labels. It has a date-range picker and reports, for that one asset over that range, how many unique viewers it had, the total time viewed and the average time per viewer.
Documents have no analytics section at all — not an empty one, not an upgrade panel. Downloads are recorded, but there is no per-document chart on the asset page.
Deleting and replacing
Deleting works the same for these types as for every asset: the Delete button is disabled while the asset is referenced by a page, a form, an email template or a profile, and deleting needs the Content Publisher role. Asset details and usage owns that rule, along with labels, marketing approval and the Copy HTML Snippet button that gives you the embed for each type.
There is no replace-file action. Uploading a corrected cut of a video or a revised PDF creates a new asset with a new id; the old one keeps its own id and every reference to it. So the sequence for a correction is: upload the new file, swap it in wherever the old one was used, then delete the old one — and the Used in list on the old asset is the checklist for that middle step.
Once the video is ready, place it on a page with the editor’s Asset button, which inserts the player rather than a link — see inserting media and embeds. In Leed Markdown a Cloudflare video, an audio file and an iframe each take their own parameters, which embeds and icons sets out.