~/docs/features/stacks
╭─ § 03.03 ─╮

StacksPRO

└───────────╯

A stack is a runnable composition of projects, services, and other stacks. Instead of starting your API, its database, its auth worker, and your frontend one at a time, you group them once and bring the whole environment up — in dependency order — with a single command, click, or Shortcut.

A stack runs no process of its own. It’s a lightweight unit that orchestrates its members: starting a stack starts its members (and their dependencies); stopping it releases them.

Two kinds of stack

Manual

You choose the members. Create a stack, seed it, then add or remove members whenever you like.

corral stack create storefront --member web --member api
corral stack add storefront auth
corral stack rm storefront web

Cloudflare-derived

For Cloudflare Workers, Corral builds stacks automatically. It reads each worker’s wrangler config, finds the workers that call each other — service bindings, queue producer/consumer pairs — and groups each cluster into a derived stack. New clusters are detected as you register projects; you don’t create these by hand.

A derived stack stays in sync with your config. Change a wrangler binding and the stack’s membership and wiring are re-derived; if the on-disk config has drifted from the stack, Corral shows a divergence banner with a one-click Re-sync.

To hand-edit a derived stack, eject it into a manual copy first (see below).

Starting and stopping

corral stack start storefront      # bring every member up, in dependency order
corral stack stop storefront       # release the stack's members
corral stack restart storefront

In the macOS app, select the stack in the STACKS section of the sidebar and use the toolbar Start / Stop / Restart controls, or the Play button on the stack’s row.

Members are ref-counted. If two running stacks share a member — say both storefront and admin depend on postgres — stopping one stack won’t pull the shared member out from under the other. The member stops only when the last stack using it releases it. When stopping a stack would affect another running stack, Corral asks first.

Seeing how a stack fits together

corral stack list                  # every stack: status, origin, member count
corral stack status storefront     # dependency tree, members, wiring, drift

In the app, a stack’s detail view opens on a Graph tab — a dependency diagram of the members and the wiring between them, each node showing its live status. The Members list, a New Stack sheet, membership editing, and (for derived stacks) the re-sync / eject controls live here too.

Re-sync and Eject

corral stack resync storefront     # re-derive a Cloudflare stack from current wrangler config
corral stack eject storefront      # fork a derived stack into an editable manual copy

Re-sync pulls a Cloudflare-derived stack back in line with its workers’ current wrangler config. Eject forks a derived stack into a manual one you can edit freely, leaving the original intact — the way to take manual control of membership that otherwise comes from config.

Deleting and renaming

corral stack rename storefront shop
corral stack delete storefront     # the stack is removed; its members are preserved

Deleting a stack never deletes its members — they go back to being ordinary standalone projects and services.

Reading a stack’s logs

A stack has no process of its own, so its logs are the logs of everything it brings up: its members, whatever those members depend on, and the same again through any nested stack. That is exactly the set corral stack start starts, so a shared Postgres two of your workers talk to is in view — which matters, because when a stack is broken that is very often what broke it.

corral logs storefront
corral logs storefront --follow

The same set backs the Logs tab of a stack’s detail view in the macOS app. Every line is labelled with the unit it came from, and the CLI names the units it widened to on stderr before the first line.

corral stack status draws the same set: a unit the stack starts but does not contain is marked ↑ started with the stack, and anything the tree cannot place — a dependency’s own dependency, a nested stack’s members — is listed after it as also started:.

Under --follow, the daemon — not the CLI — decides which units the stream carries, and it works the set out again every time the stream subscribes. So a follow that rides out a daemon restart or an update comes back scoped to the stack as it is now, rather than to the membership it had when you started. A member added while the connection stays up is picked up at the next reconnect; re-run the command to see it straight away.

Beyond the CLI and app

Stacks are reachable wherever Corral is:

  • AI tools (MCP) — agents can stack_list and stack_info (free) and stack_start / stack_stop (Pro). See AI Tools (MCP).
  • Spotlight, Shortcuts & Siri — open or list stacks for free; start / stop / restart in a Shortcut or by asking Siri (“Start a Corral stack”). See Spotlight, Shortcuts & Siri.
  • Deep linkscorral://start?stack=storefront and friends. See Deep Links.

Free vs Pro

CapabilityFreePro
List stacks, inspect members & wiring
Read a stack’s logs
Open a stack, view its graph
Create, add / remove members, rename, delete
Start / stop / restart
Re-sync / eject a Cloudflare-derived stack

The daemon enforces this split — the same gate behind every surface (CLI, app, MCP, Shortcuts, deep links), so the boundary is identical no matter how you reach it. On the free tier, a Pro action returns a clean “Corral Pro required” prompt instead of failing cryptically.

// Last updated 2026-09-13