Iron Proxy Gateway for NanoClaw
nanocoai/nanoclaw
Installs or refreshes Iron Proxy and its Iron Control web console for NanoClaw, with a local Docker setup, database, credentials and a human approval bridge.
Migrates a Docker sandbox kit from the v2 spec.yaml grammar to the v3 kit descriptor, then builds it with docker buildx, runs it with sbx, and verifies it with the kit-tck conformance suite.
$ npx skills add docker/sandbox-kit-spec --skill migrate-kit-to-v3 -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install docker/sandbox-kit-spec migrate-kit-to-v3 --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/docker/sandbox-kit-spec.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/migrate-kit-to-v3 .claude/skills/migrate-kit-to-v3 && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "migrate-kit-to-v3" agent skill from https://github.com/docker/sandbox-kit-spec/tree/main/skills/migrate-kit-to-v3 into .claude/skills/migrate-kit-to-v3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-kit-to-v3", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/docker/sandbox-kit-spec/tree/main/skills/migrate-kit-to-v3Type this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add docker/sandbox-kit-spec --skill migrate-kit-to-v3 -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install docker/sandbox-kit-spec migrate-kit-to-v3 --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/docker/sandbox-kit-spec.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/migrate-kit-to-v3 .agents/skills/migrate-kit-to-v3 && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "migrate-kit-to-v3" agent skill from https://github.com/docker/sandbox-kit-spec/tree/main/skills/migrate-kit-to-v3 into .agents/skills/migrate-kit-to-v3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-kit-to-v3", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add docker/sandbox-kit-spec --skill migrate-kit-to-v3 -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install docker/sandbox-kit-spec migrate-kit-to-v3 --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/docker/sandbox-kit-spec.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/migrate-kit-to-v3 .cursor/skills/migrate-kit-to-v3 && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "migrate-kit-to-v3" agent skill from https://github.com/docker/sandbox-kit-spec/tree/main/skills/migrate-kit-to-v3 into .cursor/skills/migrate-kit-to-v3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-kit-to-v3", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/docker/sandbox-kit-spec.git --path skills/migrate-kit-to-v3--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add docker/sandbox-kit-spec --skill migrate-kit-to-v3 -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install docker/sandbox-kit-spec migrate-kit-to-v3 --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/docker/sandbox-kit-spec.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/migrate-kit-to-v3 .gemini/skills/migrate-kit-to-v3 && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "migrate-kit-to-v3" agent skill from https://github.com/docker/sandbox-kit-spec/tree/main/skills/migrate-kit-to-v3 into .gemini/skills/migrate-kit-to-v3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-kit-to-v3", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install docker/sandbox-kit-spec migrate-kit-to-v3Installs for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add docker/sandbox-kit-spec --skill migrate-kit-to-v3 -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/docker/sandbox-kit-spec.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/migrate-kit-to-v3 .github/skills/migrate-kit-to-v3 && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "migrate-kit-to-v3" agent skill from https://github.com/docker/sandbox-kit-spec/tree/main/skills/migrate-kit-to-v3 into .github/skills/migrate-kit-to-v3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-kit-to-v3", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add docker/sandbox-kit-spec --skill migrate-kit-to-v3 -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install docker/sandbox-kit-spec migrate-kit-to-v3 --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/docker/sandbox-kit-spec.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/migrate-kit-to-v3 .opencode/skills/migrate-kit-to-v3 && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "migrate-kit-to-v3" agent skill from https://github.com/docker/sandbox-kit-spec/tree/main/skills/migrate-kit-to-v3 into .opencode/skills/migrate-kit-to-v3/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-kit-to-v3", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
migrate-kit-to-v3Migrates a Docker sandbox kit from the v2 spec.yaml grammar to the v3 kit descriptor, then builds it with docker buildx, runs it with sbx, and verifies it with the kit-tck conformance suite.
Migrate Kit To V3 is an agent skill from docker/sandbox-kit-spec, published by the product's own GitHub organization. Migrates a Docker sandbox kit from the v2 spec.yaml grammar to the v3 kit descriptor, then builds it with docker buildx, runs it with sbx, and verifies it with the kit-tck conformance suite. Use when migrating or porting a kit to schemaVersion 3, when converting a v2 spec.yaml / sandbox.image / setup hooks / permissions block into v3 capabilities, when adding a -mixin variant of a workload kit, or when asked how to build, run, or conformance-check a v3 kit.
Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `FIELD-MAPPING.md`).
It sits in DevOps & Cloud, covering Containers. It works with Docker. The repository describes itself as: Docker Sandbox Kit Specification v3 - the kit descriptor grammar, the OCI artifact, the build frontend, and the conformance suites. The licence is Apache-2.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4be7f4d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dockergoFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.docker.comgithub.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Migrate Kit To V3 loads about 5k tokens when it runs. Until then it costs about 121 tokens; SKILL.md has 2,596 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from docker/sandbox-kit-spec at commit 4be7f4d, republished under its Apache-2.0 licence (© docker). 2,596 words, ~5,011 tokens.
.claude/skills/migrate-kit-to-v3/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.A v2 kit is one spec.yaml plus a Dockerfile that builds a named image. A v3
kit is one OCI image: the descriptor declares what the kit needs as typed
capabilities and rides in a manifest annotation, the image config carries the
runtime contract (entrypoint, env, user, workdir), and the layers carry the
content.
Three published tools, nothing repo-local:
docker buildx builds kits. Nothing to install for the kit frontend —
BuildKit pulls docker/sandbox-kit:3 from the descriptor's # syntax= line.
sbx runs them. Install the stable CLI from
Docker Docs /
sbx-releases; current releases
support Kits v3 in local and cloud mode.
kit-tck judges conformance:
go install github.com/docker/sandbox-kit-spec/v3/cmd/kit-tck@latest, or take
an archive from the
releases page. (A
go install of an untagged ref reports dev; @v3.x.y and the release
archives both carry the real version, which internal/version reads from
the build info.)
This repository is private, so both routes need access to it. The public
module proxy cannot serve it — proxy.golang.org answers 404 — so go install resolves direct and needs a git credential plus
GOPRIVATE=github.com/docker/*. In CI that means a token with read access,
and a fork's token does not have one: a fork can still validate a descriptor
by building it, since the frontend validates during the build, but it cannot
run kit-tck. If the repository becomes public, that whole constraint
disappears.
In precedence order:
spec/ — the Go
implementation. Where docs and code disagree, code wins.claude and claude-mixin are the migration of a real v2 kit
into both shapes; read them first.Working inside the spec repo, all four are also on disk at spec/,
docs/spec/ and examples/.
Track progress with this checklist:
- [ ] 1. Read the v2 kit end to end, including its README and testdata
- [ ] 2. Write the v3 descriptor, recipe, and context file
- [ ] 3. Add the -mixin variant (workload kits only)
- [ ] 4. Validate the descriptor (fails in seconds on a bad field)
- [ ] 5. Build the kit
- [ ] 6. Run it with sbx and exercise the agent
- [ ] 7. Verify with kit-tck
- [ ] 8. Publish, and delete the CI that published the v2 pairRead spec.yaml, Dockerfile, README.md and testdata/tck.yaml before
writing anything. v2 kits carry their reasoning in comments, and that prose is
the most valuable thing to carry across. testdata/tck.yaml is the only record
of whether a working non-interactive invocation was ever established
(promptArgs), which decides whether the migrated kit declares
agent-sessions@1. It says nothing about interactive verbs: declare
agent-interactive-sessions@1 beside it only for verbs you have verified
against the tool's real CLI, never from a pattern.
For a kit named <kit>, migrating in place:
| v2 | v3 |
|---|---|
<kit>/spec.yaml | <kit>/<kit>.yaml, first line # syntax=docker/sandbox-kit:3 |
<kit>/Dockerfile | <kit>/<kit>.dockerfile — found by filename stem, so no dockerfile: field |
agentInstructions.content | <kit>/<kit>-context.md, referenced as contentFile: ./<kit>-context.md |
<kit>/testdata/tck.yaml | delete — v2-only harness |
<kit>/.dockerignore | keep and audit. BuildKit still applies it to a v3 kit's build context, so deleting it puts back whatever it was excluding — secrets and large generated files included. Drop only the entries that named v2 files. |
<kit>/<kit>_tck_test.go | delete — it loads the v2 spec.yaml through tck.NewSuiteFromDir(".") and cannot compile once that file is gone |
The complete field-by-field mapping, the capability rules, and the gotcha list are in FIELD-MAPPING.md. Read it before writing the descriptor.
Migrate faithfully: preserve every declared host, credential, hook, volume,
port, env var and instruction, and keep base images verbatim. Where v3 cannot
express something, or where a v2 declaration turns out to be dead config, mark
it with an inline # MIGRATION NOTE: comment rather than dropping it silently
— the claude example shows the convention.
Faithful does not mean literal in one respect: a v2 install hook is often a v2 limitation rather than a v3 requirement, because a v2 mixin had no way to ship content. Decide per hook whether it becomes a layer — the rule, and the five cases where a hook is still correct, are in FIELD-MAPPING.md.
-mixin variantEvery workload kit gets a sibling <kit>-mixin/ holding <kit>-mixin.yaml,
<kit>-mixin.dockerfile and a context file. Name that last one
<kit>-context.md, which is what six of the seven example mixins do — the
staged name only has to avoid kit.yaml and kit.dockerfile, so the -mixin-
infix buys nothing and the repository is already near-unanimous. The mixin
declares the
same credentials, network policy, volumes and hooks, minus what only the kit
that owns the environment can carry. See the
mixin variants section for the exact
subtractions and the overlay recipe patterns.
The frontend decodes and validates the descriptor before it builds any content, so an export-less build is the fast loop while the descriptor is wrong:
cd <kit> && docker buildx build . -f <kit>.yaml --output type=cacheonlyA malformed descriptor fails in about a second, naming the offending field and
its line. Be clear about what cacheonly does, though: it suppresses the
export, not the build. Once the descriptor is valid the frontend goes on to
solve the whole recipe — downloads, installs and all — so this is fail-fast for
bad input rather than a validation-only step. Iterate here until it is
clean: a malformed descriptor still costs only the second it takes to
reject, even though a valid one costs the whole recipe.
Pass build-phase args by the kit's arg name, not the buildArg name the
recipe sees, and supply anything declared required or validation fails:
docker buildx build . -f <kit>.yaml --build-arg version=2.99.0 --output type=cacheonlyBecause the recipe is solved too, a bad FROM or COPY --from surfaces here
rather than waiting for step 5 — you just do not get an image out of it.
Swap the export for --load to put an ordinary tagged image in the local
store:
docker buildx build . -f <kit>.yaml -t <kit>-kit:<tag> --load--load is not optional on the docker-container driver, which is what
buildx create gives you: without an output the result stays in the builder's
cache and docker run <kit>-kit:<tag> reports no such image.
To judge the artifact with kit-tck without a registry, export an OCI layout
directory instead:
docker buildx build . -f <kit>.yaml -t <kit>-kit:<tag> \
--output type=oci,dest=/tmp/<kit>-layout,tar=falseA workload's recipe must build on a base carrying the platform floor — bash,
the agent user (uid 1000), git, a CA store — which the hardened
dhi.io/sbx-templates:* images carry. A bare distro base builds fine and
fails at agent launch.
Point sbx at the kit directory — the runtime builds source-form kits on
demand, keyed by source hash, so this needs no registry and no push:
sbx run ./<kit> . # a workload kit
sbx run ./<workload> --kit ./<kit>-mixin . # a mixin, composed onto a workloadA mixin cannot run alone; compose it onto the migrated workload or onto a shell
workload. Pass kit args with --kit-arg name=value (or --kit-arg kit.name=value to target one kit), and bind a credential the kit declares with
sbx secret set <service> before expecting authenticated calls to work. (The
-g flag older docs show is deprecated; global is the default now.)
Inside the sandbox, the kit is self-describing — use it to check that what you declared is what arrived:
cat /usr/share/sandbox/kit/<kit>/kit.yaml # the published descriptor
cat /usr/share/sandbox/kit/<kit>/kit.dockerfile # the recipe that built it
cat /var/log/sbx-kit-startup.log # startup hook outputThen exercise the kit for real: run the agent's own version command, confirm
install hooks left what they should, confirm a declared volume is writable by
agent, and confirm an undeclared host is refused while a declared one is not.
sbx kit inspect ./<kit> builds the source kit and prints its resolved
declarations (kind, network counts, credentials, args) without starting a
sandbox. Add --kit-arg to preview how args resolve. The first source build
creates the shared builder sandbox and is slow; sbx kit builder status shows
it and sbx kit builder rm reclaims the cache.
For the published path instead of the local loop, push the kit as an ordinary image and run it by reference — a kit image that only exists in the local Docker store cannot run, because the runtime resolves kit images from registries:
docker buildx build . -f <kit>.yaml --push -t docker.io/<you>/sbx-kit-<kit>:<tag> \
--platform linux/amd64,linux/arm64 --provenance=true
sbx run docker.io/<you>/sbx-kit-<kit>:<tag> .kit-tck judges an artifact's annotations, layers, staged sources and image
config, with every check linked to the clause it enforces. The same checks run
inside the frontend during a build, so running them here is how an artifact
changed by an exporter or a registry on its way out gets judged — and how a kit
this frontend did not build gets judged at all.
kit-tck validate --layout /tmp/<kit>-layout <tag> # the OCI layout from step 5
kit-tck validate docker.io/<you>/sbx-kit-<kit>:<tag> # a published kitFor the layout form, <tag> is the tag alone as the layout records it
(1.0.0), not the full <kit>-kit:1.0.0 reference the build was tagged with.
Add --verbose to list the checks that passed, --format json for every check
with its spec link, and --plain-http for a registry served over HTTP.
A published kit built on a multi-node builder warns that the index carries
no kit annotations. That is expected, not a defect: a multi-node build merges
per-node results into a fresh index client-side, which dissolves them, and
§9.3 requires consumers to fall back to the platform manifest, which does carry
them. The verdict is still ✓ conforms. A single-node build shows no warning.
Runtime conformance is a separate suite, for people implementing a runtime
rather than authoring a kit: kit-tck runtime --adapter <path> drives hundreds
of sandbox lifecycles against an adapter implementing
conformance.md.
It runs long — the bare command defaults --timeout to 30m and fails when that
expires, so a real run needs something like --timeout 2h — and migrating a kit
does not need it at all.
One artifact means one push. A v2 kit pointed sandbox.image at an image
published separately from the kit itself, so shipping a change meant building
and pushing both and keeping the reference between them honest. In v3 the
recipe's FROM builds the content, the frontend annotates it, and the result
in the registry is the whole kit:
docker buildx build . -f <kit>.yaml --platform linux/amd64,linux/arm64 --push \
-t <registry>/sbx-kit-<kit>:<version> -t <registry>/sbx-kit-<kit>:latestAudit the CI that published the v2 pair. A pipeline built around two
artifacts does not fail once there is only one — it keeps pushing an image
nothing references now that sandbox.image is gone, and the step that packed
the kit has nothing left to pack. Both halves get deleted, not rewired.
Check what the existing tag actually names. A repo publishing a family of
kits into one repository tags them by name (…/sbx-kits:<kit>), which is a
tag that says nothing about which build it points at. Carried into v3 unchanged
and paired with a descriptor that never set version:, it yields a published
kit with no version anywhere in it. Add <kit>-<version> beside the bare name,
and set version: regardless — the joined tag is not version-shaped, so it
cannot stand in for the field.
Signing is optional, unchanged by the migration, and described with the rest of the publish flow in create-kit-v3.
Each check below caught real defects in a migration of 87 kits that the cheaper checks above it did not. They are ordered by what they cost.
readContextFile and RequireAuthoredProvides both
run before the content loop, so a contentFile: naming a missing file and
an authored deb/ provide fail in step 4, not later. What neither sees is a
*-context.md no descriptor references, or a v2 instruction body that was
dropped — both fail at nothing at all. Script those two file-level audits;
they take seconds and they found a kit whose instructions would silently
never have reached the agent.--output type=oci,dest=<dir>,tar=false and run
kit-tck validate --layout <dir> <tag>: overlay-home-ownership fails an
overlay whose /home is not root's or whose /home/agent is not uid
1000's, which is what six of the migrated overlays got wrong. Then count
every other owner:
for b in <dir>/blobs/sha256/*; do tar --numeric-owner -tvf "$b"; done | awk '{print ($2 ~ /\//) ? $2 : $3"/"$4}' | sort | uniq -c.
Every count must be 0/0 or 1000/1000; that is what found four overlays
shipping files owned by package publishers' uids. The awk reads GNU tar's
joined 0/0 field or bsdtar's split pair, because a pipeline written for
either silently reports the other's size and date.test -x passed because
the real tree was still present in the build stage: the installer had
relocated a launcher but not its payload. kit-tck's
overlay-links-resolve now warns about those, but only the composition
shows whether a link the overlay cannot resolve by itself finds its target
on the base. Compose it through
the assembler, which is what merges the overlay's ENV and PATH and puts
it on a base carrying the platform floor:
sbx run ./<workload> --kit ./<kit> --detached --name t ., then
sbx exec t tool --version. Use sbx exec and not sbx run … -- tool:
arguments after -- are agent arguments and never run the binary. The
--load plus throwaway COPY --from=<overlay> / / trick is faster and
finds the same dangling symlinks, but it transfers files only — the image
config is dropped, so a mixin relying on its own ENV fails there for a
reason the assembler would not produce. Full detail in
Verifying an overlay.kit-tck judges the published artifact — see step 7.When you change ownership, re-run step 4, not just step 3. A chown that fixes
the numbers can still break the tool.
sbx kit validate does not accept a v3 source kit: its load path has no
kit builder configured. Validate with the build in step 4, and inspect the
built artifact with sbx kit inspect.*/spec.yaml
returns nothing, so CI passes by building nothing at all, which is the worst
failure mode available.These are the conventions the sbx-kits-contrib v3 migration followed. Keep
them unless the task says otherwise:
spec.yaml and Dockerfile once the v3
pair exists.README.md, updating the filenames and any v2 grammar it quotes; keep
README.image.md; delete testdata/tck.yaml. Keep .dockerignore — it
still governs the v3 build context — and prune only the entries that named
v2 files.Use a group when skipping a capability also needs to skip its hooks,
files, or guidance. Put optional: true on the group, never on its
members (even optional: false is invalid). Groups are nonempty and
cannot nest; required and one-member groups are valid. See
examples/optional-cache/optional-cache.yaml.
The selection API includes every member or none, before composition. A runtime supplies decisions on expanded entries; the API owns atomic selection and ordering. Validate all member configs even in skipped groups. Selected entries must still satisfy cross-entry rules, and a composition conflict is an error rather than a reason to skip another group. Singleton arity is per declaration block; lifecycle lists from selected blocks concatenate, and duplicate file paths are errors.
Selection lasts for one sandbox installation, including restarts. Recreation selects afresh. A failing selected hook is an execution failure, not optional unavailability. Skipping a group does not remove old files from reused volumes, omit image layers, or suppress argument environment exports. Group names are display labels, not merge keys.
Groups extend the unfinished schema-3 grammar in place. Descriptors using them require a reader implementing this extension; older strict readers reject them.
Use ${{ kit.env.HOME }} in capability configuration strings when a path
depends on the final container environment. Image defaults compose first,
argument env exports replace them, and runtime environment overrides win
last. Expansion happens before validation and selection, including inside
groups. Missing names fail; empty values remain empty. This is structural
string substitution, not shell evaluation: $HOME, ${HOME}, and ~/
are unchanged. Do not use environment references in mapping keys or Kit
metadata, and do not pass Kit placeholders inside argument or environment
values. Persist the expanded descriptor for restart.
© docker, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in skills/migrate-kit-to-v3 of docker/sandbox-kit-spec.
Open the folder on GitHubat commit 4be7f4d
Migrate Kit To V3 next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Migrate Kit To V3 this skilldocker/sandbox-kit-spec | 136 | — | ~5k | Automated safety check: Pass | Apache-2.0 | |
| Iron Proxy Gateway for NanoClawnanocoai/nanoclaw | 31k | — | ~4.6k | Automated safety check: Notes | MIT | |
| GreptimeDB Dev Docker ImageGreptimeTeam/greptimedb | 6.7k | — | ~4k | Automated safety check: Notes | Apache-2.0 | |
| Senior DevOps Toolkitmaslennikov-ig/claude-code-orchestrator-kit | 260 | 6 repos | ~1.1k | Automated safety check: Notes | Custom licence | |
| LangBot Deployment Guidelangbot-app/LangBot | 18k | — | ~1.2k | Automated safety check: Notes | Apache-2.0 | |
| Build Openshell Mxc WindowsNVIDIA/OpenShell | 15k | — | ~4.9k | Automated safety check: Pass | Apache-2.0 |
nanocoai/nanoclaw
Installs or refreshes Iron Proxy and its Iron Control web console for NanoClaw, with a local Docker setup, database, credentials and a human approval bridge.
GreptimeTeam/greptimedb
Packages a locally built GreptimeDB debug binary into a development-only Docker image for local-cluster testing, with an optional push to a dev registry.
maslennikov-ig/claude-code-orchestrator-kit
Comprehensive DevOps skill for CI/CD, infrastructure automation, containerization, and cloud platforms (AWS, GCP, Azure). Includes pipeline setup…
langbot-app/LangBot
Deploys and configures a LangBot instance with Docker Compose or Kubernetes, covering config.yaml, the Box sandbox runtime, the plugin runtime and the global API key.
NVIDIA/OpenShell
Maintain and validate OpenShell's build-only Windows MSVC lane for x64 and ARM64.
omnigent-ai/omnigent
Brings up the Omnigent server and Postgres as a Docker compose stack on any Docker host, and covers the Dockerfile's runtime and host build targets for extending it to a new platform.
docker/sandbox-kit-spec
Authors a new Docker sandbox kit against the v3 descriptor — choosing workload or mixin, writing the descriptor and its content recipe, declaring the capabilities it needs, pinning the tool version…
Works with
Categories
Migrates a Docker sandbox kit from the v2 spec.yaml grammar to the v3 kit descriptor, then builds it with docker buildx, runs it with sbx, and verifies it with the kit-tck conformance suite. Migrate Kit To V3 is an agent skill from docker/sandbox-kit-spec, published by the product's own GitHub organization.yaml grammar to the v3 kit descriptor, then builds it with docker buildx, runs it with sbx, and verifies it with the kit-tck conformance suite.
Migrate Kit To V3 fits situations like: porting a kit to schemaVersion 3; converting a v2 spec.yaml / sandbox.image / setup hooks / permissions block into v3 capabilities; adding a -mixin variant of a workload kit; asked how to build.
Run `npx skills add docker/sandbox-kit-spec --skill migrate-kit-to-v3 -a claude-code`. Or copy the skill folder (skills/migrate-kit-to-v3 in docker/sandbox-kit-spec) into .claude/skills/migrate-kit-to-v3 in your project. Claude Code loads it when a task matches its description.
Run `npx skills add docker/sandbox-kit-spec --skill migrate-kit-to-v3 -a codex`. Or copy the skill folder (skills/migrate-kit-to-v3 in docker/sandbox-kit-spec) into .agents/skills/migrate-kit-to-v3 in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add docker/sandbox-kit-spec --skill migrate-kit-to-v3 -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/migrate-kit-to-v3, .gemini/skills/migrate-kit-to-v3, .github/skills/migrate-kit-to-v3 and .opencode/skills/migrate-kit-to-v3 in your project.
Going by SKILL.md and its folder, Migrate Kit To V3 needs the command-line tools its instructions call (docker and go). Our summary lists: Docker.
SKILL.md names 2 domains. As links in the text: docs.docker.com and github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Migrate Kit To V3 is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Migrate Kit To V3: Iron Proxy Gateway for NanoClaw (nanocoai/nanoclaw, 31k stars), GreptimeDB Dev Docker Image (GreptimeTeam/greptimedb, 6.7k stars), Senior DevOps Toolkit (maslennikov-ig/claude-code-orchestrator-kit, 260 stars) and LangBot Deployment Guide (langbot-app/LangBot, 18k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
docker (a GitHub organization, an official publisher) maintains it in docker/sandbox-kit-spec, which has 136 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 7, 2026.
Source: docker/sandbox-kit-spec on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.