Skip to content

Repository files navigation

Skillbox

The self-hosted execution runtime and skills registry for AI agents.

Your agents need a sandbox. Don't build one.

Skillbox gives AI agents a single API to register, discover, and execute sandboxed skill scripts (Python, Node.js, Bash) and receive structured JSON output + file artifacts. Think of it as a package registry — but for agent capabilities. Push skills, version them, let agents browse what's available, and run them in hardened sandboxes. Self-hosted, open source, secure by default.

fromskillboximportClientclient=Client("http://localhost:8080", "sk-your-key")
# Discover what skills are availableforskillinclient.list_skills():
print(f"{skill.name}: {skill.description}")
# Run a skill — structured in, structured outresult=client.run("data-analysis", input={"data": [1, 2, 3, 4, 5]})
print(result.output) # {"row_count": 5, "mean": 3.0, ...}

Why Skillbox

Every AI agent that does useful work needs to execute code. But executing arbitrary code is dangerous. Most teams either skip sandboxing ("we'll fix it later") or build their own broken wrapper. Skillbox is the missing piece:

ProblemHow Skillbox Solves It
"We need sandboxing but E2B/Modal are cloud-only"Self-hosted. Your infrastructure, your data, your rules.
"Three teams built three sandbox wrappers"One runtime. One API. One security review.
"Our agents don't know what tools are available"Skills registry — agents discover, inspect, and choose capabilities like browsing a package index.
"We need GDPR/EU AI Act compliance"Data never leaves your network. MIT license.
"Docker is insecure for running untrusted code"OpenSandbox with 6 layers of hardening enforced by the runtime, not configurable by callers.

Compared to Alternatives

SkillboxE2BModalDaytona
Self-hostedYes (MIT)ExperimentalNoLimited
Skills registryYes (SKILL.md)NoNoNo
Structured I/OJSON in → JSON outRaw stdoutRaw stdoutRaw stdout
Agent introspectionlist + get_skillNoNoNo
LangChain-native1:1 tool mappingManualManualManual
Network disabledAlwaysOptionalNoNo
Zero-dep SDKGo + PythonPythonPythonREST only
File managementUpload, version, downloadLimitedNoNo
LicenseMITApache-2.0ProprietaryApache-2.0

Features

  • Secure by defaultOpenSandbox isolation with network disabled, resource limits enforced, image allowlist, timeout enforcement, env var blocking, and API-based lifecycle (no Docker socket). 6 layers, all mandatory.
  • Skills registry — Skillbox is a registry for agent capabilities. Push skills like you push packages — versioned, discoverable, introspectable units with YAML metadata + markdown instructions. Agents browse, inspect, and choose the right skill before executing.
  • Structured I/O — Skills read JSON input, write JSON output, and produce file artifacts. No stdout parsing.
  • LangChain-ready — Skills map 1:1 to LangChain tools. get_skill returns descriptions for tool selection.
  • Self-hosted — Docker Compose with OpenSandbox service (dev), Kubernetes (prod), Helm chart. Air-gapped? Works offline.
  • Multi-tenant — API keys scoped to tenants, skills and executions isolated.
  • Zero-dep SDKs — Go and Python clients use only the standard library. No dependency conflicts.
  • CLI — Push, lint, run, package, and manage skills from the terminal.
  • File artifacts — Skills write files, runtime tars them, presigned S3 URL returned.
  • File persistence — Files persist across sessions, support versioning, and can be edited after creation via the file management API.
  • 12-factor config — All configuration via environment variables.

Quick Start

Prerequisites: Docker and Docker Compose. The compose stack includes the OpenSandbox service for sandbox execution.

# 1. Start the stack (includes OpenSandbox, MinIO, PostgreSQL)
git clone https://github.com/devs-group/skillbox.git &&cd skillbox
docker compose -f deploy/docker/docker-compose.yml up -d
# 2. Create an API key
bash scripts/seed-apikey.sh
export SKILLBOX_API_KEY=sk-... # from the script output# 3. Install the CLI and push a skill
go install github.com/devs-group/skillbox/cmd/skillbox@latest
skillbox skill push examples/skills/data-analysis --server http://localhost:8080
# 4. Run it
skillbox run data-analysis --input '{"data": [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]}'

