Skip to main content
SPACE (Sandboxed Platform for Agentic Code Execution) is an open source (Apache-2.0) platform from Perplexity that runs code in isolated Firecracker microVMs. Clients create sandboxes from templates and use them through an HTTP API to run commands, stream output, read and write files, and pause, suspend, and resume sandboxes. SPACE also has an E2B-compatible API, which this guide doesn’t set up. Each sandbox is a Kubernetes Pod with the space RuntimeClass. On a Kubernetes Node, containerd is a runtime that runs the Node’s containers. On each worker Node, containerd hands the sandbox Pods to SPACE’s containerd shim, containerd-shim-space-v2. The shim boots a Firecracker microVM instead of a container. Kubernetes schedules and places sandboxes, and SPACE’s node services manage the microVM lifecycle. SPACE’s local-development deployment runs on Kind, a tool that runs Kubernetes clusters in containers. This guide reuses several of its scripts and Helm charts, so their paths contain kind. This guide is for cluster operators who want to evaluate SPACE on CoreWeave Kubernetes Service (CKS). It uses SPACE’s own charts and scripts, and covers the following:
  • Prepare Node Pools and worker Nodes.
  • Build the SPACE images.
  • Install SPACE’s dependencies, its Secrets, and SPACE itself.
  • Create a first sandbox.
By the end of this guide, you have an evaluation deployment of SPACE on your cluster and a first sandbox that runs a command.
This deployment is for evaluation onlySPACE is a third-party project. Report SPACE issues directly to the SPACE repository.SPACE’s install path for existing clusters is a development and evaluation path, not a production deployment. This guide also uses SPACE’s test key broker, which isn’t designed to secure encryption keys. Use test data only.SPACE changes worker Node configuration: you install a containerd shim, edit the containerd configuration, and restart containerd on each worker. SPACE’s node services run privileged with host networking. Use worker Nodes that run no workloads other than SPACE.

Prerequisites

Before you start, you need the following:
  • A CKS cluster that uses Cilium as its network plugin.
  • The CKS Admin role, and Kubernetes permissions to create privileged Pods and cluster-scoped resources. See CKS authentication and access.
  • On your workstation: kubectl configured for your cluster, Helm, Bash 4 or later, OpenSSL 3, Python 3.8 or later, git, jq, and curl. macOS includes Bash 3.2, so install a later version, for example with Homebrew.
  • An amd64 Linux build host with Docker.
  • A container registry that your cluster’s Nodes can pull from.
Run the workstation commands in this guide from a SPACE checkout, in one Bash session. Clone SPACE at the commit that CoreWeave tested this guide with:

Prepare the cluster

Before you install SPACE, prepare the cluster it runs on. The following sections describe how to create the Node Pools, add a default StorageClass, create the namespaces and RuntimeClass, allow sandbox network traffic, and set up each worker Node.

Create Node Pools

SPACE uses two Node Pools. Set these labels in each pool’s nodeLabels: For a small evaluation, one Node Pool can carry all three labels and run both roles. CoreWeave tested this deployment on one General Purpose AMD Turin (High Storage) Node, turin-gp-l, that runs both roles. Every sandbox is a Pod, so the kubelet’s maxPods limit caps sandboxes per Node. The default of 110 allows about 100 sandboxes on a worker of any size. To run more, raise maxPods in the cluster’s kubelet configuration before you prepare the workers. The change applies to every Node in the cluster and takes effect after a Node reboot, which clears the worker preparation.

Install a default StorageClass

SPACE’s PostgreSQL chart requests a PersistentVolumeClaim from the cluster’s default StorageClass. Check whether the cluster has one:
If a StorageClass is marked (default), skip to the next section. Otherwise, install local-path-provisioner with its data on each Node’s local NVMe disk, and make its local-path StorageClass the default:
A local-path volume lives on one Node’s local disk, and CKS clears that disk when the Node reboots. The database doesn’t survive a reboot of its Node.

Create namespaces and the RuntimeClass

SPACE runs in the space namespace and places sandbox Pods in the sandboxes namespace. Create both namespaces and the RuntimeClass that sandbox Pods reference:

Allow sandbox Pods to reach their node services

Each sandbox Pod forwards control traffic to SPACE’s node API on its Node, on port 9800. SPACE’s sandbox NetworkPolicy blocks traffic from sandbox Pods to Node addresses, and CKS’s network plugin, Cilium, enforces it. Allow that one port with a CiliumNetworkPolicy:
sandbox-node-api.yaml
Without this policy, requests to create a sandbox time out with timed out waiting for sandbox pod proxy to become reachable. The policy also lets code that runs in a sandbox connect to that port on its Node.

Prepare worker Nodes

SPACE’s production node image sets up each worker before any SPACE Pod starts. CKS Nodes don’t run that image, so on each worker you run the same setup that SPACE’s Kind node image runs.
  1. Open a root shell on the worker. Replace [NODE-NAME] with the worker’s name:
  2. In the root shell, clone SPACE onto the Node’s local disk at the same commit, and install the Firecracker binaries and guest kernel:
  3. Install SPACE’s node setup units and start them. They create SPACE’s host accounts, the /space directory layout, the space cgroup, and a btrfs cache filesystem backed by an image file on the local disk. To change the cache image’s 40 GiB size, first set SPACE_CACHE_SIZE_MB in /etc/space/kind-node.env.
    The cache image is a sparse file. The cache unit logs a size warning that reads the link instead of the image. You can ignore this warning.
  4. Build the shim with a Go toolchain on the local disk, and install it:
  5. Register the space runtime with containerd, and restart it:
    This is the runtime section that install-shim.sh prints when containerd doesn’t have one yet.
  6. Exit the shell, and delete the debug Pod that kubectl debug printed when it started.
