Skip to the article
3dCMS Knowledge Base
Contact Open the editor
Importing & Assets

The Asset Library

Your account-wide media library for images, 3D models, audio, and HDRIs: upload once, use across every site.

Open in the interactive manual →

The interactive version has full-text search, a table of contents, and light/dark themes.


The Asset Library (Windows ▸ Asset Library) is your media closet: images, 3D models, audio, and HDRIs, stored on your account and shared across all your sites. Upload once, reuse everywhere.

Uploading

Drag and drop files onto the panel (several at once), or click Upload. Accepted types: png, jpg, webp, avif, gif, svg, glb, mp3, wav, ogg, m4a, mp4, webm, hdr, exr. Anything else (an FBX, a .blend, a .usdz, a text .gltf) is refused when you drop it, with what to do instead: export it as a binary .glb. An OBJ goes through File ▸ Import ▸ OBJ.

LimitValue
Per fileup to 36 MB, on every plan. A model over it is usually uncompressed textures: gltf-transform optimize in.glb out.glb --compress draco --texture-compress webp typically brings it well under.
Per account0.25 GB and 1,000 files on the free plan (see Membership & plan limits)
Textures inside a modelno side over 8,192 px. A GLB carrying a bigger embedded texture is refused at upload with the size named (most graphics cards cannot load it, and it would crash the tab of whoever placed it), and such a model cannot be shared to the public library. Re-export with the textures at 8,192 or smaller.
A model's scene descriptionunder 4 MB. The JSON part of a GLB (its node tree and material list, not the meshes or textures) is tiny in any real export; a file whose description is larger than that is refused at upload as too complex, with the same message both ways in. Re-export it from your 3D tool as a standard .glb.

Your uploads are private to you. If you hit a limit, 3dCMS tells you clearly: the per-file figure is the largest file that can actually reach the server, so an over-size file is refused up front with a readable message rather than failing halfway through the upload.

Browsing & filtering

Filter with the chip row: All · Images · Cut-out · Texture · 3D · Audio · HDRI · Heavy · Personal · Public · Trash. Image assets show thumbnails; 3D models show a triangle-count badge and weight tier. AI-generated assets carry an AI badge with their prompt.

