
Devcontainer Skills
- Updated July 3, 2026
- jeremygiberson/skill-plugins-factory
devcontainer-skills is a Claude Code skill in the AI & Agent Building category. Skills for setting up and working with development containers.
Key points
- devcontainer-skills
- AI & Agent Building
- AI-coding skill
Devcontainer Skills by the numbers
- Data as of Jul 7, 2026 (Skillselion catalog sync)
/plugin marketplace add jeremygiberson/skill-plugins-factory/plugin install devcontainer-skills@skill-plugins-factoryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Last updated | July 3, 2026 |
|---|---|
| Repository | jeremygiberson/skill-plugins-factory ↗ |
What it does
Skills for setting up and working with development containers.
README.md
devcontainer-skills
Skills for setting up and working with development containers.
Skills
| skill | purpose |
|---|---|
| devcontainer-setup | Creates devcontainers with Claude Code, language-specific tooling (Python/Node/Rust/Go), and persistent volumes. |
devcontainer-setup
Attribution: forked from trailofbits/skills @ e8cc5ba on 2026-04-21.
Why forked: the upstream skill's Dockerfile and install.sh pull and execute code from multiple unverified remotes at build time (curl | bash patterns, floating feature tags, git pull against an assumed upstream). The skills CLI flagged the upstream as High Risk (Gen) / Critical Risk (Snyk). This fork replaces each remote fetch with pinned, hash-verified local copies so the devcontainer image never executes code fetched from an unpinned remote during build.
Changes from upstream
Dockerfile
- Replaced all
curl -fsSL ... | bash/curl ... | tar/curl ... | dpkgcalls withCOPY vendor/(manifest + text installers) followed byvendor/fetch.sh, which pulls any binary artifacts at build time and verifies every artifact against pinnedSHA256SUMS. - Dropped the three
claude plugin marketplace addcalls (anthropics/skills,trailofbits/skills,trailofbits/skills-curated) — each was a standing supply-chain RCE vector for futureclaude plugin installcalls. Opt in manually per-project if desired. - Replaced the
ghcr.io/devcontainers/features/github-cli:1feature (unpinned floating tag) withapt-get installof a pinnedgh.deb (hash-verified, fetched at build time).
devcontainer.json
- Removed the
featuresblock (it only containedgithub-cli, now handled in the Dockerfile).
install.sh
- Removed
cmd_updateand itsupdatedispatcher case. The upstream implementation rangit pull --ff-onlyin whatever directory the script happened to live in — in fork context this either pulled the wrong repo (skill-plugins-factory) or the user's own project, which was misleading enough to warrant removal. - Extended
cmd_templateto copyvendor/alongside the other template files so theCOPY vendor/step in the Dockerfile has its build context.
resources/vendor/ (new)
- Committed in-repo (text):
claude-install.sh,fnm-install.sh,zsh-in-docker-1.2.1.sh. - Fetched at build time (binary):
git-delta_0.18.2_{amd64,arm64}.deb,fzf-0.67.0-linux_{amd64,arm64}.tar.gz,gh_2.90.0_linux_{amd64,arm64}.deb. URLs live inSOURCES;fetch.shpulls the artifacts matching the host arch and verifies them againstSHA256SUMS. SHA256SUMSis the single trust anchor — every artifact (committed or fetched) is verified before the Dockerfile consumes it.vendor/README.mdrecords the committed/fetched split, provenance, and refresh procedures.- Rationale for the split: multi-MB binaries bloat the repo and slow clones without adding security — the hash is what makes the artifact trustworthy, not its location in the tree.
Residual supply-chain links (not closed)
Intentionally out of scope for this fork; documented for future remediation:
claude-install.shfetches Claude Code binaries fromdownloads.claude.aiat build time. Anthropic-signed, HTTPS-served — treated as an acceptable trust anchor for Claude itself.fnm-install.shdownloads the fnm binary release zip fromgithub.com/Schniz/fnm/releasesat build time; no version is pinned in our Dockerfile call, so this floats to latest.zsh-in-docker-1.2.1.shpulls Oh My Zsh fromrobbyrussell/oh-my-zshmaster branch at build time — the most open remaining vector. Closing this would require either vendoring the OMZ install script at a pinned commit or replacingzsh-in-dockerwith a directapt install zshplus static.zshrc.