Skip to content

feat: registry expansion — 8 new plugins#16

Merged
scttfrdmn merged 8 commits into
mainfrom
feat/registry-expansion
Jul 21, 2026
Merged

feat: registry expansion — 8 new plugins#16
scttfrdmn merged 8 commits into
mainfrom
feat/registry-expansion

Conversation

@scttfrdmn

Copy link
Copy Markdown
Contributor

Grows the registry from 4 demo plugins to 12, now that the supply-chain machinery (signing, checksums, --strict, provenance) is shipped. Each new plugin passes spawn plugin validate --strict and has a README.

New plugins

Plugin What Notes
jupyterlab Browser notebooks/Python, systemd on loopback:8888 tunnel/Tailscale to reach; rstudio-shaped
code-server VS Code in browser, loopback:8080, password auth tunnel/Tailscale to reach
docker Docker engine as a persistent service + user in docker group complements task run --container's on-demand install
mountpoint-s3 S3 bucket as a filesystem via Mountpoint pinned version + sha256sum -c; needs instance IAM role with S3
cloudwatch-agent CloudWatch metrics (CWAgent) + optional log tail needs instance IAM role with CloudWatch; autoscaler reads CWAgent
vscode-tunnel code tunnel outbound relay, no port one-time device login (recipe in README)
github-actions-runner Self-hosted runner; controller mints reg-token from GITHUB_TOKEN → push no port; long-lived PAT stays on controller
rclone Mount any rclone remote; controller pushes authed rclone.conf OAuth remotes work with no instance login

Triage (excluded — already first-class, a plugin would duplicate)

DCV (spawn app launch + catalog AMI), GPU/NVIDIA drivers (auto-selected DL Base AMI), EFS/FSx/EBS mounts (pkg/userdata/storage.go, spawn fsx create).

Design notes

  • No plugin can open a security-group port — web UIs bind to loopback and are reached via SSH tunnel/Tailscale (like rstudio-server). Outbound-relay plugins (vscode-tunnel, gh-runner) sidestep this entirely.
  • Secret-bearing plugins use the established controller-mint/read → push pattern (gh-runner mints a short-lived token; rclone pushes your authed config) so long-lived secrets never bake into the plugin — same shape as tailscale/globus.
  • sha256: + pinned immutable asset where one exists (mountpoint-s3); run+curl via the vendor's own installer where the download is a moving redirect or multi-arch (code-server, docker, vscode-tunnel, rclone) — matching rstudio-server.

Validation & release

Per the agreed plan: merge now (all installable via bare name → tracks main). Signed <name>-vX.Y.Z releases cut after each plugin's validation:

  • Gated real-AWS smoke (self-contained): jupyterlab, code-server, docker, mountpoint-s3, cloudwatch-agent.
  • Static + manual recipe (need your secrets): vscode-tunnel, github-actions-runner, rclone.

No spawn code changes; no registry-workflow changes (release.yml + lint.yml --strict already handle new plugins).

Browser-based notebooks/Python via JupyterLab in a /opt/jupyterlab venv, run as
a systemd service on loopback:8888 (reached via SSH tunnel/Tailscale, like
rstudio-server). Config: port, token, notebook_dir. Declares permissions
(instance root+network, port 8888); passes 'spawn plugin validate --strict'.

First of the registry-expansion plugins (spore-plugins#8 companion track).
Merged now (installable via bare 'jupyterlab'); signed release cut after the
gated real-AWS smoke.
VS Code in the browser via the official code-server installer, run as the
code-server@ec2-user systemd service on loopback:8080 with password auth
(reached via SSH tunnel/Tailscale). Config: port, password. Passes --strict.
Installs the Docker engine as a persistent service + adds ec2-user to the docker
group, for interactive/long-lived instances (complements task run --container's
on-demand install). Health via docker info. Passes --strict.
Mounts an S3 bucket as a local filesystem via Mountpoint for Amazon S3, run as a
systemd service; credentials from the instance IAM role (documented precondition
— a plugin can't set the role). Pinned version + sha256sum -c verify; arch-aware
via run+curl (fetch step can't select arch). Config: bucket/prefix/mount_path/
read_only. Passes --strict.
Installs+configures the Amazon CloudWatch agent (CPU/mem/disk metrics under
CWAgent + optional log-file tail), started via its ctl; credentials from the
instance IAM role (documented precondition). Config: namespace/interval/log_file/
log_group. Passes --strict.
Runs 'code tunnel' as a per-user systemd service — outbound relay, no port, no
SG concern. Install writes the CLI (root); tunnel runs as_user (per-user auth +
state). Not auto-started: needs a one-time interactive device login (documented
recipe). Static-validated (--strict); not auto-smoked (needs user auth).
Registers a self-hosted GitHub Actions runner: controller mints a short-lived
registration token from GITHUB_TOKEN via the API + pushes it (long-lived PAT
never leaves your machine); remote downloads actions/runner, config.sh as_user,
svc.sh install/start as root. No port (outbound long-poll). Static-validated
(--strict); not auto-smoked (needs your GITHUB_TOKEN + repo).
Mounts a preconfigured rclone remote: controller reads local rclone.conf,
JSON-encodes via jq -Rs + captures + pushes it (globus-style secret handoff, so
OAuth remotes work with no instance login); remote installs rclone + FUSE-mounts
via systemd. Config: remote/path/mount_path. Static-validated (--strict); not
auto-smoked (needs your authed rclone.conf).
@scttfrdmn
scttfrdmn merged commit 64cdf9c into main Jul 21, 2026
1 check passed
@scttfrdmn
scttfrdmn deleted the feat/registry-expansion branch July 21, 2026 03:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant