Skip to main content
A mount gives a sandbox a live directory backed by a repository, without cloning it. Attach takes about a second regardless of repository size; file content streams in as processes read it, and unopened content never transfers. By default a mount is writable. The agent edits /work like any directory, and changes autosave to a durable private workspace WAL. The server workspace is created lazily on the first WAL checkpoint. Autosave never creates a Git commit or updates a branch; snapshots and promotion remain deliberate. Add --ro for a read-only view that creates no workspace and needs no cleanup. Because durable WAL checkpoints, snapshots, operations, and mount heartbeats live on the server, your control plane can track workspace state across a fleet of sandboxes — see Observe Workspaces.
Install the file-system extension once on macOS. Linux needs no setup.

Choose a Mount

The command shape:

Writable Mounts (the Default)

/work is an ordinary writable directory based on the branch tip — name a different base with agent-outputs:<ref-or-full-commit>. Writes enter a crash-safe local journal and autosave to private server WAL; the branch does not change while the agent works. Workspace mounts can take a subtree too; snapshots record paths relative to the repository root.

Autosave WAL

Writable mounts autosave every 30 seconds. Each autosave uploads changed content and advances the workspace’s durable WAL checkpoint, but creates no Git commit and moves no branch. This is the recovery layer for an agent run: another machine can resume through the latest server checkpoint, while the same machine can additionally recover a newer unsealed tail from its local journal. Autosave is intentionally separate from Git history. Use tl git snapshot when the current state should become an attributable workspace commit.

Read-Only Mounts

Add --ro for a view that creates no workspace and needs no cleanup:
A read-only branch mount follows the branch: when it moves, Tensorlake refreshes only the paths that changed. Reads are always consistent — a file open when the branch moves keeps serving the version it was opened against. Pin a commit when the input must never change (pinning takes a full commit id, not an abbreviation):
Mount a subtree when the task only needs part of a large repository. The mount root becomes that directory, and nothing outside it is fetched:
Subtree and commit forms combine: agent-outputs:9f2a1c8e4d6b1a0f3c7e9d2b8a4f6c1e0d3b7a99//services/auth.

Snapshot Changes

Snapshotting first seals any pending local changes, then materializes the resulting WAL state as one commit on the workspace. It is a deliberate history boundary, not the first point of durability. Snapshotting with no changes is a no-op:

Promote to a Branch

Promotion is the deliberate path to a branch. Before landing, it autosaves and materializes any dirty WAL, then lands the workspace as a squashed commit. Compare-and-swap safety prevents a plain promotion from overwriting a branch that moved. Add --merge to land a two-parent merge instead. See Merging Changes for conflict reports and the resolve loop. Activity history shows who published the promotion and which workspace it came from.

Rebase a Workspace

When the branch has moved and you want the workspace replayed on top of it — a linear history instead of a merge — rebase it onto a target ref or commit:
The target is required — rebase onto any branch, tag, or full commit. The daemon first seals pending local WAL, then the replay runs server-side and the mounted directory updates in place. If both sides changed the same content, the conflicting files carry standard diff3 markers — resolve, snapshot, and promote. After a clean rebase, promotion fast-forwards. Add --fail-on-conflict to report conflicts without materializing markers into the workspace.

Check Status

With unsealed changes, status reports how many paths are dirty and makes snapshotting the next valid transition:
Status also names every in-between state a workspace can reach — behind its branch, mid-rebase with unresolved markers, attached elsewhere — together with the command that exits it. Add --json for machine-readable output.

Observe Workspaces

Durable workspace state is server-side, so you can inspect a fleet without touching its sandboxes. List workspace WAL, snapshot, and attachment state first:
tl git smartlog shows every branch, tag, workspace, and snapshot chain and how they sit relative to each other:
tl git log shows one mount’s own workspace snapshot chain; tl git smartlog --project widens the view to the whole project. The same graph is in the dashboard’s repository page, with each workspace’s snapshot chain and actor attribution. Every snapshot, promote, rebase, and merge is also a durable entry in the repository’s activity history — the audit trail of what your agents did, queryable long after the sandboxes are gone. Live mounts also report a liveness heartbeat — that a mount exists, where it’s mounted, and that it’s still alive — so the control plane can tell which sessions are active. Fine-grained edits remain local until autosave; durable WAL checkpoints report progress without exposing every in-progress edit.

Reattach a Workspace

The mount path is disposable. The workspace is the resumable state behind it. Unmounting keeps the workspace by default:
Reattach it later from the same sandbox, another sandbox, or another machine. The new mount path can be different:
A workspace already mounted elsewhere mounts read-only if you mount it again. Unmount it there first to take writes.

Delete a Workspace

Delete the workspace while unmounting when its history is no longer needed:
The workspace WAL and unpublished snapshots become unreachable. Promote first if the work should survive as branch history. Detached workspaces are also collected automatically. By default, a WAL-only workspace is retained for 48 hours and a workspace with snapshots for 14 days. An actively mounted workspace is retained. These periods are deployment configuration, so use explicit deletion when your application requires deterministic cleanup.

What a Mount Is Not

  • Not a Git checkout. There is no .git directory inside a mount, and git commands do not run there. The verbs on this page are the interface — see Git or the tl CLI? for how they map onto Git habits. tl git clone exists when you need a real clone.
  • Not auto-publishing. A repository mount autosaves to private workspace WAL, but autosave never creates a commit or changes a branch. For a shared directory whose autosave windows periodically advance the common state, use a file system.
  • Not fully offline. Cached content and the crash-safe local journal can remain usable during a disconnection. Fetching uncached content and making work remotely durable require reconnection.

Next Steps

Merging Changes

Land workspaces on moved branches, resolve conflicts, and merge branches directly.

Architecture

Learn how promotion and merge conflict handling work internally.