Box Mount is in private preview. It is not publicly available, it is not covered by a production SLA, and features can change before general availability. Box provides the binary and setup guidance to preview participants. To request access, complete the Box Mount private preview form.
How Box Mount works
Box Mount runs a background sync process, the daemon, that maps a Box folder to a local directory inside the sandbox your product provisions. It works with any supported Linux sandbox, including Daytona, Docker, E2B, and Vercel Sandbox, and is not tied to one vendor.- Content stays in Box. Your agent works against a local path, and every operation flows through the Box API.
- Governance follows the content. Every operation runs as the identity Box Mount authenticates with, so that identity’s permissions, retention, legal hold, ethical walls, and audit trail apply to the agent, along with any Box Shield security policies driven by classification. In OAuth mode the identity is the user who authorized the app, so the agent can never reach content that the user cannot. In JWT mode the identity is the service account, so scope that account to the content the agent needs.
- Sync runs both ways. Changes an agent makes in the mount upload to Box, and updates from people or other agents are reflected back in the mount.
- Conflicts are preserved, not overwritten. When two writers change the same file at the same time, Box Mount detects the conflict at upload and keeps both results, either as a new Box version or as a separate conflict copy, so a reviewer can merge the work or roll back using Box version history.
See Box Mount in action
This demo builds a contract review agent that mounts a Box folder into an E2B sandbox, runs the agent against that workspace, and syncs the finished review back to Box for a person to review.
For the architecture behind the demo and more workflow patterns, read Meet Box Mount: A Box workspace for sandboxed AI agents on the Box blog.
Before you begin
You need:- Access to the Box Mount private preview, including the Box Mount binary. To request access, complete the Box Mount private preview form.
- A Box app in the Developer Console, configured for either OAuth 2.0 or JWT authentication.
- The ID of the Box folder you want to mount. This is the number at the end of the folder URL on Box.
Supported platforms
Box Mount supports Linux runtimes on the x86_64 and ARM64 architectures. macOS is not supported.Commands
A first session looks like this:
/mnt/box.
Configure credentials
Box Mount reads Box credentials from abox-config.json file in ~/.box-mount/, or in the path you pass to --data-path.
The config command handles configuration interactively in one step and writes ~/.box-mount/box-config.json:
oauth or jwt when prompted. Restrict the config file, and any JWT private key JSON it points at, as described in Secure your credentials.
Configure OAuth manually
Create~/.box-mount/box-config.json and fill in your Box app credentials:
The OAuth config has no
auth_type field because OAuth is the default mode. Set auth_type only to switch to JWT.
Configure JWT manually
For a JWT service account, the config needs only two fields:jwt_config_path must point to the JSON file generated by the Developer Console. To create it, open your app’s Configuration tab and, in App Settings, select Generate a Public/Private Keypair. JWT authentication does not need an access_token or a refresh_token, because the SDK obtains short-lived access tokens automatically.
Use environment variables
You can supply credential fields through environment variables instead of the JSON file. Environment variables take precedence over file values, and the JSON file is optional when you provide every required field this way.Use a developer token
Developer tokens are short-lived tokens you generate in the Developer Console. They are valid for 60 minutes, cannot be refreshed, and are useful for quick testing without the full OAuth flow. Setaccess_token in ~/.box-mount/box-config.json and leave refresh_token empty:
access_token, or re-export the environment variable, to resume.
Token lifecycle
In OAuth mode:- Access tokens expire after about 60 minutes, and the SDK refreshes them automatically.
- Each refresh rotates the refresh token, and the old one is invalidated immediately.
- Rotated tokens are written back to
~/.box-mount/box-config.json. - Refresh tokens expire after 60 days without use. Run
box-mount configagain to repeat the OAuth flow.
- The SDK signs a JWT assertion, exchanges it for a short-lived access token, and refreshes that token automatically. Tokens are held in memory only, so nothing is written to
box-config.json. - Authentication needs no user interaction as long as the JWT config JSON and private key are valid.
Secure your credentials
Box credentials are a Box API identity, and that identity is usually broader than the folder you mount. This applies to the OAuth client secret and tokens inbox-config.json, the BOX_* environment variables, and the JWT private key JSON on disk. Anyone who reads them can call the Box API as that app or user, not only read the files in the mount.
The daemon that box-mount mount starts needs those credentials, and the mount directory is the only surface other processes should share. Keep ~/.box-mount/, which holds the config, database, process ID, and logs, private to the account that runs Box Mount.
Recommended setup on an agent sandbox
When an LLM agent runs on the same machine as Box Mount, do not run the agent as the same Unix user as the daemon. Use two users:-
Create the two users. Run
box-mount configas user A so that~/.box-mount/lives in the home directory of user A. Do not mount yet, because bootstrap fills the tree and the share permissions must be set on an empty mount directory first. -
Restrict the credentials so that only user A can read them, then confirm ownership with
ls -l. Mode644, which is world-readable, is not appropriate for these files. -
Share only the mount directory with user B, using a shared group, setgid, and a default POSIX ACL. Setgid copies group ownership onto new inodes, and the default ACL inherits group write access. Apply this to an empty directory, then mount. The
setfaclcommand ships in theaclpackage.User B must not have read access to the home directory of user A, to--data-path, or to the JWT file. User B must also be able to traverse every directory above the mount, which is why the example puts the mount outside any home directory. If you place the mount inside the home directory of user A instead, a home directory set to750blocks user B even when the mount directory itself is2770. -
Start the agent as user B. Do not export
BOX_CLIENT_ID,BOX_CLIENT_SECRET,BOX_ACCESS_TOKEN,BOX_REFRESH_TOKEN, orBOX_JWT_CONFIG_PATHin the shell, systemd unit, or container spec of the agent. Those values are visible in the process environment and belong only to the daemon process of user A. - In JWT mode, use a service account scoped to the content the agent needs, rather than an enterprise admin keypair.
$HOME. That layout is not appropriate when the other process is an untrusted agent.
Data and log locations
By default,--data-path points to ~/.box-mount/, and Box Mount derives all other paths from it:
Treat this tree as private to the daemon. See Secure your credentials.
