sg-compute.sgit.ai / specs

The catalogue: sixteen ready-to-launch environments

The 30 April naming brief called it “the simulated AWS Marketplace: a catalogue of pre-configured, ready-to-launch environments.” That is what this is. Seventeen directories, 16 registered — 9 stable, 7 experimental — each a working package with a typed manifest, its own routes, service, CLI, schemas and tests. This page is generated from data/specs.json and CI fails if it drifts.

measured

Surveyed 2026-08-24 against repo v0.2.71, from sg_compute_specs/*/manifest.py. Every total on this page is computed from the per-spec rows and cross-checked against the survey's own summary blocks — a disagreement fails the build rather than publishing a number nobody can reproduce.

Why this page justifies the rename

Playwright is 1 of 16 registered specs and 16.8% of spec code. Counting the generic compute core alongside the specs, 71.5% of the new codebase is not browser code. The repository is named after one row in this table. The rename, scored against its own nine acceptance criteria →

By family — read this one first

The alphabetical list is below, but the family view is the one that carries the argument. It is a single row that makes the case:

FamilySpecsLines
browserplaywright, content_proxy, firefox, vnc, neko20,199
vaultvault_publish, vault_app19,943
observabilityelastic, prometheus, opensearch3,904
runtimedocker, podman2,757
llmlocal_claude, ollama2,437
networkmitmproxy1,448
toolopen_design773
infrasg_edge9,108

Vault specs are within 300 lines of browser specs. That row is the clearest possible statement that this is not a browser service — and it points at the integration the rest of the estate wants. It also explains why the artefact-sink gap matters more than it looks: two specs exist whose declared capability is vault-writes, while the platform's own generic vault sink raises NotImplementedError. The capability exists at the spec layer and not at the platform layer.

browser — 5 specs, 20,199 lines

Browsers and the proxies in front of them — the family the repository is named after, and 28.5% of the new codebase.

30s typical boot · 10,180 lines

playwright

The spec the repository is named after, and 1 of 16. A stateless browser data plane: every call launches a fresh Playwright subprocess and Chromium, r…

stable
600s typical boot · 4,971 lines

content_proxy

A content-inspecting proxy in front of the browser. Ten-minute typical boot — joint slowest in the catalogue with docker.

experimental
90s typical boot · 1,992 lines

firefox

A second browser engine behind the same proxy surface.

experimental
120s typical boot · 1,876 lines

vnc

A headed browser on an X display, reachable over VNC. One of only three specs create_node can provision through the control-plane API.

stable
120s typical boot · 1,180 lines

neko

A browser you can embed in an iframe and share — the collaborative end of the browser family.

stable

vault — 2 specs, 19,943 lines

Vault publishing and vault applications. Within 300 lines of the browser family, which is the single clearest statement that this is not a browser service.

45s typical boot · 11,682 lines

vault_publish

The largest spec in the tree. Publishes vault content and routes it on a subdomain — one of the two specs whose declared capability is literally vault…

experimental
45s typical boot · 8,261 lines

vault_app

Runs a vault as an application. The one spec that supports fractional teardown (max_hours = 0.1, six minutes) and defaults to spot instances.

experimental

observability — 3 specs, 3,904 lines

Metrics and search backends for the platform's own telemetry.

180s typical boot · 1,372 lines

elastic

An Elasticsearch node for the observability family.

stable
120s typical boot · 1,311 lines

prometheus

Prometheus, paired with the /metrics endpoint every data-plane node already exposes.

stable
180s typical boot · 1,221 lines

opensearch

OpenSearch, the third of the observability family and a remote-write target for the observability service.

stable

runtime — 2 specs, 2,757 lines

General container runtimes — and, with vnc, the only specs the control-plane API can provision.

600s typical boot · 1,558 lines

docker

A general container runtime node. One of the three specs create_node supports.

stable
120s typical boot · 1,199 lines

podman

A rootless container runtime alongside docker. One of the three specs create_node supports.

stable

llm — 2 specs, 2,437 lines

Model inference, local and hosted-on-your-own-node.

180s typical boot · 1,498 lines

local_claude

A node that runs Claude Code locally against a workspace, provisioned by the Claude_Code__Firstboot user-data section.

experimental
120s typical boot · 939 lines

ollama

Local model inference, provisioned by the Ollama and NVIDIA_Container_Toolkit user-data sections on a GPU instance.

experimental

network — 1 spec, 1,448 lines

The proxy sidecar the browser family routes through.

15s typical boot · 1,448 lines

mitmproxy

The fastest spec in the catalogue at 15 seconds typical, and the sidecar the browser specs route through: isolation is the Docker network, and the sid…

stable

tool — 1 spec, 773 lines

Application specs that are neither browser nor runtime.

480s typical boot · 773 lines

open_design

A design tool node, and the smallest spec in the catalogue — which is the point: a spec costs a manifest, a route class and a service.

experimental

infra — 1 spec, 9,108 lines

Platform infrastructure that lives in the spec tree without being a registered spec.

— typical boot · 9,108 lines

sg_edge

The second-largest directory in the spec tree and the one the registry cannot see: it has no manifest.py, so Spec__Loader never finds it. Either regis…

unregistered

All 17, alphabetically

SpecStabilityCapabilitiesBootLinesFamilycreate_node
content_proxyexperimentalmitm-proxy600s4,971browserno
dockerstablecontainer-runtime600s1,558runtimeyes
elasticstablemetrics180s1,372observabilityno
firefoxexperimentalmitm-proxy90s1,992browserno
local_claudeexperimentalllm-inference180s1,498llmno
mitmproxystablemitm-proxy15s1,448networkno
nekostableiframe-embed120s1,180browserno
ollamaexperimentalllm-inference120s939llmno
open_designexperimentaldesign-tool480s773toolno
opensearchstablemetrics180s1,221observabilityno
playwrightstablebrowser-automation30s10,180browserno
podmanstablecontainer-runtime120s1,199runtimeyes
prometheusstablemetrics120s1,311observabilityno
sg_edgeunregistered— unregistered ——9,108infran/a
vault_appexperimentalvault-writes45s8,261vaultno
vault_publishexperimentalvault-writes, subdomain-routing45s11,682vaultno
vncstablemitm-proxy120s1,876browseryes

Boot is boot_seconds_typical from each manifest — 15 seconds to 600 seconds, a 40× range, which is itself the argument for carrying it as a manifest field rather than a footnote. Spec ids are API identifiers and are not prettified.

The uniform CLI is real; the uniform API is not. create_node covers 3 of 16 specs — EC2__Platform._service_for raises NotImplementedError for anything but docker, podman and vnc. The other thirteen create nodes through their own CLI and service paths, not the control-plane API. Every spec page below states this for itself.

Three mechanisms, and none of them is capabilities.json

What makes this a platform rather than a service is that adding a spec costs a manifest, a route class and a service — and the CLI comes free.

1

manifest.py per spec

typed Schema__Spec__Manifest__Entry — the registry

2

Spec__Routes__Loader

convention-based route discovery: spec_id 'docker' -> sg_compute_specs.docker.api.routes.Routes__Docker__Stack. 'Specs without a route class are silently skipped.'

3

Spec__CLI__Builder

generates the same 10 verbs for every spec: list, info, create, wait, health, connect, exec, delete, ami list|bake, cert

4

Spec__Loader entry points

PEP 621 entry-point discovery, group 'sg_compute.specs' — third-party specs architecturally supported, untested in the wild

What is not the mechanism. Frozen at v0.1.29 while the repo is at v0.2.71 (42 minor versions). COPY'd into the image and served at /admin/capabilities. The repo's own docs say not to read it: 'The UI reads GET /health/capabilities (the live Schema__Service__Capabilities, populated by Capability__Detector) — never the stale capabilities.json.'

The live mechanism is Capability__Detector, which detects the deployment target from env vars (laptop | ci | claude_web | container | lambda) and builds capabilities at runtime. The three axioms that stale file names — statelessness, least-privilege-by-declaration, self-description — are good, and unlike the file that names them they are actually implemented. They are rescued onto the front page.

Specs that live in your repository

Spec__Loader already supports PEP 621 entry-point discovery under the group sg_compute.specs, alongside the in-repo walk. A spec in your own package, declaring that entry point, joins this catalogue with no change to this repository.

Stated as a claim, not a feature. Third-party specs are architecturally supported and untested in the wild — nobody outside the repository has published one. That is an invitation rather than a guarantee, and if you try it we would like to hear what broke.

One design note worth publishing because it cuts both ways: “specs without a route class are silently skipped.” Convenient during development; a silent-failure mode in production. A spec that loses its route class disappears from the API with no error.