Skip to main content
Use read-only mounts when a sandbox needs files but should not write to them. A file system is the shared writable surface, so tl fs mount is always writable. Read-only is expressed where the consumer attaches:
  • Sandbox mounts take a per-mount read_only option, plus an optional snapshot_id that pins the mount to a permanent snapshot.
  • Git repositories have tl git mount --ro for stateless read-only views of a branch, pinned commit, or subtree.
There are two read-only shapes:
  • Following: tracks the file system’s current state and refreshes as replicated autosaves or permanent snapshots land.
  • Pinned: serves one permanent snapshot and never changes.

Following Read-only Mount

A following mount is best for shared skills, prompts, docs, configs, and dependencies. Pass read_only on the sandbox mount and the guest directory is mounted read-only, enforced down to the storage credential — writes inside the guest fail with EROFS.
When the shared timeline advances, Tensorlake refreshes only the paths that changed. Unchanged files keep their warm cache. Inside the sandbox, the mount is reachable by every user — including a custom image’s non-root default user — with ordinary file permission bits deciding access from there. Mounted files present one owner (the image’s tl-user account when present, otherwise root), and the mount’s optional owner option changes whose files they appear to be — see Ownership. See Mount Filesystems for the full sandbox mount guide, including warm-pool claims and runtime attach/detach.

Pinned Read-only Mount

A pinned mount is best for reproducible builds, evals, benchmarks, and released assets: an entire fleet mounts one immutable state, and later pushes never change what any sandbox sees. Pass the mount a snapshot_id naming a permanent snapshot. Create the snapshot with tl fs snapshot (or a message-bearing tl fs push -m) and find its id under Snapshots in tl fs history:
A pinned mount requires read_only (the server rejects a writable pin with 400) and never follows the file system: skills can keep advancing for following mounts while every pinned sandbox keeps serving the release. Pins work at creation, on warm-pool claims, and on runtime attach — see Pinned mounts for the full sandbox-side guide, including the FileSystemSnapshotNotFound error for ids that are not permanent snapshots. A pinned release cannot be deleted out from under its consumers: tl fs delete-snapshot refuses with a 409 naming the pin count while any live mount pins the snapshot.

Forking for promote-later releases

If a release needs its own file-system name — one you might promote, point tooling at, or eventually write to — fork the file system at the permanent snapshot instead. A fork is metadata-only (the server shares the immutable content) and gives the release a stable name that no writer advances:
Then mount the fork read-only:
The fork stays fixed as long as nothing writes to it. Note that a fork of a fixed snapshot mounted read_only behaves like a pin, but the fork is a new writable file system: anything that writes to it advances every following mount of the fork. When you only need “every run sees this exact state”, pin the snapshot directly. For assets kept in a Git repository, tl git mount pins directly — no snapshot or fork needed:
For a complete asset distribution workflow, see Distribute Files to Agents.

Choosing Between Them