CKS clears a Node’s root filesystem and its local disk under /mnt/local when the Node reboots. Repeat these steps after a worker reboots. Until you do, SPACE’s node services on that worker fail to start.

Build and publish the images

On the build host, clone SPACE at the same commit and build its images with its Kind build script. Then tag and push them. Replace [REGISTRY] with your registry and namespace, such as registry.example.com/space, and [TAG] with an image tag:
On a 160-core build host, the first build takes about 6 minutes. The build also creates the SSH key pair that SPACE’s seed template trusts, under ~/.space-devbox/kind/ssh/ on the build host. Copy sandbox_ed25519 and sandbox_ed25519.pub from there into the SPACE checkout on your workstation. You need them to create the sandbox SSH Secret. SPACE’s charts don’t set image pull Secrets, so the worker and infra Nodes must be able to pull from [REGISTRY] without one.

Install the dependencies

SPACE needs PostgreSQL, S3-compatible object storage, and a key broker for volume encryption keys. SPACE’s install path for existing clusters doesn’t install them. For evaluation, install SPACE’s own Kind charts for each one. They run on the infra Nodes.
  1. Install PostgreSQL. The chart creates the space-postgres Secret that SPACE reads:
  2. Install the object store, with its data on the local disk. The chart creates the templates and snapshots buckets and the space-object-store Secret:
  3. Install SPACE’s test key broker under the names the install path accepts:
  4. SPACE reaches its key broker only over HTTPS with HTTP/2, and the test broker serves plain gRPC. Create a certificate for a TLS proxy in front of it:
  5. Run NGINX as the TLS proxy:
    key-broker-tls.yaml

Create the Secrets

SPACE’s install path checks that every Secret it references exists in the space namespace. The install path README lists each Secret and its keys. The dependency charts created some of them. Create the rest:
  1. Create the internal tokens and the database role passwords:
  2. Create the key that signs sandbox route tokens, and its verification bundle:
  3. Create the sandbox SSH Secret from the key pair that the build created:
  4. Issue the internal RPC TLS certificates with SPACE’s Kind script. The script targets a kubeconfig context named kind-[NAME], so create one that points at your cluster:
    The script creates the internal certificate authority and the service certificates in the space namespace.

Install SPACE

With the dependencies and Secrets in place, install SPACE and publish its seed template:
  1. Create a values file from SPACE’s example. Replace [SPACE-CLUSTER-NAME] with a stable name for this SPACE cluster:
    The changes point SPACE at your images, the in-cluster object store, and the key broker proxy. SPACE scopes Node identities to the cluster name, so don’t change it after you install. dataPlanePublicUrl is the data-plane address that clients use. This guide reaches the data plane through a port forward.
  2. Install both SPACE releases:
    The script checks the namespaces, Secrets, and RuntimeClass, and runs the database migrations. It then installs two Helm releases. The space release contains the API services and the worker node services. The space-builder release contains the template builder services, which you need only to build custom templates. This guide doesn’t cover custom templates, so it creates no Nodes labeled space.pplx.net/node-pool: builder, and the space-builder release runs no Pods.
  3. Publish the seed template. The internal API accepts template publishing only from the space-template-publish ServiceAccount, so render the chart with the release name space:

Verify the deployment

Check that every Pod in the space namespace is Running and ready, or Completed:
Check that each worker advertises sandbox capacity:
Example output
If a worker’s SLOTS column is empty, the worker isn’t ready for sandboxes. Check its space-node-manager Pod.

Create a first sandbox

To confirm that SPACE works end to end, sign in to its API from your workstation and run SPACE’s first-sandbox example:
  1. Set the password of SPACE’s root@local admin user with SPACE’s Kind script, through the kind-cks context:
  2. Forward the API and data-plane ports to your workstation:
  3. Sign in and save a session token:
  4. Run SPACE’s first-sandbox example:
    The example uses only the Python standard library. It creates a sandbox from seed:latest, runs a command, and asks whether to delete the sandbox. The output includes Hello from SPACE and Command completed successfully.
To keep working with the API, see Your first sandbox and the rest of the SPACE documentation.

Limitations

This deployment has the following limitations:
  • Evaluation only. The test key broker isn’t designed to secure encryption keys, and the dependencies run as single replicas.
  • amd64 workers only.
  • No state across Node reboots. CKS clears Node local disks on reboot. After a worker reboots, prepare it again. After an infra Node reboots, the object store loses its data, and so does PostgreSQL on a local-path volume, so uninstall and reinstall SPACE.
  • In-cluster object storage. SPACE can’t use CoreWeave AI Object Storage, so this deployment uses SPACE’s in-cluster object store.
  • No template builds or web console. This guide publishes only the seed template, and SPACE’s install path doesn’t include its UI.

Troubleshoot

For SPACE API errors, see Troubleshooting in the SPACE documentation.

Uninstall SPACE

Delete the SPACE resources:
Then reboot each worker Node. The reboot removes the shim, the containerd change, the files under /mnt/local, and the processes, cgroups, and network namespaces that SPACE leaves on the Node. Without a reboot, a reinstall fails until you remove them manually. On your workstation, stop the port forwards and remove the kubeconfig context that the SPACE scripts used:
Last modified on October 15, 2026