Skip to main content

Open-source runtime for general-purpose AI agents in isolated sandboxes.

Project description

Sandstorm

Open-source runtime for general-purpose AI agents in isolated sandboxes.

CLI, API, Python client, and Slack with streaming, file uploads, and config-driven behavior.

Built on the Claude Agent SDK and E2B.

CI PyPI Python 3.11+ License: MIT

Sandstorm is for people who want real agent work, not a chat wrapper:

  • Research Acme's competitors, crawl their sites and recent news, and write a one-page branded briefing PDF with sources
  • Analyze uploaded transcripts or PDFs
  • Triage incoming support tickets
  • Run a security audit in a fresh sandbox
  • Turn docs into a draft API spec

Terminal demo

$ pip install duvo-sandstorm
$ ds init research-brief
$ cd research-brief
$ ds "Research Acme's competitors, crawl their sites and recent news, and write a one-page branded briefing PDF with sources."

WEBFETCH competitor sites, product pages, and recent coverage
STREAM compared launches, pricing, positioning, and buyer signals
WRITE briefing.pdf
WRITE reports/sources.md

artifacts:
  - briefing.pdf
  - reports/sources.md

The point is not that an agent can answer a question. It starts from a runnable starter, gets a fresh sandbox, can read uploads or crawl the web, writes artifacts like briefing.pdf, streams its work, and tears itself down when the run is done.

60-second path

pip install duvo-sandstorm
ds init
cd general-assistant
ds add linear
ds "Compare Notion, Coda, and Slite for async product teams"

ds init scaffolds a runnable starter with sandstorm.json, a starter README, .env.example, and any starter-specific assets. If provider settings are missing, the guided flow asks once and writes .env for you.

Direct forms:

ds init --list
ds init research-brief
ds init security-audit my-audit

Install extras

Install the base package for the CLI and server:

pip install duvo-sandstorm

Add extras only when you need them:

pip install "duvo-sandstorm[client]"      # Async Python client
pip install "duvo-sandstorm[slack]"       # Slack bot support
pip install "duvo-sandstorm[telemetry]"   # OpenTelemetry integration

Pick a starter

Starter Use it when you want to Typical output Aliases
general-assistant Start with one flexible agent for mixed workflows concise answer, plan, or artifact -
research-brief Research a topic, compare options, and support a decision brief with findings, recommendations, and sources competitive-analysis
document-analyst Review transcripts, reports, PDFs, or decks summary, risks, action items, open questions -
support-triage Triage support tickets or issue exports prioritized queue with owners and next steps issue-triage
api-extractor Crawl docs and draft an API summary plus spec endpoint summary and draft openapi.yaml docs-to-openapi
security-audit Run a structured security review vulnerability report with remediation steps -

Need CRM access, ticket systems, or internal APIs? Add custom tools to the sandbox.

Add toolpacks

Use ds add to install bundled MCP integrations into the current project:

ds add --list
ds add linear

ds add linear updates sandstorm.json, writes LINEAR_API_KEY to .env, adds LINEAR_API_KEY= to .env.example, and future CLI/API/Slack runs from that project expose the Linear MCP server in the sandboxed agent runtime.

If the project already has a different mcp_servers.linear block, ds add linear stops instead of overwriting it. Re-run with ds add linear --force to replace that MCP server entry.

Why Sandstorm exists

Most agent projects break down in one of two ways:

  • You wire the SDK yourself and end up rebuilding sandbox lifecycle, file uploads, streaming, config loading, and starter setup.
  • You use an agent framework that is good at orchestration but weak at actually shipping a runnable agent product path.

Sandstorm is opinionated about the missing middle:

  • starter to runnable project in one command
  • fresh sandbox per request with teardown by default
  • CLI, API, and Slack over the same runtime
  • config-driven behavior through sandstorm.json
  • built-in document tooling for PDF, DOCX, and PPTX workflows

Why not wire the SDK yourself?

Capability Sandstorm Raw SDK + E2B DIY runner
Fresh sandbox per request Built in Manual wiring Manual wiring
Streaming API endpoint Built in Manual wiring Custom work
File uploads Built in Manual wiring Custom work
sandstorm.json config layer Built in No Custom work
Slack bot integration Built in No Custom work
Starter scaffolding with ds init Built in No Custom work

Docs

Community

If Sandstorm saves you runner plumbing, please star the repo.

If you want a new starter, a provider integration, or a sharper deploy story, open an issue or start a discussion.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

duvo_sandstorm-0.8.0.tar.gz (469.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

duvo_sandstorm-0.8.0-py3-none-any.whl (102.3 kB view details)

Uploaded Python 3

File details

Details for the file duvo_sandstorm-0.8.0.tar.gz.

File metadata

  • Download URL: duvo_sandstorm-0.8.0.tar.gz
  • Upload date:
  • Size: 469.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for duvo_sandstorm-0.8.0.tar.gz
Algorithm Hash digest
SHA256 8fa97eb87cbca60f99f707028801026965cc2caeccbcfe810fc713cf23db5753
MD5 fe2a3cac483ea6bbedabaed9db9beb9c
BLAKE2b-256 f36dd072f6ab59048afac868efed2e31a1ab865aae37294cecb8c817a4a84b8c

See more details on using hashes here.

Provenance

The following attestation bundles were made for duvo_sandstorm-0.8.0.tar.gz:

Publisher: publish.yml on tomascupr/sandstorm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file duvo_sandstorm-0.8.0-py3-none-any.whl.

File metadata

  • Download URL: duvo_sandstorm-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 102.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for duvo_sandstorm-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8817d55f743f2b5311149d30c8cbb0b8c42a83c90a74f4cc9125440c73146a73
MD5 e62b0fb8c9dca74ec2ff457e95f25eb2
BLAKE2b-256 220239279a86be041cafc4bcd9ba6eb10053a8242c7dba8e97e83d570ae86daf

See more details on using hashes here.

Provenance

The following attestation bundles were made for duvo_sandstorm-0.8.0-py3-none-any.whl:

Publisher: publish.yml on tomascupr/sandstorm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page