Summary
Migrate remo's host-side devcontainer tooling from the reference Node.js CLI (@devcontainers/cli) to deacon — our own Rust implementation of the DevContainer CLI.
Motivation
- Drops the Node.js/npm dependency on every provisioned host purely to run
devcontainer up/exec. deacon ships as a single static binary (curl-installed), removing the nodejs → npm -g @devcontainers/cli chain from the provisioning path.
- Faster, focused: deacon is "the DevContainer CLI, minus the parts you don't use" — we only use the developer-facing
up/exec surface, not feature authoring, which is exactly deacon's target.
- First-party: same org (
get2knowio), so we control the roadmap and can file parity gaps upstream.
Current usage inventory
Install (to be replaced):
ansible/roles/devcontainers/tasks/main.yml — npm install -g @devcontainers/cli
- Listed in npm-global package lists:
ansible/{aws,incus,hetzner,proxmox}_site.yml, ansible/{aws,incus,hetzner}_configure.yml
ansible/README.md (role table + dependency list)
Invocations (devcontainer up / devcontainer exec):
ansible/roles/user_setup/templates/project-launch.sh.j2:99,101
ansible/roles/user_setup/templates/devshell.sh.j2:87,92,95,96
ansible/roles/user_setup/tasks/main.yml:319,347 (devcontainer auto-start block, incl. $_rebuild_flag)
All invocations use the --workspace-folder form.
Scope / tasks
Open questions / parity to confirm
- Does deacon's
up/exec accept the same --workspace-folder semantics and exit codes the launch scripts rely on?
- Rebuild flag mapping for the config-hash-changed rebuild branch in
user_setup/tasks/main.yml.
- Version pinning + install method on hosts (curl
install.sh; deacon is currently pre-release v0.2.0 — may want --prerelease or a pinned release asset until GA).
Out of scope
- The
features/remo-notifier-source/ devcontainer Feature (deacon targets consumers, not feature authoring; this Feature is consumed by whatever CLI builds the container, not invoked by remo directly).
- Any change to
remo CLI command surface — this is host-provisioning internal.
Summary
Migrate remo's host-side devcontainer tooling from the reference Node.js CLI (
@devcontainers/cli) todeacon— our own Rust implementation of the DevContainer CLI.Motivation
devcontainer up/exec.deaconships as a single static binary (curl-installed), removing thenodejs→npm -g @devcontainers/clichain from the provisioning path.up/execsurface, not feature authoring, which is exactly deacon's target.get2knowio), so we control the roadmap and can file parity gaps upstream.Current usage inventory
Install (to be replaced):
ansible/roles/devcontainers/tasks/main.yml—npm install -g @devcontainers/cliansible/{aws,incus,hetzner,proxmox}_site.yml,ansible/{aws,incus,hetzner}_configure.ymlansible/README.md(role table + dependency list)Invocations (
devcontainer up/devcontainer exec):ansible/roles/user_setup/templates/project-launch.sh.j2:99,101ansible/roles/user_setup/templates/devshell.sh.j2:87,92,95,96ansible/roles/user_setup/tasks/main.yml:319,347(devcontainer auto-start block, incl.$_rebuild_flag)All invocations use the
--workspace-folderform.Scope / tasks
deaconinstall path to thedevcontainersrole (curl install script, pinned version) — replace the npm global install.@devcontainers/clifrom the npm-global package lists in the 7 site/configure playbooks (and re-evaluate whethernodejs/npmare still needed on the host for anything else).devcontainer up/devcontainer exec→deacon up/deacon execin the threeuser_setupfiles above.$_rebuild_flag→ deacon equivalent of--remove-existing-container/--build-no-cache).ansible/README.md(role description + dependency list).remo shell -p <project>, and--exec.Open questions / parity to confirm
up/execaccept the same--workspace-foldersemantics and exit codes the launch scripts rely on?user_setup/tasks/main.yml.install.sh; deacon is currently pre-releasev0.2.0— may want--prereleaseor a pinned release asset until GA).Out of scope
features/remo-notifier-source/devcontainer Feature (deacon targets consumers, not feature authoring; this Feature is consumed by whatever CLI builds the container, not invoked by remo directly).remoCLI command surface — this is host-provisioning internal.