Sign inSign up

localstack/sbx-localstack-claude:0.1.0

Multi-platform
Manifest digest

sha256:697a4437dba71644f3e1b87e37e41a7eef41855d7a445b96ce138ff84a6f89f0

Last pushed

6 days by localstackci

Type

Sandbox Kit

Manifest digest

sha256:697a4437dba71644f3e1b87e37e41a7eef41855d7a445b96ce138ff84a6f89f0

yaml
schemaVersion: "3"
displayName: Claude Code with LocalStack
author: LocalStack <[email protected]>
description: Docker's Claude Code workload with the LocalStack mixin. The LocalStack MCP server is registered with Claude Code.
sourceUrl: https://github.com/localstack/docker-kit
version: 0.1.0
licenses:
    - Apache-2.0
    - SEE LICENSE IN https://github.com/anthropics/claude-code/blob/main/LICENSE.md
kind: workload
provides:
    - [email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/ca-certificates-java@20240118
    - deb/ca-certificates@20250419
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/iputils-ping@20240905
    - deb/[email protected]
    - deb/[email protected]
    - deb/less@668
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - cloud.localstack/[email protected]
    - cloud.localstack/[email protected]
    - cloud.localstack/[email protected]
    - cloud.localstack/[email protected]
    - cloud.localstack/[email protected]
capabilities:
    - type: com.docker.sandbox/network-policy@1
      config:
        runtime:
            allow:
                - api.anthropic.com:443
                - platform.claude.com:443
                - downloads.claude.ai:443
                - claude.com:443
                - mcp-proxy.anthropic.com:443
                - bridge.claudeusercontent.com:443
                - api.localstack.cloud:443
                - analytics.localstack.cloud:443
                - registry-1.docker.io:443
                - auth.docker.io:443
                - index.docker.io:443
                - production.cloudflare.docker.com:443
                - production.cloudfront.docker.com:443
                - public.ecr.aws:443
                - d2glxqk2uabbnd.cloudfront.net:443
                - registry.terraform.io:443
                - releases.hashicorp.com:443
                - registry.npmjs.org:443
                - pypi.org:443
                - files.pythonhosted.org:443
                - github.com:443
                - api.github.com:443
                - codeload.github.com:443
                - objects.githubusercontent.com:443
                - raw.githubusercontent.com:443
                - wings.crawlchat.app:443
                - us.i.posthog.com:443
            deny:
                - localhost
                - 127.0.0.0/8
                - ::1/128
                - host.docker.internal
                - localhost.localstack.cloud
                - '**.localhost.localstack.cloud'
    - type: com.docker.sandbox/sbx@1
    - type: com.docker.sandbox/credential@1
      optional: true
      config:
        apiKey:
            inject:
                - domain: api.anthropic.com
                  format: '%s'
                  header: x-api-key
                - domain: mcp-proxy.anthropic.com
                  format: '%s'
                  header: x-api-key
            name: ANTHROPIC_API_KEY
        oauth:
            credentialFile:
                path: ~/.claude/.credentials.json
                structure:
                    claudeAiOauth:
                        accessToken: '{{.AccessToken}}'
                        expiresAt: '{{.ExpiresAt}}'
                        refreshToken: '{{.RefreshToken}}'
                        scopes: '{{.Scopes}}'
                    primaryApiKey: '{{.PrimaryApiKey}}'
            sentinels:
                accessToken: sk-ant-oat01-proxy-managed
                refreshToken: sk-ant-ort01-proxy-managed
            tokenEndpoint:
                host: platform.claude.com
                path: /v1/oauth/token
        phase: runtime
        service: anthropic
      description: Anthropic API access (API key or claude.ai OAuth)
    - type: com.docker.sandbox/volume@1
      config:
        path: /home/agent/.claude/projects
        size: 2g
      description: Conversation history; grows without bound, gets the headroom
    - type: com.docker.sandbox/volume@1
      config:
        path: /home/agent/.claude/sessions
        size: 512m
      description: Per-session state; load-bearing for `claude -c`
    - type: com.docker.sandbox/volume@1
      config:
        path: /home/agent/.claude/todos
        size: 512m
      description: TodoWrite state
    - type: com.docker.sandbox/volume@1
      config:
        path: /home/agent/.claude/shell-snapshots
        size: 512m
      description: Bash state snapshots across sessions
    - type: com.docker.sandbox/volume@1
      config:
        path: /home/agent/.claude/statsig
        size: 512m
      description: Local feature-flag cache
    - type: com.docker.sandbox/agent-skills@1
      optional: true
      config:
        path: /home/agent/.claude/skills
    - type: com.docker.sandbox/long-running@1
    - type: com.docker.sandbox/agent-sessions@1
      config:
        continue:
            - --continue
        list:
            - claude
            - agents
            - --json
            - --all
        prompt:
            - -p
            - '{{.Prompt}}'
        resume:
            - --resume
            - '{{.SessionID}}'
      description: Drive claude sessions programmatically
    - type: com.docker.sandbox/lifecycle@1
      config:
        files:
            - content: |
                [[containers]]
                type = "aws"
                image = "${{ kit.args.localstack_image }}"
                port = "4566"
                container_name = "localstack-main"
                env = ["sandbox"]

                [env.sandbox]
                GATEWAY_LISTEN = "0.0.0.0:4566,0.0.0.0:443"
                SKIP_SSL_CERT_DOWNLOAD = "1"
                LAMBDA_IGNORE_ARCHITECTURE = "1"

                [cli]
                check_for_update_on_startup = false
              description: lstk settings for the sandbox emulator
              mode: "0644"
              path: /home/agent/.config/lstk/config.toml
        install:
            - command:
                - sh
                - -c
                - |
                  set -e
                  ws="${WORKSPACE_DIR:-/}"
                  esc=$(printf '%s' "$ws" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\t/\\t/g; s/\r/\\r/g')
                  projects="\"/\": { \"hasTrustDialogAccepted\": true }"
                  [ "$ws" = "/" ] || projects="$projects, \"$esc\": { \"hasTrustDialogAccepted\": true }"
                  printf '%s\n' "{
                    \"bypassPermissionsModeAccepted\": true,
                    \"hasCompletedOnboarding\": true,
                    \"projects\": { $projects }
                  }" > /home/agent/.claude.json
                  chown agent:agent /home/agent/.claude.json
              description: Seed Claude bypass/trust flags (root; overwrites image-shipped file)
              env:
                - WORKSPACE_DIR
              user: "0"
            - command:
                - sh
                - -c
                - |
                  set -e
                  mkdir -p /home/agent/.claude
                  HELPER=''
                  if [ "${SBX_CRED_ANTHROPIC_MODE:-none}" != none ]; then
                    HELPER='  "apiKeyHelper": "echo proxy-managed",
                  '
                  fi
                  printf '%s' "{
                    \"themeId\": 1,
                    \"alwaysThinkingEnabled\": true,
                  ${HELPER}  \"permissions\": { \"defaultMode\": \"bypassPermissions\" },
                    \"bypassPermissionsModeAccepted\": true,
                    \"skipDangerousModePermissionPrompt\": true
                  }
                  " > /home/agent/.claude/settings.json
              description: Seed Claude settings.json from the surfaced auth mode
              env:
                - SBX_CRED_ANTHROPIC_MODE
              user: agent
            - command:
                - sh
                - -c
                - |
                  set -e
                  [ -n "$MCP_GATEWAY_URL" ] || exit 0
                  export PATH="$HOME/.local/bin:$HOME/.claude/local:$PATH"
                  claude mcp add mcp-gateway "$MCP_GATEWAY_URL" \
                    --transport http \
                    --scope user \
                    --header "Authorization: Bearer $MCP_SENTINEL_TOKEN_NAME" || true
              description: Register the sandbox MCP gateway (install-time, race-free)
              env:
                - MCP_GATEWAY_URL
                - MCP_SENTINEL_TOKEN_NAME
              user: agent
            - command:
                - sh
                - -c
                - |
                  grep -q proxy-bypass.sh /etc/sandbox-persistent.sh 2>/dev/null && exit 0
                  echo '. /opt/localstack-kit/etc/proxy-bypass.sh' >>/etc/sandbox-persistent.sh
              description: Send LocalStack hostnames around the sandbox proxy in agent shells
              user: "0"
            - command:
                - sh
                - -c
                - /opt/localstack-kit/bin/lskit-register-mcp claude
              description: Register the LocalStack MCP server with Claude Code
              user: agent
        startup:
            - command:
                - sh
                - -c
                - chown -R agent:agent /home/agent/.claude/projects /home/agent/.claude/sessions /home/agent/.claude/todos /home/agent/.claude/shell-snapshots /home/agent/.claude/statsig 2>/dev/null || true
              description: Re-own claude session-state volume mount roots to agent
              user: "0"
            - background: true
              command:
                - sh
                - -c
                - command -v apt-get > /dev/null 2>&1 && (apt-get update -qq -y > /dev/null 2>&1 || true)
              description: Update apt package cache in background
              user: "0"
            - command:
                - sh
                - -c
                - |
                  set -e
                  [ -n "$MCP_GATEWAY_URL" ] || exit 0
                  export PATH="$HOME/.local/bin:$HOME/.claude/local:$PATH"
                  claude mcp add mcp-gateway "$MCP_GATEWAY_URL" \
                    --transport http \
                    --scope user \
                    --header "Authorization: Bearer $MCP_SENTINEL_TOKEN_NAME" || true
              description: Register the sandbox MCP gateway (startup fallback)
              env:
                - MCP_GATEWAY_URL
                - MCP_SENTINEL_TOKEN_NAME
              user: agent
            - background: true
              command:
                - sh
                - -c
                - /opt/localstack-kit/bin/lskit-start
              description: Start LocalStack with lstk
              env:
                - LOCALSTACK_AUTH_TOKEN
                - LOCALSTACK_DISABLE_EVENTS
                - AWS_ENDPOINT_URL
                - DOCKER_HOST
                - LSTK_KEYRING
                - WORKSPACE_DIR
                - LSKIT_LSTK_CONFIG
                - LSKIT_IGNORE_PROJECT_CONFIG
                - LSKIT_ALLOW_ANY_IMAGE
    - type: com.docker.sandbox/agent-context@1
      config:
        contentFile: /usr/share/sandbox/kit/localstack-claude/context.md
        filename: CLAUDE.md
args:
    localstack_image:
        default: localstack/localstack-pro:latest
        description: LocalStack image that lstk starts. The default is the latest release.
        pattern: ^[a-z0-9][a-z0-9./_-]*(:[A-Za-z0-9][A-Za-z0-9._-]*)?$
kits:
    - ref: docker.io/docker/sbx-kit-claude:2.1.278
      digest: sha256:2260a38adfd98dc322a93b50dd15834a4c11a60361239fb05cdf94d54870a03f
    - ref: docker.io/localstack/sbx-kit-localstack:0.1.0
      digest: sha256:ec3e01424994f8062f4d8b6dfbd886804ada4c6fa91ad475b2412f40f8fcd4a4
      args:
        localstack_image: ${{ kit.args.localstack_image }}