PandaStack

TypeScript SDK

@pandastack/sdk — official TypeScript / JavaScript SDK.

npm install @pandastack/sdk
# or
pnpm add @pandastack/sdk
# or
bun add @pandastack/sdk

Works in Node 20+, Deno, Bun, and modern edge runtimes (Cloudflare Workers, Vercel Edge).

Authentication

import { Client } from "@pandastack/sdk";

const c = new Client({
  apiKey: process.env.PANDASTACK_API_KEY!,
  apiUrl: "https://api-dev.pandastack.ai",
});

Or set PANDASTACK_API_KEY + PANDASTACK_API in env and the default client picks them up.

Sandbox

import { Sandbox } from "@pandastack/sdk";

const sb = await Sandbox.create({
  template: "code-interpreter",
  cpu: 1,
  memoryMB: 512,
});

try {
  const { stdout, exitCode } = await sb.run("python -c 'print(2+2)'");
  console.log(stdout);
} finally {
  await sb.close();
}

Streaming exec

const stream = sb.stream("python -c 'for i in range(10): print(i)'");

for await (const event of stream) {
  if (event.type === "stdout") process.stdout.write(event.chunk);
  if (event.type === "stderr") process.stderr.write(event.chunk);
  if (event.type === "done") console.log("exit:", event.exitCode);
}

Filesystem

await sb.fs.writeFile("/tmp/data.csv", "a,b\n1,2\n");
const contents = await sb.fs.readFile("/tmp/data.csv", "utf8");
const entries = await sb.fs.readdir("/tmp");

Fork & snapshot

const child = await parent.fork();
const snap = await sb.snapshot();
const restored = await Sandbox.fromSnapshot(snap.id);

Volumes

import { Volume } from "@pandastack/sdk";

const vol = await Volume.create({ name: "workspace", sizeGB: 10 });
const sb = await Sandbox.create({
  template: "python-data",
  volumes: [{ id: vol.id, mount: "/mnt/data" }],
});

PTY (interactive terminal)

const pty = await sb.pty({ rows: 30, cols: 100 });
pty.onData((data) => process.stdout.write(data));
process.stdin.on("data", (data) => pty.write(data));

Backed by a WebSocket to /v1/sandboxes/<id>/exec/pty.

On this page