Skip to content

Media

The media record, which file types upload and the three size guards that decide, how thumbnails are made, and what a media code actually resolves to.

All documentation — Playing and styling
On this page

The Media section, Ctrl+8. Images, video, audio and documents, in a tree of folders.

The Media drawer: an Abilities folder of nine items and an Augments folder of twelve, each row carrying its own thumbnail.
The media library.

A media item

Every row — file or folder — carries:

FieldTypeWhat it is
idstring
namestringThe display name
typefolder · image · video · audio · document · other
parentIdstring or nullIts folder; null is the root
ordernumber
createdAt · updatedAtnumberEpoch milliseconds
createdBystring

A file adds:

FieldTypeWhat it is
codestringThe stable identifier you own — see below
sizenumberBytes
mimeTypestring
extensionstringIncluding the dot
minioPath · mediaIdstringWhere the bytes are
metadataobjectwidth, height, duration, thumbnail

The type is derived from the MIME type: image/*, video/*, audio/*, anything containing pdf or document, then other.

Uploading

What is accepted

FamilyTypes
ImagesJPEG · PNG · GIF · WebP · SVG
VideoMP4 · WebM · Ogg · QuickTime
AudioMP3 · WAV · Ogg · WebM
DocumentsPDF · plain text · Markdown · JSON

Empty files are rejected. The server derives the content type from the extension, not from what the browser declared — so a PNG mislabelled as a video cannot dodge the image cap.

The three size guards

The effective limit is the smallest of the three that applies to your file.

GuardLimit
In the browserA flat 100 MB. It does not know your plan.
Per file, by planFree is 10 MB. The paid figures are a support answer rather than a published table.
By type, at storageImages 25 MB; everything else 100 MB

Storage is charged when the upload is authorised, not when it finishes.

Storage per project

Every plan has a storage limit per project — not per organization, and not per seat. It counts more than media: the collaborative snapshot of each document and of the project counts too, so a text-only project consumes it. The figure per plan is on the pricing page.

Refused with: Storage limit reached for this project: your plan includes X per project and Y is already in use. Upgrade your plan or delete some files to free up space.

The figure it compares against is a maintained estimate, reconciled nightly, and it errs toward over-counting — so you are refused slightly early rather than silently allowed past your plan.

Thumbnails

SourceWhat is produced
Video, in your browser at uploadOne frame, seeked to 1 second, max dimension 512, JPEG. Non-blocking — the upload does not wait for it.
Images, on the serverFour WebP variants: centre-cropped at 128, 256 and 512, plus a 512 fit. Each is derived from the original, never from a smaller one.
Image dimensionsRead in your browser and stored as metadata. Not a thumbnail.

Serving asks for the server thumbnail first, and falls back to the browser-made JPEG. While one is still being made you get Thumbnail not found. It may still be generating, and the client retries.

Guards on the server side: sources over 30 MB are refused, and there is a pixel ceiling. Generation is idempotent — if all four variants exist, nothing runs.

Usage tracking does not exist

One partial exception: renaming a media code reports how many references it will migrate. That count comes from scanning board nodes’ expression and code fields only — it does not scan entity items, asset field values or documents. Read it as how many expressions name this code, not as where is this file used.

Media codes

A code is the stable name you give a file so an expression can refer to it. It must match [a-zA-Z_][a-zA-Z0-9_]* — a letter or underscore, then letters, digits and underscores. No spaces, no dots.

A code is minted at upload from the file’s name, camel-cased, with _1 and _2 appended on collision. It is unique per project, ignoring case and underscores (doorOpen and door_open clash). Renaming the item does not touch the code; changing the code is its own action, and it migrates the expressions that name it.

What a code resolves to

In an expression, a media code is a bare identifier in the same namespace as variables, entities, contexts and enum values.

What a game engine receives — two different things

StageWhat the code does
Code generationThe code becomes the name of a generated constant, whose value is the file’s path
The runtime payloadThe code is absent. A media reference arrives as {kind: 'media', mediaId, url}, and the payload’s media table maps ids to locations.

A game cannot obtain a media code at runtime. It resolves a media reference through an id. The code is a build-time convenience for naming constants, not part of the runtime contract.

url is a relative path for an engine build and a signed URL for a share link — the two producers answer differently on purpose.

Limits

LimitEnforced by
Per-file upload sizeA plan guard, plus a per-type storage guard
Storage per projectA plan guard, against a maintained estimate
Number of media itemsNothing. No guard reads such a number, on any plan.

What breaks

SituationWhat you see
A file type outside the accepted listRejected in the browser
A file over your plan’s per-file limitFile exceeds NMB upload limit. Upgrade your plan for larger uploads.
An image over 25 MBRefused at storage, whatever your plan
The project is out of storageStorage limit reached for this project…
A thumbnail is not ready yetThumbnail not found. It may still be generating — the client retries
Audio or a documentNo thumbnail is ever requested
A code that is invalid or already takenRefused before the write begins
Deleting a file something referencesNo warning. Nothing checks.
Written for
Writers · Unity developers · Advanced integrators
Last updated