tl fs mount is always writable. Read-only is expressed where the consumer attaches:
- Sandbox mounts take a per-mount
read_onlyoption, plus an optionalsnapshot_idthat pins the mount to a permanent snapshot. - Git repositories have
tl git mount --rofor stateless read-only views of a branch, pinned commit, or subtree.
- 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. Passread_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.
- CLI
- Python
- TypeScript
- HTTP
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 asnapshot_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:
- CLI
- Python
- TypeScript
- HTTP
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:- Python
- TypeScript
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: