diff --git a/pr-preview/pr-240/about/architecture.json b/pr-preview/pr-240/about/architecture.json index 28c0ab259..743ac1310 100644 --- a/pr-preview/pr-240/about/architecture.json +++ b/pr-preview/pr-240/about/architecture.json @@ -1 +1 @@ -{"id":"about/architecture","title":"How OpenShell Works","url":"about/architecture.html","last_modified":"2026-03-11T21:58:22.046204+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"OpenShell architecture overview covering the gateway, sandbox, policy engine, and privacy router.","tags":["AI Agents","Sandboxing","Security","Architecture"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"How OpenShell Works OpenShell runs as a K3s Kubernetes cluster inside a Docker container. Each sandbox is an isolated Kubernetes pod managed through the gateway. Four components work together to keep agents secure. Components The following table describes each component and its role in the system: Component Role Gateway Control-plane API that coordinates sandbox lifecycle and state, acts as the auth boundary, and brokers requests across the platform. Sandbox Isolated runtime that includes container supervision and policy-enforced egress routing. Policy Engine Policy definition and enforcement layer for filesystem, network, and process constraints. Defense in depth enforces policies from the application layer down to infrastructure and kernel layers. Privacy Router Privacy-aware LLM routing layer that keeps sensitive context on sandbox compute and routes based on cost and privacy policy. How a Request Flows Every outbound connection from agent code passes through the same decision path: The agent process opens an outbound connection (API call, package install, git clone, and so on). The proxy inside the sandbox intercepts the connection and identifies which binary opened it. The proxy queries the policy engine with the destination, port, and calling binary. The policy engine returns one of three decisions: Allow — the destination and binary match a policy block. Traffic flows directly to the external service. Route for inference — no policy block matched, but inference routing is configured. The privacy router intercepts the request, strips the original credentials, injects the configured backend credentials, and forwards to the managed model endpoint. Deny — no match and no inference route. The connection is blocked and logged. For REST endpoints with TLS termination enabled, the proxy also decrypts TLS and checks each HTTP request against per-method, per-path rules before allowing it through. Deployment Modes OpenShell can run locally or on a remote host. The architecture is identical in both cases — only the Docker container location changes. Local : the k3s cluster runs inside Docker on your workstation. The CLI provisions it automatically on first use. Remote : the cluster runs on a remote host. Deploy with openshell gateway start --remote user@host . For example, connect to your DGX Spark. $ openshell gateway start --remote @.local\nopenshell status\nNext Steps Continue with one of the following: To create your first sandbox, refer to the Quickstart . To learn how OpenShell enforces isolation across all protection layers, refer to Sandboxes","format":"text","summary":"OpenShell runs as a K3s Kubernetes cluster inside a Docker container. Each sandbox is an isolated Kubernetes pod managed through the gateway. Four components work together to keep agents secure.","headings":[{"text":"How OpenShell Works","level":1},{"text":"Components","level":2},{"text":"How a Request Flows","level":2},{"text":"Deployment Modes","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file +{"id":"about/architecture","title":"How OpenShell Works","url":"about/architecture.html","last_modified":"2026-03-11T22:04:40.578616+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"OpenShell architecture overview covering the gateway, sandbox, policy engine, and privacy router.","tags":["AI Agents","Sandboxing","Security","Architecture"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"How OpenShell Works OpenShell runs as a K3s Kubernetes cluster inside a Docker container. Each sandbox is an isolated Kubernetes pod managed through the gateway. Four components work together to keep agents secure. Components The following table describes each component and its role in the system: Component Role Gateway Control-plane API that coordinates sandbox lifecycle and state, acts as the auth boundary, and brokers requests across the platform. Sandbox Isolated runtime that includes container supervision and policy-enforced egress routing. Policy Engine Policy definition and enforcement layer for filesystem, network, and process constraints. Defense in depth enforces policies from the application layer down to infrastructure and kernel layers. Privacy Router Privacy-aware LLM routing layer that keeps sensitive context on sandbox compute and routes based on cost and privacy policy. How a Request Flows Every outbound connection from agent code passes through the same decision path: The agent process opens an outbound connection (API call, package install, git clone, and so on). The proxy inside the sandbox intercepts the connection and identifies which binary opened it. The proxy queries the policy engine with the destination, port, and calling binary. The policy engine returns one of three decisions: Allow — the destination and binary match a policy block. Traffic flows directly to the external service. Route for inference — no policy block matched, but inference routing is configured. The privacy router intercepts the request, strips the original credentials, injects the configured backend credentials, and forwards to the managed model endpoint. Deny — no match and no inference route. The connection is blocked and logged. For REST endpoints with TLS termination enabled, the proxy also decrypts TLS and checks each HTTP request against per-method, per-path rules before allowing it through. Deployment Modes OpenShell can run locally or on a remote host. The architecture is identical in both cases — only the Docker container location changes. Local : the k3s cluster runs inside Docker on your workstation. The CLI provisions it automatically on first use. Remote : the cluster runs on a remote host. Deploy with openshell gateway start --remote user@host . For example, connect to your DGX Spark. $ openshell gateway start --remote @.local\nopenshell status\nNext Steps Continue with one of the following: To create your first sandbox, refer to the Quickstart . To learn how OpenShell enforces isolation across all protection layers, refer to Sandboxes","format":"text","summary":"OpenShell runs as a K3s Kubernetes cluster inside a Docker container. Each sandbox is an isolated Kubernetes pod managed through the gateway. Four components work together to keep agents secure.","headings":[{"text":"How OpenShell Works","level":1},{"text":"Components","level":2},{"text":"How a Request Flows","level":2},{"text":"Deployment Modes","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file diff --git a/pr-preview/pr-240/about/overview.json b/pr-preview/pr-240/about/overview.json index 13c3b3db6..7607f26f7 100644 --- a/pr-preview/pr-240/about/overview.json +++ b/pr-preview/pr-240/about/overview.json @@ -1 +1 @@ -{"id":"about/overview","title":"Overview of NVIDIA OpenShell","url":"about/overview.html","last_modified":"2026-03-11T21:58:22.040726+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"OpenShell is the safe, private runtime for autonomous AI agents. Run agents in sandboxed environments that protect your data, credentials, and infrastructure.","tags":["AI Agents","Sandboxing","Security","Privacy","Inference Routing"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Overview of NVIDIA OpenShell NVIDIA OpenShell is an open-source runtime for executing autonomous AI agents in sandboxed environments with kernel-level isolation. It combines sandbox runtime controls and a declarative YAML policy so teams can run agents without giving them unrestricted access to local files, credentials, and external networks. Why OpenShell Exists AI agents are most useful when they can read files, install packages, call APIs, and use credentials. That same access can create material risk. OpenShell is designed for this tradeoff: preserve agent capability while enforcing explicit controls over what the agent can access. Common Risks and Controls The table below summarizes common failure modes and how OpenShell mitigates them. Threat Without controls With OpenShell Data exfiltration Agent uploads source code or internal files to unauthorized endpoints. Network policies allow only approved destinations; other outbound traffic is denied. Credential theft Agent reads local secrets such as SSH keys or cloud credentials. Filesystem restrictions (Landlock) confine access to declared paths only. Unauthorized API usage Agent sends prompts or data to unapproved model providers. Privacy routing and network policies control where inference traffic can go. Privilege escalation Agent attempts sudo , setuid paths, or dangerous syscall behavior. Unprivileged process identity and seccomp restrictions block escalation paths. Protection Layers at a Glance OpenShell applies defense in depth across the following policy domains. Layer What it protects When it applies Filesystem Prevents reads/writes outside allowed paths. Locked at sandbox creation. Network Blocks unauthorized outbound connections. Hot-reloadable at runtime. Process Blocks privilege escalation and dangerous syscalls. Locked at sandbox creation. Inference Reroutes model API calls to controlled backends. Hot-reloadable at runtime. For details, refer to Built-in Default Policy and Customize Sandbox Policies . Common Use Cases OpenShell supports a range of agent deployment patterns. Use Case Description Secure coding agents Run Claude Code, OpenCode, or OpenClaw with constrained file and network access. Private enterprise development Route inference to self-hosted or private backends while keeping sensitive context under your control. Compliance and audit Treat policy YAML as version-controlled security controls that can be reviewed and audited. Reusable environments Use community sandbox images or bring your own containerized runtime. Next Steps Explore these topics to go deeper: To understand the components that make up the OpenShell runtime, refer to the Architecture Overview . To install the CLI and create your first sandbox, refer to the Quickstart . To learn how OpenShell enforces isolation across all protection layers, refer to Sandboxes","format":"text","summary":"NVIDIA OpenShell is an open-source runtime for executing autonomous AI agents in sandboxed environments with kernel-level isolation. It combines sandbox runtime controls and a declarative YAML policy so teams can run agents without giving them unrestricted access to local files, credentials, and ...","headings":[{"text":"Overview of NVIDIA OpenShell","level":1},{"text":"Why OpenShell Exists","level":2},{"text":"Common Risks and Controls","level":2},{"text":"Protection Layers at a Glance","level":2},{"text":"Common Use Cases","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file +{"id":"about/overview","title":"Overview of NVIDIA OpenShell","url":"about/overview.html","last_modified":"2026-03-11T22:04:40.588038+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"OpenShell is the safe, private runtime for autonomous AI agents. Run agents in sandboxed environments that protect your data, credentials, and infrastructure.","tags":["AI Agents","Sandboxing","Security","Privacy","Inference Routing"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Overview of NVIDIA OpenShell NVIDIA OpenShell is an open-source runtime for executing autonomous AI agents in sandboxed environments with kernel-level isolation. It combines sandbox runtime controls and a declarative YAML policy so teams can run agents without giving them unrestricted access to local files, credentials, and external networks. Why OpenShell Exists AI agents are most useful when they can read files, install packages, call APIs, and use credentials. That same access can create material risk. OpenShell is designed for this tradeoff: preserve agent capability while enforcing explicit controls over what the agent can access. Common Risks and Controls The table below summarizes common failure modes and how OpenShell mitigates them. Threat Without controls With OpenShell Data exfiltration Agent uploads source code or internal files to unauthorized endpoints. Network policies allow only approved destinations; other outbound traffic is denied. Credential theft Agent reads local secrets such as SSH keys or cloud credentials. Filesystem restrictions (Landlock) confine access to declared paths only. Unauthorized API usage Agent sends prompts or data to unapproved model providers. Privacy routing and network policies control where inference traffic can go. Privilege escalation Agent attempts sudo , setuid paths, or dangerous syscall behavior. Unprivileged process identity and seccomp restrictions block escalation paths. Protection Layers at a Glance OpenShell applies defense in depth across the following policy domains. Layer What it protects When it applies Filesystem Prevents reads/writes outside allowed paths. Locked at sandbox creation. Network Blocks unauthorized outbound connections. Hot-reloadable at runtime. Process Blocks privilege escalation and dangerous syscalls. Locked at sandbox creation. Inference Reroutes model API calls to controlled backends. Hot-reloadable at runtime. For details, refer to Built-in Default Policy and Customize Sandbox Policies . Common Use Cases OpenShell supports a range of agent deployment patterns. Use Case Description Secure coding agents Run Claude Code, OpenCode, or OpenClaw with constrained file and network access. Private enterprise development Route inference to self-hosted or private backends while keeping sensitive context under your control. Compliance and audit Treat policy YAML as version-controlled security controls that can be reviewed and audited. Reusable environments Use community sandbox images or bring your own containerized runtime. Next Steps Explore these topics to go deeper: To understand the components that make up the OpenShell runtime, refer to the Architecture Overview . To install the CLI and create your first sandbox, refer to the Quickstart . To learn how OpenShell enforces isolation across all protection layers, refer to Sandboxes","format":"text","summary":"NVIDIA OpenShell is an open-source runtime for executing autonomous AI agents in sandboxed environments with kernel-level isolation. It combines sandbox runtime controls and a declarative YAML policy so teams can run agents without giving them unrestricted access to local files, credentials, and ...","headings":[{"text":"Overview of NVIDIA OpenShell","level":1},{"text":"Why OpenShell Exists","level":2},{"text":"Common Risks and Controls","level":2},{"text":"Protection Layers at a Glance","level":2},{"text":"Common Use Cases","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file diff --git a/pr-preview/pr-240/about/release-notes.json b/pr-preview/pr-240/about/release-notes.json index 4ddf63abe..5f8204ddd 100644 --- a/pr-preview/pr-240/about/release-notes.json +++ b/pr-preview/pr-240/about/release-notes.json @@ -1 +1 @@ -{"id":"about/release-notes","title":"NVIDIA OpenShell Release Notes","url":"about/release-notes.html","last_modified":"2026-03-11T21:58:22.053643+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Track the latest changes and improvements to NVIDIA OpenShell.","tags":["Release Notes","Changelog","AI Agents"],"topics":["Generative AI","Cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"NVIDIA OpenShell Release Notes Track the latest changes and improvements to NVIDIA OpenShell\nThis page covers the highlights of the release\nFor more details, refer to the OpenShell GitHub Releases . 0.1.0 This is the first release of NVIDIA OpenShell. It introduces sandboxed AI agent execution with kernel-level isolation, policy enforcement, and credential management. Highlights Introduces sandboxed AI agent execution with kernel-level isolation, policy enforcement, and credential management. Introduces the openshell CLI for creating, managing, and customizing sandboxes. Introduces the openshell-gateway service for managing the gateway and sandboxes. Introduces the openshell-sandbox service for running the sandboxed agent","format":"text","summary":"Track the latest changes and improvements to NVIDIA OpenShell. This page covers the highlights of the release. For more details, refer to the OpenShell GitHub Releases.","headings":[{"text":"NVIDIA OpenShell Release Notes","level":1},{"text":"0.1.0","level":2},{"text":"Highlights","level":3}]} \ No newline at end of file +{"id":"about/release-notes","title":"NVIDIA OpenShell Release Notes","url":"about/release-notes.html","last_modified":"2026-03-11T22:04:40.584391+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Track the latest changes and improvements to NVIDIA OpenShell.","tags":["Release Notes","Changelog","AI Agents"],"topics":["Generative AI","Cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"NVIDIA OpenShell Release Notes Track the latest changes and improvements to NVIDIA OpenShell\nThis page covers the highlights of the release\nFor more details, refer to the OpenShell GitHub Releases . 0.1.0 This is the first release of NVIDIA OpenShell. It introduces sandboxed AI agent execution with kernel-level isolation, policy enforcement, and credential management. Highlights Introduces sandboxed AI agent execution with kernel-level isolation, policy enforcement, and credential management. Introduces the openshell CLI for creating, managing, and customizing sandboxes. Introduces the openshell-gateway service for managing the gateway and sandboxes. Introduces the openshell-sandbox service for running the sandboxed agent","format":"text","summary":"Track the latest changes and improvements to NVIDIA OpenShell. This page covers the highlights of the release. For more details, refer to the OpenShell GitHub Releases.","headings":[{"text":"NVIDIA OpenShell Release Notes","level":1},{"text":"0.1.0","level":2},{"text":"Highlights","level":3}]} \ No newline at end of file diff --git a/pr-preview/pr-240/get-started/quickstart.json b/pr-preview/pr-240/get-started/quickstart.json index 861353f12..a591bf269 100644 --- a/pr-preview/pr-240/get-started/quickstart.json +++ b/pr-preview/pr-240/get-started/quickstart.json @@ -1 +1 @@ -{"id":"get-started/quickstart","title":"Quickstart","url":"get-started/quickstart.html","last_modified":"2026-03-11T21:58:22.052113+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Install the OpenShell CLI and create your first sandboxed AI agent in two commands.","tags":["AI Agents","Sandboxing","Installation","Quickstart"],"topics":["Generative AI","Cybersecurity"],"content_type":"get_started","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Quickstart This page gets you from zero to a running, policy-enforced sandbox in two commands. Prerequisites Before you begin, make sure you have: Python 3.12 or later uv installed Docker Desktop running on your machine Install the OpenShell CLI Install the openshell package into a virtual environment. Activate your virtual environment: uv venv && source .venv/bin/activate\nInstall the CLI: uv pip install openshell\nConnect to a Remote Gateway (Optional) If you’re running locally, skip this step. The OpenShell CLI creates a gateway automatically when you create your first sandbox. Brev Deploy an OpenShell gateway on Brev by hitting Deploy on the OpenShell Launchable . After the instance is running, find the gateway URL in the Brev console under Using Secure Links . Copy the shareable URL for port 8080 — this is the gateway endpoint. $ openshell gateway add https://.brevlab.com\nopenshell status\nDGX Spark Set up your Spark with NVIDIA Sync first, or make sure SSH access is configured (such as SSH keys added to the host). Deploy to a DGX Spark machine over SSH: $ openshell gateway start --remote @.local\nopenshell status\nAfter openshell status shows the gateway as healthy, all subsequent commands route through the SSH tunnel. Create Your First OpenShell Sandbox Choose the tab that matches your agent: Claude Code Run the following command to create a sandbox with Claude Code: $ openshell sandbox create -- claude\nThe CLI prompts you to create a provider from local credentials — type yes to continue. If ANTHROPIC_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. OpenCode Run the following command to create a sandbox with OpenCode: $ openshell sandbox create -- opencode\nThe CLI prompts you to create a provider from local credentials. Type yes to continue. If OPENAI_API_KEY or OPENROUTER_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. Codex Run the following command to create a sandbox with Codex: $ openshell sandbox create -- codex\nThe CLI prompts you to create a provider from local credentials. Type yes to continue. If OPENAI_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. OpenClaw Run the following command to create a sandbox with OpenClaw: $ openshell sandbox create --from openclaw\nThe --from flag pulls a pre-built sandbox definition from the OpenShell Community catalog. Each definition bundles a container image, a tailored policy, and optional skills into a single package. Community Sandbox You can use the --from flag to pull other OpenShell sandbox images from the NVIDIA Container Registry . For example, to pull the base image, run the following command: $ openshell sandbox create --from base","format":"text","summary":"This page gets you from zero to a running, policy-enforced sandbox in two commands.","headings":[{"text":"Quickstart","level":1},{"text":"Prerequisites","level":2},{"text":"Install the OpenShell CLI","level":2},{"text":"Connect to a Remote Gateway (Optional)","level":2},{"text":"Create Your First OpenShell Sandbox","level":2}]} \ No newline at end of file +{"id":"get-started/quickstart","title":"Quickstart","url":"get-started/quickstart.html","last_modified":"2026-03-11T22:04:40.596051+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Install the OpenShell CLI and create your first sandboxed AI agent in two commands.","tags":["AI Agents","Sandboxing","Installation","Quickstart"],"topics":["Generative AI","Cybersecurity"],"content_type":"get_started","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Quickstart This page gets you from zero to a running, policy-enforced sandbox in two commands. Prerequisites Before you begin, make sure you have: Python 3.12 or later uv installed Docker Desktop running on your machine Install the OpenShell CLI Install the openshell package into a virtual environment. Activate your virtual environment: uv venv && source .venv/bin/activate\nInstall the CLI: uv pip install openshell\nConnect to a Remote Gateway (Optional) If you’re running locally, skip this step. The OpenShell CLI creates a gateway automatically when you create your first sandbox. Brev Deploy an OpenShell gateway on Brev by hitting Deploy on the OpenShell Launchable . After the instance is running, find the gateway URL in the Brev console under Using Secure Links . Copy the shareable URL for port 8080 — this is the gateway endpoint. $ openshell gateway add https://.brevlab.com\nopenshell status\nDGX Spark Set up your Spark with NVIDIA Sync first, or make sure SSH access is configured (such as SSH keys added to the host). Deploy to a DGX Spark machine over SSH: $ openshell gateway start --remote @.local\nopenshell status\nAfter openshell status shows the gateway as healthy, all subsequent commands route through the SSH tunnel. Create Your First OpenShell Sandbox Choose the tab that matches your agent: Claude Code Run the following command to create a sandbox with Claude Code: $ openshell sandbox create -- claude\nThe CLI prompts you to create a provider from local credentials — type yes to continue. If ANTHROPIC_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. OpenCode Run the following command to create a sandbox with OpenCode: $ openshell sandbox create -- opencode\nThe CLI prompts you to create a provider from local credentials. Type yes to continue. If OPENAI_API_KEY or OPENROUTER_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. Codex Run the following command to create a sandbox with Codex: $ openshell sandbox create -- codex\nThe CLI prompts you to create a provider from local credentials. Type yes to continue. If OPENAI_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. OpenClaw Run the following command to create a sandbox with OpenClaw: $ openshell sandbox create --from openclaw\nThe --from flag pulls a pre-built sandbox definition from the OpenShell Community catalog. Each definition bundles a container image, a tailored policy, and optional skills into a single package. Community Sandbox You can use the --from flag to pull other OpenShell sandbox images from the NVIDIA Container Registry . For example, to pull the base image, run the following command: $ openshell sandbox create --from base","format":"text","summary":"This page gets you from zero to a running, policy-enforced sandbox in two commands.","headings":[{"text":"Quickstart","level":1},{"text":"Prerequisites","level":2},{"text":"Install the OpenShell CLI","level":2},{"text":"Connect to a Remote Gateway (Optional)","level":2},{"text":"Create Your First OpenShell Sandbox","level":2}]} \ No newline at end of file diff --git a/pr-preview/pr-240/index.json b/pr-preview/pr-240/index.json index c657698b3..c609c317d 100644 --- a/pr-preview/pr-240/index.json +++ b/pr-preview/pr-240/index.json @@ -1 +1 @@ -[{"id":"about/architecture","title":"How OpenShell Works","url":"about/architecture.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"OpenShell architecture overview covering the gateway, sandbox, policy engine, and privacy router.","tags":["AI Agents","Sandboxing","Security","Architecture"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"How OpenShell Works OpenShell runs as a K3s Kubernetes cluster inside a Docker container. Each sandbox is an isolated Kubernetes pod managed through the gateway. Four components work together to keep agents secure. Components The following table describes each component and its role in the system: Component Role Gateway Control-plane API that coordinates sandbox lifecycle and state, acts as the auth boundary, and brokers requests across the platform. Sandbox Isolated runtime that includes container supervision and policy-enforced egress routing. Policy Engine Policy definition and enforcement layer for filesystem, network, and process constraints. Defense in depth enforces policies from the application layer down to infrastructure and kernel layers. Privacy Router Privacy-aware LLM routing layer that keeps sensitive context on sandbox compute and routes based on cost and privacy policy. How a Request Flows Every outbound connection from agent code passes through the same decision path: The agent process opens an outbound connection (API call, package install, git clone, and so on). The proxy inside the sandbox intercepts the connection and identifies which binary opened it. The proxy queries the policy engine with the destination, port, and calling binary. The policy engine returns one of three decisions: Allow — the destination and binary match a policy block. Traffic flows directly to the external service. Route for inference — no policy block matched, but inference routing is configured. The privacy router intercepts the request, strips the original credentials, injects the configured backend credentials, and forwards to the managed model endpoint. Deny — no match and no inference route. The connection is blocked and logged. For REST endpoints with TLS termination enabled, the proxy also decrypts TLS and checks each HTTP request against per-method, per-path rules before allowing it through. Deployment Modes OpenShell can run locally or on a remote host. The architecture is identical in both cases — only the Docker container location changes. Local : the k3s cluster runs inside Docker on your workstation. The CLI provisions it automatically on first use. Remote : the cluster runs on a remote host. Deploy with openshell gateway start --remote user@host . For example, connect to your DGX Spark. $ openshell gateway start --remote @.local\nopenshell status\nNext Steps Continue with one of the following: To create your first sandbox, refer to the Quickstart . To learn how OpenShell enforces isolation across all protection layers, refer to Sandboxes","format":"text","content_length":2611,"word_count":393,"summary":"OpenShell runs as a K3s Kubernetes cluster inside a Docker container. Each sandbox is an isolated Kubernetes pod managed through the gateway. Four components work together to keep agents secure.","headings":[{"text":"How OpenShell Works","level":1,"id":"how-openshell-works"},{"text":"Components","level":2,"id":"components"},{"text":"How a Request Flows","level":2,"id":"how-a-request-flows"},{"text":"Deployment Modes","level":2,"id":"deployment-modes"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"How OpenShell Works Components How a Request Flows Deployment Modes Next Steps","keywords":["allow","component","components","continue","control","decisions","defense","deny","deploy","deployment","docker","each","engine","every","flows","following","four","gateway","isolated","k3s","kubernetes","local","modes","next","openshell","path","policy","privacy","quickstart","remote","request","role","route","router","sandbox","sandboxes","spark","steps","system","traffic","works"],"code_blocks":[{"content":"$ openshell gateway start --remote @.local\n$ openshell status","language":"text"}],"links":[{"text":"K3s","type":"external","url":"https://k3s.io/"},{"text":"OpenShell architecture diagram showing the component layout","type":"internal","url":"about/../_images/architecture.svg"}],"images":[{"src":"about/architecture.svg","alt":"OpenShell architecture diagram showing the component layout"},{"src":"about/architecture.svg","alt":"OpenShell architecture diagram showing the component layout"}],"doc_type":"documentation","section_path":["About","Architecture"]},{"id":"about/overview","title":"Overview of NVIDIA OpenShell","url":"about/overview.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"OpenShell is the safe, private runtime for autonomous AI agents. Run agents in sandboxed environments that protect your data, credentials, and infrastructure.","tags":["AI Agents","Sandboxing","Security","Privacy","Inference Routing"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Overview of NVIDIA OpenShell NVIDIA OpenShell is an open-source runtime for executing autonomous AI agents in sandboxed environments with kernel-level isolation. It combines sandbox runtime controls and a declarative YAML policy so teams can run agents without giving them unrestricted access to local files, credentials, and external networks. Why OpenShell Exists AI agents are most useful when they can read files, install packages, call APIs, and use credentials. That same access can create material risk. OpenShell is designed for this tradeoff: preserve agent capability while enforcing explicit controls over what the agent can access. Common Risks and Controls The table below summarizes common failure modes and how OpenShell mitigates them. Threat Without controls With OpenShell Data exfiltration Agent uploads source code or internal files to unauthorized endpoints. Network policies allow only approved destinations; other outbound traffic is denied. Credential theft Agent reads local secrets such as SSH keys or cloud credentials. Filesystem restrictions (Landlock) confine access to declared paths only. Unauthorized API usage Agent sends prompts or data to unapproved model providers. Privacy routing and network policies control where inference traffic can go. Privilege escalation Agent attempts sudo , setuid paths, or dangerous syscall behavior. Unprivileged process identity and seccomp restrictions block escalation paths. Protection Layers at a Glance OpenShell applies defense in depth across the following policy domains. Layer What it protects When it applies Filesystem Prevents reads/writes outside allowed paths. Locked at sandbox creation. Network Blocks unauthorized outbound connections. Hot-reloadable at runtime. Process Blocks privilege escalation and dangerous syscalls. Locked at sandbox creation. Inference Reroutes model API calls to controlled backends. Hot-reloadable at runtime. For details, refer to Built-in Default Policy and Customize Sandbox Policies . Common Use Cases OpenShell supports a range of agent deployment patterns. Use Case Description Secure coding agents Run Claude Code, OpenCode, or OpenClaw with constrained file and network access. Private enterprise development Route inference to self-hosted or private backends while keeping sensitive context under your control. Compliance and audit Treat policy YAML as version-controlled security controls that can be reviewed and audited. Reusable environments Use community sandbox images or bring your own containerized runtime. Next Steps Explore these topics to go deeper: To understand the components that make up the OpenShell runtime, refer to the Architecture Overview . To install the CLI and create your first sandbox, refer to the Quickstart . To learn how OpenShell enforces isolation across all protection layers, refer to Sandboxes","format":"text","content_length":2852,"word_count":403,"summary":"NVIDIA OpenShell is an open-source runtime for executing autonomous AI agents in sandboxed environments with kernel-level isolation. It combines sandbox runtime controls and a declarative YAML policy so teams can run agents without giving them unrestricted access to local files, credentials, and ...","headings":[{"text":"Overview of NVIDIA OpenShell","level":1,"id":"overview-of-nvidia-openshell"},{"text":"Why OpenShell Exists","level":2,"id":"why-openshell-exists"},{"text":"Common Risks and Controls","level":2,"id":"common-risks-and-controls"},{"text":"Protection Layers at a Glance","level":2,"id":"protection-layers-at-a-glance"},{"text":"Common Use Cases","level":2,"id":"common-use-cases"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Overview of NVIDIA OpenShell Why OpenShell Exists Common Risks and Controls Protection Layers at a Glance Common Use Cases Next Steps","keywords":["agent","apis","architecture","blocks","built","case","cases","claude","code","common","compliance","controls","credential","customize","data","deeper","default","description","exists","explore","filesystem","glance","hot","inference","landlock","layer","layers","locked","network","next","nvidia","openclaw","opencode","openshell","overview","policies","policy","prevents","privacy","private","privilege","process","protection","quickstart","reroutes","reusable","risks","route","run","sandbox"],"code_blocks":[],"links":[],"images":[],"doc_type":"documentation","section_path":["About","Overview"]},{"id":"about/release-notes","title":"NVIDIA OpenShell Release Notes","url":"about/release-notes.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Track the latest changes and improvements to NVIDIA OpenShell.","tags":["Release Notes","Changelog","AI Agents"],"topics":["Generative AI","Cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"NVIDIA OpenShell Release Notes Track the latest changes and improvements to NVIDIA OpenShell\nThis page covers the highlights of the release\nFor more details, refer to the OpenShell GitHub Releases . 0.1.0 This is the first release of NVIDIA OpenShell. It introduces sandboxed AI agent execution with kernel-level isolation, policy enforcement, and credential management. Highlights Introduces sandboxed AI agent execution with kernel-level isolation, policy enforcement, and credential management. Introduces the openshell CLI for creating, managing, and customizing sandboxes. Introduces the openshell-gateway service for managing the gateway and sandboxes. Introduces the openshell-sandbox service for running the sandboxed agent","format":"text","content_length":731,"word_count":97,"summary":"Track the latest changes and improvements to NVIDIA OpenShell. This page covers the highlights of the release. For more details, refer to the OpenShell GitHub Releases.","headings":[{"text":"NVIDIA OpenShell Release Notes","level":1,"id":"nvidia-openshell-release-notes"},{"text":"0.1.0","level":2,"id":"010"},{"text":"Highlights","level":3,"id":"highlights"}],"headings_text":"NVIDIA OpenShell Release Notes 0.1.0 Highlights","keywords":["github","highlights","introduces","notes","nvidia","openshell","release","releases","this","track"],"code_blocks":[],"links":[{"text":"OpenShell GitHub Releases","type":"external","url":"https://github.com/NVIDIA/OpenShell/releases"}],"images":[],"doc_type":"documentation","section_path":["About","Release Notes"]},{"id":"get-started/quickstart","title":"Quickstart","url":"get-started/quickstart.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Install the OpenShell CLI and create your first sandboxed AI agent in two commands.","tags":["AI Agents","Sandboxing","Installation","Quickstart"],"topics":["Generative AI","Cybersecurity"],"content_type":"get_started","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Quickstart This page gets you from zero to a running, policy-enforced sandbox in two commands. Prerequisites Before you begin, make sure you have: Python 3.12 or later uv installed Docker Desktop running on your machine Install the OpenShell CLI Install the openshell package into a virtual environment. Activate your virtual environment: uv venv && source .venv/bin/activate\nInstall the CLI: uv pip install openshell\nConnect to a Remote Gateway (Optional) If you’re running locally, skip this step. The OpenShell CLI creates a gateway automatically when you create your first sandbox. Brev Deploy an OpenShell gateway on Brev by hitting Deploy on the OpenShell Launchable . After the instance is running, find the gateway URL in the Brev console under Using Secure Links . Copy the shareable URL for port 8080 — this is the gateway endpoint. $ openshell gateway add https://.brevlab.com\nopenshell status\nDGX Spark Set up your Spark with NVIDIA Sync first, or make sure SSH access is configured (such as SSH keys added to the host). Deploy to a DGX Spark machine over SSH: $ openshell gateway start --remote @.local\nopenshell status\nAfter openshell status shows the gateway as healthy, all subsequent commands route through the SSH tunnel. Create Your First OpenShell Sandbox Choose the tab that matches your agent: Claude Code Run the following command to create a sandbox with Claude Code: $ openshell sandbox create -- claude\nThe CLI prompts you to create a provider from local credentials — type yes to continue. If ANTHROPIC_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. OpenCode Run the following command to create a sandbox with OpenCode: $ openshell sandbox create -- opencode\nThe CLI prompts you to create a provider from local credentials. Type yes to continue. If OPENAI_API_KEY or OPENROUTER_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. Codex Run the following command to create a sandbox with Codex: $ openshell sandbox create -- codex\nThe CLI prompts you to create a provider from local credentials. Type yes to continue. If OPENAI_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. OpenClaw Run the following command to create a sandbox with OpenClaw: $ openshell sandbox create --from openclaw\nThe --from flag pulls a pre-built sandbox definition from the OpenShell Community catalog. Each definition bundles a container image, a tailored policy, and optional skills into a single package. Community Sandbox You can use the --from flag to pull other OpenShell sandbox images from the NVIDIA Container Registry . For example, to pull the base image, run the following command: $ openshell sandbox create --from base","format":"text","content_length":2947,"word_count":470,"summary":"This page gets you from zero to a running, policy-enforced sandbox in two commands.","headings":[{"text":"Quickstart","level":1,"id":"quickstart"},{"text":"Prerequisites","level":2,"id":"prerequisites"},{"text":"Install the OpenShell CLI","level":2,"id":"install-the-openshell-cli"},{"text":"Connect to a Remote Gateway (Optional)","level":2,"id":"connect-to-a-remote-gateway-optional"},{"text":"Create Your First OpenShell Sandbox","level":2,"id":"create-your-first-openshell-sandbox"}],"headings_text":"Quickstart Prerequisites Install the OpenShell CLI Connect to a Remote Gateway (Optional) Create Your First OpenShell Sandbox","keywords":["activate","after","agent","before","brev","choose","claude","cli","code","codex","com","command","community","connect","container","copy","create","deploy","desktop","docker","each","environment","first","gateway","have","https","install","launchable","links","openclaw","opencode","openshell","optional","prerequisites","python","quickstart","registry","remote","run","sandbox","secure","set","spark","sync","this","type","using","venv","your"],"code_blocks":[{"content":"uv venv && source .venv/bin/activate","language":"text"},{"content":"uv pip install openshell","language":"text"},{"content":"$ openshell gateway add https://.brevlab.com\n$ openshell status","language":"text"},{"content":"$ openshell gateway start --remote @.local\n$ openshell status","language":"text"},{"content":"$ openshell sandbox create -- claude","language":"text"},{"content":"$ openshell sandbox create -- opencode","language":"text"},{"content":"$ openshell sandbox create -- codex","language":"text"},{"content":"$ openshell sandbox create --from openclaw","language":"text"},{"content":"$ openshell sandbox create --from base","language":"text"}],"links":[{"text":"Uv","type":"external","url":"https://docs.astral.sh/uv/","original_text":"uv"},{"text":"OpenShell Launchable","type":"external","url":"https://brev.nvidia.com/launchable/deploy/now?launchableID=env-3AaK9NmCzWp3pVyUDNNFBt805FT"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"NVIDIA Container Registry","type":"external","url":"https://registry.nvidia.com/"}],"images":[],"doc_type":"tutorial","section_path":["Get Started","Quickstart"]},{"id":"inference/configure","title":"Configure Inference Routing","url":"inference/configure.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Set up the managed local inference endpoint with provider credentials and model configuration.","tags":["Inference Routing","Configuration","Privacy","LLM","Provider"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Configure Inference Routing This page covers the managed local inference endpoint ( https://inference.local ). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details. The configuration consists of two values: Value Description Provider record The credential backend OpenShell uses to authenticate with the upstream model host. Model ID The model to use for generation requests. Step 1: Create a Provider Create a provider that holds the backend credentials you want OpenShell to use. NVIDIA API Catalog $ openshell provider create --name nvidia-prod --type nvidia --from-existing\nThis reads NVIDIA_API_KEY from your environment. Local / self-hosted endpoint $ openshell provider create\nname my-local-model\ntype openai\ncredential OPENAI_API_KEY=empty-if-not-required\nconfig OPENAI_BASE_URL=http://192.168.10.15/v1\nUse --config OPENAI_BASE_URL to point to any OpenAI-compatible server running on your network. Set OPENAI_API_KEY to a dummy value if the server does not require authentication. Anthropic $ openshell provider create --name anthropic-prod --type anthropic --from-existing\nThis reads ANTHROPIC_API_KEY from your environment. Step 2: Set Inference Routing Point inference.local at that provider and choose the model to use: $ openshell inference set\nprovider nvidia-prod\nmodel nvidia/nemotron-3-nano-30b-a3b\nStep 3: Verify the Active Config Confirm that the provider and model are set correctly: $ openshell inference get\nprovider: nvidia-prod\nmodel: nvidia/nemotron-3-nano-30b-a3b\nversion: 1\nStep 4: Update Part of the Config Use update when you want to change only one field: $ openshell inference update --model nvidia/nemotron-3-nano-30b-a3b\nOr switch providers without repeating the current model: $ openshell inference update --provider openai-prod\nUse It from a Sandbox After inference is configured, code inside any sandbox can call https://inference.local directly: from openai import OpenAI\nclient = OpenAI(base_url=\"https://inference.local/v1\", api_key=\"dummy\nresponse = client.chat.completions.create\nmodel=\"anything\nmessages=[{\"role\": \"user\", \"content\": \"Hello\nThe client-supplied model is ignored for generation requests. OpenShell rewrites it to the configured model before forwarding upstream. Use this endpoint when inference should stay local to the host for privacy and security reasons. External providers that should be reached directly belong in network_policies instead. Verify the Endpoint from a Sandbox openshell inference get confirms the configuration was saved, but does not verify the upstream endpoint is reachable. To confirm end-to-end connectivity, connect to a sandbox and run: curl https://inference.local/v1/responses\nH \"Content-Type: application/json\"\nd\ninstructions\": \"You are a helpful assistant\ninput\": \"Hello\nA successful response confirms the privacy router can reach the configured backend and the model is serving requests. Gateway-scoped — every sandbox on the active gateway sees the same inference.local backend. HTTPS only — inference.local is intercepted only for HTTPS traffic. Next Steps Explore related topics: To understand the inference routing flow and supported API patterns, refer to index . To control external endpoints, refer to Network Access Rules . To manage provider records, refer to ../sandboxes/providers . To view openshell inference commands, refer to ../reference/cli","format":"text","content_length":3402,"word_count":451,"summary":"This page covers the managed local inference endpoint (https://inference.local). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details.","headings":[{"text":"Configure Inference Routing","level":1,"id":"configure-inference-routing"},{"text":"Step 1: Create a Provider","level":2,"id":"step-1-create-a-provider"},{"text":"Step 2: Set Inference Routing","level":2,"id":"step-2-set-inference-routing"},{"text":"Step 3: Verify the Active Config","level":2,"id":"step-3-verify-the-active-config"},{"text":"Step 4: Update Part of the Config","level":2,"id":"step-4-update-part-of-the-config"},{"text":"Use It from a Sandbox","level":2,"id":"use-it-from-a-sandbox"},{"text":"Verify the Endpoint from a Sandbox","level":3,"id":"verify-the-endpoint-from-a-sandbox"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Configure Inference Routing Step 1: Create a Provider Step 2: Set Inference Routing Step 3: Verify the Active Config Step 4: Update Part of the Config Use It from a Sandbox Verify the Endpoint from a Sandbox Next Steps","keywords":["access","active","after","anthropic","api_key","base_url","catalog","chat","client","config","configure","confirm","content","correctly","create","description","directly","endpoint","explore","external","field","from","gateway","hello","http","https","inference","local","messages","model","network","next","openai","openshell","part","point","provider","response","routing","rules","run","sandbox","set","step","steps","this","topics","type","update","user"],"code_blocks":[{"content":"$ openshell provider create --name nvidia-prod --type nvidia --from-existing","language":"text"},{"content":"$ openshell provider create \\\n --name my-local-model \\\n --type openai \\\n --credential OPENAI_API_KEY=empty-if-not-required \\\n --config OPENAI_BASE_URL=http://192.168.10.15/v1","language":"text"},{"content":"$ openshell provider create --name anthropic-prod --type anthropic --from-existing","language":"text"},{"content":"$ openshell inference set \\\n --provider nvidia-prod \\\n --model nvidia/nemotron-3-nano-30b-a3b","language":"text"},{"content":"$ openshell inference get\nprovider: nvidia-prod\nmodel: nvidia/nemotron-3-nano-30b-a3b\nversion: 1","language":"text"},{"content":"$ openshell inference update --model nvidia/nemotron-3-nano-30b-a3b","language":"text"},{"content":"$ openshell inference update --provider openai-prod","language":"text"},{"content":"from openai import OpenAI\n\nclient = OpenAI(base_url=\"https://inference.local/v1\", api_key=\"dummy\")\n\nresponse = client.chat.completions.create(\n model=\"anything\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\n)","language":"text"},{"content":"curl https://inference.local/v1/responses \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"instructions\": \"You are a helpful assistant.\",\n \"input\": \"Hello!\"\n }'","language":"text"}],"links":[],"images":[],"doc_type":"tutorial","section_path":["Inference","Configure"]},{"id":"inference/index","title":"About Inference Routing","url":"inference/index.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Understand how OpenShell routes inference traffic through external endpoints and the local privacy router.","tags":["Inference Routing","Privacy","AI Agents","LLM"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"About Inference Routing OpenShell handles inference in two ways: Path How It Works External endpoints Traffic to hosts like api.openai.com or api.anthropic.com is treated like any other outbound request — allowed or denied by network_policies . Refer to Network Access Rules . inference.local A special endpoint exposed inside every sandbox for inference that should stay local to the host for privacy and security. The privacy router strips the original credentials, injects the configured backend credentials, and forwards to the managed model endpoint. How inference.local Works When code inside a sandbox calls https://inference.local , the privacy router routes the request to the configured backend for that gateway. The configured model is applied to generation requests, and provider credentials are supplied by OpenShell rather than by code inside the sandbox. If code calls an external inference host directly, that traffic is evaluated only by network_policies . Property Detail Credentials No sandbox API keys needed — credentials come from the configured provider record. Configuration One provider and one model define sandbox inference. Provider support OpenAI, Anthropic, and NVIDIA providers all work through the same endpoint. Hot-refresh Provider credential changes and inference updates are picked up without recreating sandboxes. Supported API Patterns Supported request patterns depend on the provider configured for inference.local . OpenAI-compatible Pattern Method Path Chat Completions POST /v1/chat/completions Completions POST /v1/completions Responses POST /v1/responses Model Discovery GET /v1/models Model Discovery GET /v1/models/* Anthropic-compatible Pattern Method Path Messages POST /v1/messages Requests to inference.local that do not match the configured provider’s supported patterns are denied. Next Steps Continue with one of the following: To set up the backend behind inference.local , refer to configure . To control external endpoints, refer to Network Access Rules","format":"text","content_length":2010,"word_count":281,"summary":"Traffic to hosts like api.openai.com or api.anthropic.com is treated like any other outbound request — allowed or denied by network_policies. Refer to Network Access Rules.","headings":[{"text":"About Inference Routing","level":1,"id":"about-inference-routing"},{"text":"How inference.local Works","level":2,"id":"how-inferencelocal-works"},{"text":"Supported API Patterns","level":2,"id":"supported-api-patterns"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"About Inference Routing How inference.local Works Supported API Patterns Next Steps","keywords":["about","access","anthropic","api","chat","com","completions","configuration","continue","credentials","detail","discovery","external","following","hot","https","inference","local","messages","method","model","network","next","openai","openshell","path","pattern","patterns","property","provider","refer","requests","responses","routing","rules","steps","supported","traffic","ways","works"],"code_blocks":[],"links":[],"images":[],"doc_type":"overview","section_path":["Inference"]},{"id":"reference/cli","title":"CLI Reference","url":"reference/cli.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Complete command reference for the openshell CLI including all subcommands, flags, and environment variables.","tags":["CLI","Reference","Commands","AI Agents"],"topics":["Generative AI","Cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"CLI Reference Complete command reference for the openshell CLI. Every subcommand, flag, and option is documented here. Command Tree The full hierarchy of openshell subcommands: openshell\nstatus\nlogs [name\nterm\nforward\n├── start [--all\n├── connect [name\n├── upload [name\n├── download [name\n└── ssh-config Register an existing remote gateway by URL. openshell gateway tunnel Set up a kubectl tunnel to a remote cluster. openshell gateway select Set the active cluster. All subsequent commands target this cluster. openshell gateway select List all registered clusters (when called without a name). Sandbox Commands Create and manage isolated agent execution environments. Command Description openshell sandbox create Create a new sandbox. Refer to the flag reference below. openshell sandbox get [name] Show detailed information about a sandbox. openshell sandbox list List all sandboxes in the active cluster. openshell sandbox delete Delete one or more sandboxes by name. Use --all to delete every sandbox in the active gateway. openshell sandbox connect [name] Open an interactive SSH session into a running sandbox. openshell sandbox upload [name] Upload files from the host into a sandbox. openshell sandbox download [name] Download files from a sandbox to the host. openshell sandbox ssh-config Print SSH config for a sandbox. Append to ~/.ssh/config for VS Code Remote-SSH. Sandbox Create Flags The following flags control sandbox creation: Flag Description --name Assign a human-readable name to the sandbox. Auto-generated if omitted. --provider Attach a credential provider. Repeatable for multiple providers. --policy Path to a policy YAML file to apply at creation time. --upload Upload local files into the sandbox before running. --keep Keep the sandbox alive after the trailing command exits. --forward Forward a local port into the sandbox at startup. --from Build from a community sandbox name, local Dockerfile directory, or container image reference. -- The command to run inside the sandbox. Everything after -- is passed as the agent command. Policy Commands Apply and inspect sandbox policies at runtime. Command Description openshell policy set Apply or update a policy on a running sandbox. Pass --policy . openshell policy get Show the active policy for a sandbox. Add --full for the complete policy with metadata. openshell policy list List all policy versions applied to a sandbox, with status. Port Forwarding Commands Forward sandbox ports to the host for local access. Command Description openshell forward start Forward a sandbox port to the host. Add -d for background mode. openshell forward stop Stop an active port forward. openshell forward list List all active port forwards. Provider Commands Manage credential providers that inject secrets into sandboxes. Command Description openshell provider create Create a new credential provider. Refer to the flag reference below. openshell provider get Show details of a provider. openshell provider list List all providers in the active cluster. openshell provider update Update a provider’s credentials or configuration. openshell provider delete Delete a provider. Provider Create Flags The following flags control provider creation: Flag Description --name Name for the provider. --type Provider type: claude , codex , opencode , github , gitlab , nvidia , generic , outlook . --from-existing Discover credentials from your current shell environment variables. --credential Set a credential explicitly. Format: KEY=VALUE or bare KEY to read from env. Repeatable. --config Set a configuration value. Format: KEY=VALUE . Repeatable. Inference Commands Configure the backend used by https://inference.local . openshell inference set Set the provider and model for managed inference. Both flags are required. Flag Description --provider Provider record name to use for injected credentials. --model Model identifier to force on generation requests. openshell inference update Update only the fields you specify. Flag Description --provider Replace the current provider record. --model Replace the current model ID. openshell inference get Show the current inference configuration, including provider, model, and version. Environment Variables The following environment variables override CLI defaults: Variable Description OPENSHELL_GATEWAY Name of the gateway to operate on. Overrides the active gateway set by openshell gateway select . OPENSHELL_SANDBOX_POLICY Default path to a policy YAML file. When set, openshell sandbox create uses this policy if no --policy flag is provided. Shell Completions Generate shell completion scripts for tab completion: $ openshell completions bash\nopenshell completions zsh\nopenshell completions fish\nPipe the output to your shell’s config file: $ openshell completions zsh >> ~/.zshrc\nsource ~/.zshrc\nBuilt-in Help Every command and subcommand includes built-in help. Use --help at any level to see available subcommands, flags, and usage examples: $ openshell --help\nopenshell sandbox --help\nopenshell sandbox create --help\nopenshell gateway --help\nHelp output groups flags under distinct headings: FLAGS for command-specific options, GATEWAY FLAGS for --gateway and --gateway-endpoint , and GLOBAL FLAGS for --verbose , --help , and --version","format":"text","content_length":7059,"word_count":1056,"summary":"Complete command reference for the openshell CLI. Every subcommand, flag, and option is documented here.","headings":[{"text":"CLI Reference","level":1,"id":"cli-reference"},{"text":"Command Tree","level":2,"id":"command-tree"},{"text":"Status, Logs, and Terminal","level":2,"id":"status-logs-and-terminal"},{"text":"Gateway Commands","level":2,"id":"gateway-commands"},{"text":"Sandbox Commands","level":2,"id":"sandbox-commands"},{"text":"Sandbox Create Flags","level":3,"id":"sandbox-create-flags"},{"text":"Policy Commands","level":2,"id":"policy-commands"},{"text":"Port Forwarding Commands","level":2,"id":"port-forwarding-commands"},{"text":"Provider Commands","level":2,"id":"provider-commands"},{"text":"Provider Create Flags","level":3,"id":"provider-create-flags"},{"text":"Inference Commands","level":2,"id":"inference-commands"},{"text":"openshell inference set","level":3,"id":"openshell-inference-set"},{"text":"openshell inference update","level":3,"id":"openshell-inference-update"},{"text":"openshell inference get","level":3,"id":"openshell-inference-get"},{"text":"Environment Variables","level":2,"id":"environment-variables"},{"text":"Shell Completions","level":2,"id":"shell-completions"},{"text":"Built-in Help","level":2,"id":"built-in-help"}],"headings_text":"CLI Reference Command Tree Status, Logs, and Terminal Gateway Commands Sandbox Commands Sandbox Create Flags Policy Commands Port Forwarding Commands Provider Commands Provider Create Flags Inference Commands openshell inference set openshell inference update openshell inference get Environment Variables Shell Completions Built-in Help","keywords":["add","append","apply","assign","attach","auto","both","build","built","check","cli","code","command","commands","complete","completion","completions","configure","create","creation","dashboard","default","defaults","delete","deploy","description","discover","dockerfile","download","environment","every","everything","examples","file","flag","flags","format","forward","forwarding","gateway","generate","headings","help","https","inference","keep","launch","list","logs","manage"],"code_blocks":[{"content":"openshell\n├── status\n├── logs [name]\n├── term\n├── forward\n│ ├── start \n│ ├── stop \n│ └── list\n├── gateway\n│ ├── start\n│ ├── stop\n│ ├── destroy\n│ ├── info\n│ ├── add \n│ ├── tunnel\n│ └── select [name]\n├── sandbox\n│ ├── create\n│ ├── get [name]\n│ ├── list\n│ ├── delete [--all]\n│ ├── connect [name]\n│ ├── upload [name]\n│ ├── download [name]\n│ └── ssh-config \n├── policy\n│ ├── set \n│ ├── get \n│ └── list \n├── provider\n│ ├── create\n│ ├── get \n│ ├── list\n│ ├── update \n│ └── delete \n├── inference\n│ ├── set\n│ ├── update\n│ └── get\n└── completions ","language":"text"},{"content":"$ openshell completions bash\n$ openshell completions zsh\n$ openshell completions fish","language":"text"},{"content":"$ openshell completions zsh >> ~/.zshrc\n$ source ~/.zshrc","language":"text"},{"content":"$ openshell --help\n$ openshell sandbox --help\n$ openshell sandbox create --help\n$ openshell gateway --help","language":"text"}],"links":[],"images":[],"doc_type":"reference","section_path":["Reference","Cli"]},{"id":"reference/default-policy","title":"Default Policy Reference","url":"reference/default-policy.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Breakdown of the built-in default policy applied when you create an OpenShell sandbox without a custom policy.","tags":["ai_agents","sandboxing","security","policy"],"topics":["generative_ai","cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"keywords":["openshell default policy","sandbox policy","agent compatibility"],"content":"Default Policy Reference The default policy is the policy applied when you create an OpenShell sandbox without --policy . It is defined in the deploy/docker/sandbox/dev-sandbox-policy.yaml file. Agent Compatibility The following table shows the coverage of the default policy for common agents. Agent Coverage Action Required Claude Code Full None. Works out of the box. OpenCode Partial Add opencode.ai endpoint and OpenCode binary paths. Codex None Provide a complete custom policy with OpenAI endpoints and Codex binary paths. If you run a non-Claude agent without a custom policy, the agent’s API calls are denied by the proxy. You must provide a policy that declares the agent’s endpoints and binaries. Default Policy Blocks The following tables show the default policy blocks pre-configured in the file.

Filesystem, Landlock, and ProcessNetwork Policy BlocksAnthropic API and TelemetryGit Clone and FetchNVIDIA API CatalogGitHub API (Read-Only)Python Package InstallationVS Code Remote and Marketplace The cluster image is based on rancher/k3s:v1.35.2-k3s1 and bundles the Helm charts and Kubernetes manifests required to bootstrap the control plane. The server and sandbox images are pulled separately at runtime. To override the default image references, set the following environment variables: Variable Purpose OPENSHELL_CLUSTER_IMAGE Override the cluster image reference. OPENSHELL_COMMUNITY_REGISTRY Override the registry for community sandbox images. Kernel Requirements OpenShell enforces sandbox isolation through two Linux kernel security modules: Module Requirement Details Landlock LSM Recommended Enforces filesystem access restrictions at the kernel level. The best_effort compatibility mode uses the highest Landlock ABI the host kernel supports. The hard_requirement mode fails sandbox creation if the required ABI is unavailable. seccomp Required Filters dangerous system calls. Available on all modern Linux kernels (3.17+). On macOS, these kernel modules run inside the Docker Desktop Linux VM, not on the host kernel. Agent Compatibility For the full list of supported agents and their default policy coverage, refer to the Supported Agents table","format":"text","content_length":3058,"word_count":402,"summary":"This page lists the platform, software, runtime, and kernel requirements for running OpenShell.","headings":[{"text":"Support Matrix","level":1,"id":"support-matrix"},{"text":"Supported Platforms","level":2,"id":"supported-platforms"},{"text":"Software Prerequisites","level":2,"id":"software-prerequisites"},{"text":"Sandbox Runtime Versions","level":2,"id":"sandbox-runtime-versions"},{"text":"Container Images","level":2,"id":"container-images"},{"text":"Kernel Requirements","level":2,"id":"kernel-requirements"},{"text":"Agent Compatibility","level":2,"id":"agent-compatibility"}],"headings_text":"Support Matrix Supported Platforms Software Prerequisites Sandbox Runtime Versions Container Images Kernel Requirements Agent Compatibility","keywords":["agent","agents","apple","architecture","available","base","bookworm","claude","cluster","code","codex","community","compatibility","component","container","debian","desktop","details","docker","enforces","engine","filters","first","helm","image","images","intel","k3s","kernel","kubernetes","landlock","latest","linux","matrix","minimum","module","modules","must","node","notes","opencode","openshell","override","platform","platforms","prerequisites","pulled","purpose","python","recommended"],"code_blocks":[],"links":[{"text":"Uv","type":"external","url":"https://docs.astral.sh/uv/","original_text":"uv"},{"text":"Landlock LSM","type":"external","url":"https://docs.kernel.org/security/landlock.html"}],"images":[],"doc_type":"reference","section_path":["Reference","Support Matrix"]},{"id":"resources/eula","title":"License","url":"resources/eula.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"NVIDIA OpenShell license agreement and terms of use.","tags":["License","EULA"],"topics":["Legal"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"License","format":"text","content_length":7,"word_count":1,"summary":" License","headings":[{"text":"License","level":1,"id":"license"}],"headings_text":"License","keywords":["license"],"code_blocks":[],"links":[],"images":[],"doc_type":"documentation","section_path":["Resources","Eula"]},{"id":"sandboxes/community-sandboxes","title":"Community Sandboxes","url":"sandboxes/community-sandboxes.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Use pre-built sandboxes from the OpenShell Community catalog or contribute your own.","tags":["Community","Sandbox","Container Image","Open Source"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Community Sandboxes Use pre-built sandboxes from the OpenShell Community catalog, or contribute your\nown. What Are Community Sandboxes Community sandboxes are ready-to-use environments published in the\nOpenShell Community repository\nEach sandbox bundles a Dockerfile, policy, optional skills, and startup scripts\ninto a single package that you can launch with one command. Current Catalog The following community sandboxes are available in the catalog. Sandbox Description base Foundational image with system tools and dev environment openclaw Open agent manipulation and control sdg Synthetic data generation workflows simulation General-purpose simulation sandboxes Use a Community Sandbox Launch a community sandbox by name with the --from flag: $ openshell sandbox create --from openclaw\nWhen you pass --from with a community sandbox name, the CLI: Resolves the name against the\nOpenShell Community repository. Pulls the Dockerfile, policy, skills, and any startup scripts. Builds the container image locally. Creates the sandbox with the bundled configuration applied. You end up with a running sandbox whose image, policy, and tooling are all\npreconfigured by the community package. Other Sources The --from flag also accepts: Local directory paths: Point to a directory on disk that contains a\nDockerfile and optional policy/skills: $ openshell sandbox create --from ./my-sandbox-dir\nContainer image references: Use an existing container image directly: $ openshell sandbox create --from my-registry.example.com/my-image:latest\nContribute a Community Sandbox Each community sandbox is a directory under sandboxes/ in the\nOpenShell Community repository\nAt minimum, a sandbox directory must contain: Dockerfile : Defines the container image README.md : Describes the sandbox and how to use it Optional files: policy.yaml : Default policy applied when the sandbox launches skills/ : Agent skill definitions bundled with the sandbox Startup scripts: Any scripts the Dockerfile or entrypoint invokes To contribute, fork the repository, add your sandbox directory, and open a pull\nrequest. Refer to the repository’s\nCONTRIBUTING.md\nfor submission guidelines. The community catalog is designed to grow. If you have built a sandbox that\nsupports a particular workflow (data processing, simulation, code review\nor anything else), consider contributing it back so others can use it. Next Steps Explore related topics: Need to supply API keys or tokens? Set up providers for credential management. Want to customize the sandbox policy? Write custom rules in policies","format":"text","content_length":2562,"word_count":367,"summary":"Use pre-built sandboxes from the OpenShell Community catalog, or contribute your own.","headings":[{"text":"Community Sandboxes","level":1,"id":"community-sandboxes"},{"text":"What Are Community Sandboxes","level":2,"id":"what-are-community-sandboxes"},{"text":"Current Catalog","level":2,"id":"current-catalog"},{"text":"Use a Community Sandbox","level":2,"id":"use-a-community-sandbox"},{"text":"Other Sources","level":3,"id":"other-sources"},{"text":"Contribute a Community Sandbox","level":2,"id":"contribute-a-community-sandbox"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Community Sandboxes What Are Community Sandboxes Current Catalog Use a Community Sandbox Other Sources Contribute a Community Sandbox Next Steps","keywords":["accepts","agent","any","builds","catalog","com","community","contain","container","contribute","creates","current","default","defines","describes","description","directly","dockerfile","each","explore","files","flag","foundational","general","image","launch","local","need","next","open","openshell","optional","other","paths","point","pulls","refer","references","resolves","sandbox","sandboxes","scripts","set","skills","sources","startup","steps","synthetic","topics","want"],"code_blocks":[{"content":"$ openshell sandbox create --from openclaw","language":"text"},{"content":"$ openshell sandbox create --from ./my-sandbox-dir","language":"text"},{"content":"$ openshell sandbox create --from my-registry.example.com/my-image:latest","language":"text"}],"links":[{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"Contributing","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community/blob/main/CONTRIBUTING.md","original_text":"CONTRIBUTING.md"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Community Sandboxes"]},{"id":"sandboxes/create-and-manage","title":"Create and Manage Sandboxes","url":"sandboxes/create-and-manage.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create, inspect, connect to, monitor, transfer files, and delete OpenShell sandboxes.","tags":["Sandboxing","AI Agents","Sandbox Management","CLI"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Create and Manage Sandboxes This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes . Docker must be running before you create a sandbox. If it is not, the CLI\nreturns a connection-refused error ( os error 61 ) without explaining\nthe cause. Start Docker and try again. Create a Sandbox Run a single command to create a sandbox and launch your agent: $ openshell sandbox create -- claude\nIf you have an existing gateway, the sandbox is created in it. Otherwise, a gateway is created automatically. A fully specified creation command might look like: $ openshell sandbox create\nname dev\nprovider my-claude\npolicy policy.yaml\nupload\nkeep\nclaude\nUse --keep to keep the sandbox running after the trailing command exits\nThis is especially useful when you are iterating on a policy or want to\nreconnect later from another terminal or VS Code. Create from a Community Sandbox or Custom Image Use --from to create a sandbox from a pre-built community package, a local directory, or a container image: $ openshell sandbox create --from openclaw\nThe CLI resolves the name against the OpenShell Community catalog, pulls the bundled Dockerfile and policy, builds the image locally, and creates the sandbox. For the full catalog and how to contribute your own, refer to community-sandboxes . You can also point --from at a local directory or a container image reference: $ openshell sandbox create --from ./my-sandbox-dir\nopenshell sandbox create --from my-registry.example.com/my-image:latest\nList and Inspect Sandboxes Check the status of your sandboxes and retrieve detailed information about individual ones. List all sandboxes: $ openshell sandbox list\nGet detailed information about a specific sandbox: $ openshell sandbox get my-sandbox\nConnect to a Sandbox Access a running sandbox through an interactive SSH session or VS Code Remote-SSH. Interactive SSH Open an SSH session into a running sandbox: $ openshell sandbox connect my-sandbox\nView Logs Stream and filter sandbox logs to monitor agent activity and diagnose policy decisions. Stream sandbox logs: $ openshell logs my-sandbox\nUse flags to filter and follow output: Flag Purpose Example --tail Stream logs in real time openshell logs my-sandbox --tail --source Filter by log source --source sandbox --level Filter by severity --level warn --since Show logs from a time window --since 5m Monitor Your Sandbox OpenShell Terminal is a real-time dashboard that combines sandbox status and live logs in a single view. $ openshell term\nThe dashboard shows the following information. Sandbox status : Name, phase, image, attached providers, age, and active port forwards. Live log stream : Omutbound connections, policy decisions, and inference interceptions as they happen. Logs are labeled by source: sandbox (proxy and policy events) or gateway (lifecycle events). Use the terminal to spot blocked connections ( action=deny entries) and inference interceptions ( action=inspect_for_inference entries). If a connection is blocked unexpectedly, add the host to your network policy — refer to policies for the workflow. Transfer Files Transfer files between your host machine and a running sandbox. Upload files from your host into the sandbox: $ openshell sandbox upload my-sandbox ./src /sandbox/src\nDownload files from the sandbox to your host: $ openshell sandbox download my-sandbox /sandbox/output ./local\nYou can also upload files at creation time with the --upload flag on\nopenshell sandbox create . Delete Sandboxes Remove sandboxes when they are no longer needed. Deleting a sandbox stops all processes, releases cluster resources, and purges injected credentials. Delete a sandbox by name: $ openshell sandbox delete my-sandbox\nDelete all sandboxes in the active gateway: $ openshell sandbox delete --all\nNext Steps Explore related topics: To follow a complete end-to-end example, refer to the /tutorials/github-sandbox tutorial. To supply API keys or tokens, refer to providers . To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog","format":"text","content_length":4230,"word_count":648,"summary":"This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes.","headings":[{"text":"Create and Manage Sandboxes","level":1,"id":"create-and-manage-sandboxes"},{"text":"Create a Sandbox","level":2,"id":"create-a-sandbox"},{"text":"Create from a Community Sandbox or Custom Image","level":2,"id":"create-from-a-community-sandbox-or-custom-image"},{"text":"List and Inspect Sandboxes","level":2,"id":"list-and-inspect-sandboxes"},{"text":"Connect to a Sandbox","level":2,"id":"connect-to-a-sandbox"},{"text":"Interactive SSH","level":3,"id":"interactive-ssh"},{"text":"View Logs","level":2,"id":"view-logs"},{"text":"Monitor Your Sandbox","level":2,"id":"monitor-your-sandbox"},{"text":"Transfer Files","level":2,"id":"transfer-files"},{"text":"Delete Sandboxes","level":2,"id":"delete-sandboxes"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Create and Manage Sandboxes Create a Sandbox Create from a Community Sandbox or Custom Image List and Inspect Sandboxes Connect to a Sandbox Interactive SSH View Logs Monitor Your Sandbox Transfer Files Delete Sandboxes Next Steps","keywords":["about","access","action","agent","check","code","com","community","connect","create","custom","delete","deleting","docker","dockerfile","download","example","explore","files","filter","flag","from","gateway","host","image","inspect","interactive","lifecycle","like","list","live","logs","manage","monitor","name","next","omutbound","open","openshell","otherwise","output","purpose","reference","remote","remove","run","sandbox","sandboxes","show","source"],"code_blocks":[{"content":"$ openshell sandbox create -- claude","language":"text"},{"content":"$ openshell sandbox create \\\n --name dev \\\n --provider my-claude \\\n --policy policy.yaml \\\n --upload \\\n --keep \\\n -- claude","language":"text"},{"content":"$ openshell sandbox create --from openclaw","language":"text"},{"content":"$ openshell sandbox create --from ./my-sandbox-dir\n$ openshell sandbox create --from my-registry.example.com/my-image:latest","language":"text"},{"content":"$ openshell sandbox list","language":"text"},{"content":"$ openshell sandbox get my-sandbox","language":"text"},{"content":"$ openshell sandbox connect my-sandbox","language":"text"},{"content":"$ openshell logs my-sandbox","language":"text"},{"content":"$ openshell term","language":"text"},{"content":"$ openshell sandbox upload my-sandbox ./src /sandbox/src","language":"text"},{"content":"$ openshell sandbox download my-sandbox /sandbox/output ./local","language":"text"},{"content":"$ openshell sandbox delete my-sandbox","language":"text"},{"content":"$ openshell sandbox delete --all","language":"text"}],"links":[{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Create And Manage"]},{"id":"sandboxes/index","title":"About Sandboxes","url":"sandboxes/index.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Understand sandbox lifecycle, supported agents, built-in default policy, and network access rules in OpenShell.","tags":["Sandboxing","AI Agents","Security","Policy","Isolation"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"About Sandboxes An OpenShell sandbox is a safe, private execution environment for an AI agent. Each sandbox runs with multiple layers of protection that prevent unauthorized data access, credential exposure, and network exfiltration. Protection layers include filesystem restrictions (Landlock), system call filtering (seccomp), network namespace isolation, and a privacy-enforcing HTTP CONNECT proxy. Sandbox Lifecycle Every sandbox moves through a defined set of phases: Phase Description Provisioning The runtime is setting up the sandbox environment, injecting credentials, and applying your policy. Ready The sandbox is running. The agent process is active and all isolation layers are enforced. You can connect, sync files, and view logs. Error Something went wrong during provisioning or execution. Check logs with openshell logs for details. Deleting The sandbox is being torn down. The system releases resources and purges credentials. Supported Agents The following table summarizes the agents that run in OpenShell sandboxes. Built-in agents are pre-installed in the OpenShell base sandbox image and auto-configured when passed as the trailing command to openshell sandbox create . More community agent sandboxes are available in the community-sandboxes catalog. Agent Source Default Policy Notes Claude Code Built-in Full coverage Works out of the box. Requires ANTHROPIC_API_KEY . OpenCode Built-in Partial coverage Pre-installed. Add opencode.ai endpoint and OpenCode binary paths to the policy for full functionality. Codex Built-in No coverage Pre-installed. Requires a custom policy with OpenAI endpoints and Codex binary paths. Requires OPENAI_API_KEY . OpenClaw OpenShell Community Bundled Agent orchestration layer. Launch with openshell sandbox create --from openclaw\nBuilt-in Default Policy OpenShell ships a built-in policy that covers common agent workflows out of the box\nWhen you create a sandbox without --policy , the default policy is applied. It controls three things: Layer What It Controls How It Works Filesystem What the agent can access on disk Paths are split into read-only and read-write sets. Landlock LSM enforces these restrictions at the kernel level. Network What the agent can reach on the network Each policy block pairs allowed destinations (host and port) with allowed binaries (executable paths). The proxy matches every outbound connection to the binary that opened it. Both must match or the connection is denied. Process What privileges the agent has The agent runs as an unprivileged user with seccomp filters that block dangerous system calls. No sudo , no setuid , no path to elevated privileges. For the full breakdown of each default policy block and agent compatibility details, refer to ../reference/default-policy . Policy Structure A policy has static sections ( filesystem_policy , landlock , process ) that are locked at sandbox creation, and dynamic sections ( network_policies , inference ) that are hot-reloadable on a running sandbox. version: 1\nStatic: locked at sandbox creation. Paths the agent can read vs read/write\nfilesystem_policy\nread_only: [/usr, /lib, /etc\nread_write: [/sandbox, /tmp\nStatic: Landlock LSM kernel enforcement. best_effort uses highest ABI the host supports\nlandlock\ncompatibility: best_effort\nStatic: Unprivileged user/group the agent process runs as\nprocess\nrun_as_user: sandbox\nrun_as_group: sandbox\nDynamic: hot-reloadable. Named blocks of endpoints + binaries allowed to reach them\nnetwork_policies\nmy_api\nname: my-api\nendpoints\nhost: api.example.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\naccess: full\nbinaries\npath: /usr/bin/curl\nDynamic: hot-reloadable. Routing hints this sandbox can use for inference (e.g. local, nvidia\ninference\nallowed_routes: [local\nFor the complete structure and every field, refer to the Policy Schema Reference . Network Access Rules Network access is controlled by policy blocks under network_policies . Each block has a name, a list of endpoints (host, port, protocol, and optional rules), and a list of binaries that are allowed to use those endpoints. Every outbound connection from the sandbox goes through the proxy: The proxy queries the policy engine with the destination (host and port) and the calling binary. A connection is allowed only when both match an entry in the same policy block. For endpoints with protocol: rest and tls: terminate , each HTTP request is checked against that endpoint’s rules (method and path). If no endpoint matches and inference routes are configured, the request may be rerouted for inference. Otherwise the connection is denied. Endpoints without protocol or tls allow the TCP stream through without inspecting payloads. Next Steps Continue with one of the following: To create your first sandbox, refer to create-and-manage . To supply API keys or tokens, refer to providers . To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog","format":"text","content_length":4999,"word_count":737,"summary":"An OpenShell sandbox is a safe, private execution environment for an AI agent. Each sandbox runs with multiple layers of protection that prevent unauthorized data access, credential exposure, and network exfiltration. Protection layers include filesystem restrictions (Landlock), system call filte...","headings":[{"text":"About Sandboxes","level":1,"id":"about-sandboxes"},{"text":"Sandbox Lifecycle","level":2,"id":"sandbox-lifecycle"},{"text":"Supported Agents","level":2,"id":"supported-agents"},{"text":"Built-in Default Policy","level":2,"id":"built-in-default-policy"},{"text":"Policy Structure","level":2,"id":"policy-structure"},{"text":"Network Access Rules","level":2,"id":"network-access-rules"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"About Sandboxes Sandbox Lifecycle Supported Agents Built-in Default Policy Policy Structure Network Access Rules Next Steps","keywords":["about","access","add","agent","agents","allowed_routes","both","built","bundled","check","claude","code","codex","com","community","compatibility","continue","controls","default","deleting","description","dynamic","each","endpoints","enforcement","error","every","filesystem","following","full","host","landlock","launch","layer","lifecycle","more","name","named","network","next","notes","openai","openclaw","opencode","openshell","otherwise","partial","path","paths","phase"],"code_blocks":[{"content":"version: 1\n\n# Static: locked at sandbox creation. Paths the agent can read vs read/write.\nfilesystem_policy:\n read_only: [/usr, /lib, /etc]\n read_write: [/sandbox, /tmp]\n\n# Static: Landlock LSM kernel enforcement. best_effort uses highest ABI the host supports.\nlandlock:\n compatibility: best_effort\n\n# Static: Unprivileged user/group the agent process runs as.\nprocess:\n run_as_user: sandbox\n run_as_group: sandbox\n\n# Dynamic: hot-reloadable. Named blocks of endpoints + binaries allowed to reach them.\nnetwork_policies:\n my_api:\n name: my-api\n endpoints:\n - host: api.example.com\n port: 443\n protocol: rest\n tls: terminate\n enforcement: enforce\n access: full\n binaries:\n - path: /usr/bin/curl\n\n# Dynamic: hot-reloadable. Routing hints this sandbox can use for inference (e.g. local, nvidia).\ninference:\n allowed_routes: [local]","language":"text"}],"links":[{"text":"Claude Code","type":"external","url":"https://docs.anthropic.com/en/docs/claude-code"},{"text":"OpenCode","type":"external","url":"https://opencode.ai/"},{"text":"Codex","type":"external","url":"https://developers.openai.com/codex"},{"text":"OpenClaw","type":"external","url":"https://openclaw.ai/"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community/tree/main/sandboxes/openclaw"},{"text":"Landlock LSM","type":"external","url":"https://docs.kernel.org/security/landlock.html"}],"images":[],"doc_type":"overview","section_path":["Sandboxes"]},{"id":"sandboxes/policies","title":"Customize Sandbox Policies","url":"sandboxes/policies.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Apply, iterate, and debug sandbox network policies with hot-reload on running OpenShell sandboxes.","tags":["Policy","Network Policy","Sandbox","Security","Hot Reload"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Customize Sandbox Policies Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference . Quick Start: Apply a Custom Policy Pass a policy YAML file when creating the sandbox: $ openshell sandbox create --policy ./my-policy.yaml --keep -- claude\nThe --keep flag keeps the sandbox running after the initial command exits, which is useful when you plan to iterate on the policy. To avoid passing --policy every time, set a default policy with an environment variable: $ export OPENSHELL_SANDBOX_POLICY=./my-policy.yaml\nopenshell sandbox create --keep -- claude\nThe CLI uses the policy from OPENSHELL_SANDBOX_POLICY whenever --policy is not explicitly provided. Iterate on a Running Sandbox To change what the sandbox can access, pull the current policy, edit the YAML, and push the update. The workflow is iterative: create the sandbox, monitor logs for denied actions, pull the policy, modify it, push, and verify. The following steps outline the hot-reload policy update workflow. Create the sandbox with your initial policy by following Quick Start: Apply a Custom Policy above (or set OPENSHELL_SANDBOX_POLICY ). Monitor denials. Each log entry shows host, port, binary, and reason. Alternatively, use openshell term for a live dashboard. $ openshell logs --tail --source sandbox\nPull the current policy. Strip the metadata header (Version, Hash, Status) before reusing the file. $ openshell policy get --full > current-policy.yaml\nEdit the YAML: add or adjust network_policies entries, binaries, access or rules , or inference.allowed_routes . Push the updated policy. Exit codes: 0 = loaded, 1 = validation failed, 124 = timeout. $ openshell policy set --policy current-policy.yaml --wait\nVerify the new revision. If status is loaded , repeat from step 2 as needed; if failed , fix the policy and repeat from step 4. $ openshell policy list --tail --source sandbox for the denied host, path, and binary. When triaging denied requests, check: Destination host and port to confirm which endpoint is missing. Calling binary path to confirm which binaries entry needs to be added or adjusted. HTTP method and path (for REST endpoints) to confirm which rules entry needs to be added or adjusted. Then push the updated policy as described above. Examples Add these blocks to the network_policies section of your sandbox policy. Apply with openshell policy set --policy --wait\nUse Simple endpoint for host-level allowlists and Granular rules for method/path control. Simple endpoint Allow pip install and uv pip install to reach PyPI: pypi\nname: pypi\nendpoints\nhost: pypi.org\nport: 443\nhost: files.pythonhosted.org\nport: 443\nbinaries\n{ path: /usr/bin/pip\n{ path: /usr/local/bin/uv\nEndpoints without protocol or tls use TCP passthrough — the proxy allows the stream without inspecting payloads. Granular rules Allow Claude and the GitHub CLI to reach api.github.com with per-path rules: read-only (GET, HEAD, OPTIONS) and GraphQL (POST) for all paths; full write access for alpha-repo ; and create/edit issues only for bravo-repo . Replace with your GitHub org or username. For an end-to-end walkthrough that combines this policy with a GitHub credential provider and sandbox creation, refer to /tutorials/github-sandbox . github_repos\nname: github_repos\nendpoints\nhost: api.github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nallow\nmethod: GET\npath:\nallow\nmethod: HEAD\npath:\nallow\nmethod: OPTIONS\npath:\nallow\nmethod: POST\npath: \"/graphql\nallow\nmethod:\npath: \"/repos//alpha-repo\nallow\nmethod: POST\npath: \"/repos//bravo-repo/issues\nallow\nmethod: PATCH\npath: \"/repos//bravo-repo/issues\nbinaries\n{ path: /usr/local/bin/claude\n{ path: /usr/bin/gh\nEndpoints with protocol: rest and tls: terminate enable HTTP request inspection — the proxy decrypts TLS and checks each HTTP request against the rules list. Next Steps Explore related topics: To learn about policy structure and network access rules, refer to index . To view the full field-by-field YAML definition, refer to the Policy Schema Reference . To review the default policy breakdown, refer to ../reference/default-policy","format":"text","content_length":4315,"word_count":639,"summary":"Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference.","headings":[{"text":"Customize Sandbox Policies","level":1,"id":"customize-sandbox-policies"},{"text":"Quick Start: Apply a Custom Policy","level":2,"id":"quick-start-apply-a-custom-policy"},{"text":"Iterate on a Running Sandbox","level":2,"id":"iterate-on-a-running-sandbox"},{"text":"Debug Denied Requests","level":2,"id":"debug-denied-requests"},{"text":"Examples","level":2,"id":"examples"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Customize Sandbox Policies Quick Start: Apply a Custom Policy Iterate on a Running Sandbox Debug Denied Requests Examples Next Steps","keywords":["add","allow","alternatively","apply","calling","check","claude","codes","com","create","custom","customize","debug","denied","destination","each","edit","endpoints","enforcement","examples","exit","explore","github","granular","graphql","hash","host","iterate","iterative","method","monitor","name","next","org","pass","path","policies","policy","port","protocol","pull","push","pypi","quick","reference","replace","requests","rules","running","sandbox"],"code_blocks":[{"content":"$ openshell sandbox create --policy ./my-policy.yaml --keep -- claude","language":"text"},{"content":"$ export OPENSHELL_SANDBOX_POLICY=./my-policy.yaml\n$ openshell sandbox create --keep -- claude","language":"text"},{"content":"$ openshell logs --tail --source sandbox","language":"text"},{"content":"$ openshell policy get --full > current-policy.yaml","language":"text"},{"content":"$ openshell policy set --policy current-policy.yaml --wait","language":"text"},{"content":"$ openshell policy list ","language":"text"},{"content":"pypi:\n name: pypi\n endpoints:\n - host: pypi.org\n port: 443\n - host: files.pythonhosted.org\n port: 443\n binaries:\n - { path: /usr/bin/pip }\n - { path: /usr/local/bin/uv }","language":"text"},{"content":"github_repos:\n name: github_repos\n endpoints:\n - host: api.github.com\n port: 443\n protocol: rest\n tls: terminate\n enforcement: enforce\n rules:\n - allow:\n method: GET\n path: \"/**\"\n - allow:\n method: HEAD\n path: \"/**\"\n - allow:\n method: OPTIONS\n path: \"/**\"\n - allow:\n method: POST\n path: \"/graphql\"\n - allow:\n method: \"*\"\n path: \"/repos//alpha-repo/**\"\n - allow:\n method: POST\n path: \"/repos//bravo-repo/issues\"\n - allow:\n method: PATCH\n path: \"/repos//bravo-repo/issues/*\"\n binaries:\n - { path: /usr/local/bin/claude }\n - { path: /usr/bin/gh }","language":"text"}],"links":[{"text":"Quick Start: Apply a Custom Policy","type":"anchor","url":"#quick-start-apply-a-custom-policy"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Policies"]},{"id":"sandboxes/providers","title":"Providers","url":"sandboxes/providers.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create and manage credential providers that inject API keys and tokens into OpenShell sandboxes.","tags":["Providers","Credentials","API Keys","Sandbox","Security"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Providers AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers . Create and manage providers that supply credentials to sandboxes. Create a Provider Providers can be created from local environment variables or with explicit credential values. From Local Credentials The fastest way to create a provider is to let the CLI discover credentials from\nyour shell environment: $ openshell provider create --name my-claude --type claude --from-existing\nThis reads ANTHROPIC_API_KEY or CLAUDE_API_KEY from your current environment\nand stores them in the provider. With Explicit Credentials Supply a credential value directly: $ openshell provider create --name my-api --type generic --credential API_KEY=sk-abc123\nBare Key Form Pass a key name without a value to read the value from the environment variable\nof that name: $ openshell provider create --name my-api --type generic --credential API_KEY\nThis looks up the current value of $API_KEY in your shell and stores it. Manage Providers List, inspect, update, and delete providers from the active cluster. List all providers: $ openshell provider list\nInspect a provider: $ openshell provider get my-claude\nUpdate a provider’s credentials: $ openshell provider update my-claude --type claude --from-existing\nDelete a provider: $ openshell provider delete my-claude\nAttach Providers to Sandboxes Pass one or more --provider flags when creating a sandbox: $ openshell sandbox create --provider my-claude --provider my-github -- claude\nEach --provider flag attaches one provider. The sandbox receives all\ncredentials from every attached provider at runtime. Providers cannot be added to a running sandbox. If you need to attach an\nadditional provider, delete the sandbox and recreate it with all required\nproviders specified. Auto-Discovery Shortcut When the trailing command in openshell sandbox create is a recognized tool name ( claude , codex , or opencode ), the CLI auto-creates the required\nprovider from your local credentials if one does not already exist. You do not\nneed to create the provider separately: $ openshell sandbox create -- claude\nThis detects claude as a known tool, finds your ANTHROPIC_API_KEY , creates\na provider, attaches it to the sandbox, and launches Claude Code. Supported Provider Types The following provider types are supported. Type Environment Variables Injected Typical Use claude ANTHROPIC_API_KEY , CLAUDE_API_KEY Claude Code, Anthropic API codex OPENAI_API_KEY OpenAI Codex opencode OPENCODE_API_KEY , OPENROUTER_API_KEY , OPENAI_API_KEY opencode tool github GITHUB_TOKEN , GH_TOKEN GitHub API, gh CLI — refer to /tutorials/github-sandbox gitlab GITLAB_TOKEN , GLAB_TOKEN , CI_JOB_TOKEN GitLab API, glab CLI nvidia NVIDIA_API_KEY NVIDIA API Catalog generic User-defined Any service with custom credentials outlook (none: no auto-discovery) Microsoft Outlook integration Use the generic type for any service not listed above. You define the\nenvironment variable names and values yourself with --credential . Next Steps Explore related topics: To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog. To view the complete field reference for the policy YAML, refer to the Policy Schema Reference","format":"text","content_length":3421,"word_count":502,"summary":"AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers.","headings":[{"text":"Providers","level":1,"id":"providers"},{"text":"Create a Provider","level":2,"id":"create-a-provider"},{"text":"From Local Credentials","level":3,"id":"from-local-credentials"},{"text":"With Explicit Credentials","level":3,"id":"with-explicit-credentials"},{"text":"Bare Key Form","level":3,"id":"bare-key-form"},{"text":"Manage Providers","level":2,"id":"manage-providers"},{"text":"Attach Providers to Sandboxes","level":2,"id":"attach-providers-to-sandboxes"},{"text":"Auto-Discovery Shortcut","level":3,"id":"auto-discovery-shortcut"},{"text":"Supported Provider Types","level":2,"id":"supported-provider-types"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Providers Create a Provider From Local Credentials With Explicit Credentials Bare Key Form Manage Providers Attach Providers to Sandboxes Auto-Discovery Shortcut Supported Provider Types Next Steps","keywords":["anthropic","any","attach","auto","bare","catalog","claude","code","codex","create","credentials","delete","directly","discovery","each","environment","explicit","explore","form","from","github","gitlab","injected","inspect","key","list","local","manage","microsoft","name","next","none","openai","openshell","outlook","pass","policy","provider","providers","reference","sandbox","sandboxes","schema","separately","services","shortcut","steps","supply","supported","this"],"code_blocks":[{"content":"$ openshell provider create --name my-claude --type claude --from-existing","language":"text"},{"content":"$ openshell provider create --name my-api --type generic --credential API_KEY=sk-abc123","language":"text"},{"content":"$ openshell provider create --name my-api --type generic --credential API_KEY","language":"text"},{"content":"$ openshell provider list","language":"text"},{"content":"$ openshell provider get my-claude","language":"text"},{"content":"$ openshell provider update my-claude --type claude --from-existing","language":"text"},{"content":"$ openshell provider delete my-claude","language":"text"},{"content":"$ openshell sandbox create --provider my-claude --provider my-github -- claude","language":"text"},{"content":"$ openshell sandbox create -- claude","language":"text"}],"links":[],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Providers"]},{"id":"tutorials/github-sandbox","title":"Set Up a Sandbox of Claude Code with a Custom GitHub Policy","url":"tutorials/github-sandbox.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Learn the iterative policy workflow by launching a sandbox, diagnosing a GitHub access denial, and applying a custom policy to fix it.","tags":["Tutorial","GitHub","Sandbox","Policy","Claude Code"],"topics":["Generative AI","Cybersecurity"],"content_type":"tutorial","learning_level":"technical_intermediate","audience":["engineer"],"content":"Set Up a Sandbox of Claude Code with a Custom GitHub Policy This tutorial walks through an iterative sandbox policy workflow. You launch a sandbox, ask Claude Code to push code to GitHub, and observe the default network policy denying the request\nYou then diagnose the denial from your machine and from inside the sandbox, apply a custom policy, and verify that the policy update takes effect. After completing this tutorial, you will have: A running sandbox with Claude Code that can push to a GitHub repository. A custom network policy that grants GitHub access for a specific repository. Experience with the policy iteration workflow: fail, diagnose, update, verify. This tutorial shows example prompts and responses from Claude Code. The exact wording you see might vary between sessions. Use the examples as a guide for the type of interaction, not as expected output. Prerequisites This tutorial requires the following: Completed the Quickstart tutorial. A GitHub personal access token (PAT) with repo scope. To create one, go to the GitHub personal access token settings page , select Generate new token (classic) , check the repo scope, and copy the token. Instead of pasting the token into Claude during the tutorial, use a credential provider to inject it into the sandbox automatically at startup: $ openshell provider create --name my-github --type github --from-existing\nopenshell sandbox create --provider my-github --keep -- claude\nThe provider reads GITHUB_TOKEN from your host environment and sets it as an environment variable inside the sandbox so Claude can use it directly. Your own Anthropic account for Claude Code. OpenShell provides the sandbox, not the agent. You need your own account to log in to Claude Code. A public GitHub repository you own (used as the push target). A scratch or test repository works well. The tutorial pushes a small file to it. You can create a new repository with a README if you do not have one handy. This tutorial uses two terminals to demonstrate the iterative policy workflow: Terminal 1 : The sandbox terminal. You create the sandbox here with openshell sandbox create and interact with Claude Code inside it. Terminal 2 : A terminal outside the sandbox on your machine. You use this for viewing the sandbox logs with openshell term and applying an updated policy with openshell policy set . Each section below indicates which terminal to use. Launch the Sandbox In terminal 1, create a sandbox and start Claude Code. No custom policy is needed. The default policy is applied automatically: $ openshell sandbox create --keep -- claude\nThe --keep flag keeps the sandbox running after Claude Code exits, so you can apply policy updates later without recreating the environment. Claude Code starts inside the sandbox. It prints an authentication link. Open it in your browser, sign in to your Anthropic account, and return to the terminal. When prompted, trust the /sandbox workspace to allow Claude Code to read and write files. Push Code to GitHub In terminal 1, ask Claude Code to write a simple script and push it to your repository: Write a hello_world.py script and push it to https://github.com////contents/hello_world.py\nl7_decision: deny\ndst_host: api.github.com\ndst_port: 443\nl7_protocol: rest\npolicy: github_rest_api\nl7_deny_reason: PUT /repos///contents/hello_world.py not permitted by policy\nThe log shows that the sandbox proxy intercepted an outbound PUT request to api.github.com and denied it. The github_rest_api policy allows read operations (GET) but blocks write operations (PUT, POST, DELETE) to the GitHub API. A similar denial appears for github.com if Claude attempted a git push over HTTPS. Ask Claude to Check the Sandbox Logs In terminal 1, ask Claude Code to check the sandbox logs for denied requests: Check the sandbox logs for any denied network requests. What is blocking the push\nClaude reads the deny entries and identifies the root cause. It explains that the failure is a sandbox network policy restriction, not a token permissions issue: The sandbox runs a proxy that enforces policies on outbound traffic. The\ngithub_rest_api policy allows GET requests (used to read the file) but blocks\nPUT/write requests to GitHub. This is a sandbox-level restriction, not a token\nissue. No matter what token you provide, pushes through the API will be blocked\nuntil the policy is updated. Both perspectives confirm the same thing: the proxy is doing its job. The default policy is designed to be restrictive. To allow GitHub pushes, you need to update the network policy. Update the Policy from Your Machine In terminal 2, create a policy file that extends the default policy with GitHub write access for your repository. You can ask a coding agent running on your machine, such as Claude Code or Cursor, to generate it from the deny reasons\nThe updated policy should have github_git and github_api blocks that grant write access to your repository. The following is a complete policy example that you can use as a starting point. Expand the dropdown to see the policy. Save it to a file, such as /tmp/sandbox-policy-update.yaml . Full reference policy The following YAML shows a complete policy that extends the default policy with GitHub access for a single repository. Replace with your GitHub organization or username and with your repository name. The filesystem_policy , landlock , and process sections are static. They are read once at sandbox creation and cannot be changed by a hot-reload. They are included here for completeness so the file is self-contained, but only the network_policies section takes effect when you apply this to a running sandbox. version: 1\n── Static (locked at sandbox creation)\nfilesystem_policy\ninclude_workdir: true\nread_only\n/usr\n/lib\n/proc\n/dev/urandom\n/app\n/etc\n/var/log\nread_write\n/sandbox\n/tmp\n/dev/null\nlandlock\ncompatibility: best_effort\nprocess\nrun_as_user: sandbox\nrun_as_group: sandbox\n── Dynamic (hot-reloadable)\nnetwork_policies\nClaude Code ↔ Anthropic API\nclaude_code\nname: claude-code\nendpoints\n{ host: api.anthropic.com, port: 443, protocol: rest, enforcement: enforce, access: full, tls: terminate\n{ host: statsig.anthropic.com, port: 443\n{ host: sentry.io, port: 443\n{ host: raw.githubusercontent.com, port: 443\n{ host: platform.claude.com, port: 443\nbinaries\n{ path: /usr/local/bin/claude\n{ path: /usr/bin/node\nNVIDIA inference endpoint\nnvidia_inference\nname: nvidia-inference\nendpoints\n{ host: integrate.api.nvidia.com, port: 443\nbinaries\n{ path: /usr/bin/curl\n{ path: /bin/bash\n{ path: /usr/local/bin/opencode\n── GitHub: git operations (clone, fetch, push)\ngithub_git\nname: github-git\nendpoints\nhost: github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nallow\nmethod: GET\npath: \"//.git/info/refs\nallow\nmethod: POST\npath: \"//.git/git-upload-pack\nallow\nmethod: POST\npath: \"//.git/git-receive-pack\nbinaries\n{ path: /usr/bin/git\n── GitHub: REST API\ngithub_api\nname: github-api\nendpoints\nhost: api.github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nGraphQL API (used by gh CLI\nallow\nmethod: POST\npath: \"/graphql\nFull read-write access to the repository\nallow\nmethod:\npath: \"/repos// --policy /tmp/sandbox-policy-update.yaml --wait\nTo find the name of your sandbox, check the output from openshell sandbox create or run openshell sandbox list . Network policies are hot-reloadable. The --wait flag blocks until the policy engine confirms the new revision loaded, and the update takes effect immediately without restarting the sandbox or reconnecting Claude Code. Retry the Push In terminal 1, ask Claude Code to retry the push: The sandbox policy has been updated. Try pushing to the repository again\nThe push completes successfully. The openshell term dashboard now shows l7_decision=allow entries for api.github.com and github.com where it previously showed denials. Clean Up When you are finished, delete the sandbox to free cluster resources: $ openshell sandbox delete /.","language":"text"},{"content":"$ openshell term","language":"text"},{"content":"l7_action: PUT\nl7_target: /repos///contents/hello_world.py\nl7_decision: deny\ndst_host: api.github.com\ndst_port: 443\nl7_protocol: rest\npolicy: github_rest_api\nl7_deny_reason: PUT /repos///contents/hello_world.py not permitted by policy","language":"text"},{"content":"Check the sandbox logs for any denied network requests. What is blocking the push?","language":"text"},{"content":"version: 1\n\n# ── Static (locked at sandbox creation) ──────────────────────────\n\nfilesystem_policy:\n include_workdir: true\n read_only:\n - /usr\n - /lib\n - /proc\n - /dev/urandom\n - /app\n - /etc\n - /var/log\n read_write:\n - /sandbox\n - /tmp\n - /dev/null\n\nlandlock:\n compatibility: best_effort\n\nprocess:\n run_as_user: sandbox\n run_as_group: sandbox\n\n# ── Dynamic (hot-reloadable) ─────────────────────────────────────\n\nnetwork_policies:\n\n # Claude Code ↔ Anthropic API\n claude_code:\n name: claude-code\n endpoints:\n - { host: api.anthropic.com, port: 443, protocol: rest, enforcement: enforce, access: full, tls: terminate }\n - { host: statsig.anthropic.com, port: 443 }\n - { host: sentry.io, port: 443 }\n - { host: raw.githubusercontent.com, port: 443 }\n - { host: platform.claude.com, port: 443 }\n binaries:\n - { path: /usr/local/bin/claude }\n - { path: /usr/bin/node }\n\n # NVIDIA inference endpoint\n nvidia_inference:\n name: nvidia-inference\n endpoints:\n - { host: integrate.api.nvidia.com, port: 443 }\n binaries:\n - { path: /usr/bin/curl }\n - { path: /bin/bash }\n - { path: /usr/local/bin/opencode }\n\n # ── GitHub: git operations (clone, fetch, push) ──────────────\n\n github_git:\n name: github-git\n endpoints:\n - host: github.com\n port: 443\n protocol: rest\n tls: terminate\n enforcement: enforce\n rules:\n - allow:\n method: GET\n path: \"//.git/info/refs*\"\n - allow:\n method: POST\n path: \"//.git/git-upload-pack\"\n - allow:\n method: POST\n path: \"//.git/git-receive-pack\"\n binaries:\n - { path: /usr/bin/git }\n\n # ── GitHub: REST API ─────────────────────────────────────────\n\n github_api:\n name: github-api\n endpoints:\n - host: api.github.com\n port: 443\n protocol: rest\n tls: terminate\n enforcement: enforce\n rules:\n # GraphQL API (used by gh CLI)\n - allow:\n method: POST\n path: \"/graphql\"\n # Full read-write access to the repository\n - allow:\n method: \"*\"\n path: \"/repos///**\"\n binaries:\n - { path: /usr/local/bin/claude }\n - { path: /usr/local/bin/opencode }\n - { path: /usr/bin/gh }\n - { path: /usr/bin/curl }\n\n # ── Package managers ─────────────────────────────────────────\n\n pypi:\n name: pypi\n endpoints:\n - { host: pypi.org, port: 443 }\n - { host: files.pythonhosted.org, port: 443 }\n - { host: github.com, port: 443 }\n - { host: objects.githubusercontent.com, port: 443 }\n - { host: api.github.com, port: 443 }\n - { host: downloads.python.org, port: 443 }\n binaries:\n - { path: /sandbox/.venv/bin/python }\n - { path: /sandbox/.venv/bin/python3 }\n - { path: /sandbox/.venv/bin/pip }\n - { path: /app/.venv/bin/python }\n - { path: /app/.venv/bin/python3 }\n - { path: /app/.venv/bin/pip }\n - { path: /usr/local/bin/uv }\n - { path: \"/sandbox/.uv/python/**\" }\n\n # ── VS Code Remote ──────────────────────────────────────────\n\n vscode:\n name: vscode\n endpoints:\n - { host: update.code.visualstudio.com, port: 443 }\n - { host: \"*.vo.msecnd.net\", port: 443 }\n - { host: vscode.download.prss.microsoft.com, port: 443 }\n - { host: marketplace.visualstudio.com, port: 443 }\n - { host: \"*.gallerycdn.vsassets.io\", port: 443 }\n binaries:\n - { path: /usr/bin/curl }\n - { path: /usr/bin/wget }\n - { path: \"/sandbox/.vscode-server/**\" }\n - { path: \"/sandbox/.vscode-remote-containers/**\" }","language":"text"},{"content":"$ openshell policy set --policy /tmp/sandbox-policy-update.yaml --wait","language":"text"},{"content":"The sandbox policy has been updated. Try pushing to the repository again.","language":"text"},{"content":"$ openshell sandbox delete ","language":"text"}],"links":[{"text":"GitHub personal access token settings page","type":"external","url":"https://github.com/settings/tokens"},{"text":"Anthropic account","type":"external","url":"https://console.anthropic.com/"},{"text":"create a new repository","type":"external","url":"https://github.com/new"}],"images":[],"doc_type":"tutorial","section_path":["Tutorials","Github Sandbox"]}] \ No newline at end of file +[{"id":"about/architecture","title":"How OpenShell Works","url":"about/architecture.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"OpenShell architecture overview covering the gateway, sandbox, policy engine, and privacy router.","tags":["AI Agents","Sandboxing","Security","Architecture"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"How OpenShell Works OpenShell runs as a K3s Kubernetes cluster inside a Docker container. Each sandbox is an isolated Kubernetes pod managed through the gateway. Four components work together to keep agents secure. Components The following table describes each component and its role in the system: Component Role Gateway Control-plane API that coordinates sandbox lifecycle and state, acts as the auth boundary, and brokers requests across the platform. Sandbox Isolated runtime that includes container supervision and policy-enforced egress routing. Policy Engine Policy definition and enforcement layer for filesystem, network, and process constraints. Defense in depth enforces policies from the application layer down to infrastructure and kernel layers. Privacy Router Privacy-aware LLM routing layer that keeps sensitive context on sandbox compute and routes based on cost and privacy policy. How a Request Flows Every outbound connection from agent code passes through the same decision path: The agent process opens an outbound connection (API call, package install, git clone, and so on). The proxy inside the sandbox intercepts the connection and identifies which binary opened it. The proxy queries the policy engine with the destination, port, and calling binary. The policy engine returns one of three decisions: Allow — the destination and binary match a policy block. Traffic flows directly to the external service. Route for inference — no policy block matched, but inference routing is configured. The privacy router intercepts the request, strips the original credentials, injects the configured backend credentials, and forwards to the managed model endpoint. Deny — no match and no inference route. The connection is blocked and logged. For REST endpoints with TLS termination enabled, the proxy also decrypts TLS and checks each HTTP request against per-method, per-path rules before allowing it through. Deployment Modes OpenShell can run locally or on a remote host. The architecture is identical in both cases — only the Docker container location changes. Local : the k3s cluster runs inside Docker on your workstation. The CLI provisions it automatically on first use. Remote : the cluster runs on a remote host. Deploy with openshell gateway start --remote user@host . For example, connect to your DGX Spark. $ openshell gateway start --remote @.local\nopenshell status\nNext Steps Continue with one of the following: To create your first sandbox, refer to the Quickstart . To learn how OpenShell enforces isolation across all protection layers, refer to Sandboxes","format":"text","content_length":2611,"word_count":393,"summary":"OpenShell runs as a K3s Kubernetes cluster inside a Docker container. Each sandbox is an isolated Kubernetes pod managed through the gateway. Four components work together to keep agents secure.","headings":[{"text":"How OpenShell Works","level":1,"id":"how-openshell-works"},{"text":"Components","level":2,"id":"components"},{"text":"How a Request Flows","level":2,"id":"how-a-request-flows"},{"text":"Deployment Modes","level":2,"id":"deployment-modes"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"How OpenShell Works Components How a Request Flows Deployment Modes Next Steps","keywords":["allow","component","components","continue","control","decisions","defense","deny","deploy","deployment","docker","each","engine","every","flows","following","four","gateway","isolated","k3s","kubernetes","local","modes","next","openshell","path","policy","privacy","quickstart","remote","request","role","route","router","sandbox","sandboxes","spark","steps","system","traffic","works"],"code_blocks":[{"content":"$ openshell gateway start --remote @.local\n$ openshell status","language":"text"}],"links":[{"text":"K3s","type":"external","url":"https://k3s.io/"},{"text":"OpenShell architecture diagram showing the component layout","type":"internal","url":"about/../_images/architecture.svg"}],"images":[{"src":"about/architecture.svg","alt":"OpenShell architecture diagram showing the component layout"},{"src":"about/architecture.svg","alt":"OpenShell architecture diagram showing the component layout"}],"doc_type":"documentation","section_path":["About","Architecture"]},{"id":"about/overview","title":"Overview of NVIDIA OpenShell","url":"about/overview.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"OpenShell is the safe, private runtime for autonomous AI agents. Run agents in sandboxed environments that protect your data, credentials, and infrastructure.","tags":["AI Agents","Sandboxing","Security","Privacy","Inference Routing"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Overview of NVIDIA OpenShell NVIDIA OpenShell is an open-source runtime for executing autonomous AI agents in sandboxed environments with kernel-level isolation. It combines sandbox runtime controls and a declarative YAML policy so teams can run agents without giving them unrestricted access to local files, credentials, and external networks. Why OpenShell Exists AI agents are most useful when they can read files, install packages, call APIs, and use credentials. That same access can create material risk. OpenShell is designed for this tradeoff: preserve agent capability while enforcing explicit controls over what the agent can access. Common Risks and Controls The table below summarizes common failure modes and how OpenShell mitigates them. Threat Without controls With OpenShell Data exfiltration Agent uploads source code or internal files to unauthorized endpoints. Network policies allow only approved destinations; other outbound traffic is denied. Credential theft Agent reads local secrets such as SSH keys or cloud credentials. Filesystem restrictions (Landlock) confine access to declared paths only. Unauthorized API usage Agent sends prompts or data to unapproved model providers. Privacy routing and network policies control where inference traffic can go. Privilege escalation Agent attempts sudo , setuid paths, or dangerous syscall behavior. Unprivileged process identity and seccomp restrictions block escalation paths. Protection Layers at a Glance OpenShell applies defense in depth across the following policy domains. Layer What it protects When it applies Filesystem Prevents reads/writes outside allowed paths. Locked at sandbox creation. Network Blocks unauthorized outbound connections. Hot-reloadable at runtime. Process Blocks privilege escalation and dangerous syscalls. Locked at sandbox creation. Inference Reroutes model API calls to controlled backends. Hot-reloadable at runtime. For details, refer to Built-in Default Policy and Customize Sandbox Policies . Common Use Cases OpenShell supports a range of agent deployment patterns. Use Case Description Secure coding agents Run Claude Code, OpenCode, or OpenClaw with constrained file and network access. Private enterprise development Route inference to self-hosted or private backends while keeping sensitive context under your control. Compliance and audit Treat policy YAML as version-controlled security controls that can be reviewed and audited. Reusable environments Use community sandbox images or bring your own containerized runtime. Next Steps Explore these topics to go deeper: To understand the components that make up the OpenShell runtime, refer to the Architecture Overview . To install the CLI and create your first sandbox, refer to the Quickstart . To learn how OpenShell enforces isolation across all protection layers, refer to Sandboxes","format":"text","content_length":2852,"word_count":403,"summary":"NVIDIA OpenShell is an open-source runtime for executing autonomous AI agents in sandboxed environments with kernel-level isolation. It combines sandbox runtime controls and a declarative YAML policy so teams can run agents without giving them unrestricted access to local files, credentials, and ...","headings":[{"text":"Overview of NVIDIA OpenShell","level":1,"id":"overview-of-nvidia-openshell"},{"text":"Why OpenShell Exists","level":2,"id":"why-openshell-exists"},{"text":"Common Risks and Controls","level":2,"id":"common-risks-and-controls"},{"text":"Protection Layers at a Glance","level":2,"id":"protection-layers-at-a-glance"},{"text":"Common Use Cases","level":2,"id":"common-use-cases"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Overview of NVIDIA OpenShell Why OpenShell Exists Common Risks and Controls Protection Layers at a Glance Common Use Cases Next Steps","keywords":["agent","apis","architecture","blocks","built","case","cases","claude","code","common","compliance","controls","credential","customize","data","deeper","default","description","exists","explore","filesystem","glance","hot","inference","landlock","layer","layers","locked","network","next","nvidia","openclaw","opencode","openshell","overview","policies","policy","prevents","privacy","private","privilege","process","protection","quickstart","reroutes","reusable","risks","route","run","sandbox"],"code_blocks":[],"links":[],"images":[],"doc_type":"documentation","section_path":["About","Overview"]},{"id":"about/release-notes","title":"NVIDIA OpenShell Release Notes","url":"about/release-notes.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Track the latest changes and improvements to NVIDIA OpenShell.","tags":["Release Notes","Changelog","AI Agents"],"topics":["Generative AI","Cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"NVIDIA OpenShell Release Notes Track the latest changes and improvements to NVIDIA OpenShell\nThis page covers the highlights of the release\nFor more details, refer to the OpenShell GitHub Releases . 0.1.0 This is the first release of NVIDIA OpenShell. It introduces sandboxed AI agent execution with kernel-level isolation, policy enforcement, and credential management. Highlights Introduces sandboxed AI agent execution with kernel-level isolation, policy enforcement, and credential management. Introduces the openshell CLI for creating, managing, and customizing sandboxes. Introduces the openshell-gateway service for managing the gateway and sandboxes. Introduces the openshell-sandbox service for running the sandboxed agent","format":"text","content_length":731,"word_count":97,"summary":"Track the latest changes and improvements to NVIDIA OpenShell. This page covers the highlights of the release. For more details, refer to the OpenShell GitHub Releases.","headings":[{"text":"NVIDIA OpenShell Release Notes","level":1,"id":"nvidia-openshell-release-notes"},{"text":"0.1.0","level":2,"id":"010"},{"text":"Highlights","level":3,"id":"highlights"}],"headings_text":"NVIDIA OpenShell Release Notes 0.1.0 Highlights","keywords":["github","highlights","introduces","notes","nvidia","openshell","release","releases","this","track"],"code_blocks":[],"links":[{"text":"OpenShell GitHub Releases","type":"external","url":"https://github.com/NVIDIA/OpenShell/releases"}],"images":[],"doc_type":"documentation","section_path":["About","Release Notes"]},{"id":"get-started/quickstart","title":"Quickstart","url":"get-started/quickstart.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Install the OpenShell CLI and create your first sandboxed AI agent in two commands.","tags":["AI Agents","Sandboxing","Installation","Quickstart"],"topics":["Generative AI","Cybersecurity"],"content_type":"get_started","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Quickstart This page gets you from zero to a running, policy-enforced sandbox in two commands. Prerequisites Before you begin, make sure you have: Python 3.12 or later uv installed Docker Desktop running on your machine Install the OpenShell CLI Install the openshell package into a virtual environment. Activate your virtual environment: uv venv && source .venv/bin/activate\nInstall the CLI: uv pip install openshell\nConnect to a Remote Gateway (Optional) If you’re running locally, skip this step. The OpenShell CLI creates a gateway automatically when you create your first sandbox. Brev Deploy an OpenShell gateway on Brev by hitting Deploy on the OpenShell Launchable . After the instance is running, find the gateway URL in the Brev console under Using Secure Links . Copy the shareable URL for port 8080 — this is the gateway endpoint. $ openshell gateway add https://.brevlab.com\nopenshell status\nDGX Spark Set up your Spark with NVIDIA Sync first, or make sure SSH access is configured (such as SSH keys added to the host). Deploy to a DGX Spark machine over SSH: $ openshell gateway start --remote @.local\nopenshell status\nAfter openshell status shows the gateway as healthy, all subsequent commands route through the SSH tunnel. Create Your First OpenShell Sandbox Choose the tab that matches your agent: Claude Code Run the following command to create a sandbox with Claude Code: $ openshell sandbox create -- claude\nThe CLI prompts you to create a provider from local credentials — type yes to continue. If ANTHROPIC_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. OpenCode Run the following command to create a sandbox with OpenCode: $ openshell sandbox create -- opencode\nThe CLI prompts you to create a provider from local credentials. Type yes to continue. If OPENAI_API_KEY or OPENROUTER_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. Codex Run the following command to create a sandbox with Codex: $ openshell sandbox create -- codex\nThe CLI prompts you to create a provider from local credentials. Type yes to continue. If OPENAI_API_KEY is set in your environment, it is picked up automatically. If not, you can configure it from inside the sandbox after it launches. OpenClaw Run the following command to create a sandbox with OpenClaw: $ openshell sandbox create --from openclaw\nThe --from flag pulls a pre-built sandbox definition from the OpenShell Community catalog. Each definition bundles a container image, a tailored policy, and optional skills into a single package. Community Sandbox You can use the --from flag to pull other OpenShell sandbox images from the NVIDIA Container Registry . For example, to pull the base image, run the following command: $ openshell sandbox create --from base","format":"text","content_length":2947,"word_count":470,"summary":"This page gets you from zero to a running, policy-enforced sandbox in two commands.","headings":[{"text":"Quickstart","level":1,"id":"quickstart"},{"text":"Prerequisites","level":2,"id":"prerequisites"},{"text":"Install the OpenShell CLI","level":2,"id":"install-the-openshell-cli"},{"text":"Connect to a Remote Gateway (Optional)","level":2,"id":"connect-to-a-remote-gateway-optional"},{"text":"Create Your First OpenShell Sandbox","level":2,"id":"create-your-first-openshell-sandbox"}],"headings_text":"Quickstart Prerequisites Install the OpenShell CLI Connect to a Remote Gateway (Optional) Create Your First OpenShell Sandbox","keywords":["activate","after","agent","before","brev","choose","claude","cli","code","codex","com","command","community","connect","container","copy","create","deploy","desktop","docker","each","environment","first","gateway","have","https","install","launchable","links","openclaw","opencode","openshell","optional","prerequisites","python","quickstart","registry","remote","run","sandbox","secure","set","spark","sync","this","type","using","venv","your"],"code_blocks":[{"content":"uv venv && source .venv/bin/activate","language":"text"},{"content":"uv pip install openshell","language":"text"},{"content":"$ openshell gateway add https://.brevlab.com\n$ openshell status","language":"text"},{"content":"$ openshell gateway start --remote @.local\n$ openshell status","language":"text"},{"content":"$ openshell sandbox create -- claude","language":"text"},{"content":"$ openshell sandbox create -- opencode","language":"text"},{"content":"$ openshell sandbox create -- codex","language":"text"},{"content":"$ openshell sandbox create --from openclaw","language":"text"},{"content":"$ openshell sandbox create --from base","language":"text"}],"links":[{"text":"Uv","type":"external","url":"https://docs.astral.sh/uv/","original_text":"uv"},{"text":"OpenShell Launchable","type":"external","url":"https://brev.nvidia.com/launchable/deploy/now?launchableID=env-3AaK9NmCzWp3pVyUDNNFBt805FT"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"NVIDIA Container Registry","type":"external","url":"https://registry.nvidia.com/"}],"images":[],"doc_type":"tutorial","section_path":["Get Started","Quickstart"]},{"id":"inference/configure","title":"Configure Inference Routing","url":"inference/configure.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Set up the managed local inference endpoint with provider credentials and model configuration.","tags":["Inference Routing","Configuration","Privacy","LLM","Provider"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Configure Inference Routing This page covers the managed local inference endpoint ( https://inference.local ). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details. The configuration consists of two values: Value Description Provider record The credential backend OpenShell uses to authenticate with the upstream model host. Model ID The model to use for generation requests. Step 1: Create a Provider Create a provider that holds the backend credentials you want OpenShell to use. NVIDIA API Catalog $ openshell provider create --name nvidia-prod --type nvidia --from-existing\nThis reads NVIDIA_API_KEY from your environment. Local / self-hosted endpoint $ openshell provider create\nname my-local-model\ntype openai\ncredential OPENAI_API_KEY=empty-if-not-required\nconfig OPENAI_BASE_URL=http://192.168.10.15/v1\nUse --config OPENAI_BASE_URL to point to any OpenAI-compatible server running on your network. Set OPENAI_API_KEY to a dummy value if the server does not require authentication. Anthropic $ openshell provider create --name anthropic-prod --type anthropic --from-existing\nThis reads ANTHROPIC_API_KEY from your environment. Step 2: Set Inference Routing Point inference.local at that provider and choose the model to use: $ openshell inference set\nprovider nvidia-prod\nmodel nvidia/nemotron-3-nano-30b-a3b\nStep 3: Verify the Active Config Confirm that the provider and model are set correctly: $ openshell inference get\nprovider: nvidia-prod\nmodel: nvidia/nemotron-3-nano-30b-a3b\nversion: 1\nStep 4: Update Part of the Config Use update when you want to change only one field: $ openshell inference update --model nvidia/nemotron-3-nano-30b-a3b\nOr switch providers without repeating the current model: $ openshell inference update --provider openai-prod\nUse It from a Sandbox After inference is configured, code inside any sandbox can call https://inference.local directly: from openai import OpenAI\nclient = OpenAI(base_url=\"https://inference.local/v1\", api_key=\"dummy\nresponse = client.chat.completions.create\nmodel=\"anything\nmessages=[{\"role\": \"user\", \"content\": \"Hello\nThe client-supplied model is ignored for generation requests. OpenShell rewrites it to the configured model before forwarding upstream. Use this endpoint when inference should stay local to the host for privacy and security reasons. External providers that should be reached directly belong in network_policies instead. Verify the Endpoint from a Sandbox openshell inference get confirms the configuration was saved, but does not verify the upstream endpoint is reachable. To confirm end-to-end connectivity, connect to a sandbox and run: curl https://inference.local/v1/responses\nH \"Content-Type: application/json\"\nd\ninstructions\": \"You are a helpful assistant\ninput\": \"Hello\nA successful response confirms the privacy router can reach the configured backend and the model is serving requests. Gateway-scoped — every sandbox on the active gateway sees the same inference.local backend. HTTPS only — inference.local is intercepted only for HTTPS traffic. Next Steps Explore related topics: To understand the inference routing flow and supported API patterns, refer to index . To control external endpoints, refer to Network Access Rules . To manage provider records, refer to ../sandboxes/providers . To view openshell inference commands, refer to ../reference/cli","format":"text","content_length":3402,"word_count":451,"summary":"This page covers the managed local inference endpoint (https://inference.local). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details.","headings":[{"text":"Configure Inference Routing","level":1,"id":"configure-inference-routing"},{"text":"Step 1: Create a Provider","level":2,"id":"step-1-create-a-provider"},{"text":"Step 2: Set Inference Routing","level":2,"id":"step-2-set-inference-routing"},{"text":"Step 3: Verify the Active Config","level":2,"id":"step-3-verify-the-active-config"},{"text":"Step 4: Update Part of the Config","level":2,"id":"step-4-update-part-of-the-config"},{"text":"Use It from a Sandbox","level":2,"id":"use-it-from-a-sandbox"},{"text":"Verify the Endpoint from a Sandbox","level":3,"id":"verify-the-endpoint-from-a-sandbox"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Configure Inference Routing Step 1: Create a Provider Step 2: Set Inference Routing Step 3: Verify the Active Config Step 4: Update Part of the Config Use It from a Sandbox Verify the Endpoint from a Sandbox Next Steps","keywords":["access","active","after","anthropic","api_key","base_url","catalog","chat","client","config","configure","confirm","content","correctly","create","description","directly","endpoint","explore","external","field","from","gateway","hello","http","https","inference","local","messages","model","network","next","openai","openshell","part","point","provider","response","routing","rules","run","sandbox","set","step","steps","this","topics","type","update","user"],"code_blocks":[{"content":"$ openshell provider create --name nvidia-prod --type nvidia --from-existing","language":"text"},{"content":"$ openshell provider create \\\n --name my-local-model \\\n --type openai \\\n --credential OPENAI_API_KEY=empty-if-not-required \\\n --config OPENAI_BASE_URL=http://192.168.10.15/v1","language":"text"},{"content":"$ openshell provider create --name anthropic-prod --type anthropic --from-existing","language":"text"},{"content":"$ openshell inference set \\\n --provider nvidia-prod \\\n --model nvidia/nemotron-3-nano-30b-a3b","language":"text"},{"content":"$ openshell inference get\nprovider: nvidia-prod\nmodel: nvidia/nemotron-3-nano-30b-a3b\nversion: 1","language":"text"},{"content":"$ openshell inference update --model nvidia/nemotron-3-nano-30b-a3b","language":"text"},{"content":"$ openshell inference update --provider openai-prod","language":"text"},{"content":"from openai import OpenAI\n\nclient = OpenAI(base_url=\"https://inference.local/v1\", api_key=\"dummy\")\n\nresponse = client.chat.completions.create(\n model=\"anything\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\n)","language":"text"},{"content":"curl https://inference.local/v1/responses \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"instructions\": \"You are a helpful assistant.\",\n \"input\": \"Hello!\"\n }'","language":"text"}],"links":[],"images":[],"doc_type":"tutorial","section_path":["Inference","Configure"]},{"id":"inference/index","title":"About Inference Routing","url":"inference/index.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Understand how OpenShell routes inference traffic through external endpoints and the local privacy router.","tags":["Inference Routing","Privacy","AI Agents","LLM"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"About Inference Routing OpenShell handles inference in two ways: Path How It Works External endpoints Traffic to hosts like api.openai.com or api.anthropic.com is treated like any other outbound request — allowed or denied by network_policies . Refer to Network Access Rules . inference.local A special endpoint exposed inside every sandbox for inference that should stay local to the host for privacy and security. The privacy router strips the original credentials, injects the configured backend credentials, and forwards to the managed model endpoint. How inference.local Works When code inside a sandbox calls https://inference.local , the privacy router routes the request to the configured backend for that gateway. The configured model is applied to generation requests, and provider credentials are supplied by OpenShell rather than by code inside the sandbox. If code calls an external inference host directly, that traffic is evaluated only by network_policies . Property Detail Credentials No sandbox API keys needed — credentials come from the configured provider record. Configuration One provider and one model define sandbox inference. Provider support OpenAI, Anthropic, and NVIDIA providers all work through the same endpoint. Hot-refresh Provider credential changes and inference updates are picked up without recreating sandboxes. Supported API Patterns Supported request patterns depend on the provider configured for inference.local . OpenAI-compatible Pattern Method Path Chat Completions POST /v1/chat/completions Completions POST /v1/completions Responses POST /v1/responses Model Discovery GET /v1/models Model Discovery GET /v1/models/* Anthropic-compatible Pattern Method Path Messages POST /v1/messages Requests to inference.local that do not match the configured provider’s supported patterns are denied. Next Steps Continue with one of the following: To set up the backend behind inference.local , refer to configure . To control external endpoints, refer to Network Access Rules","format":"text","content_length":2010,"word_count":281,"summary":"Traffic to hosts like api.openai.com or api.anthropic.com is treated like any other outbound request — allowed or denied by network_policies. Refer to Network Access Rules.","headings":[{"text":"About Inference Routing","level":1,"id":"about-inference-routing"},{"text":"How inference.local Works","level":2,"id":"how-inferencelocal-works"},{"text":"Supported API Patterns","level":2,"id":"supported-api-patterns"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"About Inference Routing How inference.local Works Supported API Patterns Next Steps","keywords":["about","access","anthropic","api","chat","com","completions","configuration","continue","credentials","detail","discovery","external","following","hot","https","inference","local","messages","method","model","network","next","openai","openshell","path","pattern","patterns","property","provider","refer","requests","responses","routing","rules","steps","supported","traffic","ways","works"],"code_blocks":[],"links":[],"images":[],"doc_type":"overview","section_path":["Inference"]},{"id":"reference/cli","title":"CLI Reference","url":"reference/cli.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Complete command reference for the openshell CLI including all subcommands, flags, and environment variables.","tags":["CLI","Reference","Commands","AI Agents"],"topics":["Generative AI","Cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"CLI Reference Complete command reference for the openshell CLI. Every subcommand, flag, and option is documented here. Command Tree The full hierarchy of openshell subcommands: openshell\nstatus\nlogs [name\nterm\nforward\n├── start [--all\n├── connect [name\n├── upload [name\n├── download [name\n└── ssh-config Register an existing remote gateway by URL. openshell gateway tunnel Set up a kubectl tunnel to a remote cluster. openshell gateway select Set the active cluster. All subsequent commands target this cluster. openshell gateway select List all registered clusters (when called without a name). Sandbox Commands Create and manage isolated agent execution environments. Command Description openshell sandbox create Create a new sandbox. Refer to the flag reference below. openshell sandbox get [name] Show detailed information about a sandbox. openshell sandbox list List all sandboxes in the active cluster. openshell sandbox delete Delete one or more sandboxes by name. Use --all to delete every sandbox in the active gateway. openshell sandbox connect [name] Open an interactive SSH session into a running sandbox. openshell sandbox upload [name] Upload files from the host into a sandbox. openshell sandbox download [name] Download files from a sandbox to the host. openshell sandbox ssh-config Print SSH config for a sandbox. Append to ~/.ssh/config for VS Code Remote-SSH. Sandbox Create Flags The following flags control sandbox creation: Flag Description --name Assign a human-readable name to the sandbox. Auto-generated if omitted. --provider Attach a credential provider. Repeatable for multiple providers. --policy Path to a policy YAML file to apply at creation time. --upload Upload local files into the sandbox before running. --keep Keep the sandbox alive after the trailing command exits. --forward Forward a local port into the sandbox at startup. --from Build from a community sandbox name, local Dockerfile directory, or container image reference. -- The command to run inside the sandbox. Everything after -- is passed as the agent command. Policy Commands Apply and inspect sandbox policies at runtime. Command Description openshell policy set Apply or update a policy on a running sandbox. Pass --policy . openshell policy get Show the active policy for a sandbox. Add --full for the complete policy with metadata. openshell policy list List all policy versions applied to a sandbox, with status. Port Forwarding Commands Forward sandbox ports to the host for local access. Command Description openshell forward start Forward a sandbox port to the host. Add -d for background mode. openshell forward stop Stop an active port forward. openshell forward list List all active port forwards. Provider Commands Manage credential providers that inject secrets into sandboxes. Command Description openshell provider create Create a new credential provider. Refer to the flag reference below. openshell provider get Show details of a provider. openshell provider list List all providers in the active cluster. openshell provider update Update a provider’s credentials or configuration. openshell provider delete Delete a provider. Provider Create Flags The following flags control provider creation: Flag Description --name Name for the provider. --type Provider type: claude , codex , opencode , github , gitlab , nvidia , generic , outlook . --from-existing Discover credentials from your current shell environment variables. --credential Set a credential explicitly. Format: KEY=VALUE or bare KEY to read from env. Repeatable. --config Set a configuration value. Format: KEY=VALUE . Repeatable. Inference Commands Configure the backend used by https://inference.local . openshell inference set Set the provider and model for managed inference. Both flags are required. Flag Description --provider Provider record name to use for injected credentials. --model Model identifier to force on generation requests. openshell inference update Update only the fields you specify. Flag Description --provider Replace the current provider record. --model Replace the current model ID. openshell inference get Show the current inference configuration, including provider, model, and version. Environment Variables The following environment variables override CLI defaults: Variable Description OPENSHELL_GATEWAY Name of the gateway to operate on. Overrides the active gateway set by openshell gateway select . OPENSHELL_SANDBOX_POLICY Default path to a policy YAML file. When set, openshell sandbox create uses this policy if no --policy flag is provided. Shell Completions Generate shell completion scripts for tab completion: $ openshell completions bash\nopenshell completions zsh\nopenshell completions fish\nPipe the output to your shell’s config file: $ openshell completions zsh >> ~/.zshrc\nsource ~/.zshrc\nBuilt-in Help Every command and subcommand includes built-in help. Use --help at any level to see available subcommands, flags, and usage examples: $ openshell --help\nopenshell sandbox --help\nopenshell sandbox create --help\nopenshell gateway --help\nHelp output groups flags under distinct headings: FLAGS for command-specific options, GATEWAY FLAGS for --gateway and --gateway-endpoint , and GLOBAL FLAGS for --verbose , --help , and --version","format":"text","content_length":7059,"word_count":1056,"summary":"Complete command reference for the openshell CLI. Every subcommand, flag, and option is documented here.","headings":[{"text":"CLI Reference","level":1,"id":"cli-reference"},{"text":"Command Tree","level":2,"id":"command-tree"},{"text":"Status, Logs, and Terminal","level":2,"id":"status-logs-and-terminal"},{"text":"Gateway Commands","level":2,"id":"gateway-commands"},{"text":"Sandbox Commands","level":2,"id":"sandbox-commands"},{"text":"Sandbox Create Flags","level":3,"id":"sandbox-create-flags"},{"text":"Policy Commands","level":2,"id":"policy-commands"},{"text":"Port Forwarding Commands","level":2,"id":"port-forwarding-commands"},{"text":"Provider Commands","level":2,"id":"provider-commands"},{"text":"Provider Create Flags","level":3,"id":"provider-create-flags"},{"text":"Inference Commands","level":2,"id":"inference-commands"},{"text":"openshell inference set","level":3,"id":"openshell-inference-set"},{"text":"openshell inference update","level":3,"id":"openshell-inference-update"},{"text":"openshell inference get","level":3,"id":"openshell-inference-get"},{"text":"Environment Variables","level":2,"id":"environment-variables"},{"text":"Shell Completions","level":2,"id":"shell-completions"},{"text":"Built-in Help","level":2,"id":"built-in-help"}],"headings_text":"CLI Reference Command Tree Status, Logs, and Terminal Gateway Commands Sandbox Commands Sandbox Create Flags Policy Commands Port Forwarding Commands Provider Commands Provider Create Flags Inference Commands openshell inference set openshell inference update openshell inference get Environment Variables Shell Completions Built-in Help","keywords":["add","append","apply","assign","attach","auto","both","build","built","check","cli","code","command","commands","complete","completion","completions","configure","create","creation","dashboard","default","defaults","delete","deploy","description","discover","dockerfile","download","environment","every","everything","examples","file","flag","flags","format","forward","forwarding","gateway","generate","headings","help","https","inference","keep","launch","list","logs","manage"],"code_blocks":[{"content":"openshell\n├── status\n├── logs [name]\n├── term\n├── forward\n│ ├── start \n│ ├── stop \n│ └── list\n├── gateway\n│ ├── start\n│ ├── stop\n│ ├── destroy\n│ ├── info\n│ ├── add \n│ ├── tunnel\n│ └── select [name]\n├── sandbox\n│ ├── create\n│ ├── get [name]\n│ ├── list\n│ ├── delete [--all]\n│ ├── connect [name]\n│ ├── upload [name]\n│ ├── download [name]\n│ └── ssh-config \n├── policy\n│ ├── set \n│ ├── get \n│ └── list \n├── provider\n│ ├── create\n│ ├── get \n│ ├── list\n│ ├── update \n│ └── delete \n├── inference\n│ ├── set\n│ ├── update\n│ └── get\n└── completions ","language":"text"},{"content":"$ openshell completions bash\n$ openshell completions zsh\n$ openshell completions fish","language":"text"},{"content":"$ openshell completions zsh >> ~/.zshrc\n$ source ~/.zshrc","language":"text"},{"content":"$ openshell --help\n$ openshell sandbox --help\n$ openshell sandbox create --help\n$ openshell gateway --help","language":"text"}],"links":[],"images":[],"doc_type":"reference","section_path":["Reference","Cli"]},{"id":"reference/default-policy","title":"Default Policy Reference","url":"reference/default-policy.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Breakdown of the built-in default policy applied when you create an OpenShell sandbox without a custom policy.","tags":["ai_agents","sandboxing","security","policy"],"topics":["generative_ai","cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"keywords":["openshell default policy","sandbox policy","agent compatibility"],"content":"Default Policy Reference The default policy is the policy applied when you create an OpenShell sandbox without --policy . It is defined in the deploy/docker/sandbox/dev-sandbox-policy.yaml file. Agent Compatibility The following table shows the coverage of the default policy for common agents. Agent Coverage Action Required Claude Code Full None. Works out of the box. OpenCode Partial Add opencode.ai endpoint and OpenCode binary paths. Codex None Provide a complete custom policy with OpenAI endpoints and Codex binary paths. If you run a non-Claude agent without a custom policy, the agent’s API calls are denied by the proxy. You must provide a policy that declares the agent’s endpoints and binaries. Default Policy Blocks The following tables show the default policy blocks pre-configured in the file.

Filesystem, Landlock, and ProcessNetwork Policy BlocksAnthropic API and TelemetryGit Clone and FetchNVIDIA API CatalogGitHub API (Read-Only)Python Package InstallationVS Code Remote and Marketplace The cluster image is based on rancher/k3s:v1.35.2-k3s1 and bundles the Helm charts and Kubernetes manifests required to bootstrap the control plane. The server and sandbox images are pulled separately at runtime. To override the default image references, set the following environment variables: Variable Purpose OPENSHELL_CLUSTER_IMAGE Override the cluster image reference. OPENSHELL_COMMUNITY_REGISTRY Override the registry for community sandbox images. Kernel Requirements OpenShell enforces sandbox isolation through two Linux kernel security modules: Module Requirement Details Landlock LSM Recommended Enforces filesystem access restrictions at the kernel level. The best_effort compatibility mode uses the highest Landlock ABI the host kernel supports. The hard_requirement mode fails sandbox creation if the required ABI is unavailable. seccomp Required Filters dangerous system calls. Available on all modern Linux kernels (3.17+). On macOS, these kernel modules run inside the Docker Desktop Linux VM, not on the host kernel. Agent Compatibility For the full list of supported agents and their default policy coverage, refer to the Supported Agents table","format":"text","content_length":3058,"word_count":402,"summary":"This page lists the platform, software, runtime, and kernel requirements for running OpenShell.","headings":[{"text":"Support Matrix","level":1,"id":"support-matrix"},{"text":"Supported Platforms","level":2,"id":"supported-platforms"},{"text":"Software Prerequisites","level":2,"id":"software-prerequisites"},{"text":"Sandbox Runtime Versions","level":2,"id":"sandbox-runtime-versions"},{"text":"Container Images","level":2,"id":"container-images"},{"text":"Kernel Requirements","level":2,"id":"kernel-requirements"},{"text":"Agent Compatibility","level":2,"id":"agent-compatibility"}],"headings_text":"Support Matrix Supported Platforms Software Prerequisites Sandbox Runtime Versions Container Images Kernel Requirements Agent Compatibility","keywords":["agent","agents","apple","architecture","available","base","bookworm","claude","cluster","code","codex","community","compatibility","component","container","debian","desktop","details","docker","enforces","engine","filters","first","helm","image","images","intel","k3s","kernel","kubernetes","landlock","latest","linux","matrix","minimum","module","modules","must","node","notes","opencode","openshell","override","platform","platforms","prerequisites","pulled","purpose","python","recommended"],"code_blocks":[],"links":[{"text":"Uv","type":"external","url":"https://docs.astral.sh/uv/","original_text":"uv"},{"text":"Landlock LSM","type":"external","url":"https://docs.kernel.org/security/landlock.html"}],"images":[],"doc_type":"reference","section_path":["Reference","Support Matrix"]},{"id":"resources/eula","title":"License","url":"resources/eula.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"NVIDIA OpenShell license agreement and terms of use.","tags":["License","EULA"],"topics":["Legal"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"License","format":"text","content_length":7,"word_count":1,"summary":" License","headings":[{"text":"License","level":1,"id":"license"}],"headings_text":"License","keywords":["license"],"code_blocks":[],"links":[],"images":[],"doc_type":"documentation","section_path":["Resources","Eula"]},{"id":"sandboxes/community-sandboxes","title":"Community Sandboxes","url":"sandboxes/community-sandboxes.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Use pre-built sandboxes from the OpenShell Community catalog or contribute your own.","tags":["Community","Sandbox","Container Image","Open Source"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Community Sandboxes Use pre-built sandboxes from the OpenShell Community catalog, or contribute your\nown. What Are Community Sandboxes Community sandboxes are ready-to-use environments published in the\nOpenShell Community repository\nEach sandbox bundles a Dockerfile, policy, optional skills, and startup scripts\ninto a single package that you can launch with one command. Current Catalog The following community sandboxes are available in the catalog. Sandbox Description base Foundational image with system tools and dev environment openclaw Open agent manipulation and control sdg Synthetic data generation workflows simulation General-purpose simulation sandboxes Use a Community Sandbox Launch a community sandbox by name with the --from flag: $ openshell sandbox create --from openclaw\nWhen you pass --from with a community sandbox name, the CLI: Resolves the name against the\nOpenShell Community repository. Pulls the Dockerfile, policy, skills, and any startup scripts. Builds the container image locally. Creates the sandbox with the bundled configuration applied. You end up with a running sandbox whose image, policy, and tooling are all\npreconfigured by the community package. Other Sources The --from flag also accepts: Local directory paths: Point to a directory on disk that contains a\nDockerfile and optional policy/skills: $ openshell sandbox create --from ./my-sandbox-dir\nContainer image references: Use an existing container image directly: $ openshell sandbox create --from my-registry.example.com/my-image:latest\nContribute a Community Sandbox Each community sandbox is a directory under sandboxes/ in the\nOpenShell Community repository\nAt minimum, a sandbox directory must contain: Dockerfile : Defines the container image README.md : Describes the sandbox and how to use it Optional files: policy.yaml : Default policy applied when the sandbox launches skills/ : Agent skill definitions bundled with the sandbox Startup scripts: Any scripts the Dockerfile or entrypoint invokes To contribute, fork the repository, add your sandbox directory, and open a pull\nrequest. Refer to the repository’s\nCONTRIBUTING.md\nfor submission guidelines. The community catalog is designed to grow. If you have built a sandbox that\nsupports a particular workflow (data processing, simulation, code review\nor anything else), consider contributing it back so others can use it. Next Steps Explore related topics: Need to supply API keys or tokens? Set up providers for credential management. Want to customize the sandbox policy? Write custom rules in policies","format":"text","content_length":2562,"word_count":367,"summary":"Use pre-built sandboxes from the OpenShell Community catalog, or contribute your own.","headings":[{"text":"Community Sandboxes","level":1,"id":"community-sandboxes"},{"text":"What Are Community Sandboxes","level":2,"id":"what-are-community-sandboxes"},{"text":"Current Catalog","level":2,"id":"current-catalog"},{"text":"Use a Community Sandbox","level":2,"id":"use-a-community-sandbox"},{"text":"Other Sources","level":3,"id":"other-sources"},{"text":"Contribute a Community Sandbox","level":2,"id":"contribute-a-community-sandbox"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Community Sandboxes What Are Community Sandboxes Current Catalog Use a Community Sandbox Other Sources Contribute a Community Sandbox Next Steps","keywords":["accepts","agent","any","builds","catalog","com","community","contain","container","contribute","creates","current","default","defines","describes","description","directly","dockerfile","each","explore","files","flag","foundational","general","image","launch","local","need","next","open","openshell","optional","other","paths","point","pulls","refer","references","resolves","sandbox","sandboxes","scripts","set","skills","sources","startup","steps","synthetic","topics","want"],"code_blocks":[{"content":"$ openshell sandbox create --from openclaw","language":"text"},{"content":"$ openshell sandbox create --from ./my-sandbox-dir","language":"text"},{"content":"$ openshell sandbox create --from my-registry.example.com/my-image:latest","language":"text"}],"links":[{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"Contributing","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community/blob/main/CONTRIBUTING.md","original_text":"CONTRIBUTING.md"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Community Sandboxes"]},{"id":"sandboxes/create-and-manage","title":"Create and Manage Sandboxes","url":"sandboxes/create-and-manage.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create, inspect, connect to, monitor, transfer files, and delete OpenShell sandboxes.","tags":["Sandboxing","AI Agents","Sandbox Management","CLI"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Create and Manage Sandboxes This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes . Docker must be running before you create a sandbox. If it is not, the CLI\nreturns a connection-refused error ( os error 61 ) without explaining\nthe cause. Start Docker and try again. Create a Sandbox Run a single command to create a sandbox and launch your agent: $ openshell sandbox create -- claude\nIf you have an existing gateway, the sandbox is created in it. Otherwise, a gateway is created automatically. A fully specified creation command might look like: $ openshell sandbox create\nname dev\nprovider my-claude\npolicy policy.yaml\nupload\nkeep\nclaude\nUse --keep to keep the sandbox running after the trailing command exits\nThis is especially useful when you are iterating on a policy or want to\nreconnect later from another terminal or VS Code. Create from a Community Sandbox or Custom Image Use --from to create a sandbox from a pre-built community package, a local directory, or a container image: $ openshell sandbox create --from openclaw\nThe CLI resolves the name against the OpenShell Community catalog, pulls the bundled Dockerfile and policy, builds the image locally, and creates the sandbox. For the full catalog and how to contribute your own, refer to community-sandboxes . You can also point --from at a local directory or a container image reference: $ openshell sandbox create --from ./my-sandbox-dir\nopenshell sandbox create --from my-registry.example.com/my-image:latest\nList and Inspect Sandboxes Check the status of your sandboxes and retrieve detailed information about individual ones. List all sandboxes: $ openshell sandbox list\nGet detailed information about a specific sandbox: $ openshell sandbox get my-sandbox\nConnect to a Sandbox Access a running sandbox through an interactive SSH session or VS Code Remote-SSH. Interactive SSH Open an SSH session into a running sandbox: $ openshell sandbox connect my-sandbox\nView Logs Stream and filter sandbox logs to monitor agent activity and diagnose policy decisions. Stream sandbox logs: $ openshell logs my-sandbox\nUse flags to filter and follow output: Flag Purpose Example --tail Stream logs in real time openshell logs my-sandbox --tail --source Filter by log source --source sandbox --level Filter by severity --level warn --since Show logs from a time window --since 5m Monitor Your Sandbox OpenShell Terminal is a real-time dashboard that combines sandbox status and live logs in a single view. $ openshell term\nThe dashboard shows the following information. Sandbox status : Name, phase, image, attached providers, age, and active port forwards. Live log stream : Omutbound connections, policy decisions, and inference interceptions as they happen. Logs are labeled by source: sandbox (proxy and policy events) or gateway (lifecycle events). Use the terminal to spot blocked connections ( action=deny entries) and inference interceptions ( action=inspect_for_inference entries). If a connection is blocked unexpectedly, add the host to your network policy — refer to policies for the workflow. Transfer Files Transfer files between your host machine and a running sandbox. Upload files from your host into the sandbox: $ openshell sandbox upload my-sandbox ./src /sandbox/src\nDownload files from the sandbox to your host: $ openshell sandbox download my-sandbox /sandbox/output ./local\nYou can also upload files at creation time with the --upload flag on\nopenshell sandbox create . Delete Sandboxes Remove sandboxes when they are no longer needed. Deleting a sandbox stops all processes, releases cluster resources, and purges injected credentials. Delete a sandbox by name: $ openshell sandbox delete my-sandbox\nDelete all sandboxes in the active gateway: $ openshell sandbox delete --all\nNext Steps Explore related topics: To follow a complete end-to-end example, refer to the /tutorials/github-sandbox tutorial. To supply API keys or tokens, refer to providers . To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog","format":"text","content_length":4230,"word_count":648,"summary":"This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes.","headings":[{"text":"Create and Manage Sandboxes","level":1,"id":"create-and-manage-sandboxes"},{"text":"Create a Sandbox","level":2,"id":"create-a-sandbox"},{"text":"Create from a Community Sandbox or Custom Image","level":2,"id":"create-from-a-community-sandbox-or-custom-image"},{"text":"List and Inspect Sandboxes","level":2,"id":"list-and-inspect-sandboxes"},{"text":"Connect to a Sandbox","level":2,"id":"connect-to-a-sandbox"},{"text":"Interactive SSH","level":3,"id":"interactive-ssh"},{"text":"View Logs","level":2,"id":"view-logs"},{"text":"Monitor Your Sandbox","level":2,"id":"monitor-your-sandbox"},{"text":"Transfer Files","level":2,"id":"transfer-files"},{"text":"Delete Sandboxes","level":2,"id":"delete-sandboxes"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Create and Manage Sandboxes Create a Sandbox Create from a Community Sandbox or Custom Image List and Inspect Sandboxes Connect to a Sandbox Interactive SSH View Logs Monitor Your Sandbox Transfer Files Delete Sandboxes Next Steps","keywords":["about","access","action","agent","check","code","com","community","connect","create","custom","delete","deleting","docker","dockerfile","download","example","explore","files","filter","flag","from","gateway","host","image","inspect","interactive","lifecycle","like","list","live","logs","manage","monitor","name","next","omutbound","open","openshell","otherwise","output","purpose","reference","remote","remove","run","sandbox","sandboxes","show","source"],"code_blocks":[{"content":"$ openshell sandbox create -- claude","language":"text"},{"content":"$ openshell sandbox create \\\n --name dev \\\n --provider my-claude \\\n --policy policy.yaml \\\n --upload \\\n --keep \\\n -- claude","language":"text"},{"content":"$ openshell sandbox create --from openclaw","language":"text"},{"content":"$ openshell sandbox create --from ./my-sandbox-dir\n$ openshell sandbox create --from my-registry.example.com/my-image:latest","language":"text"},{"content":"$ openshell sandbox list","language":"text"},{"content":"$ openshell sandbox get my-sandbox","language":"text"},{"content":"$ openshell sandbox connect my-sandbox","language":"text"},{"content":"$ openshell logs my-sandbox","language":"text"},{"content":"$ openshell term","language":"text"},{"content":"$ openshell sandbox upload my-sandbox ./src /sandbox/src","language":"text"},{"content":"$ openshell sandbox download my-sandbox /sandbox/output ./local","language":"text"},{"content":"$ openshell sandbox delete my-sandbox","language":"text"},{"content":"$ openshell sandbox delete --all","language":"text"}],"links":[{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Create And Manage"]},{"id":"sandboxes/index","title":"About Sandboxes","url":"sandboxes/index.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Understand sandbox lifecycle, supported agents, built-in default policy, and network access rules in OpenShell.","tags":["Sandboxing","AI Agents","Security","Policy","Isolation"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"About Sandboxes An OpenShell sandbox is a safe, private execution environment for an AI agent. Each sandbox runs with multiple layers of protection that prevent unauthorized data access, credential exposure, and network exfiltration. Protection layers include filesystem restrictions (Landlock), system call filtering (seccomp), network namespace isolation, and a privacy-enforcing HTTP CONNECT proxy. Sandbox Lifecycle Every sandbox moves through a defined set of phases: Phase Description Provisioning The runtime is setting up the sandbox environment, injecting credentials, and applying your policy. Ready The sandbox is running. The agent process is active and all isolation layers are enforced. You can connect, sync files, and view logs. Error Something went wrong during provisioning or execution. Check logs with openshell logs for details. Deleting The sandbox is being torn down. The system releases resources and purges credentials. Supported Agents The following table summarizes the agents that run in OpenShell sandboxes. Built-in agents are pre-installed in the OpenShell base sandbox image and auto-configured when passed as the trailing command to openshell sandbox create . More community agent sandboxes are available in the community-sandboxes catalog. Agent Source Default Policy Notes Claude Code Built-in Full coverage Works out of the box. Requires ANTHROPIC_API_KEY . OpenCode Built-in Partial coverage Pre-installed. Add opencode.ai endpoint and OpenCode binary paths to the policy for full functionality. Codex Built-in No coverage Pre-installed. Requires a custom policy with OpenAI endpoints and Codex binary paths. Requires OPENAI_API_KEY . OpenClaw OpenShell Community Bundled Agent orchestration layer. Launch with openshell sandbox create --from openclaw\nBuilt-in Default Policy OpenShell ships a built-in policy that covers common agent workflows out of the box\nWhen you create a sandbox without --policy , the default policy is applied. It controls three things: Layer What It Controls How It Works Filesystem What the agent can access on disk Paths are split into read-only and read-write sets. Landlock LSM enforces these restrictions at the kernel level. Network What the agent can reach on the network Each policy block pairs allowed destinations (host and port) with allowed binaries (executable paths). The proxy matches every outbound connection to the binary that opened it. Both must match or the connection is denied. Process What privileges the agent has The agent runs as an unprivileged user with seccomp filters that block dangerous system calls. No sudo , no setuid , no path to elevated privileges. For the full breakdown of each default policy block and agent compatibility details, refer to ../reference/default-policy . Policy Structure A policy has static sections ( filesystem_policy , landlock , process ) that are locked at sandbox creation, and dynamic sections ( network_policies , inference ) that are hot-reloadable on a running sandbox. version: 1\nStatic: locked at sandbox creation. Paths the agent can read vs read/write\nfilesystem_policy\nread_only: [/usr, /lib, /etc\nread_write: [/sandbox, /tmp\nStatic: Landlock LSM kernel enforcement. best_effort uses highest ABI the host supports\nlandlock\ncompatibility: best_effort\nStatic: Unprivileged user/group the agent process runs as\nprocess\nrun_as_user: sandbox\nrun_as_group: sandbox\nDynamic: hot-reloadable. Named blocks of endpoints + binaries allowed to reach them\nnetwork_policies\nmy_api\nname: my-api\nendpoints\nhost: api.example.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\naccess: full\nbinaries\npath: /usr/bin/curl\nDynamic: hot-reloadable. Routing hints this sandbox can use for inference (e.g. local, nvidia\ninference\nallowed_routes: [local\nFor the complete structure and every field, refer to the Policy Schema Reference . Network Access Rules Network access is controlled by policy blocks under network_policies . Each block has a name, a list of endpoints (host, port, protocol, and optional rules), and a list of binaries that are allowed to use those endpoints. Every outbound connection from the sandbox goes through the proxy: The proxy queries the policy engine with the destination (host and port) and the calling binary. A connection is allowed only when both match an entry in the same policy block. For endpoints with protocol: rest and tls: terminate , each HTTP request is checked against that endpoint’s rules (method and path). If no endpoint matches and inference routes are configured, the request may be rerouted for inference. Otherwise the connection is denied. Endpoints without protocol or tls allow the TCP stream through without inspecting payloads. Next Steps Continue with one of the following: To create your first sandbox, refer to create-and-manage . To supply API keys or tokens, refer to providers . To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog","format":"text","content_length":4999,"word_count":737,"summary":"An OpenShell sandbox is a safe, private execution environment for an AI agent. Each sandbox runs with multiple layers of protection that prevent unauthorized data access, credential exposure, and network exfiltration. Protection layers include filesystem restrictions (Landlock), system call filte...","headings":[{"text":"About Sandboxes","level":1,"id":"about-sandboxes"},{"text":"Sandbox Lifecycle","level":2,"id":"sandbox-lifecycle"},{"text":"Supported Agents","level":2,"id":"supported-agents"},{"text":"Built-in Default Policy","level":2,"id":"built-in-default-policy"},{"text":"Policy Structure","level":2,"id":"policy-structure"},{"text":"Network Access Rules","level":2,"id":"network-access-rules"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"About Sandboxes Sandbox Lifecycle Supported Agents Built-in Default Policy Policy Structure Network Access Rules Next Steps","keywords":["about","access","add","agent","agents","allowed_routes","both","built","bundled","check","claude","code","codex","com","community","compatibility","continue","controls","default","deleting","description","dynamic","each","endpoints","enforcement","error","every","filesystem","following","full","host","landlock","launch","layer","lifecycle","more","name","named","network","next","notes","openai","openclaw","opencode","openshell","otherwise","partial","path","paths","phase"],"code_blocks":[{"content":"version: 1\n\n# Static: locked at sandbox creation. Paths the agent can read vs read/write.\nfilesystem_policy:\n read_only: [/usr, /lib, /etc]\n read_write: [/sandbox, /tmp]\n\n# Static: Landlock LSM kernel enforcement. best_effort uses highest ABI the host supports.\nlandlock:\n compatibility: best_effort\n\n# Static: Unprivileged user/group the agent process runs as.\nprocess:\n run_as_user: sandbox\n run_as_group: sandbox\n\n# Dynamic: hot-reloadable. Named blocks of endpoints + binaries allowed to reach them.\nnetwork_policies:\n my_api:\n name: my-api\n endpoints:\n - host: api.example.com\n port: 443\n protocol: rest\n tls: terminate\n enforcement: enforce\n access: full\n binaries:\n - path: /usr/bin/curl\n\n# Dynamic: hot-reloadable. Routing hints this sandbox can use for inference (e.g. local, nvidia).\ninference:\n allowed_routes: [local]","language":"text"}],"links":[{"text":"Claude Code","type":"external","url":"https://docs.anthropic.com/en/docs/claude-code"},{"text":"OpenCode","type":"external","url":"https://opencode.ai/"},{"text":"Codex","type":"external","url":"https://developers.openai.com/codex"},{"text":"OpenClaw","type":"external","url":"https://openclaw.ai/"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community/tree/main/sandboxes/openclaw"},{"text":"Landlock LSM","type":"external","url":"https://docs.kernel.org/security/landlock.html"}],"images":[],"doc_type":"overview","section_path":["Sandboxes"]},{"id":"sandboxes/policies","title":"Customize Sandbox Policies","url":"sandboxes/policies.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Apply, iterate, and debug sandbox network policies with hot-reload on running OpenShell sandboxes.","tags":["Policy","Network Policy","Sandbox","Security","Hot Reload"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Customize Sandbox Policies Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference . Quick Start: Apply a Custom Policy Pass a policy YAML file when creating the sandbox: $ openshell sandbox create --policy ./my-policy.yaml --keep -- claude\nThe --keep flag keeps the sandbox running after the initial command exits, which is useful when you plan to iterate on the policy. To avoid passing --policy every time, set a default policy with an environment variable: $ export OPENSHELL_SANDBOX_POLICY=./my-policy.yaml\nopenshell sandbox create --keep -- claude\nThe CLI uses the policy from OPENSHELL_SANDBOX_POLICY whenever --policy is not explicitly provided. Iterate on a Running Sandbox To change what the sandbox can access, pull the current policy, edit the YAML, and push the update. The workflow is iterative: create the sandbox, monitor logs for denied actions, pull the policy, modify it, push, and verify. The following steps outline the hot-reload policy update workflow. Create the sandbox with your initial policy by following Quick Start: Apply a Custom Policy above (or set OPENSHELL_SANDBOX_POLICY ). Monitor denials. Each log entry shows host, port, binary, and reason. Alternatively, use openshell term for a live dashboard. $ openshell logs --tail --source sandbox\nPull the current policy. Strip the metadata header (Version, Hash, Status) before reusing the file. $ openshell policy get --full > current-policy.yaml\nEdit the YAML: add or adjust network_policies entries, binaries, access or rules , or inference.allowed_routes . Push the updated policy. Exit codes: 0 = loaded, 1 = validation failed, 124 = timeout. $ openshell policy set --policy current-policy.yaml --wait\nVerify the new revision. If status is loaded , repeat from step 2 as needed; if failed , fix the policy and repeat from step 4. $ openshell policy list --tail --source sandbox for the denied host, path, and binary. When triaging denied requests, check: Destination host and port to confirm which endpoint is missing. Calling binary path to confirm which binaries entry needs to be added or adjusted. HTTP method and path (for REST endpoints) to confirm which rules entry needs to be added or adjusted. Then push the updated policy as described above. Examples Add these blocks to the network_policies section of your sandbox policy. Apply with openshell policy set --policy --wait\nUse Simple endpoint for host-level allowlists and Granular rules for method/path control. Simple endpoint Allow pip install and uv pip install to reach PyPI: pypi\nname: pypi\nendpoints\nhost: pypi.org\nport: 443\nhost: files.pythonhosted.org\nport: 443\nbinaries\n{ path: /usr/bin/pip\n{ path: /usr/local/bin/uv\nEndpoints without protocol or tls use TCP passthrough — the proxy allows the stream without inspecting payloads. Granular rules Allow Claude and the GitHub CLI to reach api.github.com with per-path rules: read-only (GET, HEAD, OPTIONS) and GraphQL (POST) for all paths; full write access for alpha-repo ; and create/edit issues only for bravo-repo . Replace with your GitHub org or username. For an end-to-end walkthrough that combines this policy with a GitHub credential provider and sandbox creation, refer to /tutorials/github-sandbox . github_repos\nname: github_repos\nendpoints\nhost: api.github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nallow\nmethod: GET\npath:\nallow\nmethod: HEAD\npath:\nallow\nmethod: OPTIONS\npath:\nallow\nmethod: POST\npath: \"/graphql\nallow\nmethod:\npath: \"/repos//alpha-repo\nallow\nmethod: POST\npath: \"/repos//bravo-repo/issues\nallow\nmethod: PATCH\npath: \"/repos//bravo-repo/issues\nbinaries\n{ path: /usr/local/bin/claude\n{ path: /usr/bin/gh\nEndpoints with protocol: rest and tls: terminate enable HTTP request inspection — the proxy decrypts TLS and checks each HTTP request against the rules list. Next Steps Explore related topics: To learn about policy structure and network access rules, refer to index . To view the full field-by-field YAML definition, refer to the Policy Schema Reference . To review the default policy breakdown, refer to ../reference/default-policy","format":"text","content_length":4315,"word_count":639,"summary":"Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference.","headings":[{"text":"Customize Sandbox Policies","level":1,"id":"customize-sandbox-policies"},{"text":"Quick Start: Apply a Custom Policy","level":2,"id":"quick-start-apply-a-custom-policy"},{"text":"Iterate on a Running Sandbox","level":2,"id":"iterate-on-a-running-sandbox"},{"text":"Debug Denied Requests","level":2,"id":"debug-denied-requests"},{"text":"Examples","level":2,"id":"examples"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Customize Sandbox Policies Quick Start: Apply a Custom Policy Iterate on a Running Sandbox Debug Denied Requests Examples Next Steps","keywords":["add","allow","alternatively","apply","calling","check","claude","codes","com","create","custom","customize","debug","denied","destination","each","edit","endpoints","enforcement","examples","exit","explore","github","granular","graphql","hash","host","iterate","iterative","method","monitor","name","next","org","pass","path","policies","policy","port","protocol","pull","push","pypi","quick","reference","replace","requests","rules","running","sandbox"],"code_blocks":[{"content":"$ openshell sandbox create --policy ./my-policy.yaml --keep -- claude","language":"text"},{"content":"$ export OPENSHELL_SANDBOX_POLICY=./my-policy.yaml\n$ openshell sandbox create --keep -- claude","language":"text"},{"content":"$ openshell logs --tail --source sandbox","language":"text"},{"content":"$ openshell policy get --full > current-policy.yaml","language":"text"},{"content":"$ openshell policy set --policy current-policy.yaml --wait","language":"text"},{"content":"$ openshell policy list ","language":"text"},{"content":"pypi:\n name: pypi\n endpoints:\n - host: pypi.org\n port: 443\n - host: files.pythonhosted.org\n port: 443\n binaries:\n - { path: /usr/bin/pip }\n - { path: /usr/local/bin/uv }","language":"text"},{"content":"github_repos:\n name: github_repos\n endpoints:\n - host: api.github.com\n port: 443\n protocol: rest\n tls: terminate\n enforcement: enforce\n rules:\n - allow:\n method: GET\n path: \"/**\"\n - allow:\n method: HEAD\n path: \"/**\"\n - allow:\n method: OPTIONS\n path: \"/**\"\n - allow:\n method: POST\n path: \"/graphql\"\n - allow:\n method: \"*\"\n path: \"/repos//alpha-repo/**\"\n - allow:\n method: POST\n path: \"/repos//bravo-repo/issues\"\n - allow:\n method: PATCH\n path: \"/repos//bravo-repo/issues/*\"\n binaries:\n - { path: /usr/local/bin/claude }\n - { path: /usr/bin/gh }","language":"text"}],"links":[{"text":"Quick Start: Apply a Custom Policy","type":"anchor","url":"#quick-start-apply-a-custom-policy"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Policies"]},{"id":"sandboxes/providers","title":"Providers","url":"sandboxes/providers.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create and manage credential providers that inject API keys and tokens into OpenShell sandboxes.","tags":["Providers","Credentials","API Keys","Sandbox","Security"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Providers AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers . Create and manage providers that supply credentials to sandboxes. Create a Provider Providers can be created from local environment variables or with explicit credential values. From Local Credentials The fastest way to create a provider is to let the CLI discover credentials from\nyour shell environment: $ openshell provider create --name my-claude --type claude --from-existing\nThis reads ANTHROPIC_API_KEY or CLAUDE_API_KEY from your current environment\nand stores them in the provider. With Explicit Credentials Supply a credential value directly: $ openshell provider create --name my-api --type generic --credential API_KEY=sk-abc123\nBare Key Form Pass a key name without a value to read the value from the environment variable\nof that name: $ openshell provider create --name my-api --type generic --credential API_KEY\nThis looks up the current value of $API_KEY in your shell and stores it. Manage Providers List, inspect, update, and delete providers from the active cluster. List all providers: $ openshell provider list\nInspect a provider: $ openshell provider get my-claude\nUpdate a provider’s credentials: $ openshell provider update my-claude --type claude --from-existing\nDelete a provider: $ openshell provider delete my-claude\nAttach Providers to Sandboxes Pass one or more --provider flags when creating a sandbox: $ openshell sandbox create --provider my-claude --provider my-github -- claude\nEach --provider flag attaches one provider. The sandbox receives all\ncredentials from every attached provider at runtime. Providers cannot be added to a running sandbox. If you need to attach an\nadditional provider, delete the sandbox and recreate it with all required\nproviders specified. Auto-Discovery Shortcut When the trailing command in openshell sandbox create is a recognized tool name ( claude , codex , or opencode ), the CLI auto-creates the required\nprovider from your local credentials if one does not already exist. You do not\nneed to create the provider separately: $ openshell sandbox create -- claude\nThis detects claude as a known tool, finds your ANTHROPIC_API_KEY , creates\na provider, attaches it to the sandbox, and launches Claude Code. Supported Provider Types The following provider types are supported. Type Environment Variables Injected Typical Use claude ANTHROPIC_API_KEY , CLAUDE_API_KEY Claude Code, Anthropic API codex OPENAI_API_KEY OpenAI Codex opencode OPENCODE_API_KEY , OPENROUTER_API_KEY , OPENAI_API_KEY opencode tool github GITHUB_TOKEN , GH_TOKEN GitHub API, gh CLI — refer to /tutorials/github-sandbox gitlab GITLAB_TOKEN , GLAB_TOKEN , CI_JOB_TOKEN GitLab API, glab CLI nvidia NVIDIA_API_KEY NVIDIA API Catalog generic User-defined Any service with custom credentials outlook (none: no auto-discovery) Microsoft Outlook integration Use the generic type for any service not listed above. You define the\nenvironment variable names and values yourself with --credential . Next Steps Explore related topics: To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog. To view the complete field reference for the policy YAML, refer to the Policy Schema Reference","format":"text","content_length":3421,"word_count":502,"summary":"AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers.","headings":[{"text":"Providers","level":1,"id":"providers"},{"text":"Create a Provider","level":2,"id":"create-a-provider"},{"text":"From Local Credentials","level":3,"id":"from-local-credentials"},{"text":"With Explicit Credentials","level":3,"id":"with-explicit-credentials"},{"text":"Bare Key Form","level":3,"id":"bare-key-form"},{"text":"Manage Providers","level":2,"id":"manage-providers"},{"text":"Attach Providers to Sandboxes","level":2,"id":"attach-providers-to-sandboxes"},{"text":"Auto-Discovery Shortcut","level":3,"id":"auto-discovery-shortcut"},{"text":"Supported Provider Types","level":2,"id":"supported-provider-types"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Providers Create a Provider From Local Credentials With Explicit Credentials Bare Key Form Manage Providers Attach Providers to Sandboxes Auto-Discovery Shortcut Supported Provider Types Next Steps","keywords":["anthropic","any","attach","auto","bare","catalog","claude","code","codex","create","credentials","delete","directly","discovery","each","environment","explicit","explore","form","from","github","gitlab","injected","inspect","key","list","local","manage","microsoft","name","next","none","openai","openshell","outlook","pass","policy","provider","providers","reference","sandbox","sandboxes","schema","separately","services","shortcut","steps","supply","supported","this"],"code_blocks":[{"content":"$ openshell provider create --name my-claude --type claude --from-existing","language":"text"},{"content":"$ openshell provider create --name my-api --type generic --credential API_KEY=sk-abc123","language":"text"},{"content":"$ openshell provider create --name my-api --type generic --credential API_KEY","language":"text"},{"content":"$ openshell provider list","language":"text"},{"content":"$ openshell provider get my-claude","language":"text"},{"content":"$ openshell provider update my-claude --type claude --from-existing","language":"text"},{"content":"$ openshell provider delete my-claude","language":"text"},{"content":"$ openshell sandbox create --provider my-claude --provider my-github -- claude","language":"text"},{"content":"$ openshell sandbox create -- claude","language":"text"}],"links":[],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Providers"]},{"id":"tutorials/github-sandbox","title":"Set Up a Sandbox of Claude Code with a Custom GitHub Policy","url":"tutorials/github-sandbox.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Learn the iterative policy workflow by launching a sandbox, diagnosing a GitHub access denial, and applying a custom policy to fix it.","tags":["Tutorial","GitHub","Sandbox","Policy","Claude Code"],"topics":["Generative AI","Cybersecurity"],"content_type":"tutorial","learning_level":"technical_intermediate","audience":["engineer"],"content":"Set Up a Sandbox of Claude Code with a Custom GitHub Policy This tutorial walks through an iterative sandbox policy workflow. You launch a sandbox, ask Claude Code to push code to GitHub, and observe the default network policy denying the request\nYou then diagnose the denial from your machine and from inside the sandbox, apply a custom policy, and verify that the policy update takes effect. After completing this tutorial, you will have: A running sandbox with Claude Code that can push to a GitHub repository. A custom network policy that grants GitHub access for a specific repository. Experience with the policy iteration workflow: fail, diagnose, update, verify. This tutorial shows example prompts and responses from Claude Code. The exact wording you see might vary between sessions. Use the examples as a guide for the type of interaction, not as expected output. Prerequisites This tutorial requires the following: A working OpenShell installation. Complete the Quickstart before proceeding. A GitHub personal access token (PAT) with repo scope. Generate one from the GitHub personal access token settings page by selecting Generate new token (classic) and enabling the repo scope. To avoid pasting the token manually during the tutorial, you can configure a credential provider to inject it automatically at sandbox startup: $ openshell provider create --name my-github --type github --from-existing\nopenshell sandbox create --provider my-github --keep -- claude\nThe provider reads GITHUB_TOKEN from your host environment and exposes it as an environment variable inside the sandbox. Claude Code can then use it directly. An Anthropic account with access to Claude Code. OpenShell provides the sandbox runtime, not the agent. You must authenticate with your own account. A GitHub repository you own to use as the push target. A scratch repository is sufficient. You can create one with a README if needed. This tutorial uses two terminals to demonstrate the iterative policy workflow: Terminal 1 : The sandbox terminal. You create the sandbox here with openshell sandbox create and interact with Claude Code inside it. Terminal 2 : A terminal outside the sandbox on your machine. You use this for viewing the sandbox logs with openshell term and applying an updated policy with openshell policy set . Each section below indicates which terminal to use. Launch the Sandbox In terminal 1, create a sandbox and start Claude Code. No custom policy is needed. The default policy is applied automatically: $ openshell sandbox create --keep -- claude\nThe --keep flag keeps the sandbox running after Claude Code exits, so you can apply policy updates later without recreating the environment. Claude Code starts inside the sandbox. It prints an authentication link. Open it in your browser, sign in to your Anthropic account, and return to the terminal. When prompted, trust the /sandbox workspace to allow Claude Code to read and write files. Push Code to GitHub In terminal 1, ask Claude Code to write a simple script and push it to your repository. Replace with your GitHub organization or username and with your repository name. Write a hello_world.py script and push it to https://github.com////contents/hello_world.py\nl7_decision: deny\ndst_host: api.github.com\ndst_port: 443\nl7_protocol: rest\npolicy: github_rest_api\nl7_deny_reason: PUT /repos///contents/hello_world.py not permitted by policy\nThe log shows that the sandbox proxy intercepted an outbound PUT request to api.github.com and denied it. The github_rest_api policy allows read operations (GET) but blocks write operations (PUT, POST, DELETE) to the GitHub API. A similar denial appears for github.com if Claude attempted a git push over HTTPS. Ask Claude to Check the Sandbox Logs In terminal 1, ask Claude Code to check the sandbox logs for denied requests: Check the sandbox logs for any denied network requests. What is blocking the push\nClaude reads the deny entries and identifies the root cause. It explains that the failure is a sandbox network policy restriction, not a token permissions issue: The sandbox runs a proxy that enforces policies on outbound traffic. The\ngithub_rest_api policy allows GET requests (used to read the file) but blocks\nPUT/write requests to GitHub. This is a sandbox-level restriction, not a token\nissue. No matter what token you provide, pushes through the API will be blocked\nuntil the policy is updated. Both perspectives confirm the same thing: the proxy is doing its job. The default policy is designed to be restrictive. To allow GitHub pushes, you need to update the network policy. Update the Policy from Your Machine In terminal 2, create a policy file that extends the default policy with GitHub write access for your repository. You can ask a coding agent running on your machine, such as Claude Code or Cursor, to generate it from the deny reasons\nThe updated policy should have github_git and github_api blocks that grant write access to your repository. The following is a complete policy example that you can use as a starting point. Expand the dropdown to see the policy. Save it to a file, such as /tmp/sandbox-policy-update.yaml . Full reference policy The following YAML shows a complete policy that extends the default policy with GitHub access for a single repository. Replace with your GitHub organization or username and with your repository name. The filesystem_policy , landlock , and process sections are static. They are read once at sandbox creation and cannot be changed by a hot-reload. They are included here for completeness so the file is self-contained, but only the network_policies section takes effect when you apply this to a running sandbox. version: 1\n── Static (locked at sandbox creation)\nfilesystem_policy\ninclude_workdir: true\nread_only\n/usr\n/lib\n/proc\n/dev/urandom\n/app\n/etc\n/var/log\nread_write\n/sandbox\n/tmp\n/dev/null\nlandlock\ncompatibility: best_effort\nprocess\nrun_as_user: sandbox\nrun_as_group: sandbox\n── Dynamic (hot-reloadable)\nnetwork_policies\nClaude Code ↔ Anthropic API\nclaude_code\nname: claude-code\nendpoints\n{ host: api.anthropic.com, port: 443, protocol: rest, enforcement: enforce, access: full, tls: terminate\n{ host: statsig.anthropic.com, port: 443\n{ host: sentry.io, port: 443\n{ host: raw.githubusercontent.com, port: 443\n{ host: platform.claude.com, port: 443\nbinaries\n{ path: /usr/local/bin/claude\n{ path: /usr/bin/node\nNVIDIA inference endpoint\nnvidia_inference\nname: nvidia-inference\nendpoints\n{ host: integrate.api.nvidia.com, port: 443\nbinaries\n{ path: /usr/bin/curl\n{ path: /bin/bash\n{ path: /usr/local/bin/opencode\n── GitHub: git operations (clone, fetch, push)\ngithub_git\nname: github-git\nendpoints\nhost: github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nallow\nmethod: GET\npath: \"//.git/info/refs\nallow\nmethod: POST\npath: \"//.git/git-upload-pack\nallow\nmethod: POST\npath: \"//.git/git-receive-pack\nbinaries\n{ path: /usr/bin/git\n── GitHub: REST API\ngithub_api\nname: github-api\nendpoints\nhost: api.github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nGraphQL API (used by gh CLI\nallow\nmethod: POST\npath: \"/graphql\nFull read-write access to the repository\nallow\nmethod:\npath: \"/repos// --policy /tmp/sandbox-policy-update.yaml --wait\nTo find the name of your sandbox, check the output from openshell sandbox create or run openshell sandbox list . Network policies are hot-reloadable. The --wait flag blocks until the policy engine confirms the new revision loaded, and the update takes effect immediately without restarting the sandbox or reconnecting Claude Code. Retry the Push In terminal 1, ask Claude Code to retry the push: The sandbox policy has been updated. Try pushing to the repository again\nThe push completes successfully. The openshell term dashboard now shows l7_decision=allow entries for api.github.com and github.com where it previously showed denials. Clean Up When you are finished, delete the sandbox to free cluster resources: $ openshell sandbox delete /.","language":"text"},{"content":"$ openshell term","language":"text"},{"content":"l7_action: PUT\nl7_target: /repos///contents/hello_world.py\nl7_decision: deny\ndst_host: api.github.com\ndst_port: 443\nl7_protocol: rest\npolicy: github_rest_api\nl7_deny_reason: PUT /repos///contents/hello_world.py not permitted by policy","language":"text"},{"content":"Check the sandbox logs for any denied network requests. What is blocking the push?","language":"text"},{"content":"version: 1\n\n# ── Static (locked at sandbox creation) ──────────────────────────\n\nfilesystem_policy:\n include_workdir: true\n read_only:\n - /usr\n - /lib\n - /proc\n - /dev/urandom\n - /app\n - /etc\n - /var/log\n read_write:\n - /sandbox\n - /tmp\n - /dev/null\n\nlandlock:\n compatibility: best_effort\n\nprocess:\n run_as_user: sandbox\n run_as_group: sandbox\n\n# ── Dynamic (hot-reloadable) ─────────────────────────────────────\n\nnetwork_policies:\n\n # Claude Code ↔ Anthropic API\n claude_code:\n name: claude-code\n endpoints:\n - { host: api.anthropic.com, port: 443, protocol: rest, enforcement: enforce, access: full, tls: terminate }\n - { host: statsig.anthropic.com, port: 443 }\n - { host: sentry.io, port: 443 }\n - { host: raw.githubusercontent.com, port: 443 }\n - { host: platform.claude.com, port: 443 }\n binaries:\n - { path: /usr/local/bin/claude }\n - { path: /usr/bin/node }\n\n # NVIDIA inference endpoint\n nvidia_inference:\n name: nvidia-inference\n endpoints:\n - { host: integrate.api.nvidia.com, port: 443 }\n binaries:\n - { path: /usr/bin/curl }\n - { path: /bin/bash }\n - { path: /usr/local/bin/opencode }\n\n # ── GitHub: git operations (clone, fetch, push) ──────────────\n\n github_git:\n name: github-git\n endpoints:\n - host: github.com\n port: 443\n protocol: rest\n tls: terminate\n enforcement: enforce\n rules:\n - allow:\n method: GET\n path: \"//.git/info/refs*\"\n - allow:\n method: POST\n path: \"//.git/git-upload-pack\"\n - allow:\n method: POST\n path: \"//.git/git-receive-pack\"\n binaries:\n - { path: /usr/bin/git }\n\n # ── GitHub: REST API ─────────────────────────────────────────\n\n github_api:\n name: github-api\n endpoints:\n - host: api.github.com\n port: 443\n protocol: rest\n tls: terminate\n enforcement: enforce\n rules:\n # GraphQL API (used by gh CLI)\n - allow:\n method: POST\n path: \"/graphql\"\n # Full read-write access to the repository\n - allow:\n method: \"*\"\n path: \"/repos///**\"\n binaries:\n - { path: /usr/local/bin/claude }\n - { path: /usr/local/bin/opencode }\n - { path: /usr/bin/gh }\n - { path: /usr/bin/curl }\n\n # ── Package managers ─────────────────────────────────────────\n\n pypi:\n name: pypi\n endpoints:\n - { host: pypi.org, port: 443 }\n - { host: files.pythonhosted.org, port: 443 }\n - { host: github.com, port: 443 }\n - { host: objects.githubusercontent.com, port: 443 }\n - { host: api.github.com, port: 443 }\n - { host: downloads.python.org, port: 443 }\n binaries:\n - { path: /sandbox/.venv/bin/python }\n - { path: /sandbox/.venv/bin/python3 }\n - { path: /sandbox/.venv/bin/pip }\n - { path: /app/.venv/bin/python }\n - { path: /app/.venv/bin/python3 }\n - { path: /app/.venv/bin/pip }\n - { path: /usr/local/bin/uv }\n - { path: \"/sandbox/.uv/python/**\" }\n\n # ── VS Code Remote ──────────────────────────────────────────\n\n vscode:\n name: vscode\n endpoints:\n - { host: update.code.visualstudio.com, port: 443 }\n - { host: \"*.vo.msecnd.net\", port: 443 }\n - { host: vscode.download.prss.microsoft.com, port: 443 }\n - { host: marketplace.visualstudio.com, port: 443 }\n - { host: \"*.gallerycdn.vsassets.io\", port: 443 }\n binaries:\n - { path: /usr/bin/curl }\n - { path: /usr/bin/wget }\n - { path: \"/sandbox/.vscode-server/**\" }\n - { path: \"/sandbox/.vscode-remote-containers/**\" }","language":"text"},{"content":"$ openshell policy set --policy /tmp/sandbox-policy-update.yaml --wait","language":"text"},{"content":"The sandbox policy has been updated. Try pushing to the repository again.","language":"text"},{"content":"$ openshell sandbox delete ","language":"text"}],"links":[{"text":"GitHub personal access token settings page","type":"external","url":"https://github.com/settings/tokens"},{"text":"Anthropic account","type":"external","url":"https://console.anthropic.com/"},{"text":"create one","type":"external","url":"https://github.com/new"}],"images":[],"doc_type":"tutorial","section_path":["Tutorials","Github Sandbox"]}] \ No newline at end of file diff --git a/pr-preview/pr-240/inference/configure.json b/pr-preview/pr-240/inference/configure.json index b3369aa5f..3fd0669d4 100644 --- a/pr-preview/pr-240/inference/configure.json +++ b/pr-preview/pr-240/inference/configure.json @@ -1 +1 @@ -{"id":"inference/configure","title":"Configure Inference Routing","url":"inference/configure.html","last_modified":"2026-03-11T21:58:22.058995+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Set up the managed local inference endpoint with provider credentials and model configuration.","tags":["Inference Routing","Configuration","Privacy","LLM","Provider"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Configure Inference Routing This page covers the managed local inference endpoint ( https://inference.local ). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details. The configuration consists of two values: Value Description Provider record The credential backend OpenShell uses to authenticate with the upstream model host. Model ID The model to use for generation requests. Step 1: Create a Provider Create a provider that holds the backend credentials you want OpenShell to use. NVIDIA API Catalog $ openshell provider create --name nvidia-prod --type nvidia --from-existing\nThis reads NVIDIA_API_KEY from your environment. Local / self-hosted endpoint $ openshell provider create\nname my-local-model\ntype openai\ncredential OPENAI_API_KEY=empty-if-not-required\nconfig OPENAI_BASE_URL=http://192.168.10.15/v1\nUse --config OPENAI_BASE_URL to point to any OpenAI-compatible server running on your network. Set OPENAI_API_KEY to a dummy value if the server does not require authentication. Anthropic $ openshell provider create --name anthropic-prod --type anthropic --from-existing\nThis reads ANTHROPIC_API_KEY from your environment. Step 2: Set Inference Routing Point inference.local at that provider and choose the model to use: $ openshell inference set\nprovider nvidia-prod\nmodel nvidia/nemotron-3-nano-30b-a3b\nStep 3: Verify the Active Config Confirm that the provider and model are set correctly: $ openshell inference get\nprovider: nvidia-prod\nmodel: nvidia/nemotron-3-nano-30b-a3b\nversion: 1\nStep 4: Update Part of the Config Use update when you want to change only one field: $ openshell inference update --model nvidia/nemotron-3-nano-30b-a3b\nOr switch providers without repeating the current model: $ openshell inference update --provider openai-prod\nUse It from a Sandbox After inference is configured, code inside any sandbox can call https://inference.local directly: from openai import OpenAI\nclient = OpenAI(base_url=\"https://inference.local/v1\", api_key=\"dummy\nresponse = client.chat.completions.create\nmodel=\"anything\nmessages=[{\"role\": \"user\", \"content\": \"Hello\nThe client-supplied model is ignored for generation requests. OpenShell rewrites it to the configured model before forwarding upstream. Use this endpoint when inference should stay local to the host for privacy and security reasons. External providers that should be reached directly belong in network_policies instead. Verify the Endpoint from a Sandbox openshell inference get confirms the configuration was saved, but does not verify the upstream endpoint is reachable. To confirm end-to-end connectivity, connect to a sandbox and run: curl https://inference.local/v1/responses\nH \"Content-Type: application/json\"\nd\ninstructions\": \"You are a helpful assistant\ninput\": \"Hello\nA successful response confirms the privacy router can reach the configured backend and the model is serving requests. Gateway-scoped — every sandbox on the active gateway sees the same inference.local backend. HTTPS only — inference.local is intercepted only for HTTPS traffic. Next Steps Explore related topics: To understand the inference routing flow and supported API patterns, refer to index . To control external endpoints, refer to Network Access Rules . To manage provider records, refer to ../sandboxes/providers . To view openshell inference commands, refer to ../reference/cli","format":"text","summary":"This page covers the managed local inference endpoint (https://inference.local). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details.","headings":[{"text":"Configure Inference Routing","level":1},{"text":"Step 1: Create a Provider","level":2},{"text":"Step 2: Set Inference Routing","level":2},{"text":"Step 3: Verify the Active Config","level":2},{"text":"Step 4: Update Part of the Config","level":2},{"text":"Use It from a Sandbox","level":2},{"text":"Verify the Endpoint from a Sandbox","level":3},{"text":"Next Steps","level":2}]} \ No newline at end of file +{"id":"inference/configure","title":"Configure Inference Routing","url":"inference/configure.html","last_modified":"2026-03-11T22:04:40.651337+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Set up the managed local inference endpoint with provider credentials and model configuration.","tags":["Inference Routing","Configuration","Privacy","LLM","Provider"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Configure Inference Routing This page covers the managed local inference endpoint ( https://inference.local ). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details. The configuration consists of two values: Value Description Provider record The credential backend OpenShell uses to authenticate with the upstream model host. Model ID The model to use for generation requests. Step 1: Create a Provider Create a provider that holds the backend credentials you want OpenShell to use. NVIDIA API Catalog $ openshell provider create --name nvidia-prod --type nvidia --from-existing\nThis reads NVIDIA_API_KEY from your environment. Local / self-hosted endpoint $ openshell provider create\nname my-local-model\ntype openai\ncredential OPENAI_API_KEY=empty-if-not-required\nconfig OPENAI_BASE_URL=http://192.168.10.15/v1\nUse --config OPENAI_BASE_URL to point to any OpenAI-compatible server running on your network. Set OPENAI_API_KEY to a dummy value if the server does not require authentication. Anthropic $ openshell provider create --name anthropic-prod --type anthropic --from-existing\nThis reads ANTHROPIC_API_KEY from your environment. Step 2: Set Inference Routing Point inference.local at that provider and choose the model to use: $ openshell inference set\nprovider nvidia-prod\nmodel nvidia/nemotron-3-nano-30b-a3b\nStep 3: Verify the Active Config Confirm that the provider and model are set correctly: $ openshell inference get\nprovider: nvidia-prod\nmodel: nvidia/nemotron-3-nano-30b-a3b\nversion: 1\nStep 4: Update Part of the Config Use update when you want to change only one field: $ openshell inference update --model nvidia/nemotron-3-nano-30b-a3b\nOr switch providers without repeating the current model: $ openshell inference update --provider openai-prod\nUse It from a Sandbox After inference is configured, code inside any sandbox can call https://inference.local directly: from openai import OpenAI\nclient = OpenAI(base_url=\"https://inference.local/v1\", api_key=\"dummy\nresponse = client.chat.completions.create\nmodel=\"anything\nmessages=[{\"role\": \"user\", \"content\": \"Hello\nThe client-supplied model is ignored for generation requests. OpenShell rewrites it to the configured model before forwarding upstream. Use this endpoint when inference should stay local to the host for privacy and security reasons. External providers that should be reached directly belong in network_policies instead. Verify the Endpoint from a Sandbox openshell inference get confirms the configuration was saved, but does not verify the upstream endpoint is reachable. To confirm end-to-end connectivity, connect to a sandbox and run: curl https://inference.local/v1/responses\nH \"Content-Type: application/json\"\nd\ninstructions\": \"You are a helpful assistant\ninput\": \"Hello\nA successful response confirms the privacy router can reach the configured backend and the model is serving requests. Gateway-scoped — every sandbox on the active gateway sees the same inference.local backend. HTTPS only — inference.local is intercepted only for HTTPS traffic. Next Steps Explore related topics: To understand the inference routing flow and supported API patterns, refer to index . To control external endpoints, refer to Network Access Rules . To manage provider records, refer to ../sandboxes/providers . To view openshell inference commands, refer to ../reference/cli","format":"text","summary":"This page covers the managed local inference endpoint (https://inference.local). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details.","headings":[{"text":"Configure Inference Routing","level":1},{"text":"Step 1: Create a Provider","level":2},{"text":"Step 2: Set Inference Routing","level":2},{"text":"Step 3: Verify the Active Config","level":2},{"text":"Step 4: Update Part of the Config","level":2},{"text":"Use It from a Sandbox","level":2},{"text":"Verify the Endpoint from a Sandbox","level":3},{"text":"Next Steps","level":2}]} \ No newline at end of file diff --git a/pr-preview/pr-240/inference/index.json b/pr-preview/pr-240/inference/index.json index 147cb4fe6..eabe0c246 100644 --- a/pr-preview/pr-240/inference/index.json +++ b/pr-preview/pr-240/inference/index.json @@ -1 +1 @@ -{"id":"inference/index","title":"About Inference Routing","url":"inference/index.html","last_modified":"2026-03-11T21:58:22.091389+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Understand how OpenShell routes inference traffic through external endpoints and the local privacy router.","tags":["Inference Routing","Privacy","AI Agents","LLM"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"About Inference Routing OpenShell handles inference in two ways: Path How It Works External endpoints Traffic to hosts like api.openai.com or api.anthropic.com is treated like any other outbound request — allowed or denied by network_policies . Refer to Network Access Rules . inference.local A special endpoint exposed inside every sandbox for inference that should stay local to the host for privacy and security. The privacy router strips the original credentials, injects the configured backend credentials, and forwards to the managed model endpoint. How inference.local Works When code inside a sandbox calls https://inference.local , the privacy router routes the request to the configured backend for that gateway. The configured model is applied to generation requests, and provider credentials are supplied by OpenShell rather than by code inside the sandbox. If code calls an external inference host directly, that traffic is evaluated only by network_policies . Property Detail Credentials No sandbox API keys needed — credentials come from the configured provider record. Configuration One provider and one model define sandbox inference. Provider support OpenAI, Anthropic, and NVIDIA providers all work through the same endpoint. Hot-refresh Provider credential changes and inference updates are picked up without recreating sandboxes. Supported API Patterns Supported request patterns depend on the provider configured for inference.local . OpenAI-compatible Pattern Method Path Chat Completions POST /v1/chat/completions Completions POST /v1/completions Responses POST /v1/responses Model Discovery GET /v1/models Model Discovery GET /v1/models/* Anthropic-compatible Pattern Method Path Messages POST /v1/messages Requests to inference.local that do not match the configured provider’s supported patterns are denied. Next Steps Continue with one of the following: To set up the backend behind inference.local , refer to configure . To control external endpoints, refer to Network Access Rules","format":"text","summary":"Traffic to hosts like api.openai.com or api.anthropic.com is treated like any other outbound request — allowed or denied by network_policies. Refer to Network Access Rules.","headings":[{"text":"About Inference Routing","level":1},{"text":"How inference.local Works","level":2},{"text":"Supported API Patterns","level":2},{"text":"Next Steps","level":2}],"children":[{"id":"inference/configure","title":"Configure Inference Routing","url":"inference/configure.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Set up the managed local inference endpoint with provider credentials and model configuration.","tags":["Inference Routing","Configuration","Privacy","LLM","Provider"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Configure Inference Routing This page covers the managed local inference endpoint ( https://inference.local ). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details. The configuration consists of two values: Value Description Provider record The credential backend OpenShell uses to authenticate with the upstream model host. Model ID The model to use for generation requests. Step 1: Create a Provider Create a provider that holds the backend credentials you want OpenShell to use. NVIDIA API Catalog $ openshell provider create --name nvidia-prod --type nvidia --from-existing\nThis reads NVIDIA_API_KEY from your environment. Local / self-hosted endpoint $ openshell provider create\nname my-local-model\ntype openai\ncredential OPENAI_API_KEY=empty-if-not-required\nconfig OPENAI_BASE_URL=http://192.168.10.15/v1\nUse --config OPENAI_BASE_URL to point to any OpenAI-compatible server running on your network. Set OPENAI_API_KEY to a dummy value if the server does not require authentication. Anthropic $ openshell provider create --name anthropic-prod --type anthropic --from-existing\nThis reads ANTHROPIC_API_KEY from your environment. Step 2: Set Inference Routing Point inference.local at that provider and choose the model to use: $ openshell inference set\nprovider nvidia-prod\nmodel nvidia/nemotron-3-nano-30b-a3b\nStep 3: Verify the Active Config Confirm that the provider and model are set correctly: $ openshell inference get\nprovider: nvidia-prod\nmodel: nvidia/nemotron-3-nano-30b-a3b\nversion: 1\nStep 4: Update Part of the Config Use update when you want to change only one field: $ openshell inference update --model nvidia/nemotron-3-nano-30b-a3b\nOr switch providers without repeating the current model: $ openshell inference update --provider openai-prod\nUse It from a Sandbox After inference is configured, code inside any sandbox can call https://inference.local directly: from openai import OpenAI\nclient = OpenAI(base_url=\"https://inference.local/v1\", api_key=\"dummy\nresponse = client.chat.completions.create\nmodel=\"anything\nmessages=[{\"role\": \"user\", \"content\": \"Hello\nThe client-supplied model is ignored for generation requests. OpenShell rewrites it to the configured model before forwarding upstream. Use this endpoint when inference should stay local to the host for privacy and security reasons. External providers that should be reached directly belong in network_policies instead. Verify the Endpoint from a Sandbox openshell inference get confirms the configuration was saved, but does not verify the upstream endpoint is reachable. To confirm end-to-end connectivity, connect to a sandbox and run: curl https://inference.local/v1/responses\nH \"Content-Type: application/json\"\nd\ninstructions\": \"You are a helpful assistant\ninput\": \"Hello\nA successful response confirms the privacy router can reach the configured backend and the model is serving requests. Gateway-scoped — every sandbox on the active gateway sees the same inference.local backend. HTTPS only — inference.local is intercepted only for HTTPS traffic. Next Steps Explore related topics: To understand the inference routing flow and supported API patterns, refer to index . To control external endpoints, refer to Network Access Rules . To manage provider records, refer to ../sandboxes/providers . To view openshell inference commands, refer to ../reference/cli","format":"text","content_length":3402,"word_count":451,"summary":"This page covers the managed local inference endpoint (https://inference.local). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details.","headings":[{"text":"Configure Inference Routing","level":1,"id":"configure-inference-routing"},{"text":"Step 1: Create a Provider","level":2,"id":"step-1-create-a-provider"},{"text":"Step 2: Set Inference Routing","level":2,"id":"step-2-set-inference-routing"},{"text":"Step 3: Verify the Active Config","level":2,"id":"step-3-verify-the-active-config"},{"text":"Step 4: Update Part of the Config","level":2,"id":"step-4-update-part-of-the-config"},{"text":"Use It from a Sandbox","level":2,"id":"use-it-from-a-sandbox"},{"text":"Verify the Endpoint from a Sandbox","level":3,"id":"verify-the-endpoint-from-a-sandbox"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Configure Inference Routing Step 1: Create a Provider Step 2: Set Inference Routing Step 3: Verify the Active Config Step 4: Update Part of the Config Use It from a Sandbox Verify the Endpoint from a Sandbox Next Steps","keywords":["access","active","after","anthropic","api_key","base_url","catalog","chat","client","config","configure","confirm","content","correctly","create","description","directly","endpoint","explore","external","field","from","gateway","hello","http","https","inference","local","messages","model","network","next","openai","openshell","part","point","provider","response","routing","rules","run","sandbox","set","step","steps","this","topics","type","update","user"],"code_blocks":[{"content":"$ openshell provider create --name nvidia-prod --type nvidia --from-existing","language":"text"},{"content":"$ openshell provider create \\\n --name my-local-model \\\n --type openai \\\n --credential OPENAI_API_KEY=empty-if-not-required \\\n --config OPENAI_BASE_URL=http://192.168.10.15/v1","language":"text"},{"content":"$ openshell provider create --name anthropic-prod --type anthropic --from-existing","language":"text"},{"content":"$ openshell inference set \\\n --provider nvidia-prod \\\n --model nvidia/nemotron-3-nano-30b-a3b","language":"text"},{"content":"$ openshell inference get\nprovider: nvidia-prod\nmodel: nvidia/nemotron-3-nano-30b-a3b\nversion: 1","language":"text"},{"content":"$ openshell inference update --model nvidia/nemotron-3-nano-30b-a3b","language":"text"},{"content":"$ openshell inference update --provider openai-prod","language":"text"},{"content":"from openai import OpenAI\n\nclient = OpenAI(base_url=\"https://inference.local/v1\", api_key=\"dummy\")\n\nresponse = client.chat.completions.create(\n model=\"anything\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\n)","language":"text"},{"content":"curl https://inference.local/v1/responses \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"instructions\": \"You are a helpful assistant.\",\n \"input\": \"Hello!\"\n }'","language":"text"}],"links":[],"images":[],"doc_type":"tutorial","section_path":["Inference","Configure"]}]} \ No newline at end of file +{"id":"inference/index","title":"About Inference Routing","url":"inference/index.html","last_modified":"2026-03-11T22:04:40.601103+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Understand how OpenShell routes inference traffic through external endpoints and the local privacy router.","tags":["Inference Routing","Privacy","AI Agents","LLM"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"About Inference Routing OpenShell handles inference in two ways: Path How It Works External endpoints Traffic to hosts like api.openai.com or api.anthropic.com is treated like any other outbound request — allowed or denied by network_policies . Refer to Network Access Rules . inference.local A special endpoint exposed inside every sandbox for inference that should stay local to the host for privacy and security. The privacy router strips the original credentials, injects the configured backend credentials, and forwards to the managed model endpoint. How inference.local Works When code inside a sandbox calls https://inference.local , the privacy router routes the request to the configured backend for that gateway. The configured model is applied to generation requests, and provider credentials are supplied by OpenShell rather than by code inside the sandbox. If code calls an external inference host directly, that traffic is evaluated only by network_policies . Property Detail Credentials No sandbox API keys needed — credentials come from the configured provider record. Configuration One provider and one model define sandbox inference. Provider support OpenAI, Anthropic, and NVIDIA providers all work through the same endpoint. Hot-refresh Provider credential changes and inference updates are picked up without recreating sandboxes. Supported API Patterns Supported request patterns depend on the provider configured for inference.local . OpenAI-compatible Pattern Method Path Chat Completions POST /v1/chat/completions Completions POST /v1/completions Responses POST /v1/responses Model Discovery GET /v1/models Model Discovery GET /v1/models/* Anthropic-compatible Pattern Method Path Messages POST /v1/messages Requests to inference.local that do not match the configured provider’s supported patterns are denied. Next Steps Continue with one of the following: To set up the backend behind inference.local , refer to configure . To control external endpoints, refer to Network Access Rules","format":"text","summary":"Traffic to hosts like api.openai.com or api.anthropic.com is treated like any other outbound request — allowed or denied by network_policies. Refer to Network Access Rules.","headings":[{"text":"About Inference Routing","level":1},{"text":"How inference.local Works","level":2},{"text":"Supported API Patterns","level":2},{"text":"Next Steps","level":2}],"children":[{"id":"inference/configure","title":"Configure Inference Routing","url":"inference/configure.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Set up the managed local inference endpoint with provider credentials and model configuration.","tags":["Inference Routing","Configuration","Privacy","LLM","Provider"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Configure Inference Routing This page covers the managed local inference endpoint ( https://inference.local ). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details. The configuration consists of two values: Value Description Provider record The credential backend OpenShell uses to authenticate with the upstream model host. Model ID The model to use for generation requests. Step 1: Create a Provider Create a provider that holds the backend credentials you want OpenShell to use. NVIDIA API Catalog $ openshell provider create --name nvidia-prod --type nvidia --from-existing\nThis reads NVIDIA_API_KEY from your environment. Local / self-hosted endpoint $ openshell provider create\nname my-local-model\ntype openai\ncredential OPENAI_API_KEY=empty-if-not-required\nconfig OPENAI_BASE_URL=http://192.168.10.15/v1\nUse --config OPENAI_BASE_URL to point to any OpenAI-compatible server running on your network. Set OPENAI_API_KEY to a dummy value if the server does not require authentication. Anthropic $ openshell provider create --name anthropic-prod --type anthropic --from-existing\nThis reads ANTHROPIC_API_KEY from your environment. Step 2: Set Inference Routing Point inference.local at that provider and choose the model to use: $ openshell inference set\nprovider nvidia-prod\nmodel nvidia/nemotron-3-nano-30b-a3b\nStep 3: Verify the Active Config Confirm that the provider and model are set correctly: $ openshell inference get\nprovider: nvidia-prod\nmodel: nvidia/nemotron-3-nano-30b-a3b\nversion: 1\nStep 4: Update Part of the Config Use update when you want to change only one field: $ openshell inference update --model nvidia/nemotron-3-nano-30b-a3b\nOr switch providers without repeating the current model: $ openshell inference update --provider openai-prod\nUse It from a Sandbox After inference is configured, code inside any sandbox can call https://inference.local directly: from openai import OpenAI\nclient = OpenAI(base_url=\"https://inference.local/v1\", api_key=\"dummy\nresponse = client.chat.completions.create\nmodel=\"anything\nmessages=[{\"role\": \"user\", \"content\": \"Hello\nThe client-supplied model is ignored for generation requests. OpenShell rewrites it to the configured model before forwarding upstream. Use this endpoint when inference should stay local to the host for privacy and security reasons. External providers that should be reached directly belong in network_policies instead. Verify the Endpoint from a Sandbox openshell inference get confirms the configuration was saved, but does not verify the upstream endpoint is reachable. To confirm end-to-end connectivity, connect to a sandbox and run: curl https://inference.local/v1/responses\nH \"Content-Type: application/json\"\nd\ninstructions\": \"You are a helpful assistant\ninput\": \"Hello\nA successful response confirms the privacy router can reach the configured backend and the model is serving requests. Gateway-scoped — every sandbox on the active gateway sees the same inference.local backend. HTTPS only — inference.local is intercepted only for HTTPS traffic. Next Steps Explore related topics: To understand the inference routing flow and supported API patterns, refer to index . To control external endpoints, refer to Network Access Rules . To manage provider records, refer to ../sandboxes/providers . To view openshell inference commands, refer to ../reference/cli","format":"text","content_length":3402,"word_count":451,"summary":"This page covers the managed local inference endpoint (https://inference.local). External inference endpoints go through sandbox network_policies — refer to Network Access Rules for details.","headings":[{"text":"Configure Inference Routing","level":1,"id":"configure-inference-routing"},{"text":"Step 1: Create a Provider","level":2,"id":"step-1-create-a-provider"},{"text":"Step 2: Set Inference Routing","level":2,"id":"step-2-set-inference-routing"},{"text":"Step 3: Verify the Active Config","level":2,"id":"step-3-verify-the-active-config"},{"text":"Step 4: Update Part of the Config","level":2,"id":"step-4-update-part-of-the-config"},{"text":"Use It from a Sandbox","level":2,"id":"use-it-from-a-sandbox"},{"text":"Verify the Endpoint from a Sandbox","level":3,"id":"verify-the-endpoint-from-a-sandbox"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Configure Inference Routing Step 1: Create a Provider Step 2: Set Inference Routing Step 3: Verify the Active Config Step 4: Update Part of the Config Use It from a Sandbox Verify the Endpoint from a Sandbox Next Steps","keywords":["access","active","after","anthropic","api_key","base_url","catalog","chat","client","config","configure","confirm","content","correctly","create","description","directly","endpoint","explore","external","field","from","gateway","hello","http","https","inference","local","messages","model","network","next","openai","openshell","part","point","provider","response","routing","rules","run","sandbox","set","step","steps","this","topics","type","update","user"],"code_blocks":[{"content":"$ openshell provider create --name nvidia-prod --type nvidia --from-existing","language":"text"},{"content":"$ openshell provider create \\\n --name my-local-model \\\n --type openai \\\n --credential OPENAI_API_KEY=empty-if-not-required \\\n --config OPENAI_BASE_URL=http://192.168.10.15/v1","language":"text"},{"content":"$ openshell provider create --name anthropic-prod --type anthropic --from-existing","language":"text"},{"content":"$ openshell inference set \\\n --provider nvidia-prod \\\n --model nvidia/nemotron-3-nano-30b-a3b","language":"text"},{"content":"$ openshell inference get\nprovider: nvidia-prod\nmodel: nvidia/nemotron-3-nano-30b-a3b\nversion: 1","language":"text"},{"content":"$ openshell inference update --model nvidia/nemotron-3-nano-30b-a3b","language":"text"},{"content":"$ openshell inference update --provider openai-prod","language":"text"},{"content":"from openai import OpenAI\n\nclient = OpenAI(base_url=\"https://inference.local/v1\", api_key=\"dummy\")\n\nresponse = client.chat.completions.create(\n model=\"anything\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\n)","language":"text"},{"content":"curl https://inference.local/v1/responses \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"instructions\": \"You are a helpful assistant.\",\n \"input\": \"Hello!\"\n }'","language":"text"}],"links":[],"images":[],"doc_type":"tutorial","section_path":["Inference","Configure"]}]} \ No newline at end of file diff --git a/pr-preview/pr-240/reference/cli.json b/pr-preview/pr-240/reference/cli.json index 5f493fc3b..57c253554 100644 --- a/pr-preview/pr-240/reference/cli.json +++ b/pr-preview/pr-240/reference/cli.json @@ -1 +1 @@ -{"id":"reference/cli","title":"CLI Reference","url":"reference/cli.html","last_modified":"2026-03-11T21:58:22.069261+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Complete command reference for the openshell CLI including all subcommands, flags, and environment variables.","tags":["CLI","Reference","Commands","AI Agents"],"topics":["Generative AI","Cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"CLI Reference Complete command reference for the openshell CLI. Every subcommand, flag, and option is documented here. Command Tree The full hierarchy of openshell subcommands: openshell\nstatus\nlogs [name\nterm\nforward\n├── start [--all\n├── connect [name\n├── upload [name\n├── download [name\n└── ssh-config Register an existing remote gateway by URL. openshell gateway tunnel Set up a kubectl tunnel to a remote cluster. openshell gateway select Set the active cluster. All subsequent commands target this cluster. openshell gateway select List all registered clusters (when called without a name). Sandbox Commands Create and manage isolated agent execution environments. Command Description openshell sandbox create Create a new sandbox. Refer to the flag reference below. openshell sandbox get [name] Show detailed information about a sandbox. openshell sandbox list List all sandboxes in the active cluster. openshell sandbox delete Delete one or more sandboxes by name. Use --all to delete every sandbox in the active gateway. openshell sandbox connect [name] Open an interactive SSH session into a running sandbox. openshell sandbox upload [name] Upload files from the host into a sandbox. openshell sandbox download [name] Download files from a sandbox to the host. openshell sandbox ssh-config Print SSH config for a sandbox. Append to ~/.ssh/config for VS Code Remote-SSH. Sandbox Create Flags The following flags control sandbox creation: Flag Description --name Assign a human-readable name to the sandbox. Auto-generated if omitted. --provider Attach a credential provider. Repeatable for multiple providers. --policy Path to a policy YAML file to apply at creation time. --upload Upload local files into the sandbox before running. --keep Keep the sandbox alive after the trailing command exits. --forward Forward a local port into the sandbox at startup. --from Build from a community sandbox name, local Dockerfile directory, or container image reference. -- The command to run inside the sandbox. Everything after -- is passed as the agent command. Policy Commands Apply and inspect sandbox policies at runtime. Command Description openshell policy set Apply or update a policy on a running sandbox. Pass --policy . openshell policy get Show the active policy for a sandbox. Add --full for the complete policy with metadata. openshell policy list List all policy versions applied to a sandbox, with status. Port Forwarding Commands Forward sandbox ports to the host for local access. Command Description openshell forward start Forward a sandbox port to the host. Add -d for background mode. openshell forward stop Stop an active port forward. openshell forward list List all active port forwards. Provider Commands Manage credential providers that inject secrets into sandboxes. Command Description openshell provider create Create a new credential provider. Refer to the flag reference below. openshell provider get Show details of a provider. openshell provider list List all providers in the active cluster. openshell provider update Update a provider’s credentials or configuration. openshell provider delete Delete a provider. Provider Create Flags The following flags control provider creation: Flag Description --name Name for the provider. --type Provider type: claude , codex , opencode , github , gitlab , nvidia , generic , outlook . --from-existing Discover credentials from your current shell environment variables. --credential Set a credential explicitly. Format: KEY=VALUE or bare KEY to read from env. Repeatable. --config Set a configuration value. Format: KEY=VALUE . Repeatable. Inference Commands Configure the backend used by https://inference.local . openshell inference set Set the provider and model for managed inference. Both flags are required. Flag Description --provider Provider record name to use for injected credentials. --model Model identifier to force on generation requests. openshell inference update Update only the fields you specify. Flag Description --provider Replace the current provider record. --model Replace the current model ID. openshell inference get Show the current inference configuration, including provider, model, and version. Environment Variables The following environment variables override CLI defaults: Variable Description OPENSHELL_GATEWAY Name of the gateway to operate on. Overrides the active gateway set by openshell gateway select . OPENSHELL_SANDBOX_POLICY Default path to a policy YAML file. When set, openshell sandbox create uses this policy if no --policy flag is provided. Shell Completions Generate shell completion scripts for tab completion: $ openshell completions bash\nopenshell completions zsh\nopenshell completions fish\nPipe the output to your shell’s config file: $ openshell completions zsh >> ~/.zshrc\nsource ~/.zshrc\nBuilt-in Help Every command and subcommand includes built-in help. Use --help at any level to see available subcommands, flags, and usage examples: $ openshell --help\nopenshell sandbox --help\nopenshell sandbox create --help\nopenshell gateway --help\nHelp output groups flags under distinct headings: FLAGS for command-specific options, GATEWAY FLAGS for --gateway and --gateway-endpoint , and GLOBAL FLAGS for --verbose , --help , and --version","format":"text","summary":"Complete command reference for the openshell CLI. Every subcommand, flag, and option is documented here.","headings":[{"text":"CLI Reference","level":1},{"text":"Command Tree","level":2},{"text":"Status, Logs, and Terminal","level":2},{"text":"Gateway Commands","level":2},{"text":"Sandbox Commands","level":2},{"text":"Sandbox Create Flags","level":3},{"text":"Policy Commands","level":2},{"text":"Port Forwarding Commands","level":2},{"text":"Provider Commands","level":2},{"text":"Provider Create Flags","level":3},{"text":"Inference Commands","level":2},{"text":"openshell inference set","level":3},{"text":"openshell inference update","level":3},{"text":"openshell inference get","level":3},{"text":"Environment Variables","level":2},{"text":"Shell Completions","level":2},{"text":"Built-in Help","level":2}]} \ No newline at end of file +{"id":"reference/cli","title":"CLI Reference","url":"reference/cli.html","last_modified":"2026-03-11T22:04:40.632357+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Complete command reference for the openshell CLI including all subcommands, flags, and environment variables.","tags":["CLI","Reference","Commands","AI Agents"],"topics":["Generative AI","Cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"CLI Reference Complete command reference for the openshell CLI. Every subcommand, flag, and option is documented here. Command Tree The full hierarchy of openshell subcommands: openshell\nstatus\nlogs [name\nterm\nforward\n├── start [--all\n├── connect [name\n├── upload [name\n├── download [name\n└── ssh-config Register an existing remote gateway by URL. openshell gateway tunnel Set up a kubectl tunnel to a remote cluster. openshell gateway select Set the active cluster. All subsequent commands target this cluster. openshell gateway select List all registered clusters (when called without a name). Sandbox Commands Create and manage isolated agent execution environments. Command Description openshell sandbox create Create a new sandbox. Refer to the flag reference below. openshell sandbox get [name] Show detailed information about a sandbox. openshell sandbox list List all sandboxes in the active cluster. openshell sandbox delete Delete one or more sandboxes by name. Use --all to delete every sandbox in the active gateway. openshell sandbox connect [name] Open an interactive SSH session into a running sandbox. openshell sandbox upload [name] Upload files from the host into a sandbox. openshell sandbox download [name] Download files from a sandbox to the host. openshell sandbox ssh-config Print SSH config for a sandbox. Append to ~/.ssh/config for VS Code Remote-SSH. Sandbox Create Flags The following flags control sandbox creation: Flag Description --name Assign a human-readable name to the sandbox. Auto-generated if omitted. --provider Attach a credential provider. Repeatable for multiple providers. --policy Path to a policy YAML file to apply at creation time. --upload Upload local files into the sandbox before running. --keep Keep the sandbox alive after the trailing command exits. --forward Forward a local port into the sandbox at startup. --from Build from a community sandbox name, local Dockerfile directory, or container image reference. -- The command to run inside the sandbox. Everything after -- is passed as the agent command. Policy Commands Apply and inspect sandbox policies at runtime. Command Description openshell policy set Apply or update a policy on a running sandbox. Pass --policy . openshell policy get Show the active policy for a sandbox. Add --full for the complete policy with metadata. openshell policy list List all policy versions applied to a sandbox, with status. Port Forwarding Commands Forward sandbox ports to the host for local access. Command Description openshell forward start Forward a sandbox port to the host. Add -d for background mode. openshell forward stop Stop an active port forward. openshell forward list List all active port forwards. Provider Commands Manage credential providers that inject secrets into sandboxes. Command Description openshell provider create Create a new credential provider. Refer to the flag reference below. openshell provider get Show details of a provider. openshell provider list List all providers in the active cluster. openshell provider update Update a provider’s credentials or configuration. openshell provider delete Delete a provider. Provider Create Flags The following flags control provider creation: Flag Description --name Name for the provider. --type Provider type: claude , codex , opencode , github , gitlab , nvidia , generic , outlook . --from-existing Discover credentials from your current shell environment variables. --credential Set a credential explicitly. Format: KEY=VALUE or bare KEY to read from env. Repeatable. --config Set a configuration value. Format: KEY=VALUE . Repeatable. Inference Commands Configure the backend used by https://inference.local . openshell inference set Set the provider and model for managed inference. Both flags are required. Flag Description --provider Provider record name to use for injected credentials. --model Model identifier to force on generation requests. openshell inference update Update only the fields you specify. Flag Description --provider Replace the current provider record. --model Replace the current model ID. openshell inference get Show the current inference configuration, including provider, model, and version. Environment Variables The following environment variables override CLI defaults: Variable Description OPENSHELL_GATEWAY Name of the gateway to operate on. Overrides the active gateway set by openshell gateway select . OPENSHELL_SANDBOX_POLICY Default path to a policy YAML file. When set, openshell sandbox create uses this policy if no --policy flag is provided. Shell Completions Generate shell completion scripts for tab completion: $ openshell completions bash\nopenshell completions zsh\nopenshell completions fish\nPipe the output to your shell’s config file: $ openshell completions zsh >> ~/.zshrc\nsource ~/.zshrc\nBuilt-in Help Every command and subcommand includes built-in help. Use --help at any level to see available subcommands, flags, and usage examples: $ openshell --help\nopenshell sandbox --help\nopenshell sandbox create --help\nopenshell gateway --help\nHelp output groups flags under distinct headings: FLAGS for command-specific options, GATEWAY FLAGS for --gateway and --gateway-endpoint , and GLOBAL FLAGS for --verbose , --help , and --version","format":"text","summary":"Complete command reference for the openshell CLI. Every subcommand, flag, and option is documented here.","headings":[{"text":"CLI Reference","level":1},{"text":"Command Tree","level":2},{"text":"Status, Logs, and Terminal","level":2},{"text":"Gateway Commands","level":2},{"text":"Sandbox Commands","level":2},{"text":"Sandbox Create Flags","level":3},{"text":"Policy Commands","level":2},{"text":"Port Forwarding Commands","level":2},{"text":"Provider Commands","level":2},{"text":"Provider Create Flags","level":3},{"text":"Inference Commands","level":2},{"text":"openshell inference set","level":3},{"text":"openshell inference update","level":3},{"text":"openshell inference get","level":3},{"text":"Environment Variables","level":2},{"text":"Shell Completions","level":2},{"text":"Built-in Help","level":2}]} \ No newline at end of file diff --git a/pr-preview/pr-240/reference/default-policy.json b/pr-preview/pr-240/reference/default-policy.json index 3ea4a52dd..ae4747e3b 100644 --- a/pr-preview/pr-240/reference/default-policy.json +++ b/pr-preview/pr-240/reference/default-policy.json @@ -1 +1 @@ -{"id":"reference/default-policy","title":"Default Policy Reference","url":"reference/default-policy.html","last_modified":"2026-03-11T21:58:22.101053+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Breakdown of the built-in default policy applied when you create an OpenShell sandbox without a custom policy.","tags":["ai_agents","sandboxing","security","policy"],"topics":["generative_ai","cybersecurity"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"keywords":["openshell default policy","sandbox policy","agent compatibility"],"content":"Default Policy Reference The default policy is the policy applied when you create an OpenShell sandbox without --policy . It is defined in the deploy/docker/sandbox/dev-sandbox-policy.yaml file. Agent Compatibility The following table shows the coverage of the default policy for common agents. Agent Coverage Action Required Claude Code Full None. Works out of the box. OpenCode Partial Add opencode.ai endpoint and OpenCode binary paths. Codex None Provide a complete custom policy with OpenAI endpoints and Codex binary paths. If you run a non-Claude agent without a custom policy, the agent’s API calls are denied by the proxy. You must provide a policy that declares the agent’s endpoints and binaries. Default Policy Blocks The following tables show the default policy blocks pre-configured in the file.

Filesystem, Landlock, and ProcessNetwork Policy BlocksAnthropic API and TelemetryGit Clone and FetchNVIDIA API CatalogGitHub API (Read-Only)Python Package InstallationVS Code Remote and MarketplaceFilesystem, Landlock, and ProcessNetwork Policy BlocksAnthropic API and TelemetryGit Clone and FetchNVIDIA API CatalogGitHub API (Read-Only)Python Package InstallationVS Code Remote and Marketplace The cluster image is based on rancher/k3s:v1.35.2-k3s1 and bundles the Helm charts and Kubernetes manifests required to bootstrap the control plane. The server and sandbox images are pulled separately at runtime. To override the default image references, set the following environment variables: Variable Purpose OPENSHELL_CLUSTER_IMAGE Override the cluster image reference. OPENSHELL_COMMUNITY_REGISTRY Override the registry for community sandbox images. Kernel Requirements OpenShell enforces sandbox isolation through two Linux kernel security modules: Module Requirement Details Landlock LSM Recommended Enforces filesystem access restrictions at the kernel level. The best_effort compatibility mode uses the highest Landlock ABI the host kernel supports. The hard_requirement mode fails sandbox creation if the required ABI is unavailable. seccomp Required Filters dangerous system calls. Available on all modern Linux kernels (3.17+). On macOS, these kernel modules run inside the Docker Desktop Linux VM, not on the host kernel. Agent Compatibility For the full list of supported agents and their default policy coverage, refer to the Supported Agents table","format":"text","summary":"This page lists the platform, software, runtime, and kernel requirements for running OpenShell.","headings":[{"text":"Support Matrix","level":1},{"text":"Supported Platforms","level":2},{"text":"Software Prerequisites","level":2},{"text":"Sandbox Runtime Versions","level":2},{"text":"Container Images","level":2},{"text":"Kernel Requirements","level":2},{"text":"Agent Compatibility","level":2}]} \ No newline at end of file +{"id":"reference/support-matrix","title":"Support Matrix","url":"reference/support-matrix.html","last_modified":"2026-03-11T22:04:40.619937+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"content":"Support Matrix This page lists the platform, software, runtime, and kernel requirements for running OpenShell. Supported Platforms OpenShell publishes multi-architecture container images for linux/amd64 and linux/arm64 . The CLI is supported on the following host platforms: Platform Architecture Status Linux (Debian/Ubuntu) x86_64 (amd64) Supported Linux (Debian/Ubuntu) aarch64 (arm64) Supported macOS (Docker Desktop) Apple Silicon (arm64) Supported macOS (Docker Desktop) Intel (amd64) Supported Windows (WSL 2 + Docker Desktop) x86_64 Untested Software Prerequisites The following software must be installed on the host before using the OpenShell CLI: Component Minimum Version Notes Python 3.12 Python 3.12 and 3.13 are supported. uv 0.9 Used to install the CLI ( uv pip install openshell ). Docker Desktop or Docker Engine — Must be running before any openshell command. No minimum version is enforced. Sandbox Runtime Versions The base sandbox container image ships the following components. These versions apply to sandboxes created with the default image ( ghcr.io/nvidia/openshell/sandbox ). Component Version Base OS Debian Bookworm Python 3.12.13 Node.js 22.22.1 npm 11.11.0 uv 0.10.8 Claude Code Latest (installed at image build time) OpenCode 1.2.18 Codex 0.111.0 Container Images OpenShell uses several container images that are pulled automatically during gateway startup and sandbox creation. All images are published for linux/amd64 and linux/arm64 . Image Registry Reference Pulled When Cluster ghcr.io ghcr.io/nvidia/openshell/cluster:latest openshell gateway start Server ghcr.io ghcr.io/nvidia/openshell/server:latest Cluster startup (via Helm chart) Sandbox ghcr.io ghcr.io/nvidia/openshell/sandbox:latest First sandbox creation (via Helm chart) Community sandboxes GHCR ghcr.io/nvidia/openshell-community/sandboxes/{name}:latest openshell sandbox create --from The cluster image is based on rancher/k3s:v1.35.2-k3s1 and bundles the Helm charts and Kubernetes manifests required to bootstrap the control plane. The server and sandbox images are pulled separately at runtime. To override the default image references, set the following environment variables: Variable Purpose OPENSHELL_CLUSTER_IMAGE Override the cluster image reference. OPENSHELL_COMMUNITY_REGISTRY Override the registry for community sandbox images. Kernel Requirements OpenShell enforces sandbox isolation through two Linux kernel security modules: Module Requirement Details Landlock LSM Recommended Enforces filesystem access restrictions at the kernel level. The best_effort compatibility mode uses the highest Landlock ABI the host kernel supports. The hard_requirement mode fails sandbox creation if the required ABI is unavailable. seccomp Required Filters dangerous system calls. Available on all modern Linux kernels (3.17+). On macOS, these kernel modules run inside the Docker Desktop Linux VM, not on the host kernel. Agent Compatibility For the full list of supported agents and their default policy coverage, refer to the Supported Agents table","format":"text","summary":"This page lists the platform, software, runtime, and kernel requirements for running OpenShell.","headings":[{"text":"Support Matrix","level":1},{"text":"Supported Platforms","level":2},{"text":"Software Prerequisites","level":2},{"text":"Sandbox Runtime Versions","level":2},{"text":"Container Images","level":2},{"text":"Kernel Requirements","level":2},{"text":"Agent Compatibility","level":2}]} \ No newline at end of file diff --git a/pr-preview/pr-240/resources/eula.json b/pr-preview/pr-240/resources/eula.json index 807a1a49d..39afe62fc 100644 --- a/pr-preview/pr-240/resources/eula.json +++ b/pr-preview/pr-240/resources/eula.json @@ -1 +1 @@ -{"id":"resources/eula","title":"License","url":"resources/eula.html","last_modified":"2026-03-11T21:58:22.081868+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"NVIDIA OpenShell license agreement and terms of use.","tags":["License","EULA"],"topics":["Legal"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"License","format":"text","summary":" License","headings":[{"text":"License","level":1}]} \ No newline at end of file +{"id":"resources/eula","title":"License","url":"resources/eula.html","last_modified":"2026-03-11T22:04:40.653278+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"NVIDIA OpenShell license agreement and terms of use.","tags":["License","EULA"],"topics":["Legal"],"content_type":"reference","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"License","format":"text","summary":" License","headings":[{"text":"License","level":1}]} \ No newline at end of file diff --git a/pr-preview/pr-240/sandboxes/community-sandboxes.json b/pr-preview/pr-240/sandboxes/community-sandboxes.json index 3c11661a2..ce58237e6 100644 --- a/pr-preview/pr-240/sandboxes/community-sandboxes.json +++ b/pr-preview/pr-240/sandboxes/community-sandboxes.json @@ -1 +1 @@ -{"id":"sandboxes/community-sandboxes","title":"Community Sandboxes","url":"sandboxes/community-sandboxes.html","last_modified":"2026-03-11T21:58:22.086548+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Use pre-built sandboxes from the OpenShell Community catalog or contribute your own.","tags":["Community","Sandbox","Container Image","Open Source"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Community Sandboxes Use pre-built sandboxes from the OpenShell Community catalog, or contribute your\nown. What Are Community Sandboxes Community sandboxes are ready-to-use environments published in the\nOpenShell Community repository\nEach sandbox bundles a Dockerfile, policy, optional skills, and startup scripts\ninto a single package that you can launch with one command. Current Catalog The following community sandboxes are available in the catalog. Sandbox Description base Foundational image with system tools and dev environment openclaw Open agent manipulation and control sdg Synthetic data generation workflows simulation General-purpose simulation sandboxes Use a Community Sandbox Launch a community sandbox by name with the --from flag: $ openshell sandbox create --from openclaw\nWhen you pass --from with a community sandbox name, the CLI: Resolves the name against the\nOpenShell Community repository. Pulls the Dockerfile, policy, skills, and any startup scripts. Builds the container image locally. Creates the sandbox with the bundled configuration applied. You end up with a running sandbox whose image, policy, and tooling are all\npreconfigured by the community package. Other Sources The --from flag also accepts: Local directory paths: Point to a directory on disk that contains a\nDockerfile and optional policy/skills: $ openshell sandbox create --from ./my-sandbox-dir\nContainer image references: Use an existing container image directly: $ openshell sandbox create --from my-registry.example.com/my-image:latest\nContribute a Community Sandbox Each community sandbox is a directory under sandboxes/ in the\nOpenShell Community repository\nAt minimum, a sandbox directory must contain: Dockerfile : Defines the container image README.md : Describes the sandbox and how to use it Optional files: policy.yaml : Default policy applied when the sandbox launches skills/ : Agent skill definitions bundled with the sandbox Startup scripts: Any scripts the Dockerfile or entrypoint invokes To contribute, fork the repository, add your sandbox directory, and open a pull\nrequest. Refer to the repository’s\nCONTRIBUTING.md\nfor submission guidelines. The community catalog is designed to grow. If you have built a sandbox that\nsupports a particular workflow (data processing, simulation, code review\nor anything else), consider contributing it back so others can use it. Next Steps Explore related topics: Need to supply API keys or tokens? Set up providers for credential management. Want to customize the sandbox policy? Write custom rules in policies","format":"text","summary":"Use pre-built sandboxes from the OpenShell Community catalog, or contribute your own.","headings":[{"text":"Community Sandboxes","level":1},{"text":"What Are Community Sandboxes","level":2},{"text":"Current Catalog","level":2},{"text":"Use a Community Sandbox","level":2},{"text":"Other Sources","level":3},{"text":"Contribute a Community Sandbox","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file +{"id":"sandboxes/community-sandboxes","title":"Community Sandboxes","url":"sandboxes/community-sandboxes.html","last_modified":"2026-03-11T22:04:40.659469+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Use pre-built sandboxes from the OpenShell Community catalog or contribute your own.","tags":["Community","Sandbox","Container Image","Open Source"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Community Sandboxes Use pre-built sandboxes from the OpenShell Community catalog, or contribute your\nown. What Are Community Sandboxes Community sandboxes are ready-to-use environments published in the\nOpenShell Community repository\nEach sandbox bundles a Dockerfile, policy, optional skills, and startup scripts\ninto a single package that you can launch with one command. Current Catalog The following community sandboxes are available in the catalog. Sandbox Description base Foundational image with system tools and dev environment openclaw Open agent manipulation and control sdg Synthetic data generation workflows simulation General-purpose simulation sandboxes Use a Community Sandbox Launch a community sandbox by name with the --from flag: $ openshell sandbox create --from openclaw\nWhen you pass --from with a community sandbox name, the CLI: Resolves the name against the\nOpenShell Community repository. Pulls the Dockerfile, policy, skills, and any startup scripts. Builds the container image locally. Creates the sandbox with the bundled configuration applied. You end up with a running sandbox whose image, policy, and tooling are all\npreconfigured by the community package. Other Sources The --from flag also accepts: Local directory paths: Point to a directory on disk that contains a\nDockerfile and optional policy/skills: $ openshell sandbox create --from ./my-sandbox-dir\nContainer image references: Use an existing container image directly: $ openshell sandbox create --from my-registry.example.com/my-image:latest\nContribute a Community Sandbox Each community sandbox is a directory under sandboxes/ in the\nOpenShell Community repository\nAt minimum, a sandbox directory must contain: Dockerfile : Defines the container image README.md : Describes the sandbox and how to use it Optional files: policy.yaml : Default policy applied when the sandbox launches skills/ : Agent skill definitions bundled with the sandbox Startup scripts: Any scripts the Dockerfile or entrypoint invokes To contribute, fork the repository, add your sandbox directory, and open a pull\nrequest. Refer to the repository’s\nCONTRIBUTING.md\nfor submission guidelines. The community catalog is designed to grow. If you have built a sandbox that\nsupports a particular workflow (data processing, simulation, code review\nor anything else), consider contributing it back so others can use it. Next Steps Explore related topics: Need to supply API keys or tokens? Set up providers for credential management. Want to customize the sandbox policy? Write custom rules in policies","format":"text","summary":"Use pre-built sandboxes from the OpenShell Community catalog, or contribute your own.","headings":[{"text":"Community Sandboxes","level":1},{"text":"What Are Community Sandboxes","level":2},{"text":"Current Catalog","level":2},{"text":"Use a Community Sandbox","level":2},{"text":"Other Sources","level":3},{"text":"Contribute a Community Sandbox","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file diff --git a/pr-preview/pr-240/sandboxes/create-and-manage.json b/pr-preview/pr-240/sandboxes/create-and-manage.json index 75b9fa7f7..5202a8407 100644 --- a/pr-preview/pr-240/sandboxes/create-and-manage.json +++ b/pr-preview/pr-240/sandboxes/create-and-manage.json @@ -1 +1 @@ -{"id":"sandboxes/create-and-manage","title":"Create and Manage Sandboxes","url":"sandboxes/create-and-manage.html","last_modified":"2026-03-11T21:58:22.229301+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create, inspect, connect to, monitor, transfer files, and delete OpenShell sandboxes.","tags":["Sandboxing","AI Agents","Sandbox Management","CLI"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Create and Manage Sandboxes This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes . Docker must be running before you create a sandbox. If it is not, the CLI\nreturns a connection-refused error ( os error 61 ) without explaining\nthe cause. Start Docker and try again. Create a Sandbox Run a single command to create a sandbox and launch your agent: $ openshell sandbox create -- claude\nIf you have an existing gateway, the sandbox is created in it. Otherwise, a gateway is created automatically. A fully specified creation command might look like: $ openshell sandbox create\nname dev\nprovider my-claude\npolicy policy.yaml\nupload\nkeep\nclaude\nUse --keep to keep the sandbox running after the trailing command exits\nThis is especially useful when you are iterating on a policy or want to\nreconnect later from another terminal or VS Code. Create from a Community Sandbox or Custom Image Use --from to create a sandbox from a pre-built community package, a local directory, or a container image: $ openshell sandbox create --from openclaw\nThe CLI resolves the name against the OpenShell Community catalog, pulls the bundled Dockerfile and policy, builds the image locally, and creates the sandbox. For the full catalog and how to contribute your own, refer to community-sandboxes . You can also point --from at a local directory or a container image reference: $ openshell sandbox create --from ./my-sandbox-dir\nopenshell sandbox create --from my-registry.example.com/my-image:latest\nList and Inspect Sandboxes Check the status of your sandboxes and retrieve detailed information about individual ones. List all sandboxes: $ openshell sandbox list\nGet detailed information about a specific sandbox: $ openshell sandbox get my-sandbox\nConnect to a Sandbox Access a running sandbox through an interactive SSH session or VS Code Remote-SSH. Interactive SSH Open an SSH session into a running sandbox: $ openshell sandbox connect my-sandbox\nView Logs Stream and filter sandbox logs to monitor agent activity and diagnose policy decisions. Stream sandbox logs: $ openshell logs my-sandbox\nUse flags to filter and follow output: Flag Purpose Example --tail Stream logs in real time openshell logs my-sandbox --tail --source Filter by log source --source sandbox --level Filter by severity --level warn --since Show logs from a time window --since 5m Monitor Your Sandbox OpenShell Terminal is a real-time dashboard that combines sandbox status and live logs in a single view. $ openshell term\nThe dashboard shows the following information. Sandbox status : Name, phase, image, attached providers, age, and active port forwards. Live log stream : Omutbound connections, policy decisions, and inference interceptions as they happen. Logs are labeled by source: sandbox (proxy and policy events) or gateway (lifecycle events). Use the terminal to spot blocked connections ( action=deny entries) and inference interceptions ( action=inspect_for_inference entries). If a connection is blocked unexpectedly, add the host to your network policy — refer to policies for the workflow. Transfer Files Transfer files between your host machine and a running sandbox. Upload files from your host into the sandbox: $ openshell sandbox upload my-sandbox ./src /sandbox/src\nDownload files from the sandbox to your host: $ openshell sandbox download my-sandbox /sandbox/output ./local\nYou can also upload files at creation time with the --upload flag on\nopenshell sandbox create . Delete Sandboxes Remove sandboxes when they are no longer needed. Deleting a sandbox stops all processes, releases cluster resources, and purges injected credentials. Delete a sandbox by name: $ openshell sandbox delete my-sandbox\nDelete all sandboxes in the active gateway: $ openshell sandbox delete --all\nNext Steps Explore related topics: To follow a complete end-to-end example, refer to the /tutorials/github-sandbox tutorial. To supply API keys or tokens, refer to providers . To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog","format":"text","summary":"This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes.","headings":[{"text":"Create and Manage Sandboxes","level":1},{"text":"Create a Sandbox","level":2},{"text":"Create from a Community Sandbox or Custom Image","level":2},{"text":"List and Inspect Sandboxes","level":2},{"text":"Connect to a Sandbox","level":2},{"text":"Interactive SSH","level":3},{"text":"View Logs","level":2},{"text":"Monitor Your Sandbox","level":2},{"text":"Transfer Files","level":2},{"text":"Delete Sandboxes","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file +{"id":"sandboxes/create-and-manage","title":"Create and Manage Sandboxes","url":"sandboxes/create-and-manage.html","last_modified":"2026-03-11T22:04:40.665359+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create, inspect, connect to, monitor, transfer files, and delete OpenShell sandboxes.","tags":["Sandboxing","AI Agents","Sandbox Management","CLI"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Create and Manage Sandboxes This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes . Docker must be running before you create a sandbox. If it is not, the CLI\nreturns a connection-refused error ( os error 61 ) without explaining\nthe cause. Start Docker and try again. Create a Sandbox Run a single command to create a sandbox and launch your agent: $ openshell sandbox create -- claude\nIf you have an existing gateway, the sandbox is created in it. Otherwise, a gateway is created automatically. A fully specified creation command might look like: $ openshell sandbox create\nname dev\nprovider my-claude\npolicy policy.yaml\nupload\nkeep\nclaude\nUse --keep to keep the sandbox running after the trailing command exits\nThis is especially useful when you are iterating on a policy or want to\nreconnect later from another terminal or VS Code. Create from a Community Sandbox or Custom Image Use --from to create a sandbox from a pre-built community package, a local directory, or a container image: $ openshell sandbox create --from openclaw\nThe CLI resolves the name against the OpenShell Community catalog, pulls the bundled Dockerfile and policy, builds the image locally, and creates the sandbox. For the full catalog and how to contribute your own, refer to community-sandboxes . You can also point --from at a local directory or a container image reference: $ openshell sandbox create --from ./my-sandbox-dir\nopenshell sandbox create --from my-registry.example.com/my-image:latest\nList and Inspect Sandboxes Check the status of your sandboxes and retrieve detailed information about individual ones. List all sandboxes: $ openshell sandbox list\nGet detailed information about a specific sandbox: $ openshell sandbox get my-sandbox\nConnect to a Sandbox Access a running sandbox through an interactive SSH session or VS Code Remote-SSH. Interactive SSH Open an SSH session into a running sandbox: $ openshell sandbox connect my-sandbox\nView Logs Stream and filter sandbox logs to monitor agent activity and diagnose policy decisions. Stream sandbox logs: $ openshell logs my-sandbox\nUse flags to filter and follow output: Flag Purpose Example --tail Stream logs in real time openshell logs my-sandbox --tail --source Filter by log source --source sandbox --level Filter by severity --level warn --since Show logs from a time window --since 5m Monitor Your Sandbox OpenShell Terminal is a real-time dashboard that combines sandbox status and live logs in a single view. $ openshell term\nThe dashboard shows the following information. Sandbox status : Name, phase, image, attached providers, age, and active port forwards. Live log stream : Omutbound connections, policy decisions, and inference interceptions as they happen. Logs are labeled by source: sandbox (proxy and policy events) or gateway (lifecycle events). Use the terminal to spot blocked connections ( action=deny entries) and inference interceptions ( action=inspect_for_inference entries). If a connection is blocked unexpectedly, add the host to your network policy — refer to policies for the workflow. Transfer Files Transfer files between your host machine and a running sandbox. Upload files from your host into the sandbox: $ openshell sandbox upload my-sandbox ./src /sandbox/src\nDownload files from the sandbox to your host: $ openshell sandbox download my-sandbox /sandbox/output ./local\nYou can also upload files at creation time with the --upload flag on\nopenshell sandbox create . Delete Sandboxes Remove sandboxes when they are no longer needed. Deleting a sandbox stops all processes, releases cluster resources, and purges injected credentials. Delete a sandbox by name: $ openshell sandbox delete my-sandbox\nDelete all sandboxes in the active gateway: $ openshell sandbox delete --all\nNext Steps Explore related topics: To follow a complete end-to-end example, refer to the /tutorials/github-sandbox tutorial. To supply API keys or tokens, refer to providers . To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog","format":"text","summary":"This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes.","headings":[{"text":"Create and Manage Sandboxes","level":1},{"text":"Create a Sandbox","level":2},{"text":"Create from a Community Sandbox or Custom Image","level":2},{"text":"List and Inspect Sandboxes","level":2},{"text":"Connect to a Sandbox","level":2},{"text":"Interactive SSH","level":3},{"text":"View Logs","level":2},{"text":"Monitor Your Sandbox","level":2},{"text":"Transfer Files","level":2},{"text":"Delete Sandboxes","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file diff --git a/pr-preview/pr-240/sandboxes/index.json b/pr-preview/pr-240/sandboxes/index.json index 68eba8760..98044cd4f 100644 --- a/pr-preview/pr-240/sandboxes/index.json +++ b/pr-preview/pr-240/sandboxes/index.json @@ -1 +1 @@ -{"id":"sandboxes/index","title":"About Sandboxes","url":"sandboxes/index.html","last_modified":"2026-03-11T21:58:22.130372+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Understand sandbox lifecycle, supported agents, built-in default policy, and network access rules in OpenShell.","tags":["Sandboxing","AI Agents","Security","Policy","Isolation"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"About Sandboxes An OpenShell sandbox is a safe, private execution environment for an AI agent. Each sandbox runs with multiple layers of protection that prevent unauthorized data access, credential exposure, and network exfiltration. Protection layers include filesystem restrictions (Landlock), system call filtering (seccomp), network namespace isolation, and a privacy-enforcing HTTP CONNECT proxy. Sandbox Lifecycle Every sandbox moves through a defined set of phases: Phase Description Provisioning The runtime is setting up the sandbox environment, injecting credentials, and applying your policy. Ready The sandbox is running. The agent process is active and all isolation layers are enforced. You can connect, sync files, and view logs. Error Something went wrong during provisioning or execution. Check logs with openshell logs for details. Deleting The sandbox is being torn down. The system releases resources and purges credentials. Supported Agents The following table summarizes the agents that run in OpenShell sandboxes. Built-in agents are pre-installed in the OpenShell base sandbox image and auto-configured when passed as the trailing command to openshell sandbox create . More community agent sandboxes are available in the community-sandboxes catalog. Agent Source Default Policy Notes Claude Code Built-in Full coverage Works out of the box. Requires ANTHROPIC_API_KEY . OpenCode Built-in Partial coverage Pre-installed. Add opencode.ai endpoint and OpenCode binary paths to the policy for full functionality. Codex Built-in No coverage Pre-installed. Requires a custom policy with OpenAI endpoints and Codex binary paths. Requires OPENAI_API_KEY . OpenClaw OpenShell Community Bundled Agent orchestration layer. Launch with openshell sandbox create --from openclaw\nBuilt-in Default Policy OpenShell ships a built-in policy that covers common agent workflows out of the box\nWhen you create a sandbox without --policy , the default policy is applied. It controls three things: Layer What It Controls How It Works Filesystem What the agent can access on disk Paths are split into read-only and read-write sets. Landlock LSM enforces these restrictions at the kernel level. Network What the agent can reach on the network Each policy block pairs allowed destinations (host and port) with allowed binaries (executable paths). The proxy matches every outbound connection to the binary that opened it. Both must match or the connection is denied. Process What privileges the agent has The agent runs as an unprivileged user with seccomp filters that block dangerous system calls. No sudo , no setuid , no path to elevated privileges. For the full breakdown of each default policy block and agent compatibility details, refer to ../reference/default-policy . Policy Structure A policy has static sections ( filesystem_policy , landlock , process ) that are locked at sandbox creation, and dynamic sections ( network_policies , inference ) that are hot-reloadable on a running sandbox. version: 1\nStatic: locked at sandbox creation. Paths the agent can read vs read/write\nfilesystem_policy\nread_only: [/usr, /lib, /etc\nread_write: [/sandbox, /tmp\nStatic: Landlock LSM kernel enforcement. best_effort uses highest ABI the host supports\nlandlock\ncompatibility: best_effort\nStatic: Unprivileged user/group the agent process runs as\nprocess\nrun_as_user: sandbox\nrun_as_group: sandbox\nDynamic: hot-reloadable. Named blocks of endpoints + binaries allowed to reach them\nnetwork_policies\nmy_api\nname: my-api\nendpoints\nhost: api.example.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\naccess: full\nbinaries\npath: /usr/bin/curl\nDynamic: hot-reloadable. Routing hints this sandbox can use for inference (e.g. local, nvidia\ninference\nallowed_routes: [local\nFor the complete structure and every field, refer to the Policy Schema Reference . Network Access Rules Network access is controlled by policy blocks under network_policies . Each block has a name, a list of endpoints (host, port, protocol, and optional rules), and a list of binaries that are allowed to use those endpoints. Every outbound connection from the sandbox goes through the proxy: The proxy queries the policy engine with the destination (host and port) and the calling binary. A connection is allowed only when both match an entry in the same policy block. For endpoints with protocol: rest and tls: terminate , each HTTP request is checked against that endpoint’s rules (method and path). If no endpoint matches and inference routes are configured, the request may be rerouted for inference. Otherwise the connection is denied. Endpoints without protocol or tls allow the TCP stream through without inspecting payloads. Next Steps Continue with one of the following: To create your first sandbox, refer to create-and-manage . To supply API keys or tokens, refer to providers . To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog","format":"text","summary":"An OpenShell sandbox is a safe, private execution environment for an AI agent. Each sandbox runs with multiple layers of protection that prevent unauthorized data access, credential exposure, and network exfiltration. Protection layers include filesystem restrictions (Landlock), system call filte...","headings":[{"text":"About Sandboxes","level":1},{"text":"Sandbox Lifecycle","level":2},{"text":"Supported Agents","level":2},{"text":"Built-in Default Policy","level":2},{"text":"Policy Structure","level":2},{"text":"Network Access Rules","level":2},{"text":"Next Steps","level":2}],"children":[{"id":"sandboxes/community-sandboxes","title":"Community Sandboxes","url":"sandboxes/community-sandboxes.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Use pre-built sandboxes from the OpenShell Community catalog or contribute your own.","tags":["Community","Sandbox","Container Image","Open Source"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Community Sandboxes Use pre-built sandboxes from the OpenShell Community catalog, or contribute your\nown. What Are Community Sandboxes Community sandboxes are ready-to-use environments published in the\nOpenShell Community repository\nEach sandbox bundles a Dockerfile, policy, optional skills, and startup scripts\ninto a single package that you can launch with one command. Current Catalog The following community sandboxes are available in the catalog. Sandbox Description base Foundational image with system tools and dev environment openclaw Open agent manipulation and control sdg Synthetic data generation workflows simulation General-purpose simulation sandboxes Use a Community Sandbox Launch a community sandbox by name with the --from flag: $ openshell sandbox create --from openclaw\nWhen you pass --from with a community sandbox name, the CLI: Resolves the name against the\nOpenShell Community repository. Pulls the Dockerfile, policy, skills, and any startup scripts. Builds the container image locally. Creates the sandbox with the bundled configuration applied. You end up with a running sandbox whose image, policy, and tooling are all\npreconfigured by the community package. Other Sources The --from flag also accepts: Local directory paths: Point to a directory on disk that contains a\nDockerfile and optional policy/skills: $ openshell sandbox create --from ./my-sandbox-dir\nContainer image references: Use an existing container image directly: $ openshell sandbox create --from my-registry.example.com/my-image:latest\nContribute a Community Sandbox Each community sandbox is a directory under sandboxes/ in the\nOpenShell Community repository\nAt minimum, a sandbox directory must contain: Dockerfile : Defines the container image README.md : Describes the sandbox and how to use it Optional files: policy.yaml : Default policy applied when the sandbox launches skills/ : Agent skill definitions bundled with the sandbox Startup scripts: Any scripts the Dockerfile or entrypoint invokes To contribute, fork the repository, add your sandbox directory, and open a pull\nrequest. Refer to the repository’s\nCONTRIBUTING.md\nfor submission guidelines. The community catalog is designed to grow. If you have built a sandbox that\nsupports a particular workflow (data processing, simulation, code review\nor anything else), consider contributing it back so others can use it. Next Steps Explore related topics: Need to supply API keys or tokens? Set up providers for credential management. Want to customize the sandbox policy? Write custom rules in policies","format":"text","content_length":2562,"word_count":367,"summary":"Use pre-built sandboxes from the OpenShell Community catalog, or contribute your own.","headings":[{"text":"Community Sandboxes","level":1,"id":"community-sandboxes"},{"text":"What Are Community Sandboxes","level":2,"id":"what-are-community-sandboxes"},{"text":"Current Catalog","level":2,"id":"current-catalog"},{"text":"Use a Community Sandbox","level":2,"id":"use-a-community-sandbox"},{"text":"Other Sources","level":3,"id":"other-sources"},{"text":"Contribute a Community Sandbox","level":2,"id":"contribute-a-community-sandbox"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Community Sandboxes What Are Community Sandboxes Current Catalog Use a Community Sandbox Other Sources Contribute a Community Sandbox Next Steps","keywords":["accepts","agent","any","builds","catalog","com","community","contain","container","contribute","creates","current","default","defines","describes","description","directly","dockerfile","each","explore","files","flag","foundational","general","image","launch","local","need","next","open","openshell","optional","other","paths","point","pulls","refer","references","resolves","sandbox","sandboxes","scripts","set","skills","sources","startup","steps","synthetic","topics","want"],"code_blocks":[{"content":"$ openshell sandbox create --from openclaw","language":"text"},{"content":"$ openshell sandbox create --from ./my-sandbox-dir","language":"text"},{"content":"$ openshell sandbox create --from my-registry.example.com/my-image:latest","language":"text"}],"links":[{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"Contributing","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community/blob/main/CONTRIBUTING.md","original_text":"CONTRIBUTING.md"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Community Sandboxes"]},{"id":"sandboxes/create-and-manage","title":"Create and Manage Sandboxes","url":"sandboxes/create-and-manage.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create, inspect, connect to, monitor, transfer files, and delete OpenShell sandboxes.","tags":["Sandboxing","AI Agents","Sandbox Management","CLI"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Create and Manage Sandboxes This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes . Docker must be running before you create a sandbox. If it is not, the CLI\nreturns a connection-refused error ( os error 61 ) without explaining\nthe cause. Start Docker and try again. Create a Sandbox Run a single command to create a sandbox and launch your agent: $ openshell sandbox create -- claude\nIf you have an existing gateway, the sandbox is created in it. Otherwise, a gateway is created automatically. A fully specified creation command might look like: $ openshell sandbox create\nname dev\nprovider my-claude\npolicy policy.yaml\nupload\nkeep\nclaude\nUse --keep to keep the sandbox running after the trailing command exits\nThis is especially useful when you are iterating on a policy or want to\nreconnect later from another terminal or VS Code. Create from a Community Sandbox or Custom Image Use --from to create a sandbox from a pre-built community package, a local directory, or a container image: $ openshell sandbox create --from openclaw\nThe CLI resolves the name against the OpenShell Community catalog, pulls the bundled Dockerfile and policy, builds the image locally, and creates the sandbox. For the full catalog and how to contribute your own, refer to community-sandboxes . You can also point --from at a local directory or a container image reference: $ openshell sandbox create --from ./my-sandbox-dir\nopenshell sandbox create --from my-registry.example.com/my-image:latest\nList and Inspect Sandboxes Check the status of your sandboxes and retrieve detailed information about individual ones. List all sandboxes: $ openshell sandbox list\nGet detailed information about a specific sandbox: $ openshell sandbox get my-sandbox\nConnect to a Sandbox Access a running sandbox through an interactive SSH session or VS Code Remote-SSH. Interactive SSH Open an SSH session into a running sandbox: $ openshell sandbox connect my-sandbox\nView Logs Stream and filter sandbox logs to monitor agent activity and diagnose policy decisions. Stream sandbox logs: $ openshell logs my-sandbox\nUse flags to filter and follow output: Flag Purpose Example --tail Stream logs in real time openshell logs my-sandbox --tail --source Filter by log source --source sandbox --level Filter by severity --level warn --since Show logs from a time window --since 5m Monitor Your Sandbox OpenShell Terminal is a real-time dashboard that combines sandbox status and live logs in a single view. $ openshell term\nThe dashboard shows the following information. Sandbox status : Name, phase, image, attached providers, age, and active port forwards. Live log stream : Omutbound connections, policy decisions, and inference interceptions as they happen. Logs are labeled by source: sandbox (proxy and policy events) or gateway (lifecycle events). Use the terminal to spot blocked connections ( action=deny entries) and inference interceptions ( action=inspect_for_inference entries). If a connection is blocked unexpectedly, add the host to your network policy — refer to policies for the workflow. Transfer Files Transfer files between your host machine and a running sandbox. Upload files from your host into the sandbox: $ openshell sandbox upload my-sandbox ./src /sandbox/src\nDownload files from the sandbox to your host: $ openshell sandbox download my-sandbox /sandbox/output ./local\nYou can also upload files at creation time with the --upload flag on\nopenshell sandbox create . Delete Sandboxes Remove sandboxes when they are no longer needed. Deleting a sandbox stops all processes, releases cluster resources, and purges injected credentials. Delete a sandbox by name: $ openshell sandbox delete my-sandbox\nDelete all sandboxes in the active gateway: $ openshell sandbox delete --all\nNext Steps Explore related topics: To follow a complete end-to-end example, refer to the /tutorials/github-sandbox tutorial. To supply API keys or tokens, refer to providers . To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog","format":"text","content_length":4230,"word_count":648,"summary":"This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes.","headings":[{"text":"Create and Manage Sandboxes","level":1,"id":"create-and-manage-sandboxes"},{"text":"Create a Sandbox","level":2,"id":"create-a-sandbox"},{"text":"Create from a Community Sandbox or Custom Image","level":2,"id":"create-from-a-community-sandbox-or-custom-image"},{"text":"List and Inspect Sandboxes","level":2,"id":"list-and-inspect-sandboxes"},{"text":"Connect to a Sandbox","level":2,"id":"connect-to-a-sandbox"},{"text":"Interactive SSH","level":3,"id":"interactive-ssh"},{"text":"View Logs","level":2,"id":"view-logs"},{"text":"Monitor Your Sandbox","level":2,"id":"monitor-your-sandbox"},{"text":"Transfer Files","level":2,"id":"transfer-files"},{"text":"Delete Sandboxes","level":2,"id":"delete-sandboxes"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Create and Manage Sandboxes Create a Sandbox Create from a Community Sandbox or Custom Image List and Inspect Sandboxes Connect to a Sandbox Interactive SSH View Logs Monitor Your Sandbox Transfer Files Delete Sandboxes Next Steps","keywords":["about","access","action","agent","check","code","com","community","connect","create","custom","delete","deleting","docker","dockerfile","download","example","explore","files","filter","flag","from","gateway","host","image","inspect","interactive","lifecycle","like","list","live","logs","manage","monitor","name","next","omutbound","open","openshell","otherwise","output","purpose","reference","remote","remove","run","sandbox","sandboxes","show","source"],"code_blocks":[{"content":"$ openshell sandbox create -- claude","language":"text"},{"content":"$ openshell sandbox create \\\n --name dev \\\n --provider my-claude \\\n --policy policy.yaml \\\n --upload \\\n --keep \\\n -- claude","language":"text"},{"content":"$ openshell sandbox create --from openclaw","language":"text"},{"content":"$ openshell sandbox create --from ./my-sandbox-dir\n$ openshell sandbox create --from my-registry.example.com/my-image:latest","language":"text"},{"content":"$ openshell sandbox list","language":"text"},{"content":"$ openshell sandbox get my-sandbox","language":"text"},{"content":"$ openshell sandbox connect my-sandbox","language":"text"},{"content":"$ openshell logs my-sandbox","language":"text"},{"content":"$ openshell term","language":"text"},{"content":"$ openshell sandbox upload my-sandbox ./src /sandbox/src","language":"text"},{"content":"$ openshell sandbox download my-sandbox /sandbox/output ./local","language":"text"},{"content":"$ openshell sandbox delete my-sandbox","language":"text"},{"content":"$ openshell sandbox delete --all","language":"text"}],"links":[{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Create And Manage"]},{"id":"sandboxes/policies","title":"Customize Sandbox Policies","url":"sandboxes/policies.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Apply, iterate, and debug sandbox network policies with hot-reload on running OpenShell sandboxes.","tags":["Policy","Network Policy","Sandbox","Security","Hot Reload"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Customize Sandbox Policies Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference . Quick Start: Apply a Custom Policy Pass a policy YAML file when creating the sandbox: $ openshell sandbox create --policy ./my-policy.yaml --keep -- claude\nThe --keep flag keeps the sandbox running after the initial command exits, which is useful when you plan to iterate on the policy. To avoid passing --policy every time, set a default policy with an environment variable: $ export OPENSHELL_SANDBOX_POLICY=./my-policy.yaml\nopenshell sandbox create --keep -- claude\nThe CLI uses the policy from OPENSHELL_SANDBOX_POLICY whenever --policy is not explicitly provided. Iterate on a Running Sandbox To change what the sandbox can access, pull the current policy, edit the YAML, and push the update. The workflow is iterative: create the sandbox, monitor logs for denied actions, pull the policy, modify it, push, and verify. The following steps outline the hot-reload policy update workflow. Create the sandbox with your initial policy by following Quick Start: Apply a Custom Policy above (or set OPENSHELL_SANDBOX_POLICY ). Monitor denials. Each log entry shows host, port, binary, and reason. Alternatively, use openshell term for a live dashboard. $ openshell logs --tail --source sandbox\nPull the current policy. Strip the metadata header (Version, Hash, Status) before reusing the file. $ openshell policy get --full > current-policy.yaml\nEdit the YAML: add or adjust network_policies entries, binaries, access or rules , or inference.allowed_routes . Push the updated policy. Exit codes: 0 = loaded, 1 = validation failed, 124 = timeout. $ openshell policy set --policy current-policy.yaml --wait\nVerify the new revision. If status is loaded , repeat from step 2 as needed; if failed , fix the policy and repeat from step 4. $ openshell policy list --tail --source sandbox for the denied host, path, and binary. When triaging denied requests, check: Destination host and port to confirm which endpoint is missing. Calling binary path to confirm which binaries entry needs to be added or adjusted. HTTP method and path (for REST endpoints) to confirm which rules entry needs to be added or adjusted. Then push the updated policy as described above. Examples Add these blocks to the network_policies section of your sandbox policy. Apply with openshell policy set --policy --wait\nUse Simple endpoint for host-level allowlists and Granular rules for method/path control. Simple endpoint Allow pip install and uv pip install to reach PyPI: pypi\nname: pypi\nendpoints\nhost: pypi.org\nport: 443\nhost: files.pythonhosted.org\nport: 443\nbinaries\n{ path: /usr/bin/pip\n{ path: /usr/local/bin/uv\nEndpoints without protocol or tls use TCP passthrough — the proxy allows the stream without inspecting payloads. Granular rules Allow Claude and the GitHub CLI to reach api.github.com with per-path rules: read-only (GET, HEAD, OPTIONS) and GraphQL (POST) for all paths; full write access for alpha-repo ; and create/edit issues only for bravo-repo . Replace with your GitHub org or username. For an end-to-end walkthrough that combines this policy with a GitHub credential provider and sandbox creation, refer to /tutorials/github-sandbox . github_repos\nname: github_repos\nendpoints\nhost: api.github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nallow\nmethod: GET\npath:\nallow\nmethod: HEAD\npath:\nallow\nmethod: OPTIONS\npath:\nallow\nmethod: POST\npath: \"/graphql\nallow\nmethod:\npath: \"/repos//alpha-repo\nallow\nmethod: POST\npath: \"/repos//bravo-repo/issues\nallow\nmethod: PATCH\npath: \"/repos//bravo-repo/issues\nbinaries\n{ path: /usr/local/bin/claude\n{ path: /usr/bin/gh\nEndpoints with protocol: rest and tls: terminate enable HTTP request inspection — the proxy decrypts TLS and checks each HTTP request against the rules list. Next Steps Explore related topics: To learn about policy structure and network access rules, refer to index . To view the full field-by-field YAML definition, refer to the Policy Schema Reference . To review the default policy breakdown, refer to ../reference/default-policy","format":"text","content_length":4315,"word_count":639,"summary":"Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference.","headings":[{"text":"Customize Sandbox Policies","level":1,"id":"customize-sandbox-policies"},{"text":"Quick Start: Apply a Custom Policy","level":2,"id":"quick-start-apply-a-custom-policy"},{"text":"Iterate on a Running Sandbox","level":2,"id":"iterate-on-a-running-sandbox"},{"text":"Debug Denied Requests","level":2,"id":"debug-denied-requests"},{"text":"Examples","level":2,"id":"examples"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Customize Sandbox Policies Quick Start: Apply a Custom Policy Iterate on a Running Sandbox Debug Denied Requests Examples Next Steps","keywords":["add","allow","alternatively","apply","calling","check","claude","codes","com","create","custom","customize","debug","denied","destination","each","edit","endpoints","enforcement","examples","exit","explore","github","granular","graphql","hash","host","iterate","iterative","method","monitor","name","next","org","pass","path","policies","policy","port","protocol","pull","push","pypi","quick","reference","replace","requests","rules","running","sandbox"],"code_blocks":[{"content":"$ openshell sandbox create --policy ./my-policy.yaml --keep -- claude","language":"text"},{"content":"$ export OPENSHELL_SANDBOX_POLICY=./my-policy.yaml\n$ openshell sandbox create --keep -- claude","language":"text"},{"content":"$ openshell logs --tail --source sandbox","language":"text"},{"content":"$ openshell policy get --full > current-policy.yaml","language":"text"},{"content":"$ openshell policy set --policy current-policy.yaml --wait","language":"text"},{"content":"$ openshell policy list ","language":"text"},{"content":"pypi:\n name: pypi\n endpoints:\n - host: pypi.org\n port: 443\n - host: files.pythonhosted.org\n port: 443\n binaries:\n - { path: /usr/bin/pip }\n - { path: /usr/local/bin/uv }","language":"text"},{"content":"github_repos:\n name: github_repos\n endpoints:\n - host: api.github.com\n port: 443\n protocol: rest\n tls: terminate\n enforcement: enforce\n rules:\n - allow:\n method: GET\n path: \"/**\"\n - allow:\n method: HEAD\n path: \"/**\"\n - allow:\n method: OPTIONS\n path: \"/**\"\n - allow:\n method: POST\n path: \"/graphql\"\n - allow:\n method: \"*\"\n path: \"/repos//alpha-repo/**\"\n - allow:\n method: POST\n path: \"/repos//bravo-repo/issues\"\n - allow:\n method: PATCH\n path: \"/repos//bravo-repo/issues/*\"\n binaries:\n - { path: /usr/local/bin/claude }\n - { path: /usr/bin/gh }","language":"text"}],"links":[{"text":"Quick Start: Apply a Custom Policy","type":"anchor","url":"#quick-start-apply-a-custom-policy"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Policies"]},{"id":"sandboxes/providers","title":"Providers","url":"sandboxes/providers.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create and manage credential providers that inject API keys and tokens into OpenShell sandboxes.","tags":["Providers","Credentials","API Keys","Sandbox","Security"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Providers AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers . Create and manage providers that supply credentials to sandboxes. Create a Provider Providers can be created from local environment variables or with explicit credential values. From Local Credentials The fastest way to create a provider is to let the CLI discover credentials from\nyour shell environment: $ openshell provider create --name my-claude --type claude --from-existing\nThis reads ANTHROPIC_API_KEY or CLAUDE_API_KEY from your current environment\nand stores them in the provider. With Explicit Credentials Supply a credential value directly: $ openshell provider create --name my-api --type generic --credential API_KEY=sk-abc123\nBare Key Form Pass a key name without a value to read the value from the environment variable\nof that name: $ openshell provider create --name my-api --type generic --credential API_KEY\nThis looks up the current value of $API_KEY in your shell and stores it. Manage Providers List, inspect, update, and delete providers from the active cluster. List all providers: $ openshell provider list\nInspect a provider: $ openshell provider get my-claude\nUpdate a provider’s credentials: $ openshell provider update my-claude --type claude --from-existing\nDelete a provider: $ openshell provider delete my-claude\nAttach Providers to Sandboxes Pass one or more --provider flags when creating a sandbox: $ openshell sandbox create --provider my-claude --provider my-github -- claude\nEach --provider flag attaches one provider. The sandbox receives all\ncredentials from every attached provider at runtime. Providers cannot be added to a running sandbox. If you need to attach an\nadditional provider, delete the sandbox and recreate it with all required\nproviders specified. Auto-Discovery Shortcut When the trailing command in openshell sandbox create is a recognized tool name ( claude , codex , or opencode ), the CLI auto-creates the required\nprovider from your local credentials if one does not already exist. You do not\nneed to create the provider separately: $ openshell sandbox create -- claude\nThis detects claude as a known tool, finds your ANTHROPIC_API_KEY , creates\na provider, attaches it to the sandbox, and launches Claude Code. Supported Provider Types The following provider types are supported. Type Environment Variables Injected Typical Use claude ANTHROPIC_API_KEY , CLAUDE_API_KEY Claude Code, Anthropic API codex OPENAI_API_KEY OpenAI Codex opencode OPENCODE_API_KEY , OPENROUTER_API_KEY , OPENAI_API_KEY opencode tool github GITHUB_TOKEN , GH_TOKEN GitHub API, gh CLI — refer to /tutorials/github-sandbox gitlab GITLAB_TOKEN , GLAB_TOKEN , CI_JOB_TOKEN GitLab API, glab CLI nvidia NVIDIA_API_KEY NVIDIA API Catalog generic User-defined Any service with custom credentials outlook (none: no auto-discovery) Microsoft Outlook integration Use the generic type for any service not listed above. You define the\nenvironment variable names and values yourself with --credential . Next Steps Explore related topics: To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog. To view the complete field reference for the policy YAML, refer to the Policy Schema Reference","format":"text","content_length":3421,"word_count":502,"summary":"AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers.","headings":[{"text":"Providers","level":1,"id":"providers"},{"text":"Create a Provider","level":2,"id":"create-a-provider"},{"text":"From Local Credentials","level":3,"id":"from-local-credentials"},{"text":"With Explicit Credentials","level":3,"id":"with-explicit-credentials"},{"text":"Bare Key Form","level":3,"id":"bare-key-form"},{"text":"Manage Providers","level":2,"id":"manage-providers"},{"text":"Attach Providers to Sandboxes","level":2,"id":"attach-providers-to-sandboxes"},{"text":"Auto-Discovery Shortcut","level":3,"id":"auto-discovery-shortcut"},{"text":"Supported Provider Types","level":2,"id":"supported-provider-types"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Providers Create a Provider From Local Credentials With Explicit Credentials Bare Key Form Manage Providers Attach Providers to Sandboxes Auto-Discovery Shortcut Supported Provider Types Next Steps","keywords":["anthropic","any","attach","auto","bare","catalog","claude","code","codex","create","credentials","delete","directly","discovery","each","environment","explicit","explore","form","from","github","gitlab","injected","inspect","key","list","local","manage","microsoft","name","next","none","openai","openshell","outlook","pass","policy","provider","providers","reference","sandbox","sandboxes","schema","separately","services","shortcut","steps","supply","supported","this"],"code_blocks":[{"content":"$ openshell provider create --name my-claude --type claude --from-existing","language":"text"},{"content":"$ openshell provider create --name my-api --type generic --credential API_KEY=sk-abc123","language":"text"},{"content":"$ openshell provider create --name my-api --type generic --credential API_KEY","language":"text"},{"content":"$ openshell provider list","language":"text"},{"content":"$ openshell provider get my-claude","language":"text"},{"content":"$ openshell provider update my-claude --type claude --from-existing","language":"text"},{"content":"$ openshell provider delete my-claude","language":"text"},{"content":"$ openshell sandbox create --provider my-claude --provider my-github -- claude","language":"text"},{"content":"$ openshell sandbox create -- claude","language":"text"}],"links":[],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Providers"]}]} \ No newline at end of file +{"id":"sandboxes/index","title":"About Sandboxes","url":"sandboxes/index.html","last_modified":"2026-03-11T22:04:40.671476+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Understand sandbox lifecycle, supported agents, built-in default policy, and network access rules in OpenShell.","tags":["Sandboxing","AI Agents","Security","Policy","Isolation"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"About Sandboxes An OpenShell sandbox is a safe, private execution environment for an AI agent. Each sandbox runs with multiple layers of protection that prevent unauthorized data access, credential exposure, and network exfiltration. Protection layers include filesystem restrictions (Landlock), system call filtering (seccomp), network namespace isolation, and a privacy-enforcing HTTP CONNECT proxy. Sandbox Lifecycle Every sandbox moves through a defined set of phases: Phase Description Provisioning The runtime is setting up the sandbox environment, injecting credentials, and applying your policy. Ready The sandbox is running. The agent process is active and all isolation layers are enforced. You can connect, sync files, and view logs. Error Something went wrong during provisioning or execution. Check logs with openshell logs for details. Deleting The sandbox is being torn down. The system releases resources and purges credentials. Supported Agents The following table summarizes the agents that run in OpenShell sandboxes. Built-in agents are pre-installed in the OpenShell base sandbox image and auto-configured when passed as the trailing command to openshell sandbox create . More community agent sandboxes are available in the community-sandboxes catalog. Agent Source Default Policy Notes Claude Code Built-in Full coverage Works out of the box. Requires ANTHROPIC_API_KEY . OpenCode Built-in Partial coverage Pre-installed. Add opencode.ai endpoint and OpenCode binary paths to the policy for full functionality. Codex Built-in No coverage Pre-installed. Requires a custom policy with OpenAI endpoints and Codex binary paths. Requires OPENAI_API_KEY . OpenClaw OpenShell Community Bundled Agent orchestration layer. Launch with openshell sandbox create --from openclaw\nBuilt-in Default Policy OpenShell ships a built-in policy that covers common agent workflows out of the box\nWhen you create a sandbox without --policy , the default policy is applied. It controls three things: Layer What It Controls How It Works Filesystem What the agent can access on disk Paths are split into read-only and read-write sets. Landlock LSM enforces these restrictions at the kernel level. Network What the agent can reach on the network Each policy block pairs allowed destinations (host and port) with allowed binaries (executable paths). The proxy matches every outbound connection to the binary that opened it. Both must match or the connection is denied. Process What privileges the agent has The agent runs as an unprivileged user with seccomp filters that block dangerous system calls. No sudo , no setuid , no path to elevated privileges. For the full breakdown of each default policy block and agent compatibility details, refer to ../reference/default-policy . Policy Structure A policy has static sections ( filesystem_policy , landlock , process ) that are locked at sandbox creation, and dynamic sections ( network_policies , inference ) that are hot-reloadable on a running sandbox. version: 1\nStatic: locked at sandbox creation. Paths the agent can read vs read/write\nfilesystem_policy\nread_only: [/usr, /lib, /etc\nread_write: [/sandbox, /tmp\nStatic: Landlock LSM kernel enforcement. best_effort uses highest ABI the host supports\nlandlock\ncompatibility: best_effort\nStatic: Unprivileged user/group the agent process runs as\nprocess\nrun_as_user: sandbox\nrun_as_group: sandbox\nDynamic: hot-reloadable. Named blocks of endpoints + binaries allowed to reach them\nnetwork_policies\nmy_api\nname: my-api\nendpoints\nhost: api.example.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\naccess: full\nbinaries\npath: /usr/bin/curl\nDynamic: hot-reloadable. Routing hints this sandbox can use for inference (e.g. local, nvidia\ninference\nallowed_routes: [local\nFor the complete structure and every field, refer to the Policy Schema Reference . Network Access Rules Network access is controlled by policy blocks under network_policies . Each block has a name, a list of endpoints (host, port, protocol, and optional rules), and a list of binaries that are allowed to use those endpoints. Every outbound connection from the sandbox goes through the proxy: The proxy queries the policy engine with the destination (host and port) and the calling binary. A connection is allowed only when both match an entry in the same policy block. For endpoints with protocol: rest and tls: terminate , each HTTP request is checked against that endpoint’s rules (method and path). If no endpoint matches and inference routes are configured, the request may be rerouted for inference. Otherwise the connection is denied. Endpoints without protocol or tls allow the TCP stream through without inspecting payloads. Next Steps Continue with one of the following: To create your first sandbox, refer to create-and-manage . To supply API keys or tokens, refer to providers . To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog","format":"text","summary":"An OpenShell sandbox is a safe, private execution environment for an AI agent. Each sandbox runs with multiple layers of protection that prevent unauthorized data access, credential exposure, and network exfiltration. Protection layers include filesystem restrictions (Landlock), system call filte...","headings":[{"text":"About Sandboxes","level":1},{"text":"Sandbox Lifecycle","level":2},{"text":"Supported Agents","level":2},{"text":"Built-in Default Policy","level":2},{"text":"Policy Structure","level":2},{"text":"Network Access Rules","level":2},{"text":"Next Steps","level":2}],"children":[{"id":"sandboxes/community-sandboxes","title":"Community Sandboxes","url":"sandboxes/community-sandboxes.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Use pre-built sandboxes from the OpenShell Community catalog or contribute your own.","tags":["Community","Sandbox","Container Image","Open Source"],"topics":["Generative AI","Cybersecurity"],"content_type":"concept","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Community Sandboxes Use pre-built sandboxes from the OpenShell Community catalog, or contribute your\nown. What Are Community Sandboxes Community sandboxes are ready-to-use environments published in the\nOpenShell Community repository\nEach sandbox bundles a Dockerfile, policy, optional skills, and startup scripts\ninto a single package that you can launch with one command. Current Catalog The following community sandboxes are available in the catalog. Sandbox Description base Foundational image with system tools and dev environment openclaw Open agent manipulation and control sdg Synthetic data generation workflows simulation General-purpose simulation sandboxes Use a Community Sandbox Launch a community sandbox by name with the --from flag: $ openshell sandbox create --from openclaw\nWhen you pass --from with a community sandbox name, the CLI: Resolves the name against the\nOpenShell Community repository. Pulls the Dockerfile, policy, skills, and any startup scripts. Builds the container image locally. Creates the sandbox with the bundled configuration applied. You end up with a running sandbox whose image, policy, and tooling are all\npreconfigured by the community package. Other Sources The --from flag also accepts: Local directory paths: Point to a directory on disk that contains a\nDockerfile and optional policy/skills: $ openshell sandbox create --from ./my-sandbox-dir\nContainer image references: Use an existing container image directly: $ openshell sandbox create --from my-registry.example.com/my-image:latest\nContribute a Community Sandbox Each community sandbox is a directory under sandboxes/ in the\nOpenShell Community repository\nAt minimum, a sandbox directory must contain: Dockerfile : Defines the container image README.md : Describes the sandbox and how to use it Optional files: policy.yaml : Default policy applied when the sandbox launches skills/ : Agent skill definitions bundled with the sandbox Startup scripts: Any scripts the Dockerfile or entrypoint invokes To contribute, fork the repository, add your sandbox directory, and open a pull\nrequest. Refer to the repository’s\nCONTRIBUTING.md\nfor submission guidelines. The community catalog is designed to grow. If you have built a sandbox that\nsupports a particular workflow (data processing, simulation, code review\nor anything else), consider contributing it back so others can use it. Next Steps Explore related topics: Need to supply API keys or tokens? Set up providers for credential management. Want to customize the sandbox policy? Write custom rules in policies","format":"text","content_length":2562,"word_count":367,"summary":"Use pre-built sandboxes from the OpenShell Community catalog, or contribute your own.","headings":[{"text":"Community Sandboxes","level":1,"id":"community-sandboxes"},{"text":"What Are Community Sandboxes","level":2,"id":"what-are-community-sandboxes"},{"text":"Current Catalog","level":2,"id":"current-catalog"},{"text":"Use a Community Sandbox","level":2,"id":"use-a-community-sandbox"},{"text":"Other Sources","level":3,"id":"other-sources"},{"text":"Contribute a Community Sandbox","level":2,"id":"contribute-a-community-sandbox"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Community Sandboxes What Are Community Sandboxes Current Catalog Use a Community Sandbox Other Sources Contribute a Community Sandbox Next Steps","keywords":["accepts","agent","any","builds","catalog","com","community","contain","container","contribute","creates","current","default","defines","describes","description","directly","dockerfile","each","explore","files","flag","foundational","general","image","launch","local","need","next","open","openshell","optional","other","paths","point","pulls","refer","references","resolves","sandbox","sandboxes","scripts","set","skills","sources","startup","steps","synthetic","topics","want"],"code_blocks":[{"content":"$ openshell sandbox create --from openclaw","language":"text"},{"content":"$ openshell sandbox create --from ./my-sandbox-dir","language":"text"},{"content":"$ openshell sandbox create --from my-registry.example.com/my-image:latest","language":"text"}],"links":[{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"},{"text":"Contributing","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community/blob/main/CONTRIBUTING.md","original_text":"CONTRIBUTING.md"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Community Sandboxes"]},{"id":"sandboxes/create-and-manage","title":"Create and Manage Sandboxes","url":"sandboxes/create-and-manage.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create, inspect, connect to, monitor, transfer files, and delete OpenShell sandboxes.","tags":["Sandboxing","AI Agents","Sandbox Management","CLI"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Create and Manage Sandboxes This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes . Docker must be running before you create a sandbox. If it is not, the CLI\nreturns a connection-refused error ( os error 61 ) without explaining\nthe cause. Start Docker and try again. Create a Sandbox Run a single command to create a sandbox and launch your agent: $ openshell sandbox create -- claude\nIf you have an existing gateway, the sandbox is created in it. Otherwise, a gateway is created automatically. A fully specified creation command might look like: $ openshell sandbox create\nname dev\nprovider my-claude\npolicy policy.yaml\nupload\nkeep\nclaude\nUse --keep to keep the sandbox running after the trailing command exits\nThis is especially useful when you are iterating on a policy or want to\nreconnect later from another terminal or VS Code. Create from a Community Sandbox or Custom Image Use --from to create a sandbox from a pre-built community package, a local directory, or a container image: $ openshell sandbox create --from openclaw\nThe CLI resolves the name against the OpenShell Community catalog, pulls the bundled Dockerfile and policy, builds the image locally, and creates the sandbox. For the full catalog and how to contribute your own, refer to community-sandboxes . You can also point --from at a local directory or a container image reference: $ openshell sandbox create --from ./my-sandbox-dir\nopenshell sandbox create --from my-registry.example.com/my-image:latest\nList and Inspect Sandboxes Check the status of your sandboxes and retrieve detailed information about individual ones. List all sandboxes: $ openshell sandbox list\nGet detailed information about a specific sandbox: $ openshell sandbox get my-sandbox\nConnect to a Sandbox Access a running sandbox through an interactive SSH session or VS Code Remote-SSH. Interactive SSH Open an SSH session into a running sandbox: $ openshell sandbox connect my-sandbox\nView Logs Stream and filter sandbox logs to monitor agent activity and diagnose policy decisions. Stream sandbox logs: $ openshell logs my-sandbox\nUse flags to filter and follow output: Flag Purpose Example --tail Stream logs in real time openshell logs my-sandbox --tail --source Filter by log source --source sandbox --level Filter by severity --level warn --since Show logs from a time window --since 5m Monitor Your Sandbox OpenShell Terminal is a real-time dashboard that combines sandbox status and live logs in a single view. $ openshell term\nThe dashboard shows the following information. Sandbox status : Name, phase, image, attached providers, age, and active port forwards. Live log stream : Omutbound connections, policy decisions, and inference interceptions as they happen. Logs are labeled by source: sandbox (proxy and policy events) or gateway (lifecycle events). Use the terminal to spot blocked connections ( action=deny entries) and inference interceptions ( action=inspect_for_inference entries). If a connection is blocked unexpectedly, add the host to your network policy — refer to policies for the workflow. Transfer Files Transfer files between your host machine and a running sandbox. Upload files from your host into the sandbox: $ openshell sandbox upload my-sandbox ./src /sandbox/src\nDownload files from the sandbox to your host: $ openshell sandbox download my-sandbox /sandbox/output ./local\nYou can also upload files at creation time with the --upload flag on\nopenshell sandbox create . Delete Sandboxes Remove sandboxes when they are no longer needed. Deleting a sandbox stops all processes, releases cluster resources, and purges injected credentials. Delete a sandbox by name: $ openshell sandbox delete my-sandbox\nDelete all sandboxes in the active gateway: $ openshell sandbox delete --all\nNext Steps Explore related topics: To follow a complete end-to-end example, refer to the /tutorials/github-sandbox tutorial. To supply API keys or tokens, refer to providers . To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog","format":"text","content_length":4230,"word_count":648,"summary":"This page walks you through the full sandbox lifecycle: creating, inspecting, connecting to, monitoring, and deleting sandboxes. For background on what sandboxes are and how the runtime works, refer to About Sandboxes.","headings":[{"text":"Create and Manage Sandboxes","level":1,"id":"create-and-manage-sandboxes"},{"text":"Create a Sandbox","level":2,"id":"create-a-sandbox"},{"text":"Create from a Community Sandbox or Custom Image","level":2,"id":"create-from-a-community-sandbox-or-custom-image"},{"text":"List and Inspect Sandboxes","level":2,"id":"list-and-inspect-sandboxes"},{"text":"Connect to a Sandbox","level":2,"id":"connect-to-a-sandbox"},{"text":"Interactive SSH","level":3,"id":"interactive-ssh"},{"text":"View Logs","level":2,"id":"view-logs"},{"text":"Monitor Your Sandbox","level":2,"id":"monitor-your-sandbox"},{"text":"Transfer Files","level":2,"id":"transfer-files"},{"text":"Delete Sandboxes","level":2,"id":"delete-sandboxes"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Create and Manage Sandboxes Create a Sandbox Create from a Community Sandbox or Custom Image List and Inspect Sandboxes Connect to a Sandbox Interactive SSH View Logs Monitor Your Sandbox Transfer Files Delete Sandboxes Next Steps","keywords":["about","access","action","agent","check","code","com","community","connect","create","custom","delete","deleting","docker","dockerfile","download","example","explore","files","filter","flag","from","gateway","host","image","inspect","interactive","lifecycle","like","list","live","logs","manage","monitor","name","next","omutbound","open","openshell","otherwise","output","purpose","reference","remote","remove","run","sandbox","sandboxes","show","source"],"code_blocks":[{"content":"$ openshell sandbox create -- claude","language":"text"},{"content":"$ openshell sandbox create \\\n --name dev \\\n --provider my-claude \\\n --policy policy.yaml \\\n --upload \\\n --keep \\\n -- claude","language":"text"},{"content":"$ openshell sandbox create --from openclaw","language":"text"},{"content":"$ openshell sandbox create --from ./my-sandbox-dir\n$ openshell sandbox create --from my-registry.example.com/my-image:latest","language":"text"},{"content":"$ openshell sandbox list","language":"text"},{"content":"$ openshell sandbox get my-sandbox","language":"text"},{"content":"$ openshell sandbox connect my-sandbox","language":"text"},{"content":"$ openshell logs my-sandbox","language":"text"},{"content":"$ openshell term","language":"text"},{"content":"$ openshell sandbox upload my-sandbox ./src /sandbox/src","language":"text"},{"content":"$ openshell sandbox download my-sandbox /sandbox/output ./local","language":"text"},{"content":"$ openshell sandbox delete my-sandbox","language":"text"},{"content":"$ openshell sandbox delete --all","language":"text"}],"links":[{"text":"OpenShell Community","type":"external","url":"https://github.com/NVIDIA/OpenShell-Community"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Create And Manage"]},{"id":"sandboxes/policies","title":"Customize Sandbox Policies","url":"sandboxes/policies.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Apply, iterate, and debug sandbox network policies with hot-reload on running OpenShell sandboxes.","tags":["Policy","Network Policy","Sandbox","Security","Hot Reload"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Customize Sandbox Policies Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference . Quick Start: Apply a Custom Policy Pass a policy YAML file when creating the sandbox: $ openshell sandbox create --policy ./my-policy.yaml --keep -- claude\nThe --keep flag keeps the sandbox running after the initial command exits, which is useful when you plan to iterate on the policy. To avoid passing --policy every time, set a default policy with an environment variable: $ export OPENSHELL_SANDBOX_POLICY=./my-policy.yaml\nopenshell sandbox create --keep -- claude\nThe CLI uses the policy from OPENSHELL_SANDBOX_POLICY whenever --policy is not explicitly provided. Iterate on a Running Sandbox To change what the sandbox can access, pull the current policy, edit the YAML, and push the update. The workflow is iterative: create the sandbox, monitor logs for denied actions, pull the policy, modify it, push, and verify. The following steps outline the hot-reload policy update workflow. Create the sandbox with your initial policy by following Quick Start: Apply a Custom Policy above (or set OPENSHELL_SANDBOX_POLICY ). Monitor denials. Each log entry shows host, port, binary, and reason. Alternatively, use openshell term for a live dashboard. $ openshell logs --tail --source sandbox\nPull the current policy. Strip the metadata header (Version, Hash, Status) before reusing the file. $ openshell policy get --full > current-policy.yaml\nEdit the YAML: add or adjust network_policies entries, binaries, access or rules , or inference.allowed_routes . Push the updated policy. Exit codes: 0 = loaded, 1 = validation failed, 124 = timeout. $ openshell policy set --policy current-policy.yaml --wait\nVerify the new revision. If status is loaded , repeat from step 2 as needed; if failed , fix the policy and repeat from step 4. $ openshell policy list --tail --source sandbox for the denied host, path, and binary. When triaging denied requests, check: Destination host and port to confirm which endpoint is missing. Calling binary path to confirm which binaries entry needs to be added or adjusted. HTTP method and path (for REST endpoints) to confirm which rules entry needs to be added or adjusted. Then push the updated policy as described above. Examples Add these blocks to the network_policies section of your sandbox policy. Apply with openshell policy set --policy --wait\nUse Simple endpoint for host-level allowlists and Granular rules for method/path control. Simple endpoint Allow pip install and uv pip install to reach PyPI: pypi\nname: pypi\nendpoints\nhost: pypi.org\nport: 443\nhost: files.pythonhosted.org\nport: 443\nbinaries\n{ path: /usr/bin/pip\n{ path: /usr/local/bin/uv\nEndpoints without protocol or tls use TCP passthrough — the proxy allows the stream without inspecting payloads. Granular rules Allow Claude and the GitHub CLI to reach api.github.com with per-path rules: read-only (GET, HEAD, OPTIONS) and GraphQL (POST) for all paths; full write access for alpha-repo ; and create/edit issues only for bravo-repo . Replace with your GitHub org or username. For an end-to-end walkthrough that combines this policy with a GitHub credential provider and sandbox creation, refer to /tutorials/github-sandbox . github_repos\nname: github_repos\nendpoints\nhost: api.github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nallow\nmethod: GET\npath:\nallow\nmethod: HEAD\npath:\nallow\nmethod: OPTIONS\npath:\nallow\nmethod: POST\npath: \"/graphql\nallow\nmethod:\npath: \"/repos//alpha-repo\nallow\nmethod: POST\npath: \"/repos//bravo-repo/issues\nallow\nmethod: PATCH\npath: \"/repos//bravo-repo/issues\nbinaries\n{ path: /usr/local/bin/claude\n{ path: /usr/bin/gh\nEndpoints with protocol: rest and tls: terminate enable HTTP request inspection — the proxy decrypts TLS and checks each HTTP request against the rules list. Next Steps Explore related topics: To learn about policy structure and network access rules, refer to index . To view the full field-by-field YAML definition, refer to the Policy Schema Reference . To review the default policy breakdown, refer to ../reference/default-policy","format":"text","content_length":4315,"word_count":639,"summary":"Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference.","headings":[{"text":"Customize Sandbox Policies","level":1,"id":"customize-sandbox-policies"},{"text":"Quick Start: Apply a Custom Policy","level":2,"id":"quick-start-apply-a-custom-policy"},{"text":"Iterate on a Running Sandbox","level":2,"id":"iterate-on-a-running-sandbox"},{"text":"Debug Denied Requests","level":2,"id":"debug-denied-requests"},{"text":"Examples","level":2,"id":"examples"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Customize Sandbox Policies Quick Start: Apply a Custom Policy Iterate on a Running Sandbox Debug Denied Requests Examples Next Steps","keywords":["add","allow","alternatively","apply","calling","check","claude","codes","com","create","custom","customize","debug","denied","destination","each","edit","endpoints","enforcement","examples","exit","explore","github","granular","graphql","hash","host","iterate","iterative","method","monitor","name","next","org","pass","path","policies","policy","port","protocol","pull","push","pypi","quick","reference","replace","requests","rules","running","sandbox"],"code_blocks":[{"content":"$ openshell sandbox create --policy ./my-policy.yaml --keep -- claude","language":"text"},{"content":"$ export OPENSHELL_SANDBOX_POLICY=./my-policy.yaml\n$ openshell sandbox create --keep -- claude","language":"text"},{"content":"$ openshell logs --tail --source sandbox","language":"text"},{"content":"$ openshell policy get --full > current-policy.yaml","language":"text"},{"content":"$ openshell policy set --policy current-policy.yaml --wait","language":"text"},{"content":"$ openshell policy list ","language":"text"},{"content":"pypi:\n name: pypi\n endpoints:\n - host: pypi.org\n port: 443\n - host: files.pythonhosted.org\n port: 443\n binaries:\n - { path: /usr/bin/pip }\n - { path: /usr/local/bin/uv }","language":"text"},{"content":"github_repos:\n name: github_repos\n endpoints:\n - host: api.github.com\n port: 443\n protocol: rest\n tls: terminate\n enforcement: enforce\n rules:\n - allow:\n method: GET\n path: \"/**\"\n - allow:\n method: HEAD\n path: \"/**\"\n - allow:\n method: OPTIONS\n path: \"/**\"\n - allow:\n method: POST\n path: \"/graphql\"\n - allow:\n method: \"*\"\n path: \"/repos//alpha-repo/**\"\n - allow:\n method: POST\n path: \"/repos//bravo-repo/issues\"\n - allow:\n method: PATCH\n path: \"/repos//bravo-repo/issues/*\"\n binaries:\n - { path: /usr/local/bin/claude }\n - { path: /usr/bin/gh }","language":"text"}],"links":[{"text":"Quick Start: Apply a Custom Policy","type":"anchor","url":"#quick-start-apply-a-custom-policy"}],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Policies"]},{"id":"sandboxes/providers","title":"Providers","url":"sandboxes/providers.html","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create and manage credential providers that inject API keys and tokens into OpenShell sandboxes.","tags":["Providers","Credentials","API Keys","Sandbox","Security"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Providers AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers . Create and manage providers that supply credentials to sandboxes. Create a Provider Providers can be created from local environment variables or with explicit credential values. From Local Credentials The fastest way to create a provider is to let the CLI discover credentials from\nyour shell environment: $ openshell provider create --name my-claude --type claude --from-existing\nThis reads ANTHROPIC_API_KEY or CLAUDE_API_KEY from your current environment\nand stores them in the provider. With Explicit Credentials Supply a credential value directly: $ openshell provider create --name my-api --type generic --credential API_KEY=sk-abc123\nBare Key Form Pass a key name without a value to read the value from the environment variable\nof that name: $ openshell provider create --name my-api --type generic --credential API_KEY\nThis looks up the current value of $API_KEY in your shell and stores it. Manage Providers List, inspect, update, and delete providers from the active cluster. List all providers: $ openshell provider list\nInspect a provider: $ openshell provider get my-claude\nUpdate a provider’s credentials: $ openshell provider update my-claude --type claude --from-existing\nDelete a provider: $ openshell provider delete my-claude\nAttach Providers to Sandboxes Pass one or more --provider flags when creating a sandbox: $ openshell sandbox create --provider my-claude --provider my-github -- claude\nEach --provider flag attaches one provider. The sandbox receives all\ncredentials from every attached provider at runtime. Providers cannot be added to a running sandbox. If you need to attach an\nadditional provider, delete the sandbox and recreate it with all required\nproviders specified. Auto-Discovery Shortcut When the trailing command in openshell sandbox create is a recognized tool name ( claude , codex , or opencode ), the CLI auto-creates the required\nprovider from your local credentials if one does not already exist. You do not\nneed to create the provider separately: $ openshell sandbox create -- claude\nThis detects claude as a known tool, finds your ANTHROPIC_API_KEY , creates\na provider, attaches it to the sandbox, and launches Claude Code. Supported Provider Types The following provider types are supported. Type Environment Variables Injected Typical Use claude ANTHROPIC_API_KEY , CLAUDE_API_KEY Claude Code, Anthropic API codex OPENAI_API_KEY OpenAI Codex opencode OPENCODE_API_KEY , OPENROUTER_API_KEY , OPENAI_API_KEY opencode tool github GITHUB_TOKEN , GH_TOKEN GitHub API, gh CLI — refer to /tutorials/github-sandbox gitlab GITLAB_TOKEN , GLAB_TOKEN , CI_JOB_TOKEN GitLab API, glab CLI nvidia NVIDIA_API_KEY NVIDIA API Catalog generic User-defined Any service with custom credentials outlook (none: no auto-discovery) Microsoft Outlook integration Use the generic type for any service not listed above. You define the\nenvironment variable names and values yourself with --credential . Next Steps Explore related topics: To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog. To view the complete field reference for the policy YAML, refer to the Policy Schema Reference","format":"text","content_length":3421,"word_count":502,"summary":"AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers.","headings":[{"text":"Providers","level":1,"id":"providers"},{"text":"Create a Provider","level":2,"id":"create-a-provider"},{"text":"From Local Credentials","level":3,"id":"from-local-credentials"},{"text":"With Explicit Credentials","level":3,"id":"with-explicit-credentials"},{"text":"Bare Key Form","level":3,"id":"bare-key-form"},{"text":"Manage Providers","level":2,"id":"manage-providers"},{"text":"Attach Providers to Sandboxes","level":2,"id":"attach-providers-to-sandboxes"},{"text":"Auto-Discovery Shortcut","level":3,"id":"auto-discovery-shortcut"},{"text":"Supported Provider Types","level":2,"id":"supported-provider-types"},{"text":"Next Steps","level":2,"id":"next-steps"}],"headings_text":"Providers Create a Provider From Local Credentials With Explicit Credentials Bare Key Form Manage Providers Attach Providers to Sandboxes Auto-Discovery Shortcut Supported Provider Types Next Steps","keywords":["anthropic","any","attach","auto","bare","catalog","claude","code","codex","create","credentials","delete","directly","discovery","each","environment","explicit","explore","form","from","github","gitlab","injected","inspect","key","list","local","manage","microsoft","name","next","none","openai","openshell","outlook","pass","policy","provider","providers","reference","sandbox","sandboxes","schema","separately","services","shortcut","steps","supply","supported","this"],"code_blocks":[{"content":"$ openshell provider create --name my-claude --type claude --from-existing","language":"text"},{"content":"$ openshell provider create --name my-api --type generic --credential API_KEY=sk-abc123","language":"text"},{"content":"$ openshell provider create --name my-api --type generic --credential API_KEY","language":"text"},{"content":"$ openshell provider list","language":"text"},{"content":"$ openshell provider get my-claude","language":"text"},{"content":"$ openshell provider update my-claude --type claude --from-existing","language":"text"},{"content":"$ openshell provider delete my-claude","language":"text"},{"content":"$ openshell sandbox create --provider my-claude --provider my-github -- claude","language":"text"},{"content":"$ openshell sandbox create -- claude","language":"text"}],"links":[],"images":[],"doc_type":"tutorial","section_path":["Sandboxes","Providers"]}]} \ No newline at end of file diff --git a/pr-preview/pr-240/sandboxes/policies.json b/pr-preview/pr-240/sandboxes/policies.json index 65e02e69c..330e84e3c 100644 --- a/pr-preview/pr-240/sandboxes/policies.json +++ b/pr-preview/pr-240/sandboxes/policies.json @@ -1 +1 @@ -{"id":"sandboxes/policies","title":"Customize Sandbox Policies","url":"sandboxes/policies.html","last_modified":"2026-03-11T21:58:22.118367+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Apply, iterate, and debug sandbox network policies with hot-reload on running OpenShell sandboxes.","tags":["Policy","Network Policy","Sandbox","Security","Hot Reload"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Customize Sandbox Policies Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference . Quick Start: Apply a Custom Policy Pass a policy YAML file when creating the sandbox: $ openshell sandbox create --policy ./my-policy.yaml --keep -- claude\nThe --keep flag keeps the sandbox running after the initial command exits, which is useful when you plan to iterate on the policy. To avoid passing --policy every time, set a default policy with an environment variable: $ export OPENSHELL_SANDBOX_POLICY=./my-policy.yaml\nopenshell sandbox create --keep -- claude\nThe CLI uses the policy from OPENSHELL_SANDBOX_POLICY whenever --policy is not explicitly provided. Iterate on a Running Sandbox To change what the sandbox can access, pull the current policy, edit the YAML, and push the update. The workflow is iterative: create the sandbox, monitor logs for denied actions, pull the policy, modify it, push, and verify. The following steps outline the hot-reload policy update workflow. Create the sandbox with your initial policy by following Quick Start: Apply a Custom Policy above (or set OPENSHELL_SANDBOX_POLICY ). Monitor denials. Each log entry shows host, port, binary, and reason. Alternatively, use openshell term for a live dashboard. $ openshell logs --tail --source sandbox\nPull the current policy. Strip the metadata header (Version, Hash, Status) before reusing the file. $ openshell policy get --full > current-policy.yaml\nEdit the YAML: add or adjust network_policies entries, binaries, access or rules , or inference.allowed_routes . Push the updated policy. Exit codes: 0 = loaded, 1 = validation failed, 124 = timeout. $ openshell policy set --policy current-policy.yaml --wait\nVerify the new revision. If status is loaded , repeat from step 2 as needed; if failed , fix the policy and repeat from step 4. $ openshell policy list --tail --source sandbox for the denied host, path, and binary. When triaging denied requests, check: Destination host and port to confirm which endpoint is missing. Calling binary path to confirm which binaries entry needs to be added or adjusted. HTTP method and path (for REST endpoints) to confirm which rules entry needs to be added or adjusted. Then push the updated policy as described above. Examples Add these blocks to the network_policies section of your sandbox policy. Apply with openshell policy set --policy --wait\nUse Simple endpoint for host-level allowlists and Granular rules for method/path control. Simple endpoint Allow pip install and uv pip install to reach PyPI: pypi\nname: pypi\nendpoints\nhost: pypi.org\nport: 443\nhost: files.pythonhosted.org\nport: 443\nbinaries\n{ path: /usr/bin/pip\n{ path: /usr/local/bin/uv\nEndpoints without protocol or tls use TCP passthrough — the proxy allows the stream without inspecting payloads. Granular rules Allow Claude and the GitHub CLI to reach api.github.com with per-path rules: read-only (GET, HEAD, OPTIONS) and GraphQL (POST) for all paths; full write access for alpha-repo ; and create/edit issues only for bravo-repo . Replace with your GitHub org or username. For an end-to-end walkthrough that combines this policy with a GitHub credential provider and sandbox creation, refer to /tutorials/github-sandbox . github_repos\nname: github_repos\nendpoints\nhost: api.github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nallow\nmethod: GET\npath:\nallow\nmethod: HEAD\npath:\nallow\nmethod: OPTIONS\npath:\nallow\nmethod: POST\npath: \"/graphql\nallow\nmethod:\npath: \"/repos//alpha-repo\nallow\nmethod: POST\npath: \"/repos//bravo-repo/issues\nallow\nmethod: PATCH\npath: \"/repos//bravo-repo/issues\nbinaries\n{ path: /usr/local/bin/claude\n{ path: /usr/bin/gh\nEndpoints with protocol: rest and tls: terminate enable HTTP request inspection — the proxy decrypts TLS and checks each HTTP request against the rules list. Next Steps Explore related topics: To learn about policy structure and network access rules, refer to index . To view the full field-by-field YAML definition, refer to the Policy Schema Reference . To review the default policy breakdown, refer to ../reference/default-policy","format":"text","summary":"Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference.","headings":[{"text":"Customize Sandbox Policies","level":1},{"text":"Quick Start: Apply a Custom Policy","level":2},{"text":"Iterate on a Running Sandbox","level":2},{"text":"Debug Denied Requests","level":2},{"text":"Examples","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file +{"id":"sandboxes/policies","title":"Customize Sandbox Policies","url":"sandboxes/policies.html","last_modified":"2026-03-11T22:04:40.696467+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Apply, iterate, and debug sandbox network policies with hot-reload on running OpenShell sandboxes.","tags":["Policy","Network Policy","Sandbox","Security","Hot Reload"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_intermediate","audience":["engineer"],"content":"Customize Sandbox Policies Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference . Quick Start: Apply a Custom Policy Pass a policy YAML file when creating the sandbox: $ openshell sandbox create --policy ./my-policy.yaml --keep -- claude\nThe --keep flag keeps the sandbox running after the initial command exits, which is useful when you plan to iterate on the policy. To avoid passing --policy every time, set a default policy with an environment variable: $ export OPENSHELL_SANDBOX_POLICY=./my-policy.yaml\nopenshell sandbox create --keep -- claude\nThe CLI uses the policy from OPENSHELL_SANDBOX_POLICY whenever --policy is not explicitly provided. Iterate on a Running Sandbox To change what the sandbox can access, pull the current policy, edit the YAML, and push the update. The workflow is iterative: create the sandbox, monitor logs for denied actions, pull the policy, modify it, push, and verify. The following steps outline the hot-reload policy update workflow. Create the sandbox with your initial policy by following Quick Start: Apply a Custom Policy above (or set OPENSHELL_SANDBOX_POLICY ). Monitor denials. Each log entry shows host, port, binary, and reason. Alternatively, use openshell term for a live dashboard. $ openshell logs --tail --source sandbox\nPull the current policy. Strip the metadata header (Version, Hash, Status) before reusing the file. $ openshell policy get --full > current-policy.yaml\nEdit the YAML: add or adjust network_policies entries, binaries, access or rules , or inference.allowed_routes . Push the updated policy. Exit codes: 0 = loaded, 1 = validation failed, 124 = timeout. $ openshell policy set --policy current-policy.yaml --wait\nVerify the new revision. If status is loaded , repeat from step 2 as needed; if failed , fix the policy and repeat from step 4. $ openshell policy list --tail --source sandbox for the denied host, path, and binary. When triaging denied requests, check: Destination host and port to confirm which endpoint is missing. Calling binary path to confirm which binaries entry needs to be added or adjusted. HTTP method and path (for REST endpoints) to confirm which rules entry needs to be added or adjusted. Then push the updated policy as described above. Examples Add these blocks to the network_policies section of your sandbox policy. Apply with openshell policy set --policy --wait\nUse Simple endpoint for host-level allowlists and Granular rules for method/path control. Simple endpoint Allow pip install and uv pip install to reach PyPI: pypi\nname: pypi\nendpoints\nhost: pypi.org\nport: 443\nhost: files.pythonhosted.org\nport: 443\nbinaries\n{ path: /usr/bin/pip\n{ path: /usr/local/bin/uv\nEndpoints without protocol or tls use TCP passthrough — the proxy allows the stream without inspecting payloads. Granular rules Allow Claude and the GitHub CLI to reach api.github.com with per-path rules: read-only (GET, HEAD, OPTIONS) and GraphQL (POST) for all paths; full write access for alpha-repo ; and create/edit issues only for bravo-repo . Replace with your GitHub org or username. For an end-to-end walkthrough that combines this policy with a GitHub credential provider and sandbox creation, refer to /tutorials/github-sandbox . github_repos\nname: github_repos\nendpoints\nhost: api.github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nallow\nmethod: GET\npath:\nallow\nmethod: HEAD\npath:\nallow\nmethod: OPTIONS\npath:\nallow\nmethod: POST\npath: \"/graphql\nallow\nmethod:\npath: \"/repos//alpha-repo\nallow\nmethod: POST\npath: \"/repos//bravo-repo/issues\nallow\nmethod: PATCH\npath: \"/repos//bravo-repo/issues\nbinaries\n{ path: /usr/local/bin/claude\n{ path: /usr/bin/gh\nEndpoints with protocol: rest and tls: terminate enable HTTP request inspection — the proxy decrypts TLS and checks each HTTP request against the rules list. Next Steps Explore related topics: To learn about policy structure and network access rules, refer to index . To view the full field-by-field YAML definition, refer to the Policy Schema Reference . To review the default policy breakdown, refer to ../reference/default-policy","format":"text","summary":"Use this page to apply and iterate policy changes on running sandboxes. For a full field-by-field YAML definition, use the Policy Schema Reference.","headings":[{"text":"Customize Sandbox Policies","level":1},{"text":"Quick Start: Apply a Custom Policy","level":2},{"text":"Iterate on a Running Sandbox","level":2},{"text":"Debug Denied Requests","level":2},{"text":"Examples","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file diff --git a/pr-preview/pr-240/sandboxes/providers.json b/pr-preview/pr-240/sandboxes/providers.json index 84a3759cd..11eff29c0 100644 --- a/pr-preview/pr-240/sandboxes/providers.json +++ b/pr-preview/pr-240/sandboxes/providers.json @@ -1 +1 @@ -{"id":"sandboxes/providers","title":"Providers","url":"sandboxes/providers.html","last_modified":"2026-03-11T21:58:22.124062+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create and manage credential providers that inject API keys and tokens into OpenShell sandboxes.","tags":["Providers","Credentials","API Keys","Sandbox","Security"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Providers AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers . Create and manage providers that supply credentials to sandboxes. Create a Provider Providers can be created from local environment variables or with explicit credential values. From Local Credentials The fastest way to create a provider is to let the CLI discover credentials from\nyour shell environment: $ openshell provider create --name my-claude --type claude --from-existing\nThis reads ANTHROPIC_API_KEY or CLAUDE_API_KEY from your current environment\nand stores them in the provider. With Explicit Credentials Supply a credential value directly: $ openshell provider create --name my-api --type generic --credential API_KEY=sk-abc123\nBare Key Form Pass a key name without a value to read the value from the environment variable\nof that name: $ openshell provider create --name my-api --type generic --credential API_KEY\nThis looks up the current value of $API_KEY in your shell and stores it. Manage Providers List, inspect, update, and delete providers from the active cluster. List all providers: $ openshell provider list\nInspect a provider: $ openshell provider get my-claude\nUpdate a provider’s credentials: $ openshell provider update my-claude --type claude --from-existing\nDelete a provider: $ openshell provider delete my-claude\nAttach Providers to Sandboxes Pass one or more --provider flags when creating a sandbox: $ openshell sandbox create --provider my-claude --provider my-github -- claude\nEach --provider flag attaches one provider. The sandbox receives all\ncredentials from every attached provider at runtime. Providers cannot be added to a running sandbox. If you need to attach an\nadditional provider, delete the sandbox and recreate it with all required\nproviders specified. Auto-Discovery Shortcut When the trailing command in openshell sandbox create is a recognized tool name ( claude , codex , or opencode ), the CLI auto-creates the required\nprovider from your local credentials if one does not already exist. You do not\nneed to create the provider separately: $ openshell sandbox create -- claude\nThis detects claude as a known tool, finds your ANTHROPIC_API_KEY , creates\na provider, attaches it to the sandbox, and launches Claude Code. Supported Provider Types The following provider types are supported. Type Environment Variables Injected Typical Use claude ANTHROPIC_API_KEY , CLAUDE_API_KEY Claude Code, Anthropic API codex OPENAI_API_KEY OpenAI Codex opencode OPENCODE_API_KEY , OPENROUTER_API_KEY , OPENAI_API_KEY opencode tool github GITHUB_TOKEN , GH_TOKEN GitHub API, gh CLI — refer to /tutorials/github-sandbox gitlab GITLAB_TOKEN , GLAB_TOKEN , CI_JOB_TOKEN GitLab API, glab CLI nvidia NVIDIA_API_KEY NVIDIA API Catalog generic User-defined Any service with custom credentials outlook (none: no auto-discovery) Microsoft Outlook integration Use the generic type for any service not listed above. You define the\nenvironment variable names and values yourself with --credential . Next Steps Explore related topics: To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog. To view the complete field reference for the policy YAML, refer to the Policy Schema Reference","format":"text","summary":"AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers.","headings":[{"text":"Providers","level":1},{"text":"Create a Provider","level":2},{"text":"From Local Credentials","level":3},{"text":"With Explicit Credentials","level":3},{"text":"Bare Key Form","level":3},{"text":"Manage Providers","level":2},{"text":"Attach Providers to Sandboxes","level":2},{"text":"Auto-Discovery Shortcut","level":3},{"text":"Supported Provider Types","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file +{"id":"sandboxes/providers","title":"Providers","url":"sandboxes/providers.html","last_modified":"2026-03-11T22:04:40.690135+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Create and manage credential providers that inject API keys and tokens into OpenShell sandboxes.","tags":["Providers","Credentials","API Keys","Sandbox","Security"],"topics":["Generative AI","Cybersecurity"],"content_type":"how_to","learning_level":"technical_beginner","audience":["engineer","data_scientist"],"content":"Providers AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers . Create and manage providers that supply credentials to sandboxes. Create a Provider Providers can be created from local environment variables or with explicit credential values. From Local Credentials The fastest way to create a provider is to let the CLI discover credentials from\nyour shell environment: $ openshell provider create --name my-claude --type claude --from-existing\nThis reads ANTHROPIC_API_KEY or CLAUDE_API_KEY from your current environment\nand stores them in the provider. With Explicit Credentials Supply a credential value directly: $ openshell provider create --name my-api --type generic --credential API_KEY=sk-abc123\nBare Key Form Pass a key name without a value to read the value from the environment variable\nof that name: $ openshell provider create --name my-api --type generic --credential API_KEY\nThis looks up the current value of $API_KEY in your shell and stores it. Manage Providers List, inspect, update, and delete providers from the active cluster. List all providers: $ openshell provider list\nInspect a provider: $ openshell provider get my-claude\nUpdate a provider’s credentials: $ openshell provider update my-claude --type claude --from-existing\nDelete a provider: $ openshell provider delete my-claude\nAttach Providers to Sandboxes Pass one or more --provider flags when creating a sandbox: $ openshell sandbox create --provider my-claude --provider my-github -- claude\nEach --provider flag attaches one provider. The sandbox receives all\ncredentials from every attached provider at runtime. Providers cannot be added to a running sandbox. If you need to attach an\nadditional provider, delete the sandbox and recreate it with all required\nproviders specified. Auto-Discovery Shortcut When the trailing command in openshell sandbox create is a recognized tool name ( claude , codex , or opencode ), the CLI auto-creates the required\nprovider from your local credentials if one does not already exist. You do not\nneed to create the provider separately: $ openshell sandbox create -- claude\nThis detects claude as a known tool, finds your ANTHROPIC_API_KEY , creates\na provider, attaches it to the sandbox, and launches Claude Code. Supported Provider Types The following provider types are supported. Type Environment Variables Injected Typical Use claude ANTHROPIC_API_KEY , CLAUDE_API_KEY Claude Code, Anthropic API codex OPENAI_API_KEY OpenAI Codex opencode OPENCODE_API_KEY , OPENROUTER_API_KEY , OPENAI_API_KEY opencode tool github GITHUB_TOKEN , GH_TOKEN GitHub API, gh CLI — refer to /tutorials/github-sandbox gitlab GITLAB_TOKEN , GLAB_TOKEN , CI_JOB_TOKEN GitLab API, glab CLI nvidia NVIDIA_API_KEY NVIDIA API Catalog generic User-defined Any service with custom credentials outlook (none: no auto-discovery) Microsoft Outlook integration Use the generic type for any service not listed above. You define the\nenvironment variable names and values yourself with --credential . Next Steps Explore related topics: To control what the agent can access, refer to policies . To use a pre-built environment, refer to the community-sandboxes catalog. To view the complete field reference for the policy YAML, refer to the Policy Schema Reference","format":"text","summary":"AI agents typically need credentials to access external services: an API key for the AI model provider, a token for GitHub or GitLab, and so on. OpenShell manages these credentials as first-class entities called providers.","headings":[{"text":"Providers","level":1},{"text":"Create a Provider","level":2},{"text":"From Local Credentials","level":3},{"text":"With Explicit Credentials","level":3},{"text":"Bare Key Form","level":3},{"text":"Manage Providers","level":2},{"text":"Attach Providers to Sandboxes","level":2},{"text":"Auto-Discovery Shortcut","level":3},{"text":"Supported Provider Types","level":2},{"text":"Next Steps","level":2}]} \ No newline at end of file diff --git a/pr-preview/pr-240/searchindex.js b/pr-preview/pr-240/searchindex.js index 6d1648936..0b88f36e3 100644 --- a/pr-preview/pr-240/searchindex.js +++ b/pr-preview/pr-240/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"0.1.0": [[2, "id1"]], "About Inference Routing": [[6, null]], "About Sandboxes": [[14, null]], "Access Levels": [[9, "access-levels"]], "Agent Compatibility": [[8, "agent-compatibility"], [10, "agent-compatibility"]], "Ask Claude to Check the Sandbox Logs": [[17, "ask-claude-to-check-the-sandbox-logs"]], "Attach Providers to Sandboxes": [[16, "attach-providers-to-sandboxes"]], "Auto-Discovery Shortcut": [[16, "auto-discovery-shortcut"]], "Bare Key Form": [[16, "bare-key-form"]], "Binary Object": [[9, "binary-object"]], "Built-in Default Policy": [[14, "built-in-default-policy"]], "Built-in Help": [[7, "built-in-help"]], "CLI Reference": [[7, null]], "Clean Up": [[17, "clean-up"]], "Command Tree": [[7, "command-tree"]], "Common Risks and Controls": [[1, "common-risks-and-controls"]], "Common Use Cases": [[1, "common-use-cases"]], "Community Sandboxes": [[12, null]], "Components": [[0, "components"]], "Configure Inference Routing": [[5, null]], "Connect to a Remote Gateway (Optional)": [[3, "connect-to-a-remote-gateway-optional"]], "Connect to a Sandbox": [[13, "connect-to-a-sandbox"]], "Container Images": [[10, "container-images"]], "Contribute a Community Sandbox": [[12, "contribute-a-community-sandbox"]], "Create Your First OpenShell Sandbox": [[3, "create-your-first-openshell-sandbox"]], "Create a Provider": [[16, "create-a-provider"]], "Create a Sandbox": [[13, "create-a-sandbox"]], "Create and Manage Sandboxes": [[13, null]], "Create from a Community Sandbox or Custom Image": [[13, "create-from-a-community-sandbox-or-custom-image"]], "Current Catalog": [[12, "current-catalog"]], "Customize Sandbox Policies": [[15, null]], "Debug Denied Requests": [[15, "debug-denied-requests"]], "Default Policy Blocks": [[8, "default-policy-blocks"]], "Default Policy Reference": [[8, null]], "Delete Sandboxes": [[13, "delete-sandboxes"]], "Deployment Modes": [[0, "deployment-modes"]], "Diagnose the Denial": [[17, "diagnose-the-denial"]], "Endpoint Object": [[9, "endpoint-object"]], "Environment Variables": [[7, "environment-variables"]], "Examples": [[15, "examples"]], "Explore": [[4, "explore"]], "Filesystem Policy": [[9, "filesystem-policy"]], "From Local Credentials": [[16, "from-local-credentials"]], "Full Example": [[9, "full-example"]], "Gateway Commands": [[7, "gateway-commands"]], "Get Started": [[4, "get-started"]], "Highlights": [[2, "highlights"]], "How OpenShell Works": [[0, null]], "How a Request Flows": [[0, "how-a-request-flows"]], "How inference.local Works": [[6, "how-inference-local-works"]], "Inference Commands": [[7, "inference-commands"]], "Install the OpenShell CLI": [[3, "install-the-openshell-cli"]], "Interactive SSH": [[13, "interactive-ssh"]], "Iterate on a Running Sandbox": [[15, "iterate-on-a-running-sandbox"]], "Kernel Requirements": [[10, "kernel-requirements"]], "Landlock": [[9, "landlock"]], "Launch the Sandbox": [[17, "launch-the-sandbox"]], "License": [[11, null]], "List and Inspect Sandboxes": [[13, "list-and-inspect-sandboxes"]], "Manage Providers": [[16, "manage-providers"]], "Monitor Your Sandbox": [[13, "monitor-your-sandbox"]], "NVIDIA OpenShell": [[4, null]], "NVIDIA OpenShell Release Notes": [[2, null]], "Network Access Rules": [[14, "network-access-rules"]], "Network Policies": [[9, "network-policies"]], "Network Policy Entry": [[9, "network-policy-entry"]], "Next Steps": [[0, "next-steps"], [1, "next-steps"], [5, "next-steps"], [6, "next-steps"], [12, "next-steps"], [13, "next-steps"], [14, "next-steps"], [15, "next-steps"], [16, "next-steps"], [17, "next-steps"]], "Other Sources": [[12, "other-sources"]], "Overview of NVIDIA OpenShell": [[1, null]], "Policy Commands": [[7, "policy-commands"]], "Policy Schema Reference": [[9, null]], "Policy Structure": [[14, "policy-structure"]], "Port Forwarding Commands": [[7, "port-forwarding-commands"]], "Prerequisites": [[3, "prerequisites"], [17, "prerequisites"]], "Process": [[9, "process"]], "Protection Layers at a Glance": [[1, "protection-layers-at-a-glance"]], "Provider Commands": [[7, "provider-commands"]], "Provider Create Flags": [[7, "provider-create-flags"]], "Providers": [[16, null]], "Push Code to GitHub": [[17, "push-code-to-github"]], "Quick Start: Apply a Custom Policy": [[15, "quick-start-apply-a-custom-policy"]], "Quickstart": [[3, null]], "Retry the Push": [[17, "retry-the-push"]], "Rule Object": [[9, "rule-object"]], "Sandbox Commands": [[7, "sandbox-commands"]], "Sandbox Create Flags": [[7, "sandbox-create-flags"]], "Sandbox Lifecycle": [[14, "sandbox-lifecycle"]], "Sandbox Runtime Versions": [[10, "sandbox-runtime-versions"]], "Set Up a Sandbox of Claude Code with a Custom GitHub Policy": [[17, null]], "Shell Completions": [[7, "shell-completions"]], "Software Prerequisites": [[10, "software-prerequisites"]], "Status, Logs, and Terminal": [[7, "status-logs-and-terminal"]], "Step 1: Create a Provider": [[5, "step-1-create-a-provider"]], "Step 2: Set Inference Routing": [[5, "step-2-set-inference-routing"]], "Step 3: Verify the Active Config": [[5, "step-3-verify-the-active-config"]], "Step 4: Update Part of the Config": [[5, "step-4-update-part-of-the-config"]], "Support Matrix": [[10, null]], "Supported API Patterns": [[6, "supported-api-patterns"]], "Supported Agents": [[14, "supported-agents"]], "Supported Platforms": [[10, "supported-platforms"]], "Supported Provider Types": [[16, "supported-provider-types"]], "Top-Level Structure": [[9, "top-level-structure"]], "Transfer Files": [[13, "transfer-files"]], "Update the Policy from Your Machine": [[17, "update-the-policy-from-your-machine"]], "Use It from a Sandbox": [[5, "use-it-from-a-sandbox"]], "Use a Community Sandbox": [[12, "use-a-community-sandbox"]], "Verify the Endpoint from a Sandbox": [[5, "verify-the-endpoint-from-a-sandbox"]], "Version": [[9, "version"]], "View Logs": [[13, "view-logs"]], "View the Logs from Your Machine": [[17, "view-the-logs-from-your-machine"]], "What Are Community Sandboxes": [[12, "what-are-community-sandboxes"]], "Why OpenShell Exists": [[1, "why-openshell-exists"]], "With Explicit Credentials": [[16, "with-explicit-credentials"]], "openshell inference get": [[7, "openshell-inference-get"]], "openshell inference set": [[7, "openshell-inference-set"]], "openshell inference update": [[7, "openshell-inference-update"]]}, "docnames": ["about/architecture", "about/overview", "about/release-notes", "get-started/quickstart", "index", "inference/configure", "inference/index", "reference/cli", "reference/default-policy", "reference/policy-schema", "reference/support-matrix", "resources/eula", "sandboxes/community-sandboxes", "sandboxes/create-and-manage", "sandboxes/index", "sandboxes/policies", "sandboxes/providers", "tutorials/github-sandbox"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.viewcode": 1}, "filenames": ["about/architecture.md", "about/overview.md", "about/release-notes.md", "get-started/quickstart.md", "index.md", "inference/configure.md", "inference/index.md", "reference/cli.md", "reference/default-policy.md", "reference/policy-schema.md", "reference/support-matrix.md", "resources/eula.md", "sandboxes/community-sandboxes.md", "sandboxes/create-and-manage.md", "sandboxes/index.md", "sandboxes/policies.md", "sandboxes/providers.md", "tutorials/github-sandbox.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [6, 7, 8, 9, 12, 14, 16, 17], "0": [9, 10, 15], "1": [9, 10, 14, 15, 17], "10": [5, 10], "11": 10, "111": 10, "12": [3, 10], "124": 15, "13": 10, "15": 5, "168": 5, "17": 10, "18": 10, "192": 5, "2": [10, 15, 17], "22": 10, "256": 9, "3": [3, 10], "30b": 5, "35": 10, "4": 15, "4096": 9, "443": [8, 9, 14, 15, 17], "5m": 13, "61": 13, "8": 10, "8080": 3, "9": 10, "A": [5, 6, 8, 9, 13, 14, 17], "At": 12, "For": [0, 1, 2, 3, 9, 10, 13, 14, 15, 17], "If": [3, 6, 8, 12, 13, 14, 15, 16], "In": 17, "It": [1, 2, 4, 6, 8, 14, 17], "No": [6, 9, 10, 14, 17], "On": 10, "One": [6, 9], "Or": 5, "That": 1, "The": [0, 1, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17], "Then": 15, "These": 10, "To": [0, 1, 5, 6, 10, 12, 13, 14, 15, 16, 17], "With": 1, "a3b": 5, "aarch64": 10, "abc123": 16, "abi": [8, 9, 10, 14], "about": [4, 5, 7, 13, 15], "abov": [15, 16, 17], "absolut": 9, "accept": [7, 9, 12], "access": [1, 3, 4, 5, 6, 7, 8, 10, 13, 15, 16, 17], "account": 17, "across": [0, 1], "act": 0, "action": [8, 13, 15], "activ": [3, 4, 7, 9, 13, 14, 16], "ad": [3, 15, 16], "add": [3, 7, 8, 9, 12, 13, 14, 15, 17], "addit": 16, "address": 9, "adjust": 15, "after": [3, 5, 7, 13, 15, 17], "ag": 13, "again": [13, 17], "against": [0, 12, 13, 14, 15], "agent": [0, 1, 2, 3, 4, 7, 9, 12, 13, 16, 17], "ai": [1, 2, 4, 8, 14, 16], "aliv": 7, "all": [0, 1, 3, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17], "allow": [0, 1, 6, 8, 9, 14, 15, 17], "allowed_rout": [14, 15], "allowlist": 15, "alon": 9, "alpha": 15, "alreadi": 16, "also": [0, 12, 13], "altern": 15, "amd64": 10, "an": [0, 1, 3, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17], "ani": [5, 6, 7, 9, 10, 12, 16, 17], "anoth": 13, "anthrop": [5, 6, 8, 16, 17], "anthropic_api_kei": [3, 5, 14, 16], "anyth": [5, 12], "api": [0, 1, 4, 5, 8, 9, 12, 13, 14, 15, 16, 17], "api_kei": [5, 16], "app": [8, 17], "appear": 17, "append": 7, "appl": 10, "appli": [1, 6, 7, 8, 10, 12, 14, 17], "applic": [0, 5], "approv": 1, "ar": [1, 5, 6, 7, 8, 9, 10, 13, 14, 16, 17], "architectur": [0, 1, 4, 10], "argument": 7, "arm64": 10, "assign": 7, "assist": 5, "associ": 9, "attach": [7, 13], "attempt": [1, 17], "audit": [1, 9], "auth": 0, "authent": [5, 17], "auto": [7, 14], "automat": [0, 3, 9, 10, 13, 17], "autonom": [1, 4], "avail": [7, 10, 12, 14], "avoid": 15, "awar": 0, "back": [7, 9, 12], "backend": [0, 1, 4, 5, 6, 7], "background": [7, 13], "bare": 7, "base": [0, 3, 10, 12, 14], "base_url": 5, "bash": [7, 8, 17], "been": 17, "befor": [0, 3, 5, 7, 9, 10, 13, 15, 17], "begin": 3, "behavior": [1, 9, 17], "behind": 6, "being": 14, "belong": 5, "below": [1, 7, 9, 17], "best_effort": [8, 9, 10, 14, 17], "between": [13, 17], "bin": [3, 8, 9, 14, 15, 17], "binari": [0, 8, 14, 15, 17], "block": [0, 1, 9, 13, 14, 15, 17], "bookworm": 10, "bool": 9, "bootstrap": 10, "both": [0, 7, 8, 14, 17], "boundari": 0, "box": [8, 14], "bravo": 15, "breakdown": [14, 15], "brev": 3, "brevlab": 3, "bring": 1, "broad": 9, "broker": 0, "browser": 17, "build": [7, 8, 10, 12, 13], "built": [1, 3, 12, 13, 16], "bundl": [3, 10, 12, 13, 14], "call": [0, 1, 4, 5, 6, 7, 8, 10, 14, 15, 16], "can": [0, 1, 3, 5, 8, 9, 12, 13, 14, 15, 16, 17], "cannot": [16, 17], "capabl": [1, 4], "case": 0, "catalog": [3, 5, 8, 13, 14, 16], "categori": 9, "caus": [13, 17], "chang": [0, 2, 5, 6, 9, 15, 17], "charact": 9, "chart": 10, "chat": [5, 6], "check": [0, 7, 13, 14, 15], "choos": [3, 5], "ci_job_token": 16, "class": 16, "classic": 17, "claud": [1, 3, 4, 7, 8, 9, 10, 13, 14, 15, 16], "claude_api_kei": 16, "claude_cod": 17, "cli": [0, 1, 2, 4, 5, 10, 12, 13, 15, 16, 17], "client": 5, "clone": [0, 8, 17], "cloud": 1, "cluster": [0, 7, 10, 13, 16, 17], "code": [0, 1, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "codex": [3, 4, 7, 8, 10, 14, 16], "com": [3, 6, 8, 9, 12, 13, 14, 15, 17], "combin": [1, 9, 13, 15], "come": 6, "command": [3, 4, 5, 10, 12, 13, 14, 15, 16], "common": [8, 14], "commun": [1, 3, 4, 7, 10, 14, 16], "compat": [5, 6, 9, 14, 17], "complet": [5, 6, 8, 9, 13, 14, 16, 17], "complianc": 1, "compon": [1, 9, 10], "comput": 0, "concept": 4, "config": 7, "configur": [0, 3, 4, 6, 7, 8, 9, 12, 14, 17], "confin": 1, "confirm": [5, 15, 17], "connect": [0, 1, 5, 7, 8, 9, 14], "consid": 12, "consist": 5, "consol": 3, "constrain": 1, "constraint": [0, 9], "contain": [0, 3, 7, 8, 9, 12, 13, 17], "container": 1, "content": [5, 17], "context": [0, 1], "continu": [0, 3, 6, 14], "contribut": 13, "control": [0, 5, 6, 7, 9, 10, 12, 13, 14, 15, 16], "convers": 17, "coordin": 0, "copi": [3, 17], "correctli": 5, "cost": 0, "cover": [2, 5, 14, 17], "coverag": [8, 10, 14], "creat": [0, 1, 2, 4, 8, 10, 12, 14, 15, 17], "creation": [1, 7, 9, 10, 13, 14, 15, 17], "credenti": [0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 14, 15, 17], "curl": [5, 8, 14, 17], "current": [5, 7, 9, 15, 16], "cursor": 17, "custom": [1, 2, 4, 8, 12, 14, 16], "d": [5, 7], "danger": [1, 10, 14], "dashboard": [7, 8, 13, 15, 17], "data": [1, 4, 7, 12, 14, 17], "debian": 10, "decis": [0, 7, 13, 17], "declar": [1, 4, 8, 9], "decrypt": [0, 9, 15], "deeper": 1, "default": [1, 7, 9, 10, 12, 15, 17], "defens": [0, 1], "defin": [6, 8, 9, 12, 14, 16], "definit": [0, 3, 12, 15], "delet": [7, 14, 16, 17], "demonstr": 17, "deni": [0, 1, 6, 8, 13, 14, 17], "denial": 15, "depend": 6, "deploi": [0, 3, 7, 8], "deploy": [1, 7], "depth": [0, 1, 17], "describ": [0, 12, 15], "descript": [1, 5, 7, 9, 12, 14], "design": [1, 12, 17], "desktop": [3, 10], "destin": [0, 1, 8, 9, 14, 15], "destroi": [7, 9], "detail": [1, 2, 4, 5, 6, 7, 10, 13, 14, 17], "detect": 16, "dev": [8, 9, 12, 13, 17], "develop": [1, 8], "dgx": [0, 3], "diagnos": 13, "differ": 9, "dir": [12, 13], "directli": [0, 5, 6, 12, 16, 17], "directori": [7, 9, 12, 13], "disabl": 8, "disallow": 9, "discov": [7, 16], "discoveri": 6, "disk": [9, 12, 14], "displai": 9, "distinct": 7, "do": [6, 16, 17], "docker": [0, 3, 8, 10, 13], "dockerfil": [7, 12, 13], "document": [7, 9], "doe": [5, 16], "domain": 1, "down": [0, 14], "download": [7, 8, 13, 17], "dropdown": 17, "dst_host": 17, "dst_port": 17, "dummi": 5, "dure": [10, 14, 17], "dynam": [9, 14, 17], "e": 14, "each": [0, 3, 7, 8, 9, 12, 14, 15, 16, 17], "edit": [15, 17], "effect": [9, 17], "egress": 0, "either": 9, "elev": 14, "els": 12, "empti": 5, "enabl": [0, 8, 9, 15], "encrypt": 9, "end": [4, 5, 12, 13, 15], "endpoint": [0, 1, 3, 6, 7, 8, 14, 15, 17], "enforc": [0, 1, 2, 3, 9, 10, 14, 15, 17], "engin": [0, 10, 14, 17], "enterpris": 1, "entiti": 16, "entri": [7, 8, 13, 14, 15, 17], "entrypoint": 12, "env": 7, "environ": [1, 3, 4, 5, 10, 12, 13, 14, 15, 16, 17], "error": [8, 13, 14, 17], "escal": 1, "escap": 9, "especi": 13, "etc": [8, 9, 14, 17], "evalu": 6, "event": 13, "everi": [0, 5, 6, 7, 9, 14, 15, 16], "everyth": 7, "ex": 8, "exact": 17, "exactli": 4, "exampl": [0, 3, 7, 12, 13, 14, 17], "exce": 9, "exclus": 9, "execut": [1, 2, 4, 7, 8, 9, 14], "exfiltr": [1, 4, 14], "exist": [5, 7, 12, 13, 16, 17], "exit": [7, 13, 15, 17], "expand": 17, "expect": 17, "experi": 17, "explain": [13, 17], "explicit": 1, "explicitli": [7, 9, 15], "explor": [1, 5, 12, 13, 15, 16], "export": 15, "expos": 6, "exposur": 14, "extend": 17, "extens": 8, "extern": [0, 1, 5, 6, 16], "f": 7, "fail": [9, 10, 15, 17], "failur": [1, 17], "fall": [7, 9], "fastest": 16, "featur": 8, "fetch": [8, 17], "field": [5, 7, 9, 14, 15, 16], "file": [1, 4, 7, 8, 9, 12, 14, 15, 17], "filesystem": [0, 1, 8, 10, 14], "filesystem_polici": [9, 14, 17], "filter": [7, 10, 13, 14], "find": [3, 16, 17], "fine": 9, "finish": 17, "first": [0, 1, 2, 4, 10, 14, 16], "fish": 7, "fix": 15, "flag": [3, 8, 12, 13, 15, 16, 17], "flow": 5, "follow": [0, 1, 3, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17], "forc": 7, "fork": 12, "format": 7, "forward": [0, 5, 6, 9, 13], "foundat": 12, "four": 0, "free": 17, "from": [0, 3, 4, 6, 7, 10, 12, 14, 15], "full": [7, 8, 10, 13, 14, 15, 17], "fulli": 13, "function": 14, "g": 14, "gallerycdn": [8, 17], "gatewai": [0, 2, 5, 6, 10, 13], "gener": [5, 6, 7, 12, 16, 17], "get": [3, 5, 6, 8, 9, 13, 15, 16, 17], "gh": [8, 9, 15, 16, 17], "gh_token": 16, "ghcr": 10, "gid": 9, "git": [0, 8, 9, 17], "github": [2, 4, 7, 8, 9, 13, 15, 16], "github_api": 17, "github_git": 17, "github_repo": 15, "github_rest_api": [9, 17], "github_ssh_over_http": 17, "github_token": [16, 17], "githubusercont": [8, 17], "gitlab": [7, 16], "gitlab_token": 16, "give": 1, "glab": 16, "glab_token": 16, "glob": 9, "global": 7, "go": [1, 5, 17], "goe": 14, "govern": 4, "grain": 9, "grant": [8, 9, 17], "granular": 15, "graphql": [15, 17], "greater": 17, "group": [7, 8, 9, 14], "grow": 12, "guid": [4, 17], "guidelin": 12, "h": 5, "ha": [9, 14, 17], "handi": 17, "handl": [6, 9], "happen": 13, "hard_requir": [9, 10], "hash": 15, "have": [3, 12, 13, 17], "head": [7, 9, 15], "header": 15, "health": 7, "healthi": 3, "hello": 5, "hello_world": 17, "helm": 10, "help": 5, "here": [7, 17], "hierarchi": 7, "highest": [8, 9, 10, 14], "hint": [7, 14], "hit": 3, "hold": 5, "host": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 17], "hostnam": 9, "hot": [1, 6, 9, 14, 15, 17], "how": [1, 9, 12, 13, 14, 17], "http": [0, 3, 5, 6, 7, 8, 9, 14, 15, 17], "human": 7, "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17], "id": [5, 7], "ident": [0, 1, 9, 17], "identifi": [0, 7, 8, 9, 17], "ignor": 5, "imag": [1, 3, 4, 7, 12, 14], "immedi": 17, "import": 5, "improv": 2, "inaccess": 9, "includ": [0, 7, 8, 14, 17], "include_workdir": [9, 17], "indic": 17, "individu": [9, 13], "infer": [0, 1, 4, 8, 13, 14, 15, 17], "info": [7, 8, 9, 17], "inform": [7, 13], "infrastructur": [0, 4], "initi": 15, "inject": [0, 6, 7, 13, 14, 16, 17], "input": 5, "insid": [0, 3, 5, 6, 7, 8, 9, 10, 17], "inspect": [7, 9, 14, 15, 16], "inspect_for_infer": 13, "instal": [0, 1, 4, 8, 10, 14, 15], "instanc": 3, "instead": [5, 17], "instruct": 5, "integ": 9, "integr": [8, 16, 17], "intel": 10, "intend": 9, "interact": [7, 17], "intercept": [0, 5, 13, 17], "intern": 1, "introduc": 2, "invalid_argu": 9, "invok": 12, "io": [8, 10, 17], "ip": 9, "isol": [0, 1, 2, 7, 10, 14], "issu": [8, 15, 17], "iter": [13, 17], "its": [0, 4, 7, 8, 9, 17], "j": [7, 10], "job": 17, "json": 5, "k": 7, "k3": [0, 10], "k3s1": 10, "keep": [0, 1, 4, 7, 13, 15, 17], "kei": [1, 3, 6, 7, 9, 12, 13, 14], "kernel": [0, 1, 2, 8, 9, 14], "known": 16, "kubectl": 7, "kubernet": [0, 10], "l4": 8, "l7_action": 17, "l7_decis": 17, "l7_deny_reason": 17, "l7_protocol": 17, "l7_target": 17, "label": 13, "landlock": [1, 8, 10, 14, 17], "last": 7, "later": [3, 13, 17], "latest": [2, 10, 12, 13], "launch": [3, 7, 12, 13, 14, 16], "launchabl": 3, "layer": [0, 14], "learn": [0, 1, 4, 15, 17], "let": 16, "level": [1, 2, 7, 10, 13, 14, 15, 17], "lib": [8, 9, 14, 17], "lifecycl": [0, 13], "like": [6, 9, 13], "link": [3, 17], "linux": 10, "list": [7, 8, 9, 10, 14, 15, 16, 17], "live": [7, 13, 15, 17], "llm": [0, 8], "load": [9, 15, 17], "local": [0, 1, 3, 4, 5, 7, 8, 9, 12, 13, 14, 15, 17], "locat": 0, "lock": [1, 9, 14, 17], "log": [0, 8, 9, 14, 15], "logic": 9, "longer": 13, "look": [13, 16, 17], "lookup": 8, "lsm": [9, 10, 14], "machin": [3, 13], "maco": 10, "mai": [9, 14], "make": [1, 3], "manag": [0, 2, 4, 5, 6, 7, 12, 14, 17], "mandatori": 9, "manifest": 10, "manipul": 12, "map": 9, "marketplac": [8, 17], "match": [0, 3, 6, 8, 9, 14], "materi": 1, "matter": 17, "md": 12, "messag": [5, 6], "metadata": [7, 8, 15], "method": [0, 6, 9, 14, 15, 17], "microsoft": [8, 16, 17], "might": [13, 17], "minimum": [10, 12], "miss": 15, "mitig": 1, "mode": [1, 7, 9, 10], "model": [0, 1, 5, 6, 7, 16], "modern": 10, "modifi": [9, 15], "modul": 10, "monitor": [7, 15], "more": [2, 4, 7, 14, 16], "most": 1, "move": 14, "msecnd": [8, 17], "multi": 10, "multipl": [7, 14], "must": [8, 9, 10, 12, 13, 14], "mutat": 8, "mutual": 9, "my": [5, 12, 13, 14, 15, 16, 17], "my_api": 14, "name": [5, 7, 9, 10, 12, 13, 14, 15, 16, 17], "namespac": 14, "nano": 5, "navig": 7, "need": [4, 6, 12, 13, 15, 16, 17], "neither": 9, "nemotron": 5, "net": [8, 17], "network": [0, 1, 4, 5, 6, 8, 13, 15, 17], "network_polici": [5, 6, 9, 14, 15, 17], "new": [7, 15, 17], "node": [8, 9, 10, 17], "non": 8, "none": [8, 16], "nor": 9, "normal": 9, "note": [8, 10, 14], "noth": 4, "now": 17, "npm": [9, 10], "npm_registri": 9, "npmj": 9, "null": [8, 9, 17], "number": 9, "nvidia": [3, 5, 6, 7, 8, 10, 14, 16, 17], "nvidia_api_kei": [5, 16], "nvidia_infer": 17, "o": [9, 10, 13], "object": [8, 17], "observ": 17, "omit": [7, 9], "omutbound": 13, "onc": 17, "one": [0, 5, 6, 7, 9, 12, 14, 16, 17], "ones": 13, "onli": [0, 1, 5, 6, 7, 8, 9, 14, 15, 17], "open": [0, 1, 7, 12, 13, 14, 17], "openai": [5, 6, 8, 14, 16], "openai_api_kei": [3, 5, 14, 16], "openai_base_url": 5, "openclaw": [1, 3, 4, 12, 13, 14], "opencod": [1, 3, 4, 7, 8, 10, 14, 16, 17], "opencode_api_kei": 16, "openrouter_api_kei": [3, 16], "openshel": [5, 6, 8, 9, 10, 12, 13, 14, 15, 16, 17], "openshell_cluster_imag": 10, "openshell_community_registri": 10, "openshell_gatewai": 7, "openshell_sandbox_polici": [7, 15], "oper": [7, 17], "option": [7, 9, 12, 14, 15], "orchestr": 14, "org": [8, 9, 15, 17], "org_nam": 15, "organ": 17, "origin": [0, 6], "other": [1, 3, 6, 8], "otherwis": [13, 14], "out": [8, 14], "outbound": [0, 1, 6, 8, 14, 17], "outlin": 15, "outlook": [7, 16], "output": [7, 9, 13, 17], "outsid": [1, 17], "over": [1, 3, 8, 17], "overli": 9, "overrid": [7, 10], "overview": 4, "own": [1, 12, 13, 17], "pack": [8, 9, 17], "packag": [0, 1, 3, 8, 12, 13, 17], "page": [2, 3, 5, 10, 13, 15, 17], "pair": [8, 14], "partial": [8, 14], "particular": 12, "pass": [0, 7, 12, 14, 15, 16], "passthrough": [8, 9, 15], "past": 17, "pat": 17, "patch": [9, 15], "path": [0, 1, 6, 7, 8, 9, 12, 14, 15, 17], "pattern": [1, 5, 9], "payload": [14, 15], "per": [0, 9, 15, 17], "perman": 7, "permiss": [4, 9, 17], "permit": [9, 17], "person": 17, "perspect": 17, "phase": [13, 14], "pick": [3, 6], "pid": 8, "pip": [3, 4, 8, 10, 15, 17], "pipe": 7, "plan": 15, "plane": [0, 10], "platform": [0, 8, 17], "pod": 0, "point": [5, 12, 13, 17], "polici": [0, 1, 2, 3, 4, 10, 12, 13, 16], "port": [0, 3, 8, 9, 13, 14, 15, 17], "post": [6, 8, 9, 15, 17], "pr": 8, "pre": [3, 8, 12, 13, 14, 16], "preconfigur": 12, "preserv": [1, 7], "press": 7, "prevent": [1, 4, 14], "previous": 17, "print": [7, 17], "privaci": [0, 1, 5, 6, 14], "privat": [1, 4, 14], "privileg": [1, 14], "problem": 17, "proc": [8, 9, 17], "process": [0, 1, 8, 12, 13, 14, 17], "prod": 5, "prompt": [1, 3, 17], "properti": 6, "protect": [0, 4, 14], "protocol": [9, 14, 15, 17], "provid": [1, 3, 4, 6, 8, 9, 12, 13, 14, 15, 17], "provis": [0, 14], "proxi": [0, 8, 9, 13, 14, 15, 17], "prss": [8, 17], "public": 17, "publish": [10, 12], "pull": [3, 8, 10, 12, 13, 15, 17], "purg": [13, 14], "purpos": [10, 12, 13], "push": [8, 15], "put": [9, 17], "py": 17, "pypi": [8, 15, 17], "python": [3, 8, 10, 17], "python3": [8, 17], "pythonhost": [8, 15, 17], "q": 7, "queri": [0, 14, 17], "quickstart": [0, 1, 4, 17], "quit": 7, "rancher": 10, "rang": 1, "rather": 6, "raw": [8, 17], "re": 3, "reach": [5, 8, 9, 14, 15, 17], "reachabl": [5, 9], "read": [1, 5, 7, 8, 9, 14, 15, 16, 17], "read_onli": [9, 14, 17], "read_writ": [9, 14, 17], "readabl": 7, "readi": [12, 14], "readm": [12, 17], "real": 13, "reason": [5, 15, 17], "receiv": [8, 16, 17], "recogn": [16, 17], "recommend": 10, "reconnect": [13, 17], "record": [5, 6, 7], "recreat": [6, 9, 16, 17], "ref": [8, 9, 17], "refer": [0, 1, 2, 4, 5, 6, 10, 12, 13, 14, 15, 16, 17], "refresh": 6, "refus": 13, "regist": 7, "registri": [3, 9, 10, 12, 13], "reject": 9, "relat": [5, 12, 13, 15, 16, 17], "releas": [8, 13, 14], "relev": 9, "reload": [1, 9, 14, 15, 17], "remain": 17, "remot": [0, 7, 8, 13, 17], "remov": [7, 13], "repeat": [5, 7, 15], "replac": [7, 15, 17], "repo": [4, 15, 17], "report": [8, 17], "repositori": [8, 12, 17], "request": [5, 6, 7, 8, 9, 12, 14, 17], "requir": [5, 7, 8, 9, 14, 16, 17], "rerout": [1, 14], "resolv": [8, 12, 13], "resourc": [13, 14, 17], "respons": [5, 6, 17], "rest": [0, 8, 9, 14, 15, 17], "restart": [9, 17], "restrict": [1, 9, 10, 14, 17], "retriev": 13, "return": [0, 13, 17], "reus": 15, "reusabl": 1, "review": [1, 12, 15], "revis": [15, 17], "rewrit": 5, "role": [0, 5], "root": [9, 17], "rout": [0, 1, 3, 4, 8, 14], "router": [0, 5, 6], "rule": [0, 5, 6, 8, 12, 15, 17], "run": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 16, 17], "run_as_group": [9, 14, 17], "run_as_us": [9, 14, 17], "runtim": [0, 1, 4, 7, 13, 14, 16], "safe": [4, 14], "same": [0, 1, 5, 6, 8, 14, 17], "sandbox": [0, 1, 2, 4, 6, 8, 9], "save": [5, 17], "schema": [4, 14, 15, 16, 17], "scope": [5, 9, 17], "scratch": 17, "script": [7, 12, 17], "sdg": 12, "seccomp": [1, 10, 14], "secret": [1, 7], "section": [8, 14, 15, 17], "secur": [0, 1, 3, 5, 6, 10], "see": [5, 7, 17], "select": [7, 17], "self": [1, 4, 5, 17], "send": 1, "sensit": [0, 1], "sentri": [8, 17], "separ": [10, 16], "serv": 5, "server": [5, 8, 9, 10, 17], "servic": [0, 2, 16], "session": [7, 8, 13, 17], "set": [3, 4, 6, 8, 9, 10, 12, 13, 14, 15, 16], "setuid": [1, 14], "sever": [10, 13], "shareabl": 3, "shell": 16, "ship": [10, 14], "should": [5, 6, 17], "show": [3, 7, 8, 13, 15, 17], "sign": 17, "silicon": 10, "similar": 17, "simpl": [15, 17], "simul": 12, "sinc": 13, "singl": [3, 7, 12, 13, 17], "sk": 16, "skill": [3, 12], "skip": 3, "small": 17, "smart": [8, 17], "so": [0, 1, 8, 12, 16, 17], "socket": 8, "someth": 14, "sourc": [1, 3, 7, 13, 14, 15], "spark": [0, 3], "special": 6, "specif": [7, 13, 17], "specifi": [7, 13, 16, 17], "split": 14, "spot": 13, "src": 13, "ssh": [1, 3, 7], "ssid": [0, 3], "stai": [5, 6], "standalon": 8, "start": [0, 3, 7, 9, 10, 13, 17], "startup": [7, 10, 12, 17], "state": [0, 7], "static": [9, 14, 17], "statsig": [8, 17], "statu": [0, 3, 10, 13, 15, 17], "step": 3, "stop": [7, 13], "storag": 9, "store": 16, "stream": [7, 13, 14, 15, 17], "string": 9, "strip": [0, 6, 15], "structur": [15, 17], "subcommand": 7, "subdomain": 9, "submiss": 12, "subsequ": [3, 7], "success": 5, "successfulli": 17, "sudo": [1, 14], "summar": [1, 14, 17], "supervis": 0, "suppli": [5, 6, 12, 13, 14, 16], "support": [1, 5, 8, 9, 12], "sure": 3, "switch": 5, "sync": [3, 14], "syntax": 9, "synthet": 12, "syscal": 1, "system": [0, 4, 9, 10, 12, 14], "tab": [3, 7], "tabl": [0, 1, 8, 10, 14, 17], "tail": [7, 13, 15], "tailor": 3, "take": [9, 17], "target": [7, 17], "tcp": [8, 9, 14, 15], "team": 1, "telemetri": 8, "term": [7, 13, 15, 17], "termin": [0, 8, 9, 13, 14, 15, 17], "test": 17, "than": 6, "theft": 1, "thei": [1, 4, 13, 17], "them": [1, 9, 14, 16], "thi": [1, 2, 3, 5, 7, 9, 10, 13, 14, 15, 16, 17], "thing": [14, 17], "those": 14, "threat": 1, "three": [0, 14], "through": [0, 3, 5, 6, 8, 9, 10, 13, 14, 17], "time": [7, 9, 10, 13, 15], "timeout": 15, "tl": [0, 8, 9, 14, 15, 17], "tmp": [8, 9, 14, 17], "togeth": 0, "token": [12, 13, 14, 16, 17], "tool": [12, 16], "topic": [1, 5, 12, 13, 15, 16, 17], "torn": 14, "total": 9, "track": 2, "tradeoff": 1, "traffic": [0, 1, 4, 5, 6, 8, 9, 17], "trail": [7, 13, 14, 16], "travers": 9, "treat": [1, 6], "tree": 9, "triag": 15, "true": [9, 17], "trust": 17, "try": [13, 17], "tunnel": [3, 7], "tutori": [4, 13, 17], "two": [3, 4, 5, 6, 10, 17], "type": [3, 5, 7, 9, 17], "typic": [9, 16], "ubuntu": 10, "uid": 9, "unapprov": 1, "unauthor": [1, 4, 14], "unavail": [9, 10], "unchang": 17, "uncontrol": 4, "under": [1, 3, 7, 9, 12, 14], "understand": [1, 5], "unexpectedli": 13, "unix": 9, "unlist": 17, "unprivileg": [1, 14], "unrestrict": 1, "untest": 10, "until": 17, "up": [1, 3, 4, 6, 7, 12, 13, 14, 15, 16], "updat": [6, 8, 9, 15, 16], "upload": [1, 7, 8, 9, 13, 17], "upstream": 5, "urandom": [8, 9, 17], "url": [3, 7, 9], "us": [0, 3, 7, 8, 9, 10, 13, 14, 15, 16, 17], "usag": [1, 7], "user": [0, 5, 7, 8, 9, 14, 16], "usernam": [0, 3, 15, 17], "usr": [8, 9, 14, 15, 17], "uv": [3, 4, 8, 10, 15, 17], "v": [7, 8, 13, 14, 17], "v1": [5, 6, 10], "valid": [9, 15], "valu": [5, 7, 8, 9, 16], "var": [8, 17], "vari": 17, "variabl": [4, 10, 15, 16, 17], "venv": [3, 8, 17], "verbos": 7, "verifi": [15, 17], "version": [1, 5, 7, 14, 15, 17], "via": [8, 10], "view": [5, 7, 14, 15, 16], "violat": 9, "virtual": 3, "visualstudio": [8, 17], "vm": 10, "vo": [8, 17], "vsasset": [8, 17], "vscode": [8, 9, 17], "wa": [5, 7], "wai": [6, 16], "wait": [15, 17], "walk": [13, 17], "walkthrough": 15, "want": [5, 12, 13, 17], "warn": 13, "well": 17, "went": 14, "wget": [8, 17], "what": [1, 9, 13, 14, 15, 16, 17], "when": [1, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17], "whenev": 15, "where": [1, 9, 17], "whether": 9, "which": [0, 7, 9, 15, 17], "while": 1, "whose": 12, "wildcard": 9, "window": [10, 13], "without": [1, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17], "word": 17, "work": [8, 9, 13, 14, 17], "workdir": 8, "workflow": [12, 13, 14, 15, 17], "workspac": 17, "workstat": 0, "would": 9, "write": [1, 8, 9, 12, 14, 15, 17], "wrong": 14, "wsl": 10, "x86_64": 10, "yaml": [1, 7, 8, 9, 12, 13, 15, 16, 17], "ye": [3, 8, 9], "you": [3, 5, 7, 8, 12, 13, 14, 15, 16, 17], "your": [0, 1, 4, 5, 7, 12, 14, 15, 16], "yourself": 16, "zero": 3, "zsh": 7, "zshrc": 7}, "titles": ["How OpenShell Works", "Overview of NVIDIA OpenShell", "NVIDIA OpenShell Release Notes", "Quickstart", "NVIDIA OpenShell", "Configure Inference Routing", "About Inference Routing", "CLI Reference", "Default Policy Reference", "Policy Schema Reference", "Support Matrix", "License", "Community Sandboxes", "Create and Manage Sandboxes", "About Sandboxes", "Customize Sandbox Policies", "Providers", "Set Up a Sandbox of Claude Code with a Custom GitHub Policy"], "titleterms": {"0": 2, "1": [2, 5], "2": 5, "3": 5, "4": 5, "It": 5, "With": 16, "about": [6, 14], "access": [9, 14], "activ": 5, "agent": [8, 10, 14], "api": 6, "appli": 15, "ar": 12, "ask": 17, "attach": 16, "auto": 16, "bare": 16, "binari": 9, "block": 8, "built": [7, 14], "case": 1, "catalog": 12, "check": 17, "claud": 17, "clean": 17, "cli": [3, 7], "code": 17, "command": 7, "common": 1, "commun": [12, 13], "compat": [8, 10], "complet": 7, "compon": 0, "config": 5, "configur": 5, "connect": [3, 13], "contain": 10, "contribut": 12, "control": 1, "creat": [3, 5, 7, 13, 16], "credenti": 16, "current": 12, "custom": [13, 15, 17], "debug": 15, "default": [8, 14], "delet": 13, "deni": 15, "denial": 17, "deploy": 0, "diagnos": 17, "discoveri": 16, "endpoint": [5, 9], "entri": 9, "environ": 7, "exampl": [9, 15], "exist": 1, "explicit": 16, "explor": 4, "file": 13, "filesystem": 9, "first": 3, "flag": 7, "flow": 0, "form": 16, "forward": 7, "from": [5, 13, 16, 17], "full": 9, "gatewai": [3, 7], "get": [4, 7], "github": 17, "glanc": 1, "help": 7, "highlight": 2, "how": [0, 6], "imag": [10, 13], "infer": [5, 6, 7], "inspect": 13, "instal": 3, "interact": 13, "iter": 15, "kei": 16, "kernel": 10, "landlock": 9, "launch": 17, "layer": 1, "level": 9, "licens": 11, "lifecycl": 14, "list": 13, "local": [6, 16], "log": [7, 13, 17], "machin": 17, "manag": [13, 16], "matrix": 10, "mode": 0, "monitor": 13, "network": [9, 14], "next": [0, 1, 5, 6, 12, 13, 14, 15, 16, 17], "note": 2, "nvidia": [1, 2, 4], "object": 9, "openshel": [0, 1, 2, 3, 4, 7], "option": 3, "other": 12, "overview": 1, "part": 5, "pattern": 6, "platform": 10, "polici": [7, 8, 9, 14, 15, 17], "port": 7, "prerequisit": [3, 10, 17], "process": 9, "protect": 1, "provid": [5, 7, 16], "push": 17, "quick": 15, "quickstart": 3, "refer": [7, 8, 9], "releas": 2, "remot": 3, "request": [0, 15], "requir": 10, "retri": 17, "risk": 1, "rout": [5, 6], "rule": [9, 14], "run": 15, "runtim": 10, "sandbox": [3, 5, 7, 10, 12, 13, 14, 15, 16, 17], "schema": 9, "set": [5, 7, 17], "shell": 7, "shortcut": 16, "softwar": 10, "sourc": 12, "ssh": 13, "start": [4, 15], "statu": 7, "step": [0, 1, 5, 6, 12, 13, 14, 15, 16, 17], "structur": [9, 14], "support": [6, 10, 14, 16], "termin": 7, "top": 9, "transfer": 13, "tree": 7, "type": 16, "up": 17, "updat": [5, 7, 17], "us": [1, 5, 12], "variabl": 7, "verifi": 5, "version": [9, 10], "view": [13, 17], "what": 12, "why": 1, "work": [0, 6], "your": [3, 13, 17]}}) \ No newline at end of file +Search.setIndex({"alltitles": {"0.1.0": [[2, "id1"]], "About Inference Routing": [[6, null]], "About Sandboxes": [[14, null]], "Access Levels": [[9, "access-levels"]], "Agent Compatibility": [[8, "agent-compatibility"], [10, "agent-compatibility"]], "Ask Claude to Check the Sandbox Logs": [[17, "ask-claude-to-check-the-sandbox-logs"]], "Attach Providers to Sandboxes": [[16, "attach-providers-to-sandboxes"]], "Auto-Discovery Shortcut": [[16, "auto-discovery-shortcut"]], "Bare Key Form": [[16, "bare-key-form"]], "Binary Object": [[9, "binary-object"]], "Built-in Default Policy": [[14, "built-in-default-policy"]], "Built-in Help": [[7, "built-in-help"]], "CLI Reference": [[7, null]], "Clean Up": [[17, "clean-up"]], "Command Tree": [[7, "command-tree"]], "Common Risks and Controls": [[1, "common-risks-and-controls"]], "Common Use Cases": [[1, "common-use-cases"]], "Community Sandboxes": [[12, null]], "Components": [[0, "components"]], "Configure Inference Routing": [[5, null]], "Connect to a Remote Gateway (Optional)": [[3, "connect-to-a-remote-gateway-optional"]], "Connect to a Sandbox": [[13, "connect-to-a-sandbox"]], "Container Images": [[10, "container-images"]], "Contribute a Community Sandbox": [[12, "contribute-a-community-sandbox"]], "Create Your First OpenShell Sandbox": [[3, "create-your-first-openshell-sandbox"]], "Create a Provider": [[16, "create-a-provider"]], "Create a Sandbox": [[13, "create-a-sandbox"]], "Create and Manage Sandboxes": [[13, null]], "Create from a Community Sandbox or Custom Image": [[13, "create-from-a-community-sandbox-or-custom-image"]], "Current Catalog": [[12, "current-catalog"]], "Customize Sandbox Policies": [[15, null]], "Debug Denied Requests": [[15, "debug-denied-requests"]], "Default Policy Blocks": [[8, "default-policy-blocks"]], "Default Policy Reference": [[8, null]], "Delete Sandboxes": [[13, "delete-sandboxes"]], "Deployment Modes": [[0, "deployment-modes"]], "Diagnose the Denial": [[17, "diagnose-the-denial"]], "Endpoint Object": [[9, "endpoint-object"]], "Environment Variables": [[7, "environment-variables"]], "Examples": [[15, "examples"]], "Explore": [[4, "explore"]], "Filesystem Policy": [[9, "filesystem-policy"]], "From Local Credentials": [[16, "from-local-credentials"]], "Full Example": [[9, "full-example"]], "Gateway Commands": [[7, "gateway-commands"]], "Get Started": [[4, "get-started"]], "Highlights": [[2, "highlights"]], "How OpenShell Works": [[0, null]], "How a Request Flows": [[0, "how-a-request-flows"]], "How inference.local Works": [[6, "how-inference-local-works"]], "Inference Commands": [[7, "inference-commands"]], "Install the OpenShell CLI": [[3, "install-the-openshell-cli"]], "Interactive SSH": [[13, "interactive-ssh"]], "Iterate on a Running Sandbox": [[15, "iterate-on-a-running-sandbox"]], "Kernel Requirements": [[10, "kernel-requirements"]], "Landlock": [[9, "landlock"]], "Launch the Sandbox": [[17, "launch-the-sandbox"]], "License": [[11, null]], "List and Inspect Sandboxes": [[13, "list-and-inspect-sandboxes"]], "Manage Providers": [[16, "manage-providers"]], "Monitor Your Sandbox": [[13, "monitor-your-sandbox"]], "NVIDIA OpenShell": [[4, null]], "NVIDIA OpenShell Release Notes": [[2, null]], "Network Access Rules": [[14, "network-access-rules"]], "Network Policies": [[9, "network-policies"]], "Network Policy Entry": [[9, "network-policy-entry"]], "Next Steps": [[0, "next-steps"], [1, "next-steps"], [5, "next-steps"], [6, "next-steps"], [12, "next-steps"], [13, "next-steps"], [14, "next-steps"], [15, "next-steps"], [16, "next-steps"], [17, "next-steps"]], "Other Sources": [[12, "other-sources"]], "Overview of NVIDIA OpenShell": [[1, null]], "Policy Commands": [[7, "policy-commands"]], "Policy Schema Reference": [[9, null]], "Policy Structure": [[14, "policy-structure"]], "Port Forwarding Commands": [[7, "port-forwarding-commands"]], "Prerequisites": [[3, "prerequisites"], [17, "prerequisites"]], "Process": [[9, "process"]], "Protection Layers at a Glance": [[1, "protection-layers-at-a-glance"]], "Provider Commands": [[7, "provider-commands"]], "Provider Create Flags": [[7, "provider-create-flags"]], "Providers": [[16, null]], "Push Code to GitHub": [[17, "push-code-to-github"]], "Quick Start: Apply a Custom Policy": [[15, "quick-start-apply-a-custom-policy"]], "Quickstart": [[3, null]], "Retry the Push": [[17, "retry-the-push"]], "Rule Object": [[9, "rule-object"]], "Sandbox Commands": [[7, "sandbox-commands"]], "Sandbox Create Flags": [[7, "sandbox-create-flags"]], "Sandbox Lifecycle": [[14, "sandbox-lifecycle"]], "Sandbox Runtime Versions": [[10, "sandbox-runtime-versions"]], "Set Up a Sandbox of Claude Code with a Custom GitHub Policy": [[17, null]], "Shell Completions": [[7, "shell-completions"]], "Software Prerequisites": [[10, "software-prerequisites"]], "Status, Logs, and Terminal": [[7, "status-logs-and-terminal"]], "Step 1: Create a Provider": [[5, "step-1-create-a-provider"]], "Step 2: Set Inference Routing": [[5, "step-2-set-inference-routing"]], "Step 3: Verify the Active Config": [[5, "step-3-verify-the-active-config"]], "Step 4: Update Part of the Config": [[5, "step-4-update-part-of-the-config"]], "Support Matrix": [[10, null]], "Supported API Patterns": [[6, "supported-api-patterns"]], "Supported Agents": [[14, "supported-agents"]], "Supported Platforms": [[10, "supported-platforms"]], "Supported Provider Types": [[16, "supported-provider-types"]], "Top-Level Structure": [[9, "top-level-structure"]], "Transfer Files": [[13, "transfer-files"]], "Update the Policy from Your Machine": [[17, "update-the-policy-from-your-machine"]], "Use It from a Sandbox": [[5, "use-it-from-a-sandbox"]], "Use a Community Sandbox": [[12, "use-a-community-sandbox"]], "Verify the Endpoint from a Sandbox": [[5, "verify-the-endpoint-from-a-sandbox"]], "Version": [[9, "version"]], "View Logs": [[13, "view-logs"]], "View the Logs from Your Machine": [[17, "view-the-logs-from-your-machine"]], "What Are Community Sandboxes": [[12, "what-are-community-sandboxes"]], "Why OpenShell Exists": [[1, "why-openshell-exists"]], "With Explicit Credentials": [[16, "with-explicit-credentials"]], "openshell inference get": [[7, "openshell-inference-get"]], "openshell inference set": [[7, "openshell-inference-set"]], "openshell inference update": [[7, "openshell-inference-update"]]}, "docnames": ["about/architecture", "about/overview", "about/release-notes", "get-started/quickstart", "index", "inference/configure", "inference/index", "reference/cli", "reference/default-policy", "reference/policy-schema", "reference/support-matrix", "resources/eula", "sandboxes/community-sandboxes", "sandboxes/create-and-manage", "sandboxes/index", "sandboxes/policies", "sandboxes/providers", "tutorials/github-sandbox"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.viewcode": 1}, "filenames": ["about/architecture.md", "about/overview.md", "about/release-notes.md", "get-started/quickstart.md", "index.md", "inference/configure.md", "inference/index.md", "reference/cli.md", "reference/default-policy.md", "reference/policy-schema.md", "reference/support-matrix.md", "resources/eula.md", "sandboxes/community-sandboxes.md", "sandboxes/create-and-manage.md", "sandboxes/index.md", "sandboxes/policies.md", "sandboxes/providers.md", "tutorials/github-sandbox.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [6, 7, 8, 9, 12, 14, 16, 17], "0": [9, 10, 15], "1": [9, 10, 14, 15, 17], "10": [5, 10], "11": 10, "111": 10, "12": [3, 10], "124": 15, "13": 10, "15": 5, "168": 5, "17": 10, "18": 10, "192": 5, "2": [10, 15, 17], "22": 10, "256": 9, "3": [3, 10], "30b": 5, "35": 10, "4": 15, "4096": 9, "443": [8, 9, 14, 15, 17], "5m": 13, "61": 13, "8": 10, "8080": 3, "9": 10, "A": [5, 6, 8, 9, 13, 14, 17], "At": 12, "For": [0, 1, 2, 3, 9, 10, 13, 14, 15, 17], "If": [3, 6, 8, 12, 13, 14, 15, 16], "In": 17, "It": [1, 2, 4, 6, 8, 14, 17], "No": [6, 9, 10, 14, 17], "On": 10, "One": [6, 9], "Or": 5, "That": 1, "The": [0, 1, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17], "Then": 15, "These": 10, "To": [0, 1, 5, 6, 10, 12, 13, 14, 15, 16, 17], "With": 1, "a3b": 5, "aarch64": 10, "abc123": 16, "abi": [8, 9, 10, 14], "about": [4, 5, 7, 13, 15], "abov": [15, 16, 17], "absolut": 9, "accept": [7, 9, 12], "access": [1, 3, 4, 5, 6, 7, 8, 10, 13, 15, 16, 17], "account": 17, "across": [0, 1], "act": 0, "action": [8, 13, 15], "activ": [3, 4, 7, 9, 13, 14, 16], "ad": [3, 15, 16], "add": [3, 7, 8, 9, 12, 13, 14, 15, 17], "addit": 16, "address": 9, "adjust": 15, "after": [3, 5, 7, 13, 15, 17], "ag": 13, "again": [13, 17], "against": [0, 12, 13, 14, 15], "agent": [0, 1, 2, 3, 4, 7, 9, 12, 13, 16, 17], "ai": [1, 2, 4, 8, 14, 16], "aliv": 7, "all": [0, 1, 3, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17], "allow": [0, 1, 6, 8, 9, 14, 15, 17], "allowed_rout": [14, 15], "allowlist": 15, "alon": 9, "alpha": 15, "alreadi": 16, "also": [0, 12, 13], "altern": 15, "amd64": 10, "an": [0, 1, 3, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17], "ani": [5, 6, 7, 9, 10, 12, 16, 17], "anoth": 13, "anthrop": [5, 6, 8, 16, 17], "anthropic_api_kei": [3, 5, 14, 16], "anyth": [5, 12], "api": [0, 1, 4, 5, 8, 9, 12, 13, 14, 15, 16, 17], "api_kei": [5, 16], "app": [8, 17], "appear": 17, "append": 7, "appl": 10, "appli": [1, 6, 7, 8, 10, 12, 14, 17], "applic": [0, 5], "approv": 1, "ar": [1, 5, 6, 7, 8, 9, 10, 13, 14, 16, 17], "architectur": [0, 1, 4, 10], "argument": 7, "arm64": 10, "assign": 7, "assist": 5, "associ": 9, "attach": [7, 13], "attempt": [1, 17], "audit": [1, 9], "auth": 0, "authent": [5, 17], "auto": [7, 14], "automat": [0, 3, 9, 10, 13, 17], "autonom": [1, 4], "avail": [7, 10, 12, 14], "avoid": [15, 17], "awar": 0, "back": [7, 9, 12], "backend": [0, 1, 4, 5, 6, 7], "background": [7, 13], "bare": 7, "base": [0, 3, 10, 12, 14], "base_url": 5, "bash": [7, 8, 17], "been": 17, "befor": [0, 3, 5, 7, 9, 10, 13, 15, 17], "begin": 3, "behavior": [1, 9, 17], "behind": 6, "being": 14, "belong": 5, "below": [1, 7, 9, 17], "best_effort": [8, 9, 10, 14, 17], "between": [13, 17], "bin": [3, 8, 9, 14, 15, 17], "binari": [0, 8, 14, 15, 17], "block": [0, 1, 9, 13, 14, 15, 17], "bookworm": 10, "bool": 9, "bootstrap": 10, "both": [0, 7, 8, 14, 17], "boundari": 0, "box": [8, 14], "bravo": 15, "breakdown": [14, 15], "brev": 3, "brevlab": 3, "bring": 1, "broad": 9, "broker": 0, "browser": 17, "build": [7, 8, 10, 12, 13], "built": [1, 3, 12, 13, 16], "bundl": [3, 10, 12, 13, 14], "call": [0, 1, 4, 5, 6, 7, 8, 10, 14, 15, 16], "can": [0, 1, 3, 5, 8, 9, 12, 13, 14, 15, 16, 17], "cannot": [16, 17], "capabl": [1, 4], "case": 0, "catalog": [3, 5, 8, 13, 14, 16], "categori": 9, "caus": [13, 17], "chang": [0, 2, 5, 6, 9, 15, 17], "charact": 9, "chart": 10, "chat": [5, 6], "check": [0, 7, 13, 14, 15], "choos": [3, 5], "ci_job_token": 16, "class": 16, "classic": 17, "claud": [1, 3, 4, 7, 8, 9, 10, 13, 14, 15, 16], "claude_api_kei": 16, "claude_cod": 17, "cli": [0, 1, 2, 4, 5, 10, 12, 13, 15, 16, 17], "client": 5, "clone": [0, 8, 17], "cloud": 1, "cluster": [0, 7, 10, 13, 16, 17], "code": [0, 1, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "codex": [3, 4, 7, 8, 10, 14, 16], "com": [3, 6, 8, 9, 12, 13, 14, 15, 17], "combin": [1, 9, 13, 15], "come": 6, "command": [3, 4, 5, 10, 12, 13, 14, 15, 16], "common": [8, 14], "commun": [1, 3, 4, 7, 10, 14, 16], "compat": [5, 6, 9, 14, 17], "complet": [5, 6, 8, 9, 13, 14, 16, 17], "complianc": 1, "compon": [1, 9, 10], "comput": 0, "concept": 4, "config": 7, "configur": [0, 3, 4, 6, 7, 8, 9, 12, 14, 17], "confin": 1, "confirm": [5, 15, 17], "connect": [0, 1, 5, 7, 8, 9, 14], "consid": 12, "consist": 5, "consol": 3, "constrain": 1, "constraint": [0, 9], "contain": [0, 3, 7, 8, 9, 12, 13, 17], "container": 1, "content": [5, 17], "context": [0, 1], "continu": [0, 3, 6, 14], "contribut": 13, "control": [0, 5, 6, 7, 9, 10, 12, 13, 14, 15, 16], "convers": 17, "coordin": 0, "copi": 3, "correctli": 5, "cost": 0, "cover": [2, 5, 14, 17], "coverag": [8, 10, 14], "creat": [0, 1, 2, 4, 8, 10, 12, 14, 15, 17], "creation": [1, 7, 9, 10, 13, 14, 15, 17], "credenti": [0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 14, 15, 17], "curl": [5, 8, 14, 17], "current": [5, 7, 9, 15, 16], "cursor": 17, "custom": [1, 2, 4, 8, 12, 14, 16], "d": [5, 7], "danger": [1, 10, 14], "dashboard": [7, 8, 13, 15, 17], "data": [1, 4, 7, 12, 14, 17], "debian": 10, "decis": [0, 7, 13, 17], "declar": [1, 4, 8, 9], "decrypt": [0, 9, 15], "deeper": 1, "default": [1, 7, 9, 10, 12, 15, 17], "defens": [0, 1], "defin": [6, 8, 9, 12, 14, 16], "definit": [0, 3, 12, 15], "delet": [7, 14, 16, 17], "demonstr": 17, "deni": [0, 1, 6, 8, 13, 14, 17], "denial": 15, "depend": 6, "deploi": [0, 3, 7, 8], "deploy": [1, 7], "depth": [0, 1, 17], "describ": [0, 12, 15], "descript": [1, 5, 7, 9, 12, 14], "design": [1, 12, 17], "desktop": [3, 10], "destin": [0, 1, 8, 9, 14, 15], "destroi": [7, 9], "detail": [1, 2, 4, 5, 6, 7, 10, 13, 14, 17], "detect": 16, "dev": [8, 9, 12, 13, 17], "develop": [1, 8], "dgx": [0, 3], "diagnos": 13, "differ": 9, "dir": [12, 13], "directli": [0, 5, 6, 12, 16, 17], "directori": [7, 9, 12, 13], "disabl": 8, "disallow": 9, "discov": [7, 16], "discoveri": 6, "disk": [9, 12, 14], "displai": 9, "distinct": 7, "do": [6, 16, 17], "docker": [0, 3, 8, 10, 13], "dockerfil": [7, 12, 13], "document": [7, 9], "doe": [5, 16], "domain": 1, "down": [0, 14], "download": [7, 8, 13, 17], "dropdown": 17, "dst_host": 17, "dst_port": 17, "dummi": 5, "dure": [10, 14, 17], "dynam": [9, 14, 17], "e": 14, "each": [0, 3, 7, 8, 9, 12, 14, 15, 16, 17], "edit": [15, 17], "effect": [9, 17], "egress": 0, "either": 9, "elev": 14, "els": 12, "empti": 5, "enabl": [0, 8, 9, 15, 17], "encrypt": 9, "end": [4, 5, 12, 13, 15], "endpoint": [0, 1, 3, 6, 7, 8, 14, 15, 17], "enforc": [0, 1, 2, 3, 9, 10, 14, 15, 17], "engin": [0, 10, 14, 17], "enterpris": 1, "entiti": 16, "entri": [7, 8, 13, 14, 15, 17], "entrypoint": 12, "env": 7, "environ": [1, 3, 4, 5, 10, 12, 13, 14, 15, 16, 17], "error": [8, 13, 14, 17], "escal": 1, "escap": 9, "especi": 13, "etc": [8, 9, 14, 17], "evalu": 6, "event": 13, "everi": [0, 5, 6, 7, 9, 14, 15, 16], "everyth": 7, "ex": 8, "exact": 17, "exactli": 4, "exampl": [0, 3, 7, 12, 13, 14, 17], "exce": 9, "exclus": 9, "execut": [1, 2, 4, 7, 8, 9, 14], "exfiltr": [1, 4, 14], "exist": [5, 7, 12, 13, 16, 17], "exit": [7, 13, 15, 17], "expand": 17, "expect": 17, "experi": 17, "explain": [13, 17], "explicit": 1, "explicitli": [7, 9, 15], "explor": [1, 5, 12, 13, 15, 16], "export": 15, "expos": [6, 17], "exposur": 14, "extend": 17, "extens": 8, "extern": [0, 1, 5, 6, 16], "f": 7, "fail": [9, 10, 15, 17], "failur": [1, 17], "fall": [7, 9], "fastest": 16, "featur": 8, "fetch": [8, 17], "field": [5, 7, 9, 14, 15, 16], "file": [1, 4, 7, 8, 9, 12, 14, 15, 17], "filesystem": [0, 1, 8, 10, 14], "filesystem_polici": [9, 14, 17], "filter": [7, 10, 13, 14], "find": [3, 16, 17], "fine": 9, "finish": 17, "first": [0, 1, 2, 4, 10, 14, 16], "fish": 7, "fix": 15, "flag": [3, 8, 12, 13, 15, 16, 17], "flow": 5, "follow": [0, 1, 3, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17], "forc": 7, "fork": 12, "format": 7, "forward": [0, 5, 6, 9, 13], "foundat": 12, "four": 0, "free": 17, "from": [0, 3, 4, 6, 7, 10, 12, 14, 15], "full": [7, 8, 10, 13, 14, 15, 17], "fulli": 13, "function": 14, "g": 14, "gallerycdn": [8, 17], "gatewai": [0, 2, 5, 6, 10, 13], "gener": [5, 6, 7, 12, 16, 17], "get": [3, 5, 6, 8, 9, 13, 15, 16, 17], "gh": [8, 9, 15, 16, 17], "gh_token": 16, "ghcr": 10, "gid": 9, "git": [0, 8, 9, 17], "github": [2, 4, 7, 8, 9, 13, 15, 16], "github_api": 17, "github_git": 17, "github_repo": 15, "github_rest_api": [9, 17], "github_ssh_over_http": 17, "github_token": [16, 17], "githubusercont": [8, 17], "gitlab": [7, 16], "gitlab_token": 16, "give": 1, "glab": 16, "glab_token": 16, "glob": 9, "global": 7, "go": [1, 5], "goe": 14, "govern": 4, "grain": 9, "grant": [8, 9, 17], "granular": 15, "graphql": [15, 17], "greater": 17, "group": [7, 8, 9, 14], "grow": 12, "guid": [4, 17], "guidelin": 12, "h": 5, "ha": [9, 14, 17], "handl": [6, 9], "happen": 13, "hard_requir": [9, 10], "hash": 15, "have": [3, 12, 13, 17], "head": [7, 9, 15], "header": 15, "health": 7, "healthi": 3, "hello": 5, "hello_world": 17, "helm": 10, "help": 5, "here": [7, 17], "hierarchi": 7, "highest": [8, 9, 10, 14], "hint": [7, 14], "hit": 3, "hold": 5, "host": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 17], "hostnam": 9, "hot": [1, 6, 9, 14, 15, 17], "how": [1, 9, 12, 13, 14, 17], "http": [0, 3, 5, 6, 7, 8, 9, 14, 15, 17], "human": 7, "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17], "id": [5, 7], "ident": [0, 1, 9, 17], "identifi": [0, 7, 8, 9, 17], "ignor": 5, "imag": [1, 3, 4, 7, 12, 14], "immedi": 17, "import": 5, "improv": 2, "inaccess": 9, "includ": [0, 7, 8, 14, 17], "include_workdir": [9, 17], "indic": 17, "individu": [9, 13], "infer": [0, 1, 4, 8, 13, 14, 15, 17], "info": [7, 8, 9, 17], "inform": [7, 13], "infrastructur": [0, 4], "initi": 15, "inject": [0, 6, 7, 13, 14, 16, 17], "input": 5, "insid": [0, 3, 5, 6, 7, 8, 9, 10, 17], "inspect": [7, 9, 14, 15, 16], "inspect_for_infer": 13, "instal": [0, 1, 4, 8, 10, 14, 15, 17], "instanc": 3, "instead": [5, 17], "instruct": 5, "integ": 9, "integr": [8, 16, 17], "intel": 10, "intend": 9, "interact": [7, 17], "intercept": [0, 5, 13, 17], "intern": 1, "introduc": 2, "invalid_argu": 9, "invok": 12, "io": [8, 10, 17], "ip": 9, "isol": [0, 1, 2, 7, 10, 14], "issu": [8, 15, 17], "iter": [13, 17], "its": [0, 4, 7, 8, 9, 17], "j": [7, 10], "job": 17, "json": 5, "k": 7, "k3": [0, 10], "k3s1": 10, "keep": [0, 1, 4, 7, 13, 15, 17], "kei": [1, 3, 6, 7, 9, 12, 13, 14], "kernel": [0, 1, 2, 8, 9, 14], "known": 16, "kubectl": 7, "kubernet": [0, 10], "l4": 8, "l7_action": 17, "l7_decis": 17, "l7_deny_reason": 17, "l7_protocol": 17, "l7_target": 17, "label": 13, "landlock": [1, 8, 10, 14, 17], "last": 7, "later": [3, 13, 17], "latest": [2, 10, 12, 13], "launch": [3, 7, 12, 13, 14, 16], "launchabl": 3, "layer": [0, 14], "learn": [0, 1, 4, 15, 17], "let": 16, "level": [1, 2, 7, 10, 13, 14, 15, 17], "lib": [8, 9, 14, 17], "lifecycl": [0, 13], "like": [6, 9, 13], "link": [3, 17], "linux": 10, "list": [7, 8, 9, 10, 14, 15, 16, 17], "live": [7, 13, 15, 17], "llm": [0, 8], "load": [9, 15, 17], "local": [0, 1, 3, 4, 5, 7, 8, 9, 12, 13, 14, 15, 17], "locat": 0, "lock": [1, 9, 14, 17], "log": [0, 8, 9, 14, 15], "logic": 9, "longer": 13, "look": [13, 16, 17], "lookup": 8, "lsm": [9, 10, 14], "machin": [3, 13], "maco": 10, "mai": [9, 14], "make": [1, 3], "manag": [0, 2, 4, 5, 6, 7, 12, 14, 17], "mandatori": 9, "manifest": 10, "manipul": 12, "manual": 17, "map": 9, "marketplac": [8, 17], "match": [0, 3, 6, 8, 9, 14], "materi": 1, "matter": 17, "md": 12, "messag": [5, 6], "metadata": [7, 8, 15], "method": [0, 6, 9, 14, 15, 17], "microsoft": [8, 16, 17], "might": [13, 17], "minimum": [10, 12], "miss": 15, "mitig": 1, "mode": [1, 7, 9, 10], "model": [0, 1, 5, 6, 7, 16], "modern": 10, "modifi": [9, 15], "modul": 10, "monitor": [7, 15], "more": [2, 4, 7, 14, 16], "most": 1, "move": 14, "msecnd": [8, 17], "multi": 10, "multipl": [7, 14], "must": [8, 9, 10, 12, 13, 14, 17], "mutat": 8, "mutual": 9, "my": [5, 12, 13, 14, 15, 16, 17], "my_api": 14, "name": [5, 7, 9, 10, 12, 13, 14, 15, 16, 17], "namespac": 14, "nano": 5, "navig": 7, "need": [4, 6, 12, 13, 15, 16, 17], "neither": 9, "nemotron": 5, "net": [8, 17], "network": [0, 1, 4, 5, 6, 8, 13, 15, 17], "network_polici": [5, 6, 9, 14, 15, 17], "new": [7, 15, 17], "node": [8, 9, 10, 17], "non": 8, "none": [8, 16], "nor": 9, "normal": 9, "note": [8, 10, 14], "noth": 4, "now": 17, "npm": [9, 10], "npm_registri": 9, "npmj": 9, "null": [8, 9, 17], "number": 9, "nvidia": [3, 5, 6, 7, 8, 10, 14, 16, 17], "nvidia_api_kei": [5, 16], "nvidia_infer": 17, "o": [9, 10, 13], "object": [8, 17], "observ": 17, "omit": [7, 9], "omutbound": 13, "onc": 17, "one": [0, 5, 6, 7, 9, 12, 14, 16, 17], "ones": 13, "onli": [0, 1, 5, 6, 7, 8, 9, 14, 15, 17], "open": [0, 1, 7, 12, 13, 14, 17], "openai": [5, 6, 8, 14, 16], "openai_api_kei": [3, 5, 14, 16], "openai_base_url": 5, "openclaw": [1, 3, 4, 12, 13, 14], "opencod": [1, 3, 4, 7, 8, 10, 14, 16, 17], "opencode_api_kei": 16, "openrouter_api_kei": [3, 16], "openshel": [5, 6, 8, 9, 10, 12, 13, 14, 15, 16, 17], "openshell_cluster_imag": 10, "openshell_community_registri": 10, "openshell_gatewai": 7, "openshell_sandbox_polici": [7, 15], "oper": [7, 17], "option": [7, 9, 12, 14, 15], "orchestr": 14, "org": [8, 9, 15, 17], "org_nam": 15, "organ": 17, "origin": [0, 6], "other": [1, 3, 6, 8], "otherwis": [13, 14], "out": [8, 14], "outbound": [0, 1, 6, 8, 14, 17], "outlin": 15, "outlook": [7, 16], "output": [7, 9, 13, 17], "outsid": [1, 17], "over": [1, 3, 8, 17], "overli": 9, "overrid": [7, 10], "overview": 4, "own": [1, 12, 13, 17], "pack": [8, 9, 17], "packag": [0, 1, 3, 8, 12, 13, 17], "page": [2, 3, 5, 10, 13, 15, 17], "pair": [8, 14], "partial": [8, 14], "particular": 12, "pass": [0, 7, 12, 14, 15, 16], "passthrough": [8, 9, 15], "past": 17, "pat": 17, "patch": [9, 15], "path": [0, 1, 6, 7, 8, 9, 12, 14, 15, 17], "pattern": [1, 5, 9], "payload": [14, 15], "per": [0, 9, 15, 17], "perman": 7, "permiss": [4, 9, 17], "permit": [9, 17], "person": 17, "perspect": 17, "phase": [13, 14], "pick": [3, 6], "pid": 8, "pip": [3, 4, 8, 10, 15, 17], "pipe": 7, "plan": 15, "plane": [0, 10], "platform": [0, 8, 17], "pod": 0, "point": [5, 12, 13, 17], "polici": [0, 1, 2, 3, 4, 10, 12, 13, 16], "port": [0, 3, 8, 9, 13, 14, 15, 17], "post": [6, 8, 9, 15, 17], "pr": 8, "pre": [3, 8, 12, 13, 14, 16], "preconfigur": 12, "preserv": [1, 7], "press": 7, "prevent": [1, 4, 14], "previous": 17, "print": [7, 17], "privaci": [0, 1, 5, 6, 14], "privat": [1, 4, 14], "privileg": [1, 14], "problem": 17, "proc": [8, 9, 17], "proceed": 17, "process": [0, 1, 8, 12, 13, 14, 17], "prod": 5, "prompt": [1, 3, 17], "properti": 6, "protect": [0, 4, 14], "protocol": [9, 14, 15, 17], "provid": [1, 3, 4, 6, 8, 9, 12, 13, 14, 15, 17], "provis": [0, 14], "proxi": [0, 8, 9, 13, 14, 15, 17], "prss": [8, 17], "publish": [10, 12], "pull": [3, 8, 10, 12, 13, 15, 17], "purg": [13, 14], "purpos": [10, 12, 13], "push": [8, 15], "put": [9, 17], "py": 17, "pypi": [8, 15, 17], "python": [3, 8, 10, 17], "python3": [8, 17], "pythonhost": [8, 15, 17], "q": 7, "queri": [0, 14, 17], "quickstart": [0, 1, 4, 17], "quit": 7, "rancher": 10, "rang": 1, "rather": 6, "raw": [8, 17], "re": 3, "reach": [5, 8, 9, 14, 15, 17], "reachabl": [5, 9], "read": [1, 5, 7, 8, 9, 14, 15, 16, 17], "read_onli": [9, 14, 17], "read_writ": [9, 14, 17], "readabl": 7, "readi": [12, 14], "readm": [12, 17], "real": 13, "reason": [5, 15, 17], "receiv": [8, 16, 17], "recogn": [16, 17], "recommend": 10, "reconnect": [13, 17], "record": [5, 6, 7], "recreat": [6, 9, 16, 17], "ref": [8, 9, 17], "refer": [0, 1, 2, 4, 5, 6, 10, 12, 13, 14, 15, 16, 17], "refresh": 6, "refus": 13, "regist": 7, "registri": [3, 9, 10, 12, 13], "reject": 9, "relat": [5, 12, 13, 15, 16, 17], "releas": [8, 13, 14], "relev": 9, "reload": [1, 9, 14, 15, 17], "remain": 17, "remot": [0, 7, 8, 13, 17], "remov": [7, 13], "repeat": [5, 7, 15], "replac": [7, 15, 17], "repo": [4, 15, 17], "report": [8, 17], "repositori": [8, 12, 17], "request": [5, 6, 7, 8, 9, 12, 14, 17], "requir": [5, 7, 8, 9, 14, 16, 17], "rerout": [1, 14], "resolv": [8, 12, 13], "resourc": [13, 14, 17], "respons": [5, 6, 17], "rest": [0, 8, 9, 14, 15, 17], "restart": [9, 17], "restrict": [1, 9, 10, 14, 17], "retriev": 13, "return": [0, 13, 17], "reus": 15, "reusabl": 1, "review": [1, 12, 15], "revis": [15, 17], "rewrit": 5, "role": [0, 5], "root": [9, 17], "rout": [0, 1, 3, 4, 8, 14], "router": [0, 5, 6], "rule": [0, 5, 6, 8, 12, 15, 17], "run": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 16, 17], "run_as_group": [9, 14, 17], "run_as_us": [9, 14, 17], "runtim": [0, 1, 4, 7, 13, 14, 16, 17], "safe": [4, 14], "same": [0, 1, 5, 6, 8, 14, 17], "sandbox": [0, 1, 2, 4, 6, 8, 9], "save": [5, 17], "schema": [4, 14, 15, 16, 17], "scope": [5, 9, 17], "scratch": 17, "script": [7, 12, 17], "sdg": 12, "seccomp": [1, 10, 14], "secret": [1, 7], "section": [8, 14, 15, 17], "secur": [0, 1, 3, 5, 6, 10], "see": [5, 7, 17], "select": [7, 17], "self": [1, 4, 5, 17], "send": 1, "sensit": [0, 1], "sentri": [8, 17], "separ": [10, 16], "serv": 5, "server": [5, 8, 9, 10, 17], "servic": [0, 2, 16], "session": [7, 8, 13, 17], "set": [3, 4, 6, 8, 9, 10, 12, 13, 14, 15, 16], "setuid": [1, 14], "sever": [10, 13], "shareabl": 3, "shell": 16, "ship": [10, 14], "should": [5, 6, 17], "show": [3, 7, 8, 13, 15, 17], "sign": 17, "silicon": 10, "similar": 17, "simpl": [15, 17], "simul": 12, "sinc": 13, "singl": [3, 7, 12, 13, 17], "sk": 16, "skill": [3, 12], "skip": 3, "smart": [8, 17], "so": [0, 1, 8, 12, 16, 17], "socket": 8, "someth": 14, "sourc": [1, 3, 7, 13, 14, 15], "spark": [0, 3], "special": 6, "specif": [7, 13, 17], "specifi": [7, 13, 16, 17], "split": 14, "spot": 13, "src": 13, "ssh": [1, 3, 7], "ssid": [0, 3], "stai": [5, 6], "standalon": 8, "start": [0, 3, 7, 9, 10, 13, 17], "startup": [7, 10, 12, 17], "state": [0, 7], "static": [9, 14, 17], "statsig": [8, 17], "statu": [0, 3, 10, 13, 15, 17], "step": 3, "stop": [7, 13], "storag": 9, "store": 16, "stream": [7, 13, 14, 15, 17], "string": 9, "strip": [0, 6, 15], "structur": [15, 17], "subcommand": 7, "subdomain": 9, "submiss": 12, "subsequ": [3, 7], "success": 5, "successfulli": 17, "sudo": [1, 14], "suffici": 17, "summar": [1, 14, 17], "supervis": 0, "suppli": [5, 6, 12, 13, 14, 16], "support": [1, 5, 8, 9, 12], "sure": 3, "switch": 5, "sync": [3, 14], "syntax": 9, "synthet": 12, "syscal": 1, "system": [0, 4, 9, 10, 12, 14], "tab": [3, 7], "tabl": [0, 1, 8, 10, 14, 17], "tail": [7, 13, 15], "tailor": 3, "take": [9, 17], "target": [7, 17], "tcp": [8, 9, 14, 15], "team": 1, "telemetri": 8, "term": [7, 13, 15, 17], "termin": [0, 8, 9, 13, 14, 15, 17], "than": 6, "theft": 1, "thei": [1, 4, 13, 17], "them": [1, 9, 14, 16], "thi": [1, 2, 3, 5, 7, 9, 10, 13, 14, 15, 16, 17], "thing": [14, 17], "those": 14, "threat": 1, "three": [0, 14], "through": [0, 3, 5, 6, 8, 9, 10, 13, 14, 17], "time": [7, 9, 10, 13, 15], "timeout": 15, "tl": [0, 8, 9, 14, 15, 17], "tmp": [8, 9, 14, 17], "togeth": 0, "token": [12, 13, 14, 16, 17], "tool": [12, 16], "topic": [1, 5, 12, 13, 15, 16, 17], "torn": 14, "total": 9, "track": 2, "tradeoff": 1, "traffic": [0, 1, 4, 5, 6, 8, 9, 17], "trail": [7, 13, 14, 16], "travers": 9, "treat": [1, 6], "tree": 9, "triag": 15, "true": [9, 17], "trust": 17, "try": [13, 17], "tunnel": [3, 7], "tutori": [4, 13, 17], "two": [3, 4, 5, 6, 10, 17], "type": [3, 5, 7, 9, 17], "typic": [9, 16], "ubuntu": 10, "uid": 9, "unapprov": 1, "unauthor": [1, 4, 14], "unavail": [9, 10], "unchang": 17, "uncontrol": 4, "under": [1, 3, 7, 9, 12, 14], "understand": [1, 5], "unexpectedli": 13, "unix": 9, "unlist": 17, "unprivileg": [1, 14], "unrestrict": 1, "untest": 10, "until": 17, "up": [1, 3, 4, 6, 7, 12, 13, 14, 15, 16], "updat": [6, 8, 9, 15, 16], "upload": [1, 7, 8, 9, 13, 17], "upstream": 5, "urandom": [8, 9, 17], "url": [3, 7, 9], "us": [0, 3, 7, 8, 9, 10, 13, 14, 15, 16, 17], "usag": [1, 7], "user": [0, 5, 7, 8, 9, 14, 16], "usernam": [0, 3, 15, 17], "usr": [8, 9, 14, 15, 17], "uv": [3, 4, 8, 10, 15, 17], "v": [7, 8, 13, 14, 17], "v1": [5, 6, 10], "valid": [9, 15], "valu": [5, 7, 8, 9, 16], "var": [8, 17], "vari": 17, "variabl": [4, 10, 15, 16, 17], "venv": [3, 8, 17], "verbos": 7, "verifi": [15, 17], "version": [1, 5, 7, 14, 15, 17], "via": [8, 10], "view": [5, 7, 14, 15, 16], "violat": 9, "virtual": 3, "visualstudio": [8, 17], "vm": 10, "vo": [8, 17], "vsasset": [8, 17], "vscode": [8, 9, 17], "wa": [5, 7], "wai": [6, 16], "wait": [15, 17], "walk": [13, 17], "walkthrough": 15, "want": [5, 12, 13, 17], "warn": 13, "went": 14, "wget": [8, 17], "what": [1, 9, 13, 14, 15, 16, 17], "when": [1, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17], "whenev": 15, "where": [1, 9, 17], "whether": 9, "which": [0, 7, 9, 15, 17], "while": 1, "whose": 12, "wildcard": 9, "window": [10, 13], "without": [1, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17], "word": 17, "work": [8, 9, 13, 14, 17], "workdir": 8, "workflow": [12, 13, 14, 15, 17], "workspac": 17, "workstat": 0, "would": 9, "write": [1, 8, 9, 12, 14, 15, 17], "wrong": 14, "wsl": 10, "x86_64": 10, "yaml": [1, 7, 8, 9, 12, 13, 15, 16, 17], "ye": [3, 8, 9], "you": [3, 5, 7, 8, 12, 13, 14, 15, 16, 17], "your": [0, 1, 4, 5, 7, 12, 14, 15, 16], "yourself": 16, "zero": 3, "zsh": 7, "zshrc": 7}, "titles": ["How OpenShell Works", "Overview of NVIDIA OpenShell", "NVIDIA OpenShell Release Notes", "Quickstart", "NVIDIA OpenShell", "Configure Inference Routing", "About Inference Routing", "CLI Reference", "Default Policy Reference", "Policy Schema Reference", "Support Matrix", "License", "Community Sandboxes", "Create and Manage Sandboxes", "About Sandboxes", "Customize Sandbox Policies", "Providers", "Set Up a Sandbox of Claude Code with a Custom GitHub Policy"], "titleterms": {"0": 2, "1": [2, 5], "2": 5, "3": 5, "4": 5, "It": 5, "With": 16, "about": [6, 14], "access": [9, 14], "activ": 5, "agent": [8, 10, 14], "api": 6, "appli": 15, "ar": 12, "ask": 17, "attach": 16, "auto": 16, "bare": 16, "binari": 9, "block": 8, "built": [7, 14], "case": 1, "catalog": 12, "check": 17, "claud": 17, "clean": 17, "cli": [3, 7], "code": 17, "command": 7, "common": 1, "commun": [12, 13], "compat": [8, 10], "complet": 7, "compon": 0, "config": 5, "configur": 5, "connect": [3, 13], "contain": 10, "contribut": 12, "control": 1, "creat": [3, 5, 7, 13, 16], "credenti": 16, "current": 12, "custom": [13, 15, 17], "debug": 15, "default": [8, 14], "delet": 13, "deni": 15, "denial": 17, "deploy": 0, "diagnos": 17, "discoveri": 16, "endpoint": [5, 9], "entri": 9, "environ": 7, "exampl": [9, 15], "exist": 1, "explicit": 16, "explor": 4, "file": 13, "filesystem": 9, "first": 3, "flag": 7, "flow": 0, "form": 16, "forward": 7, "from": [5, 13, 16, 17], "full": 9, "gatewai": [3, 7], "get": [4, 7], "github": 17, "glanc": 1, "help": 7, "highlight": 2, "how": [0, 6], "imag": [10, 13], "infer": [5, 6, 7], "inspect": 13, "instal": 3, "interact": 13, "iter": 15, "kei": 16, "kernel": 10, "landlock": 9, "launch": 17, "layer": 1, "level": 9, "licens": 11, "lifecycl": 14, "list": 13, "local": [6, 16], "log": [7, 13, 17], "machin": 17, "manag": [13, 16], "matrix": 10, "mode": 0, "monitor": 13, "network": [9, 14], "next": [0, 1, 5, 6, 12, 13, 14, 15, 16, 17], "note": 2, "nvidia": [1, 2, 4], "object": 9, "openshel": [0, 1, 2, 3, 4, 7], "option": 3, "other": 12, "overview": 1, "part": 5, "pattern": 6, "platform": 10, "polici": [7, 8, 9, 14, 15, 17], "port": 7, "prerequisit": [3, 10, 17], "process": 9, "protect": 1, "provid": [5, 7, 16], "push": 17, "quick": 15, "quickstart": 3, "refer": [7, 8, 9], "releas": 2, "remot": 3, "request": [0, 15], "requir": 10, "retri": 17, "risk": 1, "rout": [5, 6], "rule": [9, 14], "run": 15, "runtim": 10, "sandbox": [3, 5, 7, 10, 12, 13, 14, 15, 16, 17], "schema": 9, "set": [5, 7, 17], "shell": 7, "shortcut": 16, "softwar": 10, "sourc": 12, "ssh": 13, "start": [4, 15], "statu": 7, "step": [0, 1, 5, 6, 12, 13, 14, 15, 16, 17], "structur": [9, 14], "support": [6, 10, 14, 16], "termin": 7, "top": 9, "transfer": 13, "tree": 7, "type": 16, "up": 17, "updat": [5, 7, 17], "us": [1, 5, 12], "variabl": 7, "verifi": 5, "version": [9, 10], "view": [13, 17], "what": 12, "why": 1, "work": [0, 6], "your": [3, 13, 17]}}) \ No newline at end of file diff --git a/pr-preview/pr-240/tutorials/github-sandbox.html b/pr-preview/pr-240/tutorials/github-sandbox.html index b53530070..4f98f0efe 100644 --- a/pr-preview/pr-240/tutorials/github-sandbox.html +++ b/pr-preview/pr-240/tutorials/github-sandbox.html @@ -485,20 +485,20 @@ You then diagnose the denial from your machine and from inside the sandbox, appl

Prerequisites#

This tutorial requires the following:

    -
  • Completed the Quickstart tutorial.

  • -
  • A GitHub personal access token (PAT) with repo scope. To create one, go to the GitHub personal access token settings page, select Generate new token (classic), check the repo scope, and copy the token.

    +
  • A working OpenShell installation. Complete the Quickstart before proceeding.

  • +
  • A GitHub personal access token (PAT) with repo scope. Generate one from the GitHub personal access token settings page by selecting Generate new token (classic) and enabling the repo scope.

    Tip

    -

    Instead of pasting the token into Claude during the tutorial, use a credential provider to inject it into the sandbox automatically at startup:

    +

    To avoid pasting the token manually during the tutorial, you can configure a credential provider to inject it automatically at sandbox startup:

    $ openshell provider create --name my-github --type github --from-existing
     $ openshell sandbox create --provider my-github --keep -- claude
     
    -

    The provider reads GITHUB_TOKEN from your host environment and sets it as an environment variable inside the sandbox so Claude can use it directly.

    +

    The provider reads GITHUB_TOKEN from your host environment and exposes it as an environment variable inside the sandbox. Claude Code can then use it directly.

  • -
  • Your own Anthropic account for Claude Code. OpenShell provides the sandbox, not the agent. You need your own account to log in to Claude Code.

  • -
  • A public GitHub repository you own (used as the push target). A scratch or test repository works well. The tutorial pushes a small file to it. You can create a new repository with a README if you do not have one handy.

  • +
  • An Anthropic account with access to Claude Code. OpenShell provides the sandbox runtime, not the agent. You must authenticate with your own account.

  • +
  • A GitHub repository you own to use as the push target. A scratch repository is sufficient. You can create one with a README if needed.

This tutorial uses two terminals to demonstrate the iterative policy workflow:

    @@ -518,7 +518,7 @@ You then diagnose the denial from your machine and from inside the sandbox, appl

    Push Code to GitHub#

    -

    In terminal 1, ask Claude Code to write a simple script and push it to your repository:

    +

    In terminal 1, ask Claude Code to write a simple script and push it to your repository. Replace <org> with your GitHub organization or username and <repo> with your repository name.

    Write a hello_world.py script and push it to https://github.com/<org>/<repo>.
     
    diff --git a/pr-preview/pr-240/tutorials/github-sandbox.json b/pr-preview/pr-240/tutorials/github-sandbox.json index 8b05d42d5..7658d0f16 100644 --- a/pr-preview/pr-240/tutorials/github-sandbox.json +++ b/pr-preview/pr-240/tutorials/github-sandbox.json @@ -1 +1 @@ -{"id":"tutorials/github-sandbox","title":"Set Up a Sandbox of Claude Code with a Custom GitHub Policy","url":"tutorials/github-sandbox.html","last_modified":"2026-03-11T21:58:22.141648+00:00","book":{"title":"NVIDIA OpenShell Developer Guide","version":"0.1.0"},"product":{"name":"OpenShell","version":"0.1.0"},"description":"Learn the iterative policy workflow by launching a sandbox, diagnosing a GitHub access denial, and applying a custom policy to fix it.","tags":["Tutorial","GitHub","Sandbox","Policy","Claude Code"],"topics":["Generative AI","Cybersecurity"],"content_type":"tutorial","learning_level":"technical_intermediate","audience":["engineer"],"content":"Set Up a Sandbox of Claude Code with a Custom GitHub Policy This tutorial walks through an iterative sandbox policy workflow. You launch a sandbox, ask Claude Code to push code to GitHub, and observe the default network policy denying the request\nYou then diagnose the denial from your machine and from inside the sandbox, apply a custom policy, and verify that the policy update takes effect. After completing this tutorial, you will have: A running sandbox with Claude Code that can push to a GitHub repository. A custom network policy that grants GitHub access for a specific repository. Experience with the policy iteration workflow: fail, diagnose, update, verify. This tutorial shows example prompts and responses from Claude Code. The exact wording you see might vary between sessions. Use the examples as a guide for the type of interaction, not as expected output. Prerequisites This tutorial requires the following: Completed the Quickstart tutorial. A GitHub personal access token (PAT) with repo scope. To create one, go to the GitHub personal access token settings page , select Generate new token (classic) , check the repo scope, and copy the token. Instead of pasting the token into Claude during the tutorial, use a credential provider to inject it into the sandbox automatically at startup: $ openshell provider create --name my-github --type github --from-existing\nopenshell sandbox create --provider my-github --keep -- claude\nThe provider reads GITHUB_TOKEN from your host environment and sets it as an environment variable inside the sandbox so Claude can use it directly. Your own Anthropic account for Claude Code. OpenShell provides the sandbox, not the agent. You need your own account to log in to Claude Code. A public GitHub repository you own (used as the push target). A scratch or test repository works well. The tutorial pushes a small file to it. You can create a new repository with a README if you do not have one handy. This tutorial uses two terminals to demonstrate the iterative policy workflow: Terminal 1 : The sandbox terminal. You create the sandbox here with openshell sandbox create and interact with Claude Code inside it. Terminal 2 : A terminal outside the sandbox on your machine. You use this for viewing the sandbox logs with openshell term and applying an updated policy with openshell policy set . Each section below indicates which terminal to use. Launch the Sandbox In terminal 1, create a sandbox and start Claude Code. No custom policy is needed. The default policy is applied automatically: $ openshell sandbox create --keep -- claude\nThe --keep flag keeps the sandbox running after Claude Code exits, so you can apply policy updates later without recreating the environment. Claude Code starts inside the sandbox. It prints an authentication link. Open it in your browser, sign in to your Anthropic account, and return to the terminal. When prompted, trust the /sandbox workspace to allow Claude Code to read and write files. Push Code to GitHub In terminal 1, ask Claude Code to write a simple script and push it to your repository: Write a hello_world.py script and push it to https://github.com////contents/hello_world.py\nl7_decision: deny\ndst_host: api.github.com\ndst_port: 443\nl7_protocol: rest\npolicy: github_rest_api\nl7_deny_reason: PUT /repos///contents/hello_world.py not permitted by policy\nThe log shows that the sandbox proxy intercepted an outbound PUT request to api.github.com and denied it. The github_rest_api policy allows read operations (GET) but blocks write operations (PUT, POST, DELETE) to the GitHub API. A similar denial appears for github.com if Claude attempted a git push over HTTPS. Ask Claude to Check the Sandbox Logs In terminal 1, ask Claude Code to check the sandbox logs for denied requests: Check the sandbox logs for any denied network requests. What is blocking the push\nClaude reads the deny entries and identifies the root cause. It explains that the failure is a sandbox network policy restriction, not a token permissions issue: The sandbox runs a proxy that enforces policies on outbound traffic. The\ngithub_rest_api policy allows GET requests (used to read the file) but blocks\nPUT/write requests to GitHub. This is a sandbox-level restriction, not a token\nissue. No matter what token you provide, pushes through the API will be blocked\nuntil the policy is updated. Both perspectives confirm the same thing: the proxy is doing its job. The default policy is designed to be restrictive. To allow GitHub pushes, you need to update the network policy. Update the Policy from Your Machine In terminal 2, create a policy file that extends the default policy with GitHub write access for your repository. You can ask a coding agent running on your machine, such as Claude Code or Cursor, to generate it from the deny reasons\nThe updated policy should have github_git and github_api blocks that grant write access to your repository. The following is a complete policy example that you can use as a starting point. Expand the dropdown to see the policy. Save it to a file, such as /tmp/sandbox-policy-update.yaml . Full reference policy The following YAML shows a complete policy that extends the default policy with GitHub access for a single repository. Replace with your GitHub organization or username and with your repository name. The filesystem_policy , landlock , and process sections are static. They are read once at sandbox creation and cannot be changed by a hot-reload. They are included here for completeness so the file is self-contained, but only the network_policies section takes effect when you apply this to a running sandbox. version: 1\n── Static (locked at sandbox creation)\nfilesystem_policy\ninclude_workdir: true\nread_only\n/usr\n/lib\n/proc\n/dev/urandom\n/app\n/etc\n/var/log\nread_write\n/sandbox\n/tmp\n/dev/null\nlandlock\ncompatibility: best_effort\nprocess\nrun_as_user: sandbox\nrun_as_group: sandbox\n── Dynamic (hot-reloadable)\nnetwork_policies\nClaude Code ↔ Anthropic API\nclaude_code\nname: claude-code\nendpoints\n{ host: api.anthropic.com, port: 443, protocol: rest, enforcement: enforce, access: full, tls: terminate\n{ host: statsig.anthropic.com, port: 443\n{ host: sentry.io, port: 443\n{ host: raw.githubusercontent.com, port: 443\n{ host: platform.claude.com, port: 443\nbinaries\n{ path: /usr/local/bin/claude\n{ path: /usr/bin/node\nNVIDIA inference endpoint\nnvidia_inference\nname: nvidia-inference\nendpoints\n{ host: integrate.api.nvidia.com, port: 443\nbinaries\n{ path: /usr/bin/curl\n{ path: /bin/bash\n{ path: /usr/local/bin/opencode\n── GitHub: git operations (clone, fetch, push)\ngithub_git\nname: github-git\nendpoints\nhost: github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nallow\nmethod: GET\npath: \"//.git/info/refs\nallow\nmethod: POST\npath: \"//.git/git-upload-pack\nallow\nmethod: POST\npath: \"//.git/git-receive-pack\nbinaries\n{ path: /usr/bin/git\n── GitHub: REST API\ngithub_api\nname: github-api\nendpoints\nhost: api.github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nGraphQL API (used by gh CLI\nallow\nmethod: POST\npath: \"/graphql\nFull read-write access to the repository\nallow\nmethod:\npath: \"/repos// --policy /tmp/sandbox-policy-update.yaml --wait\nTo find the name of your sandbox, check the output from openshell sandbox create or run openshell sandbox list . Network policies are hot-reloadable. The --wait flag blocks until the policy engine confirms the new revision loaded, and the update takes effect immediately without restarting the sandbox or reconnecting Claude Code. Retry the Push In terminal 1, ask Claude Code to retry the push: The sandbox policy has been updated. Try pushing to the repository again\nThe push completes successfully. The openshell term dashboard now shows l7_decision=allow entries for api.github.com and github.com where it previously showed denials. Clean Up When you are finished, delete the sandbox to free cluster resources: $ openshell sandbox delete with your GitHub organization or username and with your repository name. Write a hello_world.py script and push it to https://github.com////contents/hello_world.py\nl7_decision: deny\ndst_host: api.github.com\ndst_port: 443\nl7_protocol: rest\npolicy: github_rest_api\nl7_deny_reason: PUT /repos///contents/hello_world.py not permitted by policy\nThe log shows that the sandbox proxy intercepted an outbound PUT request to api.github.com and denied it. The github_rest_api policy allows read operations (GET) but blocks write operations (PUT, POST, DELETE) to the GitHub API. A similar denial appears for github.com if Claude attempted a git push over HTTPS. Ask Claude to Check the Sandbox Logs In terminal 1, ask Claude Code to check the sandbox logs for denied requests: Check the sandbox logs for any denied network requests. What is blocking the push\nClaude reads the deny entries and identifies the root cause. It explains that the failure is a sandbox network policy restriction, not a token permissions issue: The sandbox runs a proxy that enforces policies on outbound traffic. The\ngithub_rest_api policy allows GET requests (used to read the file) but blocks\nPUT/write requests to GitHub. This is a sandbox-level restriction, not a token\nissue. No matter what token you provide, pushes through the API will be blocked\nuntil the policy is updated. Both perspectives confirm the same thing: the proxy is doing its job. The default policy is designed to be restrictive. To allow GitHub pushes, you need to update the network policy. Update the Policy from Your Machine In terminal 2, create a policy file that extends the default policy with GitHub write access for your repository. You can ask a coding agent running on your machine, such as Claude Code or Cursor, to generate it from the deny reasons\nThe updated policy should have github_git and github_api blocks that grant write access to your repository. The following is a complete policy example that you can use as a starting point. Expand the dropdown to see the policy. Save it to a file, such as /tmp/sandbox-policy-update.yaml . Full reference policy The following YAML shows a complete policy that extends the default policy with GitHub access for a single repository. Replace with your GitHub organization or username and with your repository name. The filesystem_policy , landlock , and process sections are static. They are read once at sandbox creation and cannot be changed by a hot-reload. They are included here for completeness so the file is self-contained, but only the network_policies section takes effect when you apply this to a running sandbox. version: 1\n── Static (locked at sandbox creation)\nfilesystem_policy\ninclude_workdir: true\nread_only\n/usr\n/lib\n/proc\n/dev/urandom\n/app\n/etc\n/var/log\nread_write\n/sandbox\n/tmp\n/dev/null\nlandlock\ncompatibility: best_effort\nprocess\nrun_as_user: sandbox\nrun_as_group: sandbox\n── Dynamic (hot-reloadable)\nnetwork_policies\nClaude Code ↔ Anthropic API\nclaude_code\nname: claude-code\nendpoints\n{ host: api.anthropic.com, port: 443, protocol: rest, enforcement: enforce, access: full, tls: terminate\n{ host: statsig.anthropic.com, port: 443\n{ host: sentry.io, port: 443\n{ host: raw.githubusercontent.com, port: 443\n{ host: platform.claude.com, port: 443\nbinaries\n{ path: /usr/local/bin/claude\n{ path: /usr/bin/node\nNVIDIA inference endpoint\nnvidia_inference\nname: nvidia-inference\nendpoints\n{ host: integrate.api.nvidia.com, port: 443\nbinaries\n{ path: /usr/bin/curl\n{ path: /bin/bash\n{ path: /usr/local/bin/opencode\n── GitHub: git operations (clone, fetch, push)\ngithub_git\nname: github-git\nendpoints\nhost: github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nallow\nmethod: GET\npath: \"//.git/info/refs\nallow\nmethod: POST\npath: \"//.git/git-upload-pack\nallow\nmethod: POST\npath: \"//.git/git-receive-pack\nbinaries\n{ path: /usr/bin/git\n── GitHub: REST API\ngithub_api\nname: github-api\nendpoints\nhost: api.github.com\nport: 443\nprotocol: rest\ntls: terminate\nenforcement: enforce\nrules\nGraphQL API (used by gh CLI\nallow\nmethod: POST\npath: \"/graphql\nFull read-write access to the repository\nallow\nmethod:\npath: \"/repos// --policy /tmp/sandbox-policy-update.yaml --wait\nTo find the name of your sandbox, check the output from openshell sandbox create or run openshell sandbox list . Network policies are hot-reloadable. The --wait flag blocks until the policy engine confirms the new revision loaded, and the update takes effect immediately without restarting the sandbox or reconnecting Claude Code. Retry the Push In terminal 1, ask Claude Code to retry the push: The sandbox policy has been updated. Try pushing to the repository again\nThe push completes successfully. The openshell term dashboard now shows l7_decision=allow entries for api.github.com and github.com where it previously showed denials. Clean Up When you are finished, delete the sandbox to free cluster resources: $ openshell sandbox delete