Skip to content

Adapters

PocketStack converts a browser-compatible Docker Compose project into a static, browser-native demo. Every Compose service maps to one adapter — a browser primitive that runs entirely in the tab — or is reported as unsupported with concrete conversion suggestions.

A project generates only when every service maps to an adapter. If even one service needs Docker/container semantics PocketStack cannot represent honestly, generation stops and you get a readiness report instead.

Pull-request behavior

The GitHub Action publishes an application preview only for ready projects. partial and blocked projects publish a static compatibility report, fail the check, and never fall back to an arbitrary container runner.

Adapter matrix

There are six adapters. Five are selected with the pocketstack.adapter label; static-web is autodetected and has no label.

AdapterMapsHow it's selected
static-webnginx / httpd / caddy static sitesAutodetected from the image + a document-root mount (no label)
frontendNode/Bun projects that run from sourceAutodetected (Node/Bun image + package.json), or pocketstack.adapter=frontend
mock-httpOpenAPI + JSON fixtures as browser routespocketstack.adapter=mock-http
postgres-pglitePostgres-shaped demos backed by PGlitepocketstack.adapter=postgres-pglite
sqliteSQLite demos seeded from SQL or a .db filepocketstack.adapter=sqlite
wasiPrebuilt .wasm modulespocketstack.adapter=wasi

See the labels reference for every label and its accepted values.

INFO

Unsupported is not permanent. It means there is no honest browser adapter for that behavior yet. Docker builds, privileged containers, opaque volumes, arbitrary daemons, and Linux networking remain unsupported in browser-only v1.

Compose features

PocketStack analyzes a single Compose file and maps the default service set to adapters. A few directives are handled specifically:

  • profiles: — services gated behind a profile are not started by a default docker compose up, so PocketStack skips them. Skipped services do not count toward, or block, browser readiness, and the analysis warns when they are skipped.
  • extends: — unsupported. PocketStack does not resolve an extended base service. Flatten the service (inline its image, labels, ports, and volumes) before analyzing.
  • Multiple files / overrides — pass a single file with -f. Merge any overrides yourself first.
  • Port ranges such as 3000-3005:3000-3005 are accepted; the first port of the range is used and adapter selection does not depend on the exact port.
  • Image normalization — short names (postgres), Docker Hub official names (library/postgres), and registry-qualified names (docker.io/library/postgres:16, ghcr.io/org/app) all resolve to the same adapter.
  • depends_on: / healthcheck: — parsed but ignored. A static demo has no startup ordering or health gating.

Readiness report

pocketstack analyze is useful even when generation is blocked. Every analysis result includes:

  • readiness.statusready, partial, or blocked;
  • readiness.score — the percentage of services that are browser-native;
  • service-level unsupported reasons;
  • service-level suggestions;
  • project-level nextSteps.

The goal is to make unsupported services actionable. For example, a Redis service is reported as stateful browser-incompatible and points you toward SQLite, PGlite, fixtures, or in-browser mock state for the demo.

Unsupported services

When a service has no honest adapter, reshape the demo rather than expecting a hidden runner. The conversion guide walks through replacing backends with mock-http, databases with sqlite or postgres-pglite, caches and queues with fixtures or in-browser state, and Dockerfile builds with prebuilt output.

Compose PR in. Static preview out—only when every service is browser-compatible.