Releases: veggerby/container-superposition
Release list
Version 0.1.13
[0.1.13] - 2026-07-27
Added
-
Versioned private overlay and preset catalogs —
superposition.ymlnow supports project-declared external catalogs with immutable git/archive pinning or repo-relative path sources, namespace-qualified external IDs such asacme/web-api, strict no-override collision behavior in v1, shared catalog resolution acrossinit/regen/doctor/list/explain/plan, and generated manifest receipts that record the resolved catalog identities used for replay -
fusekioverlay seed loading — Apache Jena Fuseki projects can now opt into automatic RDF seed imports from one file or one directory during devcontainer creation, with append-or-replace modes, optional named-graph targeting, content-type auto-detection/override, and a reusable.devcontainer/seed-fuseki.shhelper for reruns -
GitHub Copilot CLI overlay — the overlay catalog now includes
copilot-cli, a terminal-first GitHub Copilot CLI install for devcontainers with configurable npm versioning, post-create installation, verification guidance, and authentication setup viacopilot loginor supported token environment variables -
Root Taskfile contributor workflow — the repository now ships a repo-root
Taskfile.ymlwith thin wrappers over the existing npm scripts plus mandatorytask validateand broadertask validate:generatedflows, so contributors have one discoverable entrypoint that runslint:fixbeforelintand aligns local validation guidance with existing CI contracts -
Named multi-instance compose overlays for repeatable services —
superposition.ymlnow accepts mixedoverlays:entries so compose projects can keep legacy string singletons and add named object-form instances with per-entry parameter overrides. Top-levelparameters:remain the shared default layer, manifests now recordoverlaySelectionsas a compatibility receipt for repeated intent, interactiveinitsafely bails out instead of flattening existing named instances, generatedservices.mdguidance now keeps repeated service hostnames instance-aware, and the audited repeatable compose catalog now includespostgres,redis,fuseki,sqlserver, andnatswhile deferred overlays still fail closed. -
Deterministic compose port rendering and optional env files — tool-owned compose port bindings are now written with final numeric host ports instead of
${...}host-port expressions, user-authored projectportsremain verbatim, compose-targeted projectenv:now renders directly into generateddocker-compose.ymleven when env artifacts are off, and.devcontainer/.envplus.devcontainer/.env.exampleare opt-in artifacts only via--compose-env-filesorcomposeEnvFiles: true.plan,doctor, generated summaries, and related help now follow the same persisted intent. -
Project-specific compose network names — compose-based generated projects now default
docker-compose.yml -> networks.devnet.namefrom the repository folder name instead of one host-globaldevnet, support explicitcomposeNetworkNameoverrides in sharedsuperposition.yml, preserve the logicaldevnetkey inside overlays, and reject compose-network configuration on plain stacks -
Four project-local contributor Pi skills — the repo now includes
/skill:cli-command-delivery,/skill:canonical-docs-alignment,/skill:workflow-sync, and/skill:dogfooding-safetyso contributors and agents can discover required workflows, validation commands, prohibited shortcuts, and escalation rules for CLI command work, documentation alignment, spec/index/changelog/Pi synchronization, and generated-artifact safety directly from Pi, without reconstructing guidance from scattered authority docs. -
Project-local overlay discovery and requirements-capture Pi workflow — the repo now includes
/skill:overlay-requirements-capture,/overlay-spec,/skill:overlay-solution-discovery,/overlay-discover, and/overlay-write-loopso contributors can start from a rough technology idea or plain-language need, capture a short overlay brief, check whether an existing overlay or preset already solves it, check whether a maintained published Dev Container Feature should be reused before writing bespoke install logic, and hand approved discovery output into the existing overlay creation/review loop. -
Repo-owned Behave overlay acceptance workflow — the repository now ships
npm run test:bdd/task test:bdd, a shared Behave harness with automatic discovery oftests/behave/**/*.featureplusoverlays/<id>/tests/behave/**/*.feature, CI wiring, repo-owned runtime bootstrap, semantic assertions for generated JSON/YAML/Compose/script output (including PATH/export checks), inline workspace fixtures for small scenario-local project files, and aligned contributor/overlay-authoring guidance for when to keep setup inline versus promote it to reusable fixture directories -
superposition.local.ymlcan now resolve local port conflicts without touching shared config — local config now supportsportOffsetand fullportsreplacement, including meaningfulports: []to suppress shared project ports for one developer.init,regen, and doctor dry-compose generation honor those local-only overrides, while sharedsuperposition.yml,plan, and generatedsuperposition.jsonstay shared-only. -
Init-only user-scoped global defaults — eligible fresh
initruns can now read personal home-directory defaults from preferred~/.superposition.ymlor legacy~/.container-superposition.yml(with the legacy-specific file winning when both exist), opt out with--ignore-global-defaults, and scaffold a firstsuperposition.local.ymlfrom either a legacylocalConfigTemplateor a stack-awarecommon/plain/composetemplate without affectingregen,doctor,plan, project-file replay, or manifest replay. The bootstrapinitDefaultssurface now explicitly includes existingdevcontainerGitignoresupport plusstack,composeEnvFiles, andcustomImage, while still normalizingcustomImageaway unlessbaseImage: customandcomposeEnvFilesaway unlessstack: compose -
Stable prerelease npm tag in publish automation — successful prerelease publish runs now keep the exact version, publish directly with the shared
prereleasedist-tag in the primary npm publish step, and advertise exact-version plus@prereleaseinstall/regen commands in workflow summaries and PR comments without any PR-specificpr-{number}tag
Changed
-
Overlay catalog audit remediation — compose overlays now rely on generator-owned final network naming, use
overlay.yml serviceOrderas the documented startup-order source of truth, pin audited image defaults away from movinglatestaliases (with the documentedcomfyuiflavor exception), keep.sharedinventory truthful, and record explicit bespoke-vs-reuse dispositions for the current tool/runtime decision set -
CLI UX model unified across init/regen/list/explain/plan/hash/doctor/adopt/migrate — human-readable command output now starts from shared framing, preview/review, and single next-step guidance built from normalized semantics instead of command-local copy.
init/regennow omit placeholder next-step/manual-review output on clean runs, remove duplicate preflight intro boxes, preferreview generated diffafter clean changed replay, and only suggestdoctorwhen the outcome leaves a real warning to follow up.listnow keeps workflow teaching in-body without a duplicate footer;explainletsPreview this changeown the follow-up action;plan/hashkeep footer guidance only when it is concrete and state-aware;doctoromits healthy-run placeholder guidance and avoids duplicate diagnosis/fix routing;adopt/migrateteach canonical vs compatibility vs preservation artifact roles without repeating the same replay action across frame, checklist, and footer. -
Second-pass read-only and conversion UX pass —
list,explain,plan,hash,doctor,adopt, andmigratenow show clearer first-screen context such asCurrent setup, project-vs-catalog scope, lane selection, planned changes, watch-outs, comparison meaning, and ordered next checklists.plancan now label reconciliation previews asReplay canonical intent;doctordefaults to project-health framing while--all-overlaysis explicitly maintainer-style catalog validation.
Fixed
- Read-only CLI JSON output and overlay explain semantics are now stable in automation —
list --json,explain --json, andadopt --jsonno longer risk truncated piped stdout before JSON consumers can parse it,cs explain postgres --jsonnow reports normalized compose service IDs without template suffix tokens, and the Behave validation workflow now runs on main-branch pushes as well as pull requests cs explainnow renders rich overlay ports readably — human-readable explain output no longer shows[object Object]for structured port metadata, now reuses one normalized port token acrossWhat it adds,What to watch out for, andFiles, services, and ports, and keeps legacy numeric ports compactservices.mdno longer trips doctor reproducibility right after regen — generated service reference output is now deterministic by default instead of embedding wall-clock time, socs doctorno longer reportsservices.mdas out of date immediately aftercs regen- Doctor now checks Git-tracking safety for generated output and local-only config —
cs doctornow warns whendevcontainerGitignore: trueoutput is still tracked, warns whensuperposition.local.ymlis tracked, anddoctor --fixcan safely appendsuperposition.local.ymlto root.gitignorewithout mutating Git index - Guided write review now gates init, doctor, and adopt mutations —
initnow starts with lane or shortcut entry points and requires explic...
Version 0.1.12
[0.1.12] - 2026-06-09
Fixed
- Ad-hoc project parameters now resolve correctly —
superposition.yml parameters:keys not
declared by any selected overlay (e.g.API_PORT,WEB_DEV_PORT) are now included in the
resolved parameter map and available for{{cs.KEY}}substitution inenv:values and
overlay file content. Previously they triggered a hardUnresolved parameter tokenerror.
Changed
-
Publish workflow release guidance — successful npm publish runs now render exact
npm installandnpx container-superposition@<version> regencommands in the workflow summary; prerelease runs do same, and final releases also comment on associated PRs when one is found -
Console output for unlisted parameters — the
⚠️ Unknown overlay parameters …warning
(yellow, comma-separated) is replaced by a neutral⚙️ Project-only parameters (not declared by any selected overlay):informational block using the sameKEY=VALUEper-line format as
overlay parameters. -
Doctor check 4 wording — renamed from "Unknown parameters in project file" to
"Project-only parameters (not declared by any selected overlay)";findingIdchanged to
project-only-parameters; guidance updated to explain these keys are resolved and valid,
rather than advising removal. -
validateEnvTokensResolved()error message — second line now reads
Resolved parameters: …instead ofDeclared parameters for selected overlays: …, accurately
reflecting that both overlay-declared and project-only keys appear in the resolved map.
Added
-
Parameter tokens (
{{cs.KEY}}) inenv:values —superposition.yml(and
superposition.local.yml)env:values now support{{cs.KEY}}parameter tokens.
Tokens are resolved in-memory at generation time using the fully resolvedparameters:map
(CLI > project parameters > overlay defaults). The project file is never modified.
Unknown tokens cause a hard error before any files are written, reporting theenv.KEYfield
and the list of declared parameters.
This eliminates duplication betweenparameters:andenv:— e.g.:env: DATABASE_URL: 'postgresql://{{cs.POSTGRES_USER}}:{{cs.POSTGRES_PORT}}/{{cs.POSTGRES_DB}}'
-
Doctor: sensitive parameter checks — new
doctorfindings:sensitive-params-project-file(warn) — fires when a parameter declaredsensitive: true
by an overlay has a literal (non-${VAR}) value insuperposition.yml parameters:. Suppressed
when the value equals the overlay default.sensitive-params-devcontainer-env(warn) — fires when a sensitive parameter appears as
plain text in.devcontainer/.envafter generation. Skipped when.devcontainer/.envis absent
(plain stack). Suppressed when value equals overlay default.
-
Doctor: first-class property promotion suggestions — new
doctorfindings suggest
migratingcustomizationsusage to first-class fields:customizations-env-promote—customizations.devcontainerPatch.remoteEnvset butenv:absentcustomizations-mounts-promote—customizations.devcontainerPatch.mountsset butmounts:absentcustomizations-ports-promote—customizations.dockerComposePatchcontains port bindings butports:absent
-
Docs: variable precedence and parameter token section —
docs/superposition-yml.mdnow
includes a "Parameter tokens ({{cs.KEY}})" section with syntax reference, supported fields
table, pass-through guarantee table, and worked examples. Theenv:section now documents
the two-tier generation-time vs runtime substitution model with a decision tree. -
Stable doctor finding IDs — internal
CheckResultgains an optionalfindingIdfield;
checksToFindings()prefers it over the name-slugified ID when present. Makesdoctor --fix
routing and test assertions stable across name changes. -
superposition.local.ymllocal config — optional repository-root local config for machine-specificenv,mounts,shell, andcustomizationsenrichment during generated devcontainer output creation, with schema support and Git safety warnings for unignored or already-tracked generated output. -
devcontainerGitignoreproject-file option — when enabled insuperposition.yml,
generation writesoutputPath/.gitignorewith:*
-
portsfield insuperposition.yml— first-class project port declarations with stack-specific semanticsstack: plain: write a container port expression (${VAR:-default}or a number, no colon); resolved at generation time withsuperposition.yml envtaking priority over root.env, then inline defaultstack: compose: write a fullHOST:CONTAINERbinding; written verbatim todocker-compose.yml(no${VAR}expansion — Compose resolves at container startup); container port extracted best-effort forforwardPortsportsAttributeskeyed by container port (not host port)- Superposition.yml
enventry simultaneously drivesremoteEnvand plain-stack port resolution — single source of truth - Project
portsentries are intentionally not shifted byportOffset
Changed
-
portssemantics corrected — BREAKING for anysuperposition.ymlthat usesportsonstack: compose- Plain stack:
valuemay be a bare container port expression (no colon) or aHOST:CONTAINERbinding (e.g."9001:8080"). When host ≠ container port, the tool adds-p HOST:CONTAINERtodevcontainer.json runArgs.${VAR}references are resolved at generation time. - Compose stack:
valueis now written verbatim todocker-compose.yml;${VAR}references are no longer expanded by the tool.portsAttributeskey is now the extracted container port, not the host port. - Migration for compose stacks: existing
"8080:8080"entries work as before. Bare port expressions on compose stacks (no colon) now throw an error — add the host side:"8080"→"8080:8080".
- Plain stack:
-
PR prerelease publishing — draft PRs publish npm prereleases only when labeled
publish-prerelease; ready-for-review PRs continue publishing automatically.
Fixed
fusekioverlay — addedhostname: fusekito the Docker Compose service to fix a startup failure where Fuseki could not resolve its own hostname
Version 0.1.11
[0.1.11] - 2026-05-27
Added
-
pioverlay — adds the Pi minimal terminal coding agent (@earendil-works/pi-coding-agent) with multi-provider LLM support (Anthropic, OpenAI, Gemini, DeepSeek, and more) -
JSON Schema for
superposition.yml— machine-readable schema enables editor auto-complete and inline validation when authoring project files- Schema is generated automatically from the overlay registry and TypeScript types via
npm run schema:generate - Generated
superposition.ymlfiles now include a$schemaline pointing to the stable URL:https://raw.githubusercontent.com/veggerby/container-superposition/main/tool/schema/superposition.schema.json - Schema file (
tool/schema/superposition.schema.json) is committed to the repository, kept in sync by CI, and uploaded as a release asset with each GitHub release - Keeping the schema up to date is part of the Definition of Done: run
npm run schema:generateafter adding overlays or changingProjectConfigSelectiontypes
- Schema is generated automatically from the overlay registry and TypeScript types via
Fixed
- Generated README reproducibility — consolidated generated
README.mdfiles no longer embed the current date in their header, so repeatedcs regenruns remain deterministic andcs doctordoes not report false-positive drift from a day rollover alone
Version 0.1.10
[0.1.10] - 2026-05-05
Added
taskoverlay — Adds Taskfile CLI (task) for declarative project automation- Installs architecture-specific Task binary (amd64/arm64) from official releases in
setup.sh - Includes
verify.shsmoke check wired topostStartCommand - Suggests
modern-cli-toolsandkubectl-helmfor broader developer workflows
- Installs architecture-specific Task binary (amd64/arm64) from official releases in
mountsfield insuperposition.yml— First-class filesystem mount support with structured entries and raw-string fallback; stack-agnostic by design so the same config works unchanged when swapping betweenplainandcompose- Structured form supports
source,destination, optionaltype,cached,consistency,readOnly, andtarget - Named map syntax is supported (e.g.
mounts: { codex: { source: ..., destination: ... } }) in addition to list syntax - Raw-string and
{ value: "..." }forms remain available as an escape hatch for advanced mount specs;valueandsource/destinationcannot be combined in the same entry target: auto(default) andtarget: devcontainerMountalways route todevcontainer.json mounts[]regardless of stacktarget: composeVolumeis an explicit opt-in to route todocker-compose.yml services.devcontainer.volumes[](compose only; error on plain)- Applied before
customizations.devcontainerPatch/customizations.dockerComposePatchso patch overrides remain respected
- Structured form supports
superposition.ymlauthoring guide (docs/superposition-yml.md) — comprehensive reference covering every field, routing tables, and a complete annotated example;README.mdupdated to reference itansibleoverlay — Adds Ansible automation tooling (ansible,ansible-playbook,ansible-galaxy) withansible-lint, plus the VS Code Red Hat Ansible extension (redhat.ansible)- Installs via the shared
cross-distro-packagesfeature with distro fallback package names - Suggests
aws-cli,azure-cli,gcloud, andterraformfor end-to-end infrastructure automation workflows
- Installs via the shared
argocdoverlay — Adds Argo CD CLI for GitOps application workflows- Installs architecture-specific
argocdbinary from official Argo CD releases insetup.sh - Includes
verify.shsmoke check wired topostStartCommand - Suggests
kubectl-helm,k3d, andkindfor Kubernetes/GitOps development workflows
- Installs architecture-specific
shellfield insuperposition.yml— First-class shell profile customizations for aliases and snippets- Supports
shell.aliasesandshell.snippets - Generates
.devcontainer/custom/shell-init.sh - Adds an idempotent postCreate hook that manages a marked source block in
~/.bashrcand~/.zshrc envremains the canonical place for environment variables/exports
- Supports
Version 0.1.9
[0.1.9] - 2026-04-29
Added
doctoroverlay dependency checks —cs doctornow validates that all overlayrequires:dependencies are present in the project file, flags unknown overlay IDs (typos, removed overlays), and surfacessuggests:entries as informational warnings;doctor --fixauto-adds missing required overlays and regeneratesdoctorport cross-validation —cs doctorcross-checksdevcontainer.jsonforwardPortsagainst the ports actually exposed by Docker Compose services; reportsfailfor forwarded ports with no backing service andwarnfor compose-bound ports absent fromforwardPorts; not auto-fixable (requires overlay-level changes)doctor.env.exampledrift detection —cs doctordetects when.env.exampleis stale:failfor parameters declared by selected overlays that are missing from the file;warnfor keys in the file not declared by any overlay;doctor --fixregenerates.env.examplevia a fullcs regendoctorreproducibility check —cs doctordry-composes the devcontainer to a temp directory and compares it file-by-file against the current output; reportsfailwhen a generated file is missing or has drifted from whatcs regenwould produce;doctor --fixregenerates the affected filesdoctor --fix --dry-run— New flag combination that previews whatdoctor --fixwould change without writing any files; prints a numbered plan of each auto-fixable action with itsremediationKey,safetyClass, andplannedChanges; exits with code1when any findings exist (auto-fixable or manual) so CI can detect "fix needed" without applying changes;--dry-runwithout--fixis an error;--format jsonis supported and addsdryRun: trueandplannedActionsto the outputdoctorparameter checks —cs doctornow validates overlay parameter configuration against the project file and generated output. Five new checks in a dedicated "Parameters" section:- Unresolved
{{cs.*}}tokens — scansdevcontainer.json,docker-compose.yml, and.env.examplefor substitution tokens that were never replaced; reported as a failure - Sensitive parameters in plain text — detects
sensitive: trueparameters whose values appear as literal strings indevcontainer.jsonremoteEnvinstead of being referenced via${VAR:-default}; reported as a warning - Missing
.env.example— warns when a compose-stack project has parameterised overlays but no.env.examplewas generated - Unknown parameter keys — warns when the project file's
parameters:section contains keys not declared by any selected overlay (stale entries from removed overlays) - Missing required parameters — fails when an overlay declares a required parameter (no default value) that is absent from the project file
parameters:section doctor --fixresolves the automatic checks by adding missing parameters with their overlay defaults to the project file then re-runningcs regen
- Unresolved
local-llmpreset — New preset for local LLM inference: always selectsollama+ollama-cli+open-webui; optionalgpuparameter addscudaorrocmoverlay; pre-setsOLLAMA_HOSTenvironment variablefull-observabilitypreset — New preset that bolts a complete monitoring stack onto any project:prometheus,grafana,loki,otel-collector,alertmanager,promtailalways included;tracingparameter selects Jaeger, Tempo, both, or none; pre-sets all OTel SDK environment variablesvector-aipreset — New preset for RAG pipeline development:qdrant+ollama+ollama-cli+pythonalways included; optionalgpuandchat_ui(Open WebUI) parameters; pre-setsQDRANT_URL,OLLAMA_HOST, andEMBEDDING_MODELk8s-devpreset — New preset for local Kubernetes development:kubectl-helm+docker-in-docker+modern-cli-toolsalways included;clusterparameter selects k3d (default) or kind;devloopparameter selects Tilt (default), Skaffold, or none.shared/vscode/markdown-extensions.json— New shared VS Code fragment containingyzhang.markdown-all-in-oneandDavidAnson.vscode-markdownlint; imported bymkdocs,mkdocs2, andpandocoverlays, removing duplicated extension entries from their patchesfusekioverlay — New overlay for Apache Fuseki (Apache Jena SPARQL server); runsstain/jena-fusekiwith a TDB2-backed persistent dataset, exposes port 3030 for the SPARQL endpoint and admin UI, and injectsFUSEKI_HOST,FUSEKI_PORT,FUSEKI_DATASET,FUSEKI_URL, andFUSEKI_ADMIN_PASSWORDinto the devcontainer environmentparameters:sections on infrastructure overlays —mysql,mongodb,redis,rabbitmq,nats,minio,sqlserver, andlocalstacknow declare all configurable values (version, port(s), credentials) as first-class parameters visible to the questionnaire and documentation system; password fields are markedsensitive: trueserviceOrderfield inoverlay.yml— Service startup ordering is now declared asserviceOrder: <number>inoverlay.ymlrather than the non-standard_serviceOrderfield indevcontainer.patch.json, eliminating VS Code JSON schema validation warnings;mergeRunServices()reads the value from the overlay manifest; convention is 0 = infrastructure, 1 = observability backends, 2 = middleware, 3 = UI tier, 4 = demo appsmessagingoverlay category —rabbitmq,nats, andredpandaare now categorised asmessaginginstead ofdatabase; the interactive questionnaire shows a dedicated "Messaging" section; aMessagingOverlaytype alias is exported fromtool/schema/types.ts.shared/vscode/js-ts-settings.json— New shared VS Code settings fragment providing Prettier/ESLint extensions andformatOnSavefor TypeScript and JavaScript; imported bynodejsandbunoverlays, removing duplicated configuration from their patches
Fixed
cross-distro-packagesfeature deleted on regen — WhencleanupStaleDirFileswas introduced to remove stale scripts within registered directories, it also recursed into thefeatures/directory and deletedcross-distro-packages/devcontainer-feature.jsonandinstall.shbecause those files were never added to the file registry. The composer now registers every file in the copied feature directory, sodevcontainer buildcan locate the local feature.- Stale
scripts/files not removed on regen — When an overlay with asetup.shorverify.shwas removed from a project andcs regenwas run, any scripts that belonged only to the removed overlay (e.g.scripts/setup-rabbitmq.sh) were left behind on disk if at least one other overlay still contributed scripts. The cleanup pass now recurses into registered subdirectories and removes individual stale files within them, not just entire unregistered directories. Additionally,scripts/is no longer created eagerly before determining whether any overlay in the current run requires it. messagingoverlays rejected by project file validator on regen — Afterrabbitmq,nats, andredpandawere moved to themessagingcategory, any project file using the legacydatabase:list field to declare them caused aProjectConfigErrorthat silently abortedcs regenbefore any files were written — leaving the previousdocker-compose.ymlintact. Thedatabasepredicate inbuildCategoryLookupnow accepts bothdatabaseandmessagingcategory overlays so existing project files continue to work without migration.- Port conflict declarations — Added bidirectional
conflicts:entries for all overlays sharing host ports, preventing silent Docker bind failures at startup:- Port 3000:
grafana,open-webui,nodejs,bun,rust - Port 8080:
mysql,redpanda,otel-demo-nodejs,nodejs,bun,go,java,dotnet - Port 8081:
mongodb,redpanda,otel-demo-python,go,java
- Port 3000:
grafanaandotel-collectordepends_on— Removed hardcodeddepends_onentries for services declared assuggests(optional);grafananow only depends onprometheus(its solerequires);otel-collector'sdepends_onblock removed entirelyminio/localstackconflict — Added bidirectional conflict betweenminioandlocalstack(both provide S3-compatible storage and inject conflictingAWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY);minioenv var unified fromAWS_REGIONtoAWS_DEFAULT_REGION- Redundant feature installs —
pre-commitno longer re-installs the Python devcontainer feature (already provided byrequires: [python]);commitlintno longer re-installs Node (already provided byrequires: [nodejs]);playwrightnow declaresrequires: [nodejs]and no longer installs Node independently - Observability
restart: unless-stopped— Added restart policy to all 8 observability compose services (prometheus,grafana,loki,tempo,jaeger,alertmanager,promtail,otel-collector) - Observability healthchecks — Added HTTP healthchecks to all 8 observability services;
grafana's healthcheck uses/api/health,prometheusandalertmanageruse/-/ready, others use/readyor the collector's/health endpoint redishealthcheck — Addedredis-cli pinghealthcheck matching the pattern in.shared/compose/common-healthchecks.mdmysqlandmongodbhealthcheckstart_period— Addedstart_period: 30stomysqlandstart_period: 20stomongodbto prevent spurious failures during slow storage-engine initialisationqdrantversion pinning — DefaultQDRANT_VERSIONchanged fromlatesttov1.9.0for reproducible buildsmkdocscategory — Changed fromlanguagetodev, matchingmkdocs2and reflecting that documentation generators are dev tools, not language runtimescomfyuiGPU devcontainer support — A...
Version 0.1.8
[0.1.8] - 2026-04-11
Added
-
open-webuioverlay — Browser-based chat UI for Ollama and OpenAI-compatible LLM backends, running as a Docker Compose sidecar- Serves the Open WebUI at port
3000(mapped from container port8080); auto-forwarded and opened in the browser - Pre-configured
OLLAMA_BASE_URL=http://ollama:11434so it connects automatically when theollamaoverlay is also selected - Persistent
open-webui-datavolume preserves conversation history and settings across container rebuilds - Supports any OpenAI-compatible backend via
OLLAMA_BASE_URL; not limited to Ollama - Suggests the
ollamaoverlay as its natural LLM backend
- Serves the Open WebUI at port
-
qdrantoverlay — High-performance vector database for similarity search and embeddings, running as a Docker Compose service- REST API on port
6333, gRPC on port6334; both ports forwarded from the devcontainer QDRANT_HOST,QDRANT_PORT, andQDRANT_URLpre-set in the container environment for zero-config SDK usage- Persistent
qdrant-datavolume and health check via/readyzendpoint - Suggests
ollama,python, andnodejsoverlays for embedding-generation workflows
- REST API on port
-
pgvectoroverlay — PostgreSQL 16 with the pgvector extension pre-installed, running as a Docker Compose service- Uses the official
pgvector/pgvector:pg16image;CREATE EXTENSION vector;works immediately with no manual setup postgresql-clientinstalled in the devcontainer;PGHOST,PGPORT,PGDATABASE, andPGUSERpre-set for seamlesspsqlusage- Conflicts with the
postgresoverlay (both provide a PostgreSQL service on port 5432 — choose one) - Fully parameterised:
PGVECTOR_DB,PGVECTOR_USER,PGVECTOR_PASSWORD,PGVECTOR_PORT,PGVECTOR_VERSIONconfigurable viasuperposition.ymlor--param - Suggests
ollama,python, andnodejsoverlays for RAG and embedding workflows
- Uses the official
-
k3doverlay — Lightweight local Kubernetes clusters running k3s in Docker, with faster startup and lower resource usage thankind- Installs the
k3dbinary viasetup.sh; supports amd64 and arm64 - Requires
docker-in-docker(auto-resolved dependency) to launch k3s nodes as Docker containers - Conflicts with
kind(both provision local Kubernetes clusters — choose one) - Suggests
kubectl-helmfor interacting with clusters viakubectland Helm - README includes a
k3dvskindcomparison table
- Installs the
-
skaffoldoverlay — Continuous build-test-deploy pipeline for Kubernetes applications- Installs the
skaffoldbinary viasetup.sh; supports amd64 and arm64 - Supports multiple builders (Docker, Buildpacks, Jib) and deployers (kubectl, Helm, Kustomize) via declarative
skaffold.yaml - Conflicts with
tilt(both serve the Kubernetes inner-loop development role — choose one) - Suggests
kubectl-helm,kind, andk3doverlays for a complete local Kubernetes workflow - README includes a
skaffoldvstiltcomparison table
- Installs the
-
Overlay parameters with safe
{{cs.KEY}}substitution — Overlays can now declare configurable parameters that are resolved at generation time without colliding with Docker Compose${VAR}, shell$VAR, VS Code${localWorkspaceFolder}, or GitHub Actions${{ }}syntax- Overlays declare parameters in
overlay.ymlunder aparameters:map, each with adescription, optionaldefault, and optionalsensitive: trueflag - Users supply values in
superposition.ymlunder a top-levelparameters:section, or via--param KEY=valueon the CLI (repeatable) - Resolution order: CLI overrides → project file → overlay defaults
- Missing required parameters (no default, no supplied value) → hard error before generation
- Unresolved
{{cs.*}}tokens in final output → hard error (catch-all safety net) - Unknown parameters supplied in
superposition.yml→ warning only (generation continues) - Docker Compose
${VAR:-default}, shell, VS Code, and GitHub Actions variable expressions pass through completely untouched - The
{{cs.*}}syntax can be nested inside Docker Compose defaults:${POSTGRES_PORT:-{{cs.POSTGRES_PORT}}}—csresolves the inner token at generation time, Docker resolves the outer at runtime - Interactive questionnaire prompts for each declared parameter (sensitive parameters use masked input)
postgresoverlay converted to use parameters as proof-of-concept:POSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_PORT,POSTGRES_VERSIONare now fully configurable without forking the overlay- Spec committed under
docs/specs/011-overlay-parameters/spec.md
- Overlays declare parameters in
-
First-class project
envinsuperposition.yml— Container environment variables can now be declared once in the project file and routed automatically by stackstack: plainwrites projectenventries todevcontainer.json -> remoteEnvstack: composematerializes projectenventries into.devcontainer/.env, writesdocker-compose.yml -> services.devcontainer.environmentas${KEY}, and exposes the same values to the devcontainer viadevcontainer.json -> remoteEnv.KEY = ${containerEnv:KEY}- Supports string shorthand (
FOO: bar) and object form with explicit target override (target: auto | remoteEnv | composeEnv) - Compose values that reference
${NAME}or${NAME:-default}resolve from the repository root.envwhen available before being written to.devcontainer/.env customizations.envTemplateis now the canonical project-file field for variables written to.env.example;customizations.environmentremains as a deprecated read-compatible alias, but newly written project files normalize toenvTemplate
-
JetBrains IDE support (
--editor jetbrains) — Generates JetBrains project artifacts alongside the devcontainer configuration- Adds
customizations.jetbrains.backendtodevcontainer.json, selecting the IDE automatically from the primary language overlay (WebStorm for Node.js/Bun, PyCharm for Python, GoLand for Go, Rider for .NET, RustRover for Rust, IntelliJIdea for Java or generic) - Generates
.idea/.gitignoreat the project root, marking shared settings as VCS-tracked and excluding user-local entries - Generates language-specific run configuration XML files under
.idea/runConfigurations/(npm_dev.xmlfornpm run dev/ Node.js,bun_dev.xmlfor Bun,mkdocs_serve.xmlformkdocs serve,python_main.xmlforpython main.py,go_run.xmlforgo run ./...,dotnet_run.xmlfordotnet run,java_run.xmlfor a Java Application,rust_run.xmlforcargo run) - Existing
.idea/files are never overwritten — only missing files are written, preserving any user customisations - Falls back to a minimal
.idea/scaffold withIntelliJIdeabackend when no language overlay is selected - Editor profile question added to the interactive questionnaire (
? Editor profile: VS Code / JetBrains / None) editorfield persisted tosuperposition.jsonmanifest for reproducible regen
- Adds
-
cscommand alias —npm install -g container-superpositionnow registers bothcontainer-superpositionand the shortercscommand; all existingcs <subcommand>usage in docs and examples works without a separate install -
ollamaoverlay — Local LLM inference server via Ollama, running as a Docker Compose sidecar- Serves the Ollama REST API on port
11434; OpenAI-compatible endpoint available at/v1/ - Ollama CLI installed in devcontainer —
setup.shnow prefers copying/usr/bin/ollamafrom the localollama/ollamasidecar image, avoiding a second multi-gigabyte download during setup; when Docker is unavailable it falls back to the current official Linux release archives (prefers.tar.zst, falls back to legacy.tgz, and installszstdwhen required) instead of viaollama.com/install.sh OLLAMA_HOSTpre-configured — Set as acontainerEnvvariable tohttp://ollama:11434soollama pull / run / list / rmtarget the sidecar automatically with no manual setup- GPU passthrough built-in — Both the
ollamasidecar and thedevcontainerservice receive all NVIDIA GPUs viadeploy.resources.reservations.devices; enables GPU-accelerated tooling (torch,tensorflow, CUDA CLIs) directly in the dev environment - Mounts the host's
~/.ollamadirectory by default so models pulled on the host are immediately available — no re-download on rebuild; models pulled inside the devcontainer are also persisted to the host OLLAMA_MODELS_PATHenv var overrides the host model path (useful for external drives or Windows users)verify.shchecks CLI is installed,OLLAMA_HOSTis set, smoke-tests the REST API, and lists available models via the CLI- Suggests
codex,claude-code, andampoverlays for AI-assisted workflows - README documents the Ollama CLI UX, GPU prerequisites (NVIDIA Container Toolkit), and links to the
cudaoverlay
- Serves the Ollama REST API on port
-
Target-aware generation —
--targetnow produces workspace artifacts and setup guidance tailored to the selected deployment environment, not just compatibility warnings--target codespaces→ extendsdevcontainer.jsonwithhostRequirements(machine-size recommendation based on service count) and writesCODESPACES.mdwith Codespaces-specific setup guidance--target gitpod→ generates.gitpod.ymlat the project root (with tasks and port exposures from selected overlays) and writesGITPOD.mdwith Gitpod badge and usage notes--target devpod→ generatesdevpod.yamlat the project root (referencing the devcontainer) and writesDEVPOD.mdwithdevpod upinstructions--target local(explicit or default) → no change to existing behavior; no extra files writt...
Version 0.1.7
[0.1.7] - 2026-03-23
Added
-
Shared overlay imports — Overlays can now declare
imports:in theiroverlay.ymlto reuse fragments fromoverlays/.shared/, reducing copy-paste duplication across the overlay catalogue- Supported types:
.jsonand.yaml/.ymlfragments are deep-merged into the devcontainer patch;.envfragments are appended to.env.examplewith a# from .shared/…comment - Imports are applied in declaration order, followed by the overlay's own
devcontainer.patch.json; the overlay's own patch always wins on key conflict - Path traversal prevention: any import path that does not begin with
.shared/or resolves outsideoverlays/.shared/is rejected before generation starts - Missing files, unsupported types, and traversal attempts all fail with an error that names the overlay and the bad reference
explain <overlay>now shows the overlay'simportslist under a Shared Imports sectiondoctorvalidates import paths (existence, type, and path traversal) for every overlay
- Supported types:
-
otel-collector,prometheus, andjaegeroverlays converted — These three overlays now import.shared/otel/instrumentation.env, so their generated.env.exampleincludes the OTEL SDK environment variables without duplication -
overlays/.shared/vscode/recommended-extensions.jsonreformatted — Now a valid devcontainer patch (customizations.vscode.extensionsarray) that can be merged directly when imported -
doctor --fix— Interactive repair flow for common environment problems- Can fix stale manifests, missing devcontainer regeneration, Node.js version mismatches, and Docker daemon issues
- Re-runs checks after remediation and reports a structured outcome summary; use
--fix --jsonfor machine-readable output
-
Shared setup utilities — A generated
scripts/setup-utils.shis now included automatically when any overlay provides asetup.sh- Centralises apt locking, architecture detection, binary installation helpers, npm environment setup, and quieter script output
- Eliminates apt-lock races between parallel
postCreateCommandscripts and reduces boilerplate across overlay setup scripts
-
alloverlay — Meta-overlay that expands to all non-preset overlays; useful for integration testing; hidden from the interactive questionnaire -
cudaoverlay — NVIDIA CUDA GPU passthrough for containerized ML/inference workloads- Injects
"runArgs": ["--gpus=all"]and"hostRequirements": {"gpu": true}into devcontainer.json setup.shprobesnvidia-smion container start and prints step-by-step remediation guidance when GPU access is unavailableverify.shassertsnvidia-smiexits 0 fordoctorchecks- Conflicts with
rocm(the companion AMD GPU overlay)
- Injects
-
rocmoverlay — AMD ROCm GPU passthrough for containerized ML/inference workloads- Injects
--device=/dev/kfd,--device=/dev/dri,--group-add=video, and--group-add=renderintorunArgs setup.shprobesrocm-smi/rocminfoon container start and prints actionable host-setup guidance when GPU access is unavailableverify.shassertsrocm-smiexits 0 fordoctorchecks- Conflicts with
cuda(bidirectional); treated as a separate supported profile, not a CUDA drop-in replacement
- Injects
-
devcontainer-clioverlay — Installs@devcontainers/cliglobally for building and managing devcontainers from the terminal -
Port conflict auto-resolution —
initandregennow detect host-port collisions across selected overlays and remap conflicting ports automatically, with a before/after warning in the output
Changed
- Flat
overlaysfield in project config — Project files now use a singleoverlaysarray instead of per-category keys (language,database,devTools, etc.); old category keys are still accepted for backward compatibility doctorcommand —--from-manifest,--from-project, and--project-rootflags added, bringingdoctorinto parity withinitandregenfor project-file and manifest selectiondirenvoverlay — Package installation moved tocross-distro-packagesdevcontainer feature (runs at image-build time);setup.shnow handles only shell hook configurationmodern-cli-toolsoverlay — Core packages (jq,ripgrep,fd-find,bat) moved tocross-distro-packages;setup.shnow only installsyqand creates platform symlinks (fdfind→fd,batcat→bat)git-lfsfeature —autoPullset tofalsein thegit-helpersoverlay; prevents container creation failures in repos with no LFS remote configured
Fixed
${containerEnv:HOME}in mount targets — Replaced with absolute path/home/vscode/.codex; Docker cannot resolve container env vars at mount timepandocoverlay — Added missinglmodernpackage required by the default LaTeX template on Trixie;emoji-fallback.luafilter extended to cover BMP symbol blocks (Dingbats U+2700–U+27BF, Miscellaneous Symbols U+2600–U+26FF) — ✅ ⚠ ❌ and similar characters are now routed to\textfallback{}(Noto Sans Symbols 2) so they render as proper glyphs instead of generating XeLaTeX[WARNING] Missing charactermessagestiltoverlay — Replaced pipe-to-bash installer with direct binary download; fixessudo mv: No such file or directoryon some systemsminiooverlay — Fixed hardcodedamd64-only download URL; now correctly selects theaarch64binaryjustoverlay — Removed hardcoded SHA256 checksums that were incorrect foraarch64mongodboverlay — Replaced standard-repo feature (package not in default repos) with asetup.shthat adds the official MongoDB apt repositorygcloudoverlay — Replaced deprecatedapt-key-based feature with asetup.shusinggpg --dearmornatsoverlay — Fixedlatest-alpinetag not existing on Docker Hub; default version is now2windsurf-clioverlay — Replaced non-existent npm package with binary download from GitHub releases; verify script now exits gracefully on unsupported platforms (arm64)powershelloverlay — Fixed hang on interactive NuGet provider prompt;Install-PackageProvideris now skipped on PowerShell 7+ where the provider is built-inplaywrightoverlay — Browser install moved to asetup.shthat holds the shared apt lock, preventingE: Could not get lockraces with other parallel setup scripts; noisy apt and download progress output suppressedkeycloakoverlay — Health-check URL corrected to port9000(management port) instead of8180; verify timeout increased to cover the full container startup window;depends_onnow waits for postgres to be healthy (condition: service_healthy) so Keycloak no longer starts before its database is readypostgresoverlay — Addedpg_isreadyhealthcheck to the service definition so dependent overlays (e.g. Keycloak) can usecondition: service_healthysqlserveroverlay — Verify script replaceddocker exec(which requires Docker socket access) with a two-path strategy:docker execvia the container's ancestor image when available, TCP port check (/dev/tcp) as an automatic fallback when the Docker socket is not mountedredpandaoverlay — Fixed YAML indentation in the Console config that caused the schema-registry URL to be silently ignoredpre-commitoverlay — Installation now preferspipxto avoid conflicts with active virtualenvsdirenvoverlay —direnv allownow also runs on container rebuilds when.envrcalready exists, fixing the "blocked" error on subsequent opensbunoverlay — PATH entry persisted to shell profiles; verify script falls back to~/.bun/bin/bunwhen the binary is not yet on PATH in a non-interactive shellalertmanager/otel-collectoroverlays — Fixed workspace-root detection; scripts now locate.devcontainer/relative to their own path, eliminating failures whenLOCAL_WORKSPACE_FOLDERis a host-only pathalertmanager,promtail,tempo,otel-demo-nodejs,otel-demo-pythonoverlays — Verify scripts now use the service's HTTP health endpoint as the primary readiness check instead ofdocker ps; eliminates false failures when the Docker socket is not accessible from inside the devcontainermysqloverlay — Verify script timeout increased to 90 seconds to match the container healthcheck window- Duplicate
postCreateCommandentries —duckdb,kind,openapi-tools,tilt, andplaywrightoverlay patches were causing setup scripts to run twice; redundant entries removed - Parallel apt contention — Setup scripts now coordinate through the shared apt lock, eliminating
E: Could not get lockfailures during parallelpostCreateCommandexecution - Escape sequences in apt output —
DEBIAN_FRONTEND=noninteractiveandTERM=dumbare now passed explicitly onsudo apt-getinvocations; prevents cursor-probe escape sequences appearing in devcontainer build logs
Version 0.1.6
[0.1.6] - 2026-03-16
Added
pandocoverlay — Complete Markdown → PDF pipeline with Pandoc, XeLaTeX, and optional Mermaid diagram rendering- Installs Pandoc 3.x from the official GitHub release (not the outdated apt version)
- TeX Live / XeLaTeX with Carlito, JetBrains Mono, and Noto Sans Symbols 2 fonts for clean Unicode output
diagram.luaLua filter from pandoc-ext/diagram for fencedmermaidcode block rendering- Mermaid CLI (
mmdc) installed automatically when thenodejsoverlay is present; skipped gracefully otherwise - System Chromium wired to Puppeteer with
--no-sandboxfor headless Mermaid rendering inside containers - Ready-to-use
~/.pandoc/pandoc.yamldefaults file with XeLaTeX engine, font, and table settings
- Adopt project-file output —
adopt --project-filenow writes a repository-root project config alongside the manifest- Reuses an existing
.superposition.ymlorsuperposition.ymlwhen present to avoid dual-file ambiguity - Carries inferred output path, container name, overlay selections, and supported customizations into the generated project file
- Reuses an existing
- Project-root selection for persisted input —
initandregennow accept--project-root <path>- Lets you load a repository project file or discover a manifest from another directory without changing shells first
- Relative output paths from the selected project file continue to resolve from that repository root
minimal-trixieexample — Lightweight project-file-driven example using Debian Trixie with Codex and a~/.codexhost mountkitchen-sinkexample — Comprehensive reference example exercising everysuperposition.ymlfield: preset with parameter choices, additional overlays, port offset, deployment target, editor profile, and the full customizations block (patches, environment, scripts, files)
Fixed
cross-distro-packagesfeature — Package declarations can now use fallback names likepkgA|pkgB- Allows overlays such as
pandocto handle Debian-vs-Ubuntu package-name differences without embedding apt-specific detection logic in setup scripts
- Allows overlays such as
Version 0.1.5
[0.1.5] - 2026-03-11
Added
- Project config generation — Standard
initcan now read a repository-root.superposition.ymlorsuperposition.yml- Lets teams and CI run generation from committed declarative defaults instead of reconstructing long CLI commands
regennow supports--from-project, uses the repository project file by default when present, and consistently behaves as deterministic replay across project-file and manifest-based persisted sourcesinitremains the editable flow, so persisted sources can still prefill the questionnaire when you want to modify a generated setup instead of replaying it exactly- Direct CLI flags still override the project config for one run, while explicit
--from-manifestregeneration remains isolated - Conflicting persisted-input source combinations such as
--from-project --from-manifestor source mode plus structural selection flags now fail before generation with a clear source-conflict error - Supports parity for the existing clean-generation surface, including custom images, container naming, minimal/editor settings, environment variables, and additional generated features declared through custom patches
- Verbose plan narration —
plan --verbosenow explains why each overlay was included- Shows direct selections, required dependencies, and dependency paths in the terminal output
- Supports
plan --from-manifest <path> --verboseso existing manifests get the same explanation model as explicit overlay lists - Adds structured inclusion reasons to
plan --json --verbosewithout changing the default JSON shape - Calls out skipped overlays and conflict boundaries so dependency resolution is easier to audit
spec-kitoverlay — Spec-Driven Development with thespecifyCLI and any supported AI coding agent- Installs
uv(Astral's fast Python package manager) andspecify-clifrom github/spec-kit - Supports 20+ AI agents: Codex, Claude Code, Gemini CLI, GitHub Copilot, Cursor, Windsurf, Amp, opencode, and more
- Usage:
specify init . --here --ai <agent>after overlay setup
- Installs
claude-codeoverlay — Anthropic Claude Code CLI (@anthropic-ai/claude-code) for AI-powered terminal developmentgemini-clioverlay — Google Gemini CLI (@google/gemini-cli) for AI-powered terminal developmentampoverlay — Sourcegraph Amp CLI (@sourcegraph/amp) for AI-powered terminal developmentwindsurf-clioverlay — Codeium Windsurf CLI for AI-powered terminal developmentopencodeoverlay — opencode AI coding agent (opencode-ai) for multi-provider terminal developmentsddpreset — Spec-Driven Development meta-preset bundlingspec-kitwith a user-selectable AI agent CLI- Prompts users to choose from: Codex, Claude Code, Gemini CLI, Amp, Windsurf, opencode, or GitHub Copilot (IDE-integrated)
- Sets
SPECIFY_AI_AGENTenvironment variable automatically to match the chosen agent
hashcommand — Deterministic environment fingerprint for drift detection and reproducibility- Produces a stable SHA-256 fingerprint from stack, resolved overlays, preset, base image, and tool version
- Auto-resolves overlay dependencies (same logic as
plan) so the hash includes transitively required overlays - Works standalone (
--stack/--overlaysflags) or reads directly from an existingsuperposition.jsonmanifest --jsonflag emits machine-readable JSON with both a short 8-characterhash(for display/badges) and the full 64-characterhashFull(for CI comparison)--writeflag writes the full hash to.devcontainer/superposition.hashalongside the manifest- Hash is version-stable across patch releases (uses
major.minorof the tool version only) - Full documentation at
docs/hash.md
adoptcommand — Adopt an existing.devcontainer/into the overlay-based model- Reads
devcontainer.jsonand any linkeddocker-compose.ymlfiles and analyses their contents - Resolves the
dockerComposeFilefield (string or array, relative paths) to support Docker Compose-based devcontainers where the compose file lives outside the.devcontainer/directory - Maps detected devcontainer features, Docker Compose service images, VS Code extensions, and
remoteEnvvariables to equivalent overlay IDs - Detection tables are built dynamically from the overlay registry — no hardcoded overlay names, every overlay is automatically supported
- Best-match scoring ensures a feature used by multiple overlays (e.g. the Node.js feature shared by
nodejsandbun) is assigned to the most appropriate one - Displays a table showing each detected signal → suggested overlay with a confidence level (
exactorheuristic) - Prints the equivalent
container-superposition initcommand to reproduce the configuration, using correct CLI flags per overlay category (--language,--database,--observability,--cloud-tools,--dev-tools) - Unmatched items (features, services, extensions not covered by any overlay) are surfaced separately; a
custom/devcontainer.patch.json/custom/docker-compose.patch.ymlis written to preserve them across regenerations - Backup support using the same auto-detect logic as
regen— skipped in git repos by default; use--backup/--no-backup/--backup-dirto override --dry-runflag prints the analysis without writing any files- Prompts to generate
superposition.json(and optionallycustom/patch files) from the suggestions --forceflag allows overwriting existing generated files--jsonflag for machine-readable output (suitable for scripting)- Gracefully handles configs with no recognisable overlay patterns
- Full documentation at
docs/adopt.md
- Reads
Version 0.1.4
[0.1.4] - 2026-02-26
Added
-
Keycloak overlay — Open-source identity and access management for local OAuth2/OIDC development
- Runs as a Docker Compose service on port 8180 (avoids collision with common app servers)
- Automatically requires and integrates with the
postgresoverlay as its database backend - Exposes OIDC discovery at
/realms/master/.well-known/openid-configuration KEYCLOAK_HOST,KEYCLOAK_PORT, andKEYCLOAK_ISSUERwired into the dev container viaremoteEnv
-
Mailpit overlay — Email testing tool that captures all outbound email locally
- SMTP server on port 1025 (no authentication required in dev mode)
- Web UI on port 8025 for browsing captured emails
- REST API at
/api/v1/messagesfor automated test assertions SMTP_HOST,SMTP_PORT, andMAILPIT_URLwired into the dev container viaremoteEnv
-
gRPC Tools overlay — Protocol Buffers and gRPC development toolchain
- Installs
protoc(via system packages),bufCLI, andgrpcurl(from official GitHub releases, multi-arch) - VS Code extensions:
vscode-proto3andvscode-buf - Works with all base stacks (plain and compose)
- Installs
-
Cloudflared overlay — Cloudflare Tunnel for securely exposing local services to the internet
- Anonymous tunnels work immediately with no account required
- Named tunnels support persistent URLs with a Cloudflare account
- Conflicts with
ngrokoverlay (bidirectional — both overlays declare the conflict) - Pinned to a specific release version for reproducibility
-
Service reference exports — Two convenience files are now auto-generated during
initandregenfor projects that include service overlaysservices.md— Consolidated service reference with connection info, connection strings (URIs), code examples (Node.js, Python) for common services, common CLI commands, port offset documentation, and a troubleshooting sectionenv.local.example— Optional-overrides template derived from each overlay's.env.example, with all values commented out and grouped by service — copy to.envand uncomment only what you need to customize- Both files are tracked in the file registry and cleaned up on regeneration alongside other generated files
-
Git-aware backup defaults — Backups are now skipped automatically when the target directory is inside a git repository (git already tracks history), and created by default when it is not
--backupflag forces a backup even inside a git repo--no-backupflag suppresses a backup even outside a git repo- Auto-detection uses
git rev-parse --git-dir; falls back to walking up the directory tree looking for a.gitfolder when thegitcommand is unavailable
-
Automatic
.gitignoremanagement — Generated projects now include tool-specific.gitignoreentries automatically; overlay-provided patterns are merged into your project root.gitignoreat generation time- Entries from each overlay are grouped under a labelled comment for easy identification
- Running generation again never duplicates patterns already in your
.gitignore - Overlay-provided ignore rules are always applied to the project root
.gitignore(never to files inside.devcontainer/), keeping generated configuration isolated from your application's source ignores
-
direnv overlay: secrets and env files are gitignored automatically —
.envrc.local,.env,.env.local, and.direnv/are now excluded from git immediately after generation — no need to start the container first -
Python overlay: workspace virtual environment (
.venv) — The Python overlay now sets up a.venvvirtual environment in your project root on container creation- VS Code automatically uses the workspace
.venvas the Python interpreter - All project dependencies are installed into the venv (
requirements.txt,requirements-dev.txt,pyproject.toml,setup.py) .venv/,__pycache__/,*.pyc, and other Python artifacts are added to.gitignoreautomatically
- VS Code automatically uses the workspace
-
Preset parameterization — Customize presets with high-level choices without micro-managing individual overlays
- New
parametersfield in preset definitions maps choices to sets of overlays web-apipreset now parameterized:database,cache,broker,observabilityslotsmicroservicepreset now parameterized:broker,observabilityslots- Interactive questionnaire asks for each parameter value with descriptions and defaults
--preset <id>CLI flag pre-selects a preset and skips the preset selection prompt--preset-param <key=value>CLI flag pre-fills parameter values (repeatable)- Pre-filled parameters skip their interactive prompt; unfilled ones are still asked
- Invalid parameter values produce helpful error messages listing valid options
explain <preset-id>now shows parameters, options, defaults, and usage examples- Example:
container-superposition init --preset web-api --preset-param broker=nats --preset-param observability=full
- New
-
plan --diff— Compare planned output vs existing.devcontainer/configuration before applying changes- Shows files to be created, modified, unchanged, and removed
- Generates colored unified diff for
devcontainer.json(loads base template + applies overlay patches) - Detects overlay changes (added/removed) by comparing with existing
superposition.jsonmanifest - Detects port changes (added/removed) derived from overlay comparison
- Lists preserved custom files in
custom/directory --output <path>to compare against a custom existing config path (default:./.devcontainer)--diff-format jsonfor machine-readable output (also via--json)--diff-context <lines>to control diff context lines (default: 3)- Example:
container-superposition plan --stack compose --overlays postgres,redis --diff