StackPanel
Containers & Deployment

Containers & Deployment

Host-aware deployment for Cloudflare and Fly.io

Stackpanel deployment is app-first: each app opts into deployment, chooses a host, and then host-specific modules generate the files/scripts needed for that host.

The canonical maintainer/agent deployment specification lives in docs/superpowers/specs/2026-03-28-deployment-system.md in the repository. This page remains the public deployment landing page for provider guides and workflow entrypoints.

Routing Model

Deployment selection is resolved in this order:

  1. stackpanel.apps.<name>.deployment.host (explicit per app)
  2. stackpanel.deployment.defaultHost (global fallback, default: "cloudflare")

An app is deployable when:

  • stackpanel.apps.<name>.deployment.enable = true
  • one framework flag is enabled (for example framework.tanstack-start.enable = true)

What Runs Where

HostProvisioning pathNotes
cloudflareinfra:deploy (Alchemy infra module)Framework × host maps to a Cloudflare Alchemy resource
flyFly module workflow (flyctl, generated fly.toml)Container-based deploy flow; not managed by infra deployment module

The infra deployment module currently provisions Cloudflare apps only. Fly apps are handled by the Fly deployment module.

Minimal Example

{
  stackpanel.deployment.defaultHost = "cloudflare";

  stackpanel.apps.web = {
    path = "apps/web";
    framework.tanstack-start.enable = true;
    deployment = {
      enable = true;
      # host omitted -> uses defaultHost (cloudflare)
      bindings = [ "CORS_ORIGIN" "BETTER_AUTH_SECRET" ];
      secrets = [ "BETTER_AUTH_SECRET" ];
      cloudflare.workerName = "stackpanel-web";
    };
  };

  stackpanel.apps.api = {
    path = "apps/server";
    framework.hono.enable = true;
    deployment = {
      enable = true;
      host = "fly";
      fly.appName = "stackpanel-api";
      container = {
        type = "bun";
        port = 3000;
      };
    };
  };
}

Provider Guides

On this page