ChipShows
Cut-outOnly images with a transparent background (a detected alpha channel): the decals, logos, and foliage that become alpha-cutout planes.
TextureOnly complete PBR texture sets. A folder of channel-named maps (albedo + normal + ORMH, plus an optional emissive member) collapses into a single card (badged PBR) instead of cluttering the grid with four separate images. Placing it drops a plane carrying the whole material.
HeavyOnly the assets that cost a visitor real money to load. See below. The chip carries a count, so Heavy (4) tells you how many there are before you click it.
PersonalJust your own uploads (hides anything you've made public).

Which assets are heavy

A 67 MB model and a 5 KB one look identical on the shelf, so the library marks the expensive half. An asset is heavy when it carries 32 MB or more of textures or 25,000 triangles or more. Heavy cards show a small kettlebell beside their triangle count, and hovering it (or reading it with a screen reader) says which of the two numbers tripped. That's worth knowing, because shrinking maps does nothing for a dense mesh and decimating does nothing for heavy maps.

It's a weight, not a grade. A heavy asset isn't a mistake: plenty of scenes want exactly one hero model at that size. It just tells you that every visitor pays for it, which is the thing you can't see from a thumbnail. The judgement is made on the full-size original, not on the pre-shrunk copy a phone might receive: the card says what the asset is, since a desktop visitor gets the master. Assets uploaded before 3dCMS measured models carry no numbers at all, and those are left unmarked rather than vouched for as light.

An empty Heavy view is the good outcome, and it says so, "Nothing in your library is heavy" rather than pretending your filters found nothing. When something is in there, Decimate, a smaller texture, or a low-poly substitute are the three ways out; scene weight is where you see what it costs once placed.

Deleting an asset

Deleting from your library is a move to Trash, reversible from the Trash chip for 30 days. The confirmation first tells you who would notice: "Used by 3 of your scenes, 1 of them published and live." That count is the difference between tidying up and quietly breaking a page, and it isn't visible from a thumbnail.

When the 30 days run out, the sweep holds back any file a published scene still points at rather than deleting it, so a live page never turns into a placeholder box on a day nobody did anything. That is a safety net, not a lock: Delete forever inside the Trash is an explicit decision and removes the file either way. If you meant it, republish the scene without the asset first.

Search & keyword tags

The search box matches on both file names and keyword tags. Every asset carries tags built automatically from its name plus, for images, its dominant colours, so searching "blue", "wood", "fabric", or "flooring" surfaces the right assets even when the word isn't in the filename (material-category synonyms map common words onto tagged surfaces). As you type, matching tags auto-complete from a suggestion list.

To curate a card's tags yourself, click its 🏷 tag button: a little editor opens where you type tags (commit each with Enter or a comma), remove one with its × or Backspace, and Save. Good tags make a big library searchable in seconds.

Shrinking model textures

The textures inside a downloaded or generated 3D model are routinely 2048 or 4096 pixels square, more than any phone can display, and enough to crash a mobile browser tab while it's still loading. So the library quietly builds a pre-shrunk copy of each of your models: identical geometry, every embedded texture re-encoded at 1024 pixels. The savings are large: a 90 KB model came out at under 7 KB in testing.

A model you upload gets its shrunk copy immediately, built in your browser from the bytes it just sent, so a scene you upload to and publish in the same sitting is already phone-friendly, with no panel to open and nothing to wait for.

A model that lands on the server with no browser in the loop, an AI generation or a model made through Claude over MCP, gets its shrunk copy built on the server right after it is saved, one model at a time, so a scene built entirely from chat is phone-friendly without anyone opening the editor. If a build fails for a transient reason the model is simply tried again later rather than written off.

The server also bakes a second, 2048-pixel copy of each model. Phones load the 1024 copy everywhere, then fetch the 2048 one for the single model the visitor is standing closest to, so whatever they walk up to stays sharp (see Building fast scenes). A model whose textures already fit is served as itself rather than as a smaller copy.

The library sweep is the backfill for everything else: models uploaded before this existed, and anything the server has not reached yet. While the panel is open it works through a few models at a time and shows a progress bar ("Shrinking model textures…" with the model it's on), and when models are still waiting it says so, with a Shrink all button to do the rest in one go (and Stop to call it off). It only runs on your own library, never on Trash or Public, and models it can't improve are marked once and never re-attempted.

Nothing changes about how you build The shrunk copy is chosen at load time by the visitor's device, not baked into your scene: phones and tablets get it, desktops keep the full-resolution original, and every already-published scene picks it up with no re-publish. Scene weight is still quoted against the real model, so the meter never flatters you. A model that hasn't been shrunk yet simply loads as it always did.

Baking loading outlines

A second, much cheaper sweep runs on the same panel: it bakes a tiny outline of each model, its own silhouette clustered down to a few hundred triangles with every texture stripped, tens of kilobytes against the model's megabytes. That's what stands in a published scene while the real model is still on its way, so a deferred forest reads as trees rather than as crates.

It works like the texture sweep: a few models at a time while the panel is open, a progress line reading "Baking model outlines…", a count of how many models still show a plain block, and a Bake all button (with Stop) to finish the rest in one go. It starts only after the texture sweep is done: each sweep deliberately handles one model at a time to avoid a memory spike on your machine, and two running at once would recreate exactly that spike. Models it can't read are marked once and skipped forever, and your own library is the only thing it touches.

A model you upload doesn't wait for the sweep: its outline is baked as part of bringing it in, from the bytes your browser just sent. The sweep is the backfill for everything else, AI generations included, since those arrive on the server with no browser in the loop. Which outline a published scene uses is stamped in when you publish, so republish an older site to pick up outlines baked since.

Placing an asset

There are two ways to get a card into the scene:

  • Click a card: the asset lands at the centre of your current view (repeat placements nudge along so they don't stack).
  • Drag a card onto the viewport: it drops exactly where you release, sitting on the ground level of whatever you're looking at, and your camera stays put.

On a touch screen the drag is a press and hold, then drag: rest a finger on a card for about a third of a second and it arms (you get a small haptic tick, and a chip of the card follows your finger), then slide out onto the scene and lift to drop. The hold is what makes it work in a scrolling list: a finger that moves straight away is scrolling the library, so the drag only takes over once you've held still. A plain tap is over long before that, so tap-to-place is unaffected, and a mouse keeps its ordinary drag. A stylus or pen follows the same hold-then-drag, and while the gesture is live the phone's own long-press menu (copy image, text selection) stays out of the way. Everything downstream is identical to the mouse drag, the amber cage included, so dropping a texture onto an object (below) works from a tablet exactly as it does from a desktop.

Your images are also offered inside the objects that display one: select a Web Image block and Properties opens with a Choose from your images dropdown listing this same library, so swapping the picture in a framed slot is one click rather than a trip through here to copy an address. The particle sprite and spotlight gobo pickers work the same way.

Use your own copy, not someone else's address Pasting an image address from another website into a Web Image block (or a video block's poster) looks fine in the editor and breaks for everyone else. Those pictures are fetched through a proxy that requires a signed-in caller, and it has to stay that way: it is what stops a scene from being pointed at private addresses. So you see the image and every visitor to the published scene sees an empty plane. Upload the file here and pick it from Choose from your images instead. The scene lint flags hot-linked images by name, and publishing now runs the same check: the publish result carries an advisory warning naming the offending nodes, because publish is the moment your audience changes from you to everyone.

What each asset becomes:

AssetWhat happens
ImageCreates a Plane with a real material bound to it.
HDRINot placed as an object. It lights the scene instead: open Settings ▸ Lighting, choose Studio, and pick it under Environment HDRI (or use Upload HDRI… there). It replaces the built-in studio HDRI for reflections and fill, in the editor and the published scene; HDRI rotation turns it to put its brightest light where you want it. A .hdr or .exr up to 2048 px wide: wider files, or files whose header cannot be read, are refused at upload, in the picker and in the published scene, so phones can light it. While it downloads, the built-in HDRI lights the scene. It counts toward the scene weight (about 29 MB of texture). The Live sky mode keeps its own environment, and Settings says so when a stored HDRI is not in use (Live sky, or Environment intensity 0).
GLBImports the model into the scene.
AudioAttaches as the audio clip of the selected page or object.
VideoAdds a Web Video screen (the Web palette's Video block) playing the clip (or, with a Web Video block selected, sets its source). MP4 and WebM.

Dropping a texture onto an object

Drag an image or a PBR set card onto an object rather than onto empty space and it retextures that object instead of placing a new plane. While you drag, an amber cage appears around whatever is under the cursor: that's the thing you're about to paint, so you always know which of the two you'll get. Release over empty space and you get the old behaviour: a new plane where you dropped it.

It works on any geometry, imported models included, and lands as a single Undo. Drop the same card on five walls and you get one material shared by all five rather than five identical copies, so "make the brick less shiny" stays a single edit in Materials. (A material you've since tuned by hand is never quietly reused for a new drop.) Models and audio ignore the target and place exactly as they always did (an HDRI is not placed at all, see above). There's no sensible way to apply a model to a wall.

Sharing to the public library

The globe button on a card adds it to the public library, a shared shelf every signed-in user can browse under the Public chip. Any kind of asset can go there: 3D models, images and sprite sheets, audio, HDRIs, and colour LUTs. Click the globe again to take it back down.

Sharing is free, and so is browsing. Storage is charged only when someone actually takes a copy: placing a shared asset copies it into the taker's own library first, so their scene points at their file and can't break later if you unshare or delete yours. Your own shares still live in your library: the Personal chip is the view that hides them.

This is also how some particle presets arrive complete: the Ink drops presets pull their two watercolour flipbooks out of the public library and copy them into your own on apply.

Low-poly picture frames

Search frame under the Public chip and you'll find two very different sets. The detailed frames are full sculpted models: beautiful, and each one carries tens of megabytes of baked texture, which is a lot to spend on something hanging on a wall behind the thing you actually want looked at. Alongside them sit seven models whose names end in -lowpoly: contemporary (black), midcentury (walnut), artscrafts (oak), artdeco (stepped black and gilt), barbizon (gilt cove), cassetta (gilt mouldings around a charcoal frieze), and whistler (reeded gilt). Each is a moulding profile swept around a rectangle: a hundred triangles or so, a few kilobytes, and no textures at all, because the finish is a plain colour with metalness and roughness on it.

Neither set is the "real" one. Hang one frame around a hero piece and the detailed model is worth its cost; line a wall with six and the low-poly set gives you the same silhouette for a rounding error on your scene weight. They're the same orientation and scale as their detailed counterparts, so swapping one for the other is a straight substitution. Carved styles are deliberately not in the low-poly set: a hundred-triangle version of scrollwork reads as a different object, not a simpler one.

Spotted something off, or want a topic covered? Tell us, a person reads every message.