Skip to main content
Build is the developer surface for creating isolated runtime environments, running work inside them, moving files, exposing services, and keeping state when a workflow needs to continue. Start here when you know what you want to build but are not sure which Nullspace primitive owns the job.

Choose The Primitive

GoalStart WithWhy
Run code or install dependencies in a clean VMMachinesMachines are the runtime boundary for commands, files, networking, desktop, and lifecycle.
Execute commands, stream logs, or manage processesCommandsCommands are the process API inside a machine.
Read, write, upload, download, or search filesFilesystemFilesystem APIs are for machine-local paths such as /workspace.
Run notebook-style code with structured resultsCode InterpreterCode Interpreter adds stateful cells, artifacts, and language contexts.
Automate a browser or GUI appDesktop EnvironmentsDesktop machines expose screenshots, input, windows, clipboard, viewer sessions, and recordings.
Avoid repeating setup on every machine createTemplatesTemplates turn setup steps or images into reusable machine environments.
Persist shared files outside VM memoryVolumesVolumes are durable filesystems that can mount into one or more machines.
Expose an HTTP or WebSocket serviceNetworkingPreview URLs and WebSockets route traffic to services inside machines.
Track long-running work and lifecycle stateObservabilityLifecycle events, webhooks, and monitor streams show what changed and why.

Common Workflows

WorkflowPath
Create a machine, run a command, read a file, then destroy itMachines -> Commands -> Filesystem
Start a web app and share it with a signed URLCommands -> Preview URLs
Build a reusable Python or Node environmentTemplates -> Template build -> Logging
Keep generated data across machine lifetimesVolumes -> Mounting volumes
Let an agent use a browser or desktop appDesktop automation -> Managed viewer
Debug a retained or long-running machineMonitor -> PTY or SSH

First Working Shape

Most Build workflows start with a machine and then opt into the primitives they need:
from nullspace import Machine

with Machine.create(template="base", timeout=300) as machine:
    result = machine.commands.run("python3 --version", shell=True)
    machine.files.write("/workspace/result.txt", result.stdout)
    print(machine.id, machine.files.read("/workspace/result.txt").strip())
Use a custom Template when this setup becomes repeatable, a Volume when output must outlive the VM, and a Preview URL when a process inside the machine needs inbound traffic.

Build Areas

Machines

Create isolated runtimes and choose lifecycle behavior.

Commands

Run foreground, streaming, and background work.

Filesystem

Move data in and out of machine paths.

Networking

Expose services and connect over HTTP, WebSockets, or SSH.

Templates

Build reusable environments for faster starts.

Volumes

Persist and share files outside VM memory.

Desktop Environments

Automate GUI workflows and supervise them in a viewer.

Observability

Subscribe to lifecycle events, webhooks, and metrics.