ediContainers
VS Code / Cursor extension for managing Apple container machines (container machine).


Features
- Create machines from presets (Ubuntu, Debian, Alpine, Kali) with SSH + sudo preconfigured (
root / root)
- Custom Dockerfile path for hand-written images (does not touch preset Dockerfiles / BASE_IMAGE injection)
- Edit which base images/versions to pull via a user JSON settings file
- List container machines with status and IP address
- Start, stop, and delete machines from the sidebar
- Connect to a running machine via Remote SSH
- Auto-refresh with configurable interval
- Start and stop the container system from the Machines view
- Explain how to install the CLI when
container is not found
Requirements
- macOS 26+ on Apple Silicon
- Apple
container CLI installed (container in PATH). If it is missing, the view explains how to install it (brew install --cask container, or the signed package from GitHub releases)
- Container system running. Start or stop it from the Machines view, or with
container system start / container system stop
- Remote - SSH extension for SSH connections (in Cursor:
anysphere.remote-ssh)
Installation
Cursor Marketplace
In Cursor: open Extensions (Cmd+Shift+X), search for ediContainers (or tunerok.edi-containers), and click Install.
Extension page: open-vsx.org/extension/tunerok/edi-containers
cursor --install-extension tunerok.edi-containers
From GitHub Release (VSIX)
Prebuilt .vsix releases are also on GitHub — no npm / compile required.
- Open Releases and download
edi-containers-*.vsix (e.g. edi-containers-0.2.2.vsix).
- Install in one of these ways:
Cursor / VS Code UI
- Open Extensions (
Cmd+Shift+X).
- Click
… (top of the Extensions view) → Install from VSIX…
- Select the downloaded
.vsix file.
- Reload the window if prompted.
CLI
# Cursor
cursor --install-extension ~/Downloads/edi-containers-0.2.2.vsix
# VS Code
code --install-extension ~/Downloads/edi-containers-0.2.2.vsix
After install, open the ediContainers icon in the Activity Bar.
Usage
- Open the ediContainers view in the Activity Bar.
- Click + (Create Machine): pick a preset or Custom Dockerfile, enter a name. Presets build with injected
BASE_IMAGE; Custom builds your file as-is.
- Machines appear with
status · IP in the description.
- Use inline actions or the context menu:
- Start — boots a stopped machine
- Stop — stops a running machine
- Connect via SSH — pick or enter a username, then open a Remote SSH window as
user@ip (preset machines: root / root)
- Copy IP — copy the machine IP to the clipboard
- Delete Machine — stop (if needed) and delete
- Click the gear (Edit Machine Image Settings) to change preset base image tags/versions. Use Edit Custom Dockerfile (or the Custom item in Create) for a fully manual image.
- Click Refresh to update the list manually.
- The system button in the view toolbar starts the Apple container service, then switches to Stop Container System. Stopping asks for confirmation because running machines stop with it. The button stays disabled during the action and for a few seconds after, so it cannot be clicked repeatedly.
Custom Dockerfile
Presets stay opinionated (SSH root/root, systemd/OpenRC, etc.). For full control:
- Create Machine → Custom Dockerfile (or command Edit Custom Dockerfile).
- Edit the file in extension global storage (created once from a minimal skeleton; never overwritten).
- Build & Create → choose image tag → machine name.
No --build-arg BASE_IMAGE is passed. Rebuild triggers when the Dockerfile content changes.
SSH usernames are stored in the extension global storage folder and offered again on later connects.
Machine image settings
Defaults ship in templates/machine-images.json. On first use a copy is written to the extension global storage. Edit that copy (via the gear command) to change what gets pulled, for example:
{
"id": "ubuntu",
"label": "Ubuntu",
"description": "Ubuntu + systemd + SSH (root/root)",
"baseImage": "ubuntu:22.04",
"localTag": "edi-containers/ubuntu-ssh:local",
"enabled": true
}
Set "enabled": false to hide a template from Create. After changing baseImage, the next Create rebuilds that local tag.
Configuration
| Setting |
Default |
Description |
ediContainers.containerPath |
container |
Path to the Apple container CLI |
ediContainers.refreshInterval |
8000 |
Auto-refresh interval in ms (0 to disable) |
Development
npm install
npm run compile
npm run watch # during development
If Node.js/npm is not installed globally, you can compile with Cursor's bundled Node:
npm run compile:cursor
Or manually:
export PATH="/Applications/Cursor.app/Contents/Resources/app/resources/helpers:$PATH"
node esbuild.js
Press F5 in VS Code/Cursor to launch an Extension Development Host.
Build VSIX
For maintainers (end users should use Installation from Releases):
npm install
npm run package
This produces edi-containers-<version>.vsix in the repo root. Attach it to a GitHub Release for others to install.
CLI mapping
| Action |
Command |
| List |
container machine list --format json |
| Inspect |
container machine inspect <id> |
| Stop |
container machine stop <id> |
| Start |
container machine run -n <id> -d -- true |
| Create |
container machine create <image> --name <name> |
| Delete |
container machine delete <id> |
| Build template |
container build --tag <tag> --build-arg BASE_IMAGE=… <templateDir> |
| Start system |
container system start --enable-kernel-install |
| Stop system |
container system stop |
License
MIT