A preview for every Compose PR.

Add one GitHub Action. PocketStack checks each service, packages browser-compatible stacks, and deploys a static Cloudflare Pages preview.

Browser-compatible only. Unsupported containers block deployment and stay explicit.

acme/storefront · PR #184 Ready
Compose change detectedpull_request · synchronize
- uses: ramazankara/pocketstack@v1
  with:
    compose-file: compose.yaml
Compatibility checked3 services · readiness 100%
web frontend api mock-http db postgres-pglite
Preview publishedhttps://pr-184.pocketstack.pages.dev

Compatible ships.
Everything else explains itself.

PocketStack never treats an arbitrary container as browser-ready. Every service receives an adapter, a warning, or a blocking reason before anything deploys.

Readiness report

Ready to deploy

100/100
frontendVite applicationfrontend
apiOpenAPI fixturesmock-http
dbPostgres seed SQLpostgres-pglite

Preview publishedStatic URL added to PR #184

pr-184.pocketstack.pages.dev
Readiness report

Deployment blocked

75/100
webVite applicationfrontend
apiOpenAPI fixturesmock-http
dbPostgres seed SQLpostgres-pglite
cacheRedis daemonunsupported
!

No app preview was publishedThe report URL remains shareable

Convert or remove 1 service
No hidden server fallback. PocketStack does not run Docker in CI or proxy unsupported containers to a remote host. See the compatibility matrix

Three apps. Three browser-native stacks.

Each example starts as Docker Compose, passes the same compatibility gate, and becomes a static preview.

Add it once. Every eligible PR gets a URL.

Keep your existing Compose file. The Action checks out the pull request, reports compatibility, and deploys only generated static files.

.github/workflows/pocketstack.yml
name: PocketStack Preview
on:
  pull_request:
    types: [opened, synchronize, reopened, closed]

permissions:
  contents: read
  pull-requests: write

jobs:
  preview:
    runs-on: ubuntu-latest
    steps:
      - uses: ramazankara/pocketstack@v1
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          compose-file: compose.yaml
          cloudflare-project: my-app-previews
          cloudflare-account-id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          cloudflare-api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}

Fork pull requests stay secret-safe

The Action reports compatibility but skips deployment and comments when repository secrets are unavailable.

Some adapters require host headers

Frontend and WASI previews need COOP/COEP. Cloudflare Pages receives the generated _headers file.