EC2 for Agents.

Existing cloud platforms like AWS and GCP were built for human developers. We are building cloud infrastructure for a new class of users: AI agents.

What we're building

Composability

Any machine an agent needs, in code.

Specify hardware, OS, files, tools, and policies in one call—no stitched-together setup scripts.

Linux
from nullspace import Machine

machine = Machine.create(
    hardware={
        "vcpus": 4,
        "memory": "8GiB",
        "disk": "40GiB",
    },
    runtime={
        "os": "linux",
        "image": "ubuntu-24.04",
    },
    environment={
        "repo": "github.com/acme/api",
        "packages": ["python3", "nodejs", "docker"],
        "secrets": ["GITHUB_TOKEN"],
    },
)

machine.commands.run("pytest", ["tests/"])

Scalability

From one machine to a thousand, instantly.

Run agents in parallel across many machines, or resize a single machine as the workload grows.

Horizontal
from nullspace import Machine

# Agents often need to explore many paths at once.
batch = Machine.batch(
    count=100,
    hardware={
        "vcpus": 2,
        "memory": "4GiB",
    },
    runtime={
        "os": "linux",
        "image": "python-3.12",
    },
    environment={
        "repo": "github.com/acme/evals",
        "secrets": ["OPENAI_API_KEY"],
    },
)

runs = batch.map(
    command=["python", "eval.py"],
    inputs=[
        {"candidate": "patch-001"},
        {"candidate": "patch-002"},
        {"candidate": "patch-003"},
        # ...
    ],
)

results = runs.collect()

Stateful Lifecycle

Pause, resume, and fork without losing context.

Stop work without throwing it away, branch a prepared machine, and skip the expensive setup every time.

Pause/Resume
from nullspace import Machine

machine = Machine.create(
    hardware={
        "vcpus": 4,
        "memory": "8GiB",
        "disk": "40GiB",
    },
    runtime={
        "os": "linux",
        "image": "python-3.12",
    },
    environment={
        "repo": "github.com/acme/research-agent",
        "volumes": ["experiment-data:/data"],
        "secrets": ["OPENAI_API_KEY"],
    },
)

# The agent spends time setting up useful state.
machine.commands.run("pip", ["install", "-r", "requirements.txt"])
machine.commands.run("python", ["preprocess.py", "--input", "/data/raw"])

# Pause the machine without throwing away the work.
machine.pause()

# Later, resume from the same state.
machine.resume()

machine.commands.run("python", ["continue.py", "--input", "/data/processed"])

Safety

Powerful by default, contained by design.

Give agents real capabilities while isolation, scoped permissions, secrets, and audit logs stay on by the platform.

Least Privilege
from nullspace import Machine, Policy

machine = Machine.create(
    hardware={
        "vcpus": 4,
        "memory": "8GiB",
    },
    runtime={
        "os": "linux",
        "image": "python-3.12",
    },
    environment={
        "repo": "github.com/acme/app",
        "secrets": ["GITHUB_TOKEN"],
    },
    policy=Policy(
        network={
            "mode": "allowlist",
            "allow": [
                "api.github.com",
                "pypi.org",
                "files.pythonhosted.org",
            ],
        },
        filesystem={
            "read": ["/workspace/repo"],
            "write": ["/workspace/tmp", "/workspace/output"],
        },
        secrets={
            "allow": ["GITHUB_TOKEN"],
        },
    ),
)

machine.commands.run("python", ["agent.py", "--task", "fix-failing-test"])

Experience

Simple when you want it, deep when you need it.

Ask for a machine without learning the stack—then reach into Firecracker, snapshots, and policies when the workload demands it.

Simple by Default
from nullspace import Machine

machine = Machine.create(
    purpose="run-agent-code",
    hardware={
        "vcpus": 4,
        "memory": "8GiB",
    },
    runtime={
        "os": "linux",
        "image": "python-3.12",
    },
)

result = machine.commands.run(
    "python",
    ["agent_task.py"],
)

print(result.stdout)