{"id":44667204,"url":"https://github.com/tomascupr/sandstorm","last_synced_at":"2026-03-11T02:17:40.674Z","repository":{"id":338449623,"uuid":"1157928891","full_name":"tomascupr/sandstorm","owner":"tomascupr","description":"Run Claude agents in secure cloud sandboxes — via API, CLI, or Slack. One call. Full agent. Zero infrastructure.","archived":false,"fork":false,"pushed_at":"2026-03-06T22:58:34.000Z","size":477,"stargazers_count":421,"open_issues_count":0,"forks_count":39,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-03-07T00:59:54.339Z","etag":null,"topics":["agent-sdk","ai","ai-agents","anthropic","claude","e2b","fastapi","llm","python","sandbox","slack-bot"],"latest_commit_sha":null,"homepage":"https://duvo.ai","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tomascupr.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-14T14:26:15.000Z","updated_at":"2026-03-06T22:58:33.000Z","dependencies_parsed_at":"2026-02-21T07:00:52.549Z","dependency_job_id":null,"html_url":"https://github.com/tomascupr/sandstorm","commit_stats":null,"previous_names":["tomascupr/sandstorm"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/tomascupr/sandstorm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomascupr%2Fsandstorm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomascupr%2Fsandstorm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomascupr%2Fsandstorm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomascupr%2Fsandstorm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tomascupr","download_url":"https://codeload.github.com/tomascupr/sandstorm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomascupr%2Fsandstorm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30367811,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"online","status_checked_at":"2026-03-11T02:00:07.027Z","response_time":84,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-sdk","ai","ai-agents","anthropic","claude","e2b","fastapi","llm","python","sandbox","slack-bot"],"created_at":"2026-02-15T01:11:45.913Z","updated_at":"2026-03-11T02:17:40.661Z","avatar_url":"https://github.com/tomascupr.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sandstorm\n\nOpen-source runtime for general-purpose AI agents in isolated sandboxes.\n\nCLI, API, Python client, and Slack with streaming, file uploads, and config-driven behavior.\n\nBuilt on the Claude Agent SDK and E2B.\n\n[![CI](https://github.com/tomascupr/sandstorm/actions/workflows/ci.yml/badge.svg)](https://github.com/tomascupr/sandstorm/actions/workflows/ci.yml)\n[![PyPI](https://img.shields.io/pypi/v/duvo-sandstorm.svg)](https://pypi.org/project/duvo-sandstorm/)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nSandstorm is for people who want real agent work, not a chat wrapper:\n\n- Research Acme's competitors, crawl their sites and recent news, and write a one-page branded briefing PDF with sources\n- Analyze uploaded transcripts or PDFs\n- Triage incoming support tickets\n- Run a security audit in a fresh sandbox\n- Turn docs into a draft API spec\n\n## Terminal demo\n\n```bash\n$ pip install duvo-sandstorm\n$ ds init research-brief\n$ cd research-brief\n$ ds \"Research Acme's competitors, crawl their sites and recent news, and write a one-page branded briefing PDF with sources.\"\n\nWEBFETCH competitor sites, product pages, and recent coverage\nSTREAM compared launches, pricing, positioning, and buyer signals\nWRITE briefing.pdf\nWRITE reports/sources.md\n\nartifacts:\n  - briefing.pdf\n  - reports/sources.md\n```\n\nThe point is not that an agent can answer a question. It starts from a runnable starter, gets a\nfresh sandbox, can read uploads or crawl the web, writes artifacts like `briefing.pdf`, streams\nits work, and tears itself down when the run is done.\n\n## 60-second path\n\n```bash\npip install duvo-sandstorm\nds init\ncd general-assistant\nds add linear\nds \"Compare Notion, Coda, and Slite for async product teams\"\n```\n\n`ds init` scaffolds a runnable starter with `sandstorm.json`, a starter README, `.env.example`,\nand any starter-specific assets. If provider settings are missing, the guided flow asks once and\nwrites `.env` for you.\n\nDirect forms:\n\n```bash\nds init --list\nds init research-brief\nds init security-audit my-audit\n```\n\n## Install extras\n\nInstall the base package for the CLI and server:\n\n```bash\npip install duvo-sandstorm\n```\n\nAdd extras only when you need them:\n\n```bash\npip install \"duvo-sandstorm[client]\"      # Async Python client\npip install \"duvo-sandstorm[slack]\"       # Slack bot support\npip install \"duvo-sandstorm[telemetry]\"   # OpenTelemetry integration\n```\n\n## Pick a starter\n\n| Starter | Use it when you want to | Typical output | Aliases |\n|---------|--------------------------|----------------|---------|\n| `general-assistant` | Start with one flexible agent for mixed workflows | concise answer, plan, or artifact | - |\n| `research-brief` | Research a topic, compare options, and support a decision | brief with findings, recommendations, and sources | `competitive-analysis` |\n| `document-analyst` | Review transcripts, reports, PDFs, or decks | summary, risks, action items, open questions | - |\n| `support-triage` | Triage support tickets or issue exports | prioritized queue with owners and next steps | `issue-triage` |\n| `api-extractor` | Crawl docs and draft an API summary plus spec | endpoint summary and draft `openapi.yaml` | `docs-to-openapi` |\n| `security-audit` | Run a structured security review | vulnerability report with remediation steps | - |\n\nNeed CRM access, ticket systems, or internal APIs? Add custom tools to the sandbox.\n\n## Add toolpacks\n\nUse `ds add` to install bundled MCP integrations into the current project:\n\n```bash\nds add --list\nds add linear\n```\n\n`ds add linear` updates `sandstorm.json`, writes `LINEAR_API_KEY` to `.env`, adds\n`LINEAR_API_KEY=` to `.env.example`, and future CLI/API/Slack runs from that project expose the\nLinear MCP server in the sandboxed agent runtime.\n\nIf the project already has a different `mcp_servers.linear` block, `ds add linear` stops instead\nof overwriting it. Re-run with `ds add linear --force` to replace that MCP server entry.\n\n## Why Sandstorm exists\n\nMost agent projects break down in one of two ways:\n\n- You wire the SDK yourself and end up rebuilding sandbox lifecycle, file uploads, streaming,\n  config loading, and starter setup.\n- You use an agent framework that is good at orchestration but weak at actually shipping a\n  runnable agent product path.\n\nSandstorm is opinionated about the missing middle:\n\n- starter to runnable project in one command\n- fresh sandbox per request with teardown by default\n- CLI, API, and Slack over the same runtime\n- config-driven behavior through `sandstorm.json`\n- built-in document tooling for PDF, DOCX, and PPTX workflows\n\n## Why not wire the SDK yourself?\n\n| Capability | Sandstorm | Raw SDK + E2B | DIY runner |\n|------------|-----------|---------------|------------|\n| Fresh sandbox per request | Built in | Manual wiring | Manual wiring |\n| Streaming API endpoint | Built in | Manual wiring | Custom work |\n| File uploads | Built in | Manual wiring | Custom work |\n| `sandstorm.json` config layer | Built in | No | Custom work |\n| Slack bot integration | Built in | No | Custom work |\n| Starter scaffolding with `ds init` | Built in | No | Custom work |\n\n## Docs\n\n- [Getting started](docs/getting-started.md)\n- [Python client](docs/client.md)\n- [Configuration](docs/configuration.md)\n- [API reference](docs/api.md)\n- [Slack bot](docs/slack.md)\n- [Deployment](docs/deployment.md)\n- [OpenRouter](docs/openrouter.md)\n- [Advanced examples](examples/README.md)\n\n## Community\n\nIf Sandstorm saves you runner plumbing, please [star the repo](https://github.com/tomascupr/sandstorm).\n\nIf you want a new starter, a provider integration, or a sharper deploy story, open an issue or\nstart a discussion.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomascupr%2Fsandstorm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomascupr%2Fsandstorm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomascupr%2Fsandstorm/lists"}