Envs
An env is a simulation environment: one entry file — a MuJoCo MJCF scene
or a URDF robot — plus the assets it references (meshes, textures,
<include>d XMLs). dreamlake env pushes a directory as a new version of an
env under your namespace, and every version opens as an interactive 3D viewer
at dreamlake.ai/<namespace>/envs/<name>.
Unchanged files are never re-uploaded: file content is content-addressed,
so a new version only transfers what actually changed. A push with no
changes at all (same entry, same files) does not create a version — it
reports no changes since vN — nothing to push (any --title/--visibility
flags still apply as a metadata update).
Push a version
--typerecords the simulator family (isaaclab,superdex, … are accepted as free strings). It is auto-detected from the entry file: an MJCF ismujoco, a*.urdfisurdf. Every type is stored, versioned and pullable —mujocoopens as a live simulation andurdfas a poseable robot (joint sliders + drag-a-link posing); other types show the version's file listing.--entryis auto-detected when the directory has exactly one root-level*.xml/*.mjcfcontaining<mujoco>— or, when there is no MJCF, exactly one root-level*.urdfcontaining<robot>. Otherwise pass it explicitly (a*.xmlURDF also needs--type urdf).- Paths are stored relative to the pushed directory, so relative
<mesh file="…"/>and<include file="…"/>references keep working. - Dot-files,
node_modulesand symlinks are skipped. Limits: ≤ 1000 files, ≤ 100 MiB per file, ≤ 1 GiB per version. --thumbnail <path>uploads a PNG (≤ 512 KiB) as the env's cover image in the app's env grid. It is recorded as a manual cover, so the web viewer won't auto-overwrite it for this version. Without the flag, the viewer renders a cover automatically the first time a member opens the env — framed from the scene's own<camera>/<visual global>/<statistic>when authored (see the app docs). Works on a no-change push too (thumbnail-only update, no new version).env createispushthat refuses a name that already exists.
Each push prints what was uploaded vs reused, and the web URL:
The open: URL targets the web app of the active environment, not its
API server — see Environments § Receipt web links for the
known prod/staging mapping and the DREAMLAKE_WEB_URL override.
List, pull, delete
pull downloads every file over presigned URLs and verifies each against its
content hash, so the reconstructed directory is byte-identical to what was
pushed. It needs no special tooling server-side — any HTTP client can follow
the same two REST calls (GET …/envs/:name/versions and
GET …/envs/:name/versions/:version).
Compose a layered env
A stack — dreamlake.layers.json, schema dreamlake.env-layers/v3 —
builds one env out of ordered ops: Merge a base scene, Attach a robot
under a key, Update an element inline, Remove one, Patch from a
sparse-MJCF file. env compose materializes it into a runnable env
directory:
- The stack file defaults to
./dreamlake.layers.json.-o/--outdefaults to./<the stack's "name", else the stack directory's basename>; a non-empty output directory is refused without--force. - A registry
src("ns/name[@version]") resolves through the immutable, hash-verified version cache at~/.dreamlake/cache/envs/, so a pinned ref with a cache hit costs zero network. Public envs resolve without login. A"./"-prefixedsrcis a local directory or file. - The CLI validates the stack's shape and resolves layer srcs;
composition itself (Merge / Attach / Update / Remove / Patch, URDF
import, compile validation) runs in the reference engine — Python,
dreamlake.envlayer, shipped by the Python SDK:pip install "dreamlake[compose]"(dreamlake ≥ 0.19.0 on PyPI). The CLI triespython3, thenpython;DREAMLAKE_PYTHONpins a specific interpreter.
The composed directory carries a fully pinned copy of the stack as provenance, so anyone can re-open its composition later. Stack schema, the five ops and worked examples: Env layers reference.
Pushing a composed env
A pushed env should carry a fully pinned stack — one that still references
local ("./"-prefixed) srcs exists only on your machine, so nobody else
could recompose it. Like cargo and npm with path-only dependencies,
env push (and env create) refuses such a directory unless told
otherwise:
--push-layerspushes each local layer directory as its own env (named by the directory's basename), then stops so you can pin them indreamlake.layers.json("src": "ns/name@version"), recompose, and push again. The composed env itself is not pushed.--allow-localpushes anyway; the provenance stays marked non-resolvable.
Visibility
Envs are private by default (only namespace members can see them). Make
one public at push time (--visibility public) or later from the env's web
page; a public env's viewer link opens without login.
Before v0.6, dreamlake env switched login environments. That moved to
dreamlake auth env list|use|remove — see the Environments page.