Skip to main content

SkillFS

Bash is all you need.

A persistent, version-controlled sandbox for AI agents. Runs on E2B with every change tracked in git.

Agent works → commits progress → session ends
            ↓
Next session → restores state → continues where it left off
            ↓
git log     → full history of everything it did

Installation

pip install skillfs

You'll also need:

  • An E2B API key for sandbox execution
  • An LLM API key (e.g., Anthropic) if using runners

Quick Start

import asyncio
from skillfs.workspaces import Workspace
from skillfs.sandboxes import E2BSandbox, SandboxConfig
from skillfs.storage import LocalBundleStore

async def main():
    sandbox = E2BSandbox.create(config=SandboxConfig(timeout=300))
    store = LocalBundleStore(directory="/tmp/workspaces")

    workspace = Workspace(
        workspace_id="my-workspace",
        sandbox=sandbox,
        store=store,
    )

    await workspace.load()  # Restore from previous session if exists

    # Use the sandbox directly
    sandbox.run_command("echo 'Hello, world!' > hello.txt")
    sandbox.run_command("cat hello.txt")

    workspace.save()  # Commit and upload git bundle
    sandbox.close()

asyncio.run(main())

Workspace

Workspace handles persistence. It manages:

  • Loading state from storage (git bundles)
  • Saving state back to storage
  • Setting up MCP servers
  • Managing skills
from skillfs.workspaces import Workspace

workspace = Workspace(
    workspace_id="my-workspace",
    sandbox=sandbox,
    store=store,
    mcp_servers={
        "playwright": {"command": "npx", "args": ["@playwright/mcp@latest"]}
    },
    generate_mcp_tools=True,
)

await workspace.load()
# ... do work with sandbox ...
workspace.save()

Storage Backends

# Local filesystem (development)
from skillfs.storage import LocalBundleStore
store = LocalBundleStore(directory="/tmp/workspaces")

# Google Cloud Storage (production)
from skillfs.storage import GCSBundleStore
store = GCSBundleStore(bucket="my-bucket", prefix="workspaces/")

Runners (Optional)

Runners are LLM loops that work with the sandbox. Workspace handles persistence, Runner handles agent logic.

from skillfs.workspaces import Workspace
from skillfs.runners import AnthropicProvider, MainRunner

# Workspace: persistence
workspace = Workspace(workspace_id="my-workspace", sandbox=sandbox, store=store)
await workspace.load()

# Runner: LLM loop (uses same sandbox)
provider = AnthropicProvider(api_key="sk-ant-...", model="claude-sonnet-4-5-20250929")
runner = MainRunner(
    name="assistant",
    description="General assistant",
    system_prompt="You are a helpful assistant.",
    sandbox=sandbox,
    provider=provider,
    tools=["glob", "grep", "read_file", "write_file"],
)

result = await runner.run("Find all Python files")
print(result.message)

workspace.save()

Tools

Built-in sandbox tools available to runners:

  • glob: Find files by pattern
  • grep: Search file contents (regex)
  • read_file: Read file contents
  • write_file: Create/overwrite files
  • edit_file: Make targeted string replacements
  • run_command: Execute shell commands

MCP Integration

Generate Python wrappers for MCP servers inside the sandbox:

workspace = Workspace(
    workspace_id="browser-workspace",
    sandbox=sandbox,
    store=store,
    mcp_servers={
        "playwright": {
            "command": "npx",
            "args": ["@playwright/mcp@latest"]
        }
    },
    generate_mcp_tools=True,
)
await workspace.load()

# MCP tools are now available at src/servers/playwright/

Examples

examples/browser_agent.py - Browser automation with Playwright MCP.

examples/example_with_runners.py - Using Workspace with Runners.

export ANTHROPIC_API_KEY=sk-ant-...
export E2B_API_KEY=e2b_...
python examples/browser_agent.py

License

MIT

Metadata

Release files for skillfs 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for skillfs 0.1.0
File Size Uploaded
skillfs-0.1.0.tar.gz 56.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for skillfs 0.1.0
File Interpreter ABI Platform
skillfs-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 134.0 kB

Release files / skillfs-0.1.0.tar.gz

Download URL skillfs-0.1.0.tar.gz
Size 56.4 kB
Tags Source
SHA-256 checksum
How to use checksums
6e797d94672baa146caaa2f19bb5a024c78d0cea9352375edf7e7a1e40c15348
BLAKE2b-256 checksum
How to use checksums
30172269716d5282ced938ff559402303ceed4e373323a2cad7d30e1cf24202c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / skillfs-0.1.0-py3-none-any.whl

Download URL skillfs-0.1.0-py3-none-any.whl
Size 77.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ee42e152722a750beff0d7b35cb04efd89f6507a75bbe013ae0554be4e42885c
BLAKE2b-256 checksum
How to use checksums
9717aa1f7c2ad2807009512343f4b85141a2114f2adad88c8ce998b21db8db25
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page