Or with curl:

curl -s http://localhost:8080/v1/executions \
-H "Authorization: Bearer $SKILLBOX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"skill": "data-analysis", "input": {"data": [{"name": "Alice", "age": 30}]}}'| jq .

Security Model

Security is enforced by the runtime — not configurable away by callers:

ControlImplementationThreat Mitigated
Network isolationOpenSandbox NetworkPolicy (defaultAction: deny)Data exfiltration, SSRF
Resource limitsCPU and memory caps sent to OpenSandbox, clamped to server-side maximumsFork bombs, resource exhaustion
Image allowlistValidated by Skillbox before CreateSandbox callSupply-chain attack
TimeoutGo context cancellation + sandbox TTLResource exhaustion
Env var blockingLD_PRELOAD, PYTHONPATH, NODE_OPTIONS, SANDBOX_* filtered before passingLibrary injection
Sandbox lifecycleOpenSandbox API (no Docker socket required)Host escape

For genuinely untrusted code, gVisor or Kata Containers can be enabled as a Kubernetes RuntimeClass with zero changes to Skillbox.

Skill Format

A skill is a zip archive containing SKILL.md + scripts:

my-skill/
├── SKILL.md # YAML frontmatter + instructions
├── scripts/
│ └── main.py # Entrypoint
└── requirements.txt # Optional: Python deps
---
name: data-analysisversion: "1.0.0"description: Analyze CSV data and produce summary statisticslang: pythontimeout: 60sresources:
memory: 256Micpu: "0.5"
---
# Data Analysis SkillAnalyze data and produce summary statistics with charts.

The YAML frontmatter is machine-readable (for SDKs and API). The markdown body is LLM-readable (for agent tool selection). This dual format is what makes Skillbox skills work as LangChain tools out of the box.

See docs/SKILL-SPEC.md for the full specification.

SDKs

Go

Single file, zero dependencies beyond the Go standard library:

go get github.com/devs-group/skillbox/sdks/go
import skillbox "github.com/devs-group/skillbox/sdks/go"client:=skillbox.New("http://localhost:8080", "sk-your-key",
skillbox.WithTenant("my-team"),
)
// Create a skill from structured fields (no zip packaging needed)skill, err:=client.UpsertSkillFromFields(ctx, skillbox.CreateFromFieldsRequest{
Name: "text-summary",
Description: "Summarize long text into key sentences",
Lang: "python",
Code: "import json, os\ndata = json.loads(os.environ['SANDBOX_INPUT'])\nprint(json.dumps({'summary': data['text'][:100]}))",
})
// Run a skillresult, err:=client.Run(ctx, skillbox.RunRequest{
Skill: "text-summary",
Input: json.RawMessage(`{"text": "Long text here...", "max_sentences": 3}`),
})
ifresult.HasFiles() {
err=client.DownloadFiles(ctx, result, "./output")
}
// File managementfiles, err:=client.ListFiles(ctx, skillbox.FileFilter{ExecutionID: "exec-abc-123"})
err=client.DownloadFile(ctx, files[0].ID, "./output/report.pdf")

Python

Single file, zero dependencies beyond the Python standard library:

fromskillboximportClientclient=Client("http://localhost:8080", "sk-your-key", tenant_id="my-team")
result=client.run("text-summary", input={"text": "Long text here...", "max_sentences": 3})
print(result.output) # {"summary": "...", "sentence_count": 2}ifresult.has_files:
client.download_files(result, "./output")
# File managementfiles=client.list_files(execution_id="exec-abc-123")
client.download_file(files[0].id, "./output/report.pdf")

LangChain Integration

Skillbox skills map directly to LangChain tools. Each skill becomes a callable tool that an agent can discover, inspect, and execute:

fromlangchain_anthropicimportChatAnthropicfromlanggraph.prebuiltimportcreate_react_agent# Build tools from all registered skillstools=build_skillbox_toolkit("http://localhost:8080", "sk-your-key")
# Agent sees tools like skillbox_data_analysis, reads their descriptions,# picks the right one, calls it with structured input, gets structured outputagent=create_react_agent(ChatAnthropic(model="claude-sonnet-4-6"), tools)
result=agent.invoke({
"messages": [{"role": "user", "content": "Analyze this data: name,age\nAlice,30\nBob,25"}]
})

