dabs.dev

Disposable spaces you can hand to an AI agent.

A sandbox, a git worktree, a throwaway copy of your project — declared once as a recipe, summoned by name, tracked until you tear it down.

$ curl -fsSL https://dabs.dev/install.sh | sh

Supported platforms: Linux and macOS. Installed? Read the docs →

Choose from the shipped recipes
$ dabs recipes
sh          shell in a clean box over your current directory
wt          cut a worktree, no box
wtbox       shell in a clean box over a fresh git worktree
scratch     copy the cwd into a directory node, no box
scratchbox  shell in a clean box over a throwaway copy of the cwd
Create a boxed worktree
$ dabs recipe wtbox --detach
 kept: worktree (branch dabs/8cf03d49)
  ~/.dabs/nodes/dabs-8cf03d49/held/worktree
 recipe booted: wtbox
  id: wtbox-8b4920ba
Just a scratchpad, no box
$ dabs recipe scratch
 workdir dabs-45e61218
  ~/.dabs/nodes/dabs-45e61218/held/work
Or write your own — ~/.dabs/recipes.yaml
claudewt:
  description: Claude box working in a fresh git worktree
  image: claude
  command: [claude]
  keep: true          # resume the box after claude exits
  env:
    CLAUDE_CONFIG_DIR: /root/.claude
  sources:
    - mkmount: ~/.dabs/shared/claude    # mount sandbox specific credentials and configs
      path: /root/.claude
    - mkmount: $PARENT_VOLUME/claude/projects  # transcripts outlive the box
      path: /root/.claude/projects
    - worktree: .
      path: /work

Boxception

Write your own setups and call them by their name.

What you defineWhat dabs takes care of

aibAgent in the boxyou ──▶ [box] ──▶ claude

aobAgent outside the boxyou ──▶ claude ──▶ [box] ──▶ npm test

aob-aibAgents outside the box running an agent inside the boxyou ──▶ claude ──▶ [box] ──▶ claude 😵‍💫

A box is just a place an agent can stand — so nothing stops the agent standing in one from booting another.