Custom dev container Features for enhancing development containers, hosted on GitHub Container Registry. This repository follows the dev container Feature distribution specification.
| Feature | Description |
|---|---|
| Oh My Posh | Prompt theme engine for bash, zsh, and fish |
| Microsoft Security DevOps CLI | guardian CLI for running security analysis tools without .NET |
| Copilot CLI Persistence | Persist GitHub Copilot CLI settings & chat history across rebuilds |
| Atlassian CLI for Jira & Confluence | acli for working with Jira and Confluence Cloud |
| Package Source Overrides | Point npm, pnpm, pip, and NuGet at internal override feeds |
| GitLab CI Local | Run GitLab CI/CD pipelines locally with gitlab-ci-local |
| Prompty Dumpty | dumpty CLI for managing prompty files |
Each feature's full option reference lives in its src/<feature>/README.md.
Installs Oh My Posh, a prompt theme engine for customizing your shell prompt across bash, zsh, and fish.
Usage:
{
"features": {
"ghcr.io/rosstaco/devcontainer-features/ohmyposh:1": {
"version": "latest",
"theme": "jandedobbeleer",
"installPath": "/usr/local/bin",
"shells": "bash,zsh"
}
}
}Options:
version- Oh My Posh version to install (default: "latest")theme- Built-in theme name to use (default: "jandedobbeleer")installPath- Installation directory (default: "/usr/local/bin")shells- Comma-separated list of shells to configure: bash, zsh, fish (default: "bash,zsh")
Custom Themes:
To use a custom theme file from your host machine, add a mount in your devcontainer.json:
{
"features": {
"ghcr.io/rosstaco/devcontainer-features/ohmyposh:1": {}
},
"mounts": [
"source=${localEnv:HOME}/path/to/theme.json,target=/home/vscode/.ohmyposh.json,type=bind"
]
}The feature creates a placeholder file at ~/.ohmyposh.json during installation. If you mount a custom theme to this location, it will be used automatically. Otherwise, the built-in theme specified in the options will be used.
Installs Microsoft Security DevOps CLI (guardian command) for running security analysis tools without requiring .NET installation.
Usage:
{
"features": {
"ghcr.io/rosstaco/devcontainer-features/microsoft-security-devops-cli:1": {
"version": "latest"
}
}
}Options:
version- Version to install (default: "latest"). Use "latest" or a specific version like "0.215.0"installPath- Installation directory (default: "/usr/local/bin/guardian")
Supported Architectures:
- linux-x64 (x86_64)
- linux-arm64 (aarch64)
Running Guardian:
After installation, the guardian command is available in your PATH. To initialize guardian in your repository:
guardian init --forceNote: guardian init requires a git repository, so it must be run manually after the container starts (not during feature installation).
Persists GitHub Copilot CLI settings and chat history across container rebuilds using a named Docker volume.
Usage:
{
"features": {
"ghcr.io/devcontainers/features/copilot-cli:1": {},
"ghcr.io/rosstaco/devcontainer-features/copilot-persistence:1": {}
}
}How It Works:
- Mounts a named volume (scoped per dev container) to
/copilot-data - Creates a symlink from
~/.copilot→/copilot-data - Sets the
COPILOT_DATA_DIRenvironment variable to/copilot-data
What Persists:
- Chat history and sessions
- CLI configuration (model preferences, settings)
- Command history
- Trusted folders
Installs the Atlassian CLI (acli) for working with Jira and Confluence Cloud from the command line.
Usage:
{
"features": {
"ghcr.io/rosstaco/devcontainer-features/atlassian-jira-confluence-cli:1": {
"version": "latest"
}
}
}Options:
version- Version of acli to install (default: "latest"). Use "latest" or a specific version like "1.3.21"installPath- Directory where the acli binary will be installed (default: "/usr/local/bin")configureBrowser- Install anxdg-openshim that prefers$BROWSERsoacli auth loginopens on your host (default:true)
Supported Architectures:
- amd64 (x86_64)
- arm64 (aarch64)
Getting Started:
After the container starts, authenticate once and then use the Jira and Confluence commands:
acli auth login
acli jira project listBrowser Login:
acli auth login opens an OAuth page via xdg-open, which doesn't honor $BROWSER inside a dev container. With configureBrowser enabled (the default), the feature installs a small xdg-open shim at /usr/local/bin/xdg-open that prefers $BROWSER (such as the VS Code browser helper) so the login page opens on your host machine. Set configureBrowser to false to skip it.
Points npm, pnpm, pip, and NuGet at internal override package sources (a pull-through proxy such as Artifactory, Nexus, or Azure Artifacts) instead of public feeds. It writes system- and user-scoped configuration as early as possible in the container lifecycle so that other Features also resolve packages through the proxy during their own installation.
Usage:
{
"features": {
"ghcr.io/rosstaco/devcontainer-features/package-source-overrides:1": {
"npmRegistry": "https://artifactory.example.com/artifactory/api/npm/npm-remote/",
"pipIndexUrl": "https://artifactory.example.com/artifactory/api/pypi/pypi-remote/simple",
"nugetSource": "https://artifactory.example.com/artifactory/api/nuget/v3/index.json"
},
"ghcr.io/devcontainers/features/node:1": {},
"ghcr.io/devcontainers/features/python:1": {}
},
"overrideFeatureInstallOrder": [
"ghcr.io/rosstaco/devcontainer-features/package-source-overrides"
]
}Options:
npmRegistry- registry URL for npm and pnpm (default: "")pipIndexUrl- pip / PyPI index URL that replaces the default index (default: "")nugetSource- NuGet v3 source URL that replaces nuget.org (default: "")nugetSourceName- key/name for the configured NuGet source (default: "override")scope- where config is written:system,user, orboth(default: "both")strictSsl- set tofalsefor self-signed / HTTP internal proxies (default:true)
Lifecycle & Ordering:
The feature declares no installsAfter dependencies so it installs as early as possible, and it writes root-readable config (/etc/pip.conf, /etc/npmrc, /root/.npmrc, root NuGet.Config) that other Features' build-time (root) package installs pick up automatically. Because a Feature can't force itself ahead of arbitrary third-party Features, list it first in overrideFeatureInstallOrder to guarantee it runs before anything that downloads packages. Providing no URLs makes it a safe no-op.
Installs gitlab-ci-local so you can run GitLab CI/CD pipelines locally (as a shell or docker executor) without pushing to test them.
Usage:
{
"features": {
"ghcr.io/rosstaco/devcontainer-features/gitlab-ci-local:1": {
"version": "latest"
}
}
}Options:
version- Version to install (default: "latest"). Use "latest" or a specific version like "4.67.0"
Supported Architectures:
- amd64 (x86_64)
- arm64 (aarch64)
Getting Started:
From a project containing a .gitlab-ci.yml:
gitlab-ci-local # run the default pipeline
gitlab-ci-local --job <job-name> # run a specific jobInstalls prompty-dumpty, a CLI (dumpty) for managing prompty files.
Usage:
{
"features": {
"ghcr.io/rosstaco/devcontainer-features/prompty-dumpty:1": {
"version": "latest"
}
}
}Options:
version- Version to install (default: "latest"). Use "latest" or a specific version like "0.6.2"
Getting Started:
dumpty --help
dumpty --versionPrompty Dumpty is installed system-wide with pip3 --break-system-packages (appropriate for containers) and assumes Python 3 is present in the base image.
This repository uses a GitHub Action workflow that publishes each Feature to GHCR (GitHub Container Registry).
Features in this repository are referenced with:
ghcr.io/rosstaco/devcontainer-features/<feature>:1
By default, GHCR packages are marked as private. To make them publicly accessible, navigate to the Feature's package settings page in GHCR and set the visibility to public:
https://github.com/users/rosstaco/packages/container/devcontainer-features%2F<featureName>/settings
To add Features to the public index:
- Go to github.com/devcontainers/devcontainers.github.io
- Open a PR to modify the collection-index.yml file
This allows tools like VS Code Dev Containers and GitHub Codespaces to surface your Features in their creation UI.