See the full LangChain integration guide for SkillboxTool, SkillboxToolkit, and custom tool examples.

Architecture

Agent → REST API → Skill Registry (MinIO) → OpenSandbox Runner → Sandbox (hardened) → Output + Files
↕ ↕
PostgreSQL OpenSandbox API (lifecycle + ExecD)

Every execution: authenticate → load skill → validate image → create hardened sandbox via OpenSandbox → run → collect output + files → cleanup. Stateless API, horizontally scalable behind a load balancer.

See docs/ARCHITECTURE.md for the full deep-dive.

CLI

skillbox run <skill> [--input '{}'] [--version latest]
skillbox skill push <dir|zip>
skillbox skill list
skillbox skill lint <dir>
skillbox skill package <dir>
skillbox exec logs <id>
skillbox health
skillbox version

Deployment

Docker Compose (Development)

docker compose -f deploy/docker/docker-compose.yml up

Kubernetes (Production)

kubectl apply -k deploy/k8s/overlays/prod

Helm

helm install skillbox deploy/helm/skillbox/

Kustomize overlays for dev and prod environments. Includes namespace, RBAC, NetworkPolicy, and Pod Security Standards. OpenSandbox manages container lifecycle directly -- no Docker socket proxy required.

API

MethodPathDescription
POST/v1/executionsRun a skill
GET/v1/executions/:idGet execution result
GET/v1/executions/:id/logsGet execution logs
POST/v1/skillsUpload a skill zip
GET/v1/skillsList skills (with descriptions)
GET/v1/skills/:name/:versionGet skill metadata + instructions
DELETE/v1/skills/:name/:versionDelete a skill
POST/v1/filesUpload a file
GET/v1/filesList files (with pagination)
GET/v1/files/:idGet file metadata
GET/v1/files/:id/downloadDownload file content
PUT/v1/files/:idUpdate/version a file
DELETE/v1/files/:idDelete a file
GET/v1/files/:id/versionsList file versions
GET/healthLiveness probe
GET/readyReadiness probe

See docs/API.md for the full reference.

Examples

ExampleDescription
examples/skills/data-analysis/CSV/JSON statistics with chart artifacts
examples/skills/text-summary/Extractive text summarization
examples/skills/word-counter/Word frequency counting
examples/curl/Step-by-step curl + jq walkthrough
examples/python/Python integration (stdlib only)
examples/agent-integration/Full Go agent using the SDK
examples/write-your-first-skill/Build your first skill (tutorial)

Run all examples at once:

docker compose -f examples/docker-compose.yml up

Configuration

All configuration via environment variables (12-factor):

VariableDefaultDescription
SKILLBOX_DB_DSNrequiredPostgreSQL connection string
SKILLBOX_S3_ENDPOINTrequiredMinIO/S3 endpoint
SKILLBOX_S3_ACCESS_KEYrequiredS3 access key
SKILLBOX_S3_SECRET_KEYrequiredS3 secret key
SKILLBOX_OPENSANDBOX_URLhttp://localhost:8080OpenSandbox API URL
SKILLBOX_OPENSANDBOX_API_KEYrequiredOpenSandbox API key
SKILLBOX_SANDBOX_EXPIRATION5mSandbox TTL
SKILLBOX_IMAGE_ALLOWLISTpython:3.12-slim,...Allowed Docker images
SKILLBOX_DEFAULT_TIMEOUT120sDefault execution timeout
SKILLBOX_API_PORT8080HTTP port
SKILLBOX_REDIS_URL(optional)Redis URL for caching

Contributing

We welcome contributions! See CONTRIBUTING.md for development setup, coding guidelines, and how to add new skills.

License

MIT. See LICENSE.


Built and maintained by devs group · Kreuzlingen, Switzerland

About

Secure skill execution runtime for AI agents. Run sandboxed Python/Node.js/Bash scripts via REST API with structured I/O and file artifacts.

Resources

Contributing

Security policy

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages