Skip to Content

Propagate CLI

The propagate CLI lives in the propagate monorepo. It is the sole interface for deploying app stacks — the previous Next.js wizard has been removed.

Prerequisites

RequirementNotes
Node.js ≥ 18.17
pnpm 10+Monorepo package manager
Pulumi CLI Required for apply, status, diff, destroy
Cardano wallet extensionNami, Eternl, Lace, etc. — for propagate login
GitHub App on target orgInstalled via browser during propagate create / apply / propagate auth github (no PAT)
VERCEL_TOKENProject create/deploy permissions (or provide during propagate create)
PROPAGATE_HOST_NAMEBase domain for nested DNS (optional; falls back to *.vercel.app)

Install

From the propagate repo root:

pnpm install pnpm build

Run via:

pnpm propagate <command> # or node packages/cli/dist/index.js <command>

Commands

CommandDescription
propagate initCreate .propagate/ workspace and global config at ~/.propagate/config.yaml
propagate loginHosted wallet auth — opens browser on propagate.prisma.events 
propagate auth githubInstall Propagate GitHub App on the stack’s target org
propagate auth vercelConnect Vercel (OAuth, GitHub App, team GitHub integration)
propagate auth upstashInstall Upstash Redis marketplace integration on the Vercel team
propagate auth railwaySave Railway API token for Neo4j provisioning (use No workspace scope at railway.com/account/tokens)
propagate createInteractive prompts → stack.yaml, values.yaml, credentials.json
propagate validateValidate manifests and capability graph; write resolved.json
propagate validate --schema-onlyValidate stack.yaml schema only (skip app manifests)
propagate applyRun Pulumi to provision infrastructure
propagate apply --yesApply without confirmation
propagate statusShow Pulumi stack outputs (URLs, project IDs)
propagate diffCompare manifest to last-applied; run pulumi preview
propagate destroyTear down infrastructure (--yes to skip confirm)
propagate exportPrint stack.yaml to stdout
propagate export --resolvedPrint full resolved stack including derivable values

Quick start

# 1. Initialise workspace in your project directory propagate init # 2. Authenticate (opens browser — connect Cardano wallet, sign nonce) propagate login # 3. Interactive manifest generation propagate create # Prompts: client name, event name/dates, event code, GitHub org, # Vercel team, app selection, timelining secrets (Telegram, OpenAI), Vercel token # Redis and Neo4j are provisioned on apply unless overridden in values.yaml # then GitHub App install in browser (if not already installed) # 4. Validate (requires app.manifest.yaml in each selected app repo) propagate validate # 5. Provision export PROPAGATE_HOST_NAME=prisma.events # optional propagate apply --yes # 6. Check outputs propagate status

Workspace layout

Running commands from a project directory creates:

.propagate/ stack.yaml # infrastructure intent (committed) values.yaml # user secrets — gitignored credentials.json # GitHub App install + Vercel token — gitignored resolved.json # validation output — gitignored pulumi-state/ # local Pulumi backend — gitignored last-applied/ # snapshot after successful apply — gitignored

propagate create prompts

The create flow mirrors the former web wizard steps:

  1. Metadata — client name, event name, start/end dates
  2. Event code — DNS-safe slug (default derived from event name, e.g. Argentina ALJargentina-alj)
  3. GitHub — target organisation
  4. Vercel — team ID
  5. App selection — multi-select from deployable catalog (docs, timelining)
  6. User capabilities — conditional prompts (e.g. TELEGRAM_BOT_TOKEN, OPENAI_API_KEY for timelining). Redis and Neo4j are not prompted — provisioned on apply.
  7. Vercel token — stored in credentials.json
  8. GitHub App install — browser opens on propagate.prisma.events ; install the Propagate app on the target org (skipped if already installed)

Authentication

Wallet login

propagate login opens a browser session on the hosted auth app (propagate.prisma.events ). You connect a Cardano wallet, sign a nonce, and the CLI polls until complete. The session is stored at ~/.propagate/session.json. Authorization is checked against register.prisma.events  (enrol app) — your wallet must be registered there.

Override the auth host for local dev:

PROPAGATE_AUTH_URL=http://localhost:3000 propagate login

Local dev requires REGISTER_API_TOKEN in packages/web/.env.local on the auth server.

GitHub App install

Forking requires the Propagate GitHub App installed on provider.github.targetOrg — not a personal access token. Triggered during propagate create, before propagate apply (if missing), via propagate auth github, or optionally after propagate login when a workspace stack already exists.

  1. CLI creates an install session via POST /api/github/cli/init
  2. Browser opens /cli-github-install
  3. You install the app on the target GitHub organisation
  4. GitHub redirects to the app Setup URL; CLI polls until complete
  5. .propagate/credentials.json stores installationId, targetOrg, and credentialRef
  6. At apply / destroy, the CLI mints a short-lived installation token from the auth server

Example credentials.json:

{ "github": { "installationId": 12345678, "targetOrg": "client-org", "credentialRef": "...", "installedAt": "2026-06-13T..." }, "vercelToken": "..." }

Vercel token

For CI or headless use, the Vercel token can be supplied via environment variable instead of credentials.json:

export VERCEL_TOKEN=...

Vercel connect troubleshooting

Git-linked deploys require three links: Vercel OAuth (token + team), the Vercel GitHub App  on your target org, and GitHub under Vercel team → Settings → Integrations → GitHub → Connect.

If propagate auth vercel completes OAuth and GitHub App steps but fails verification:

  1. In the Vercel dashboard for the stack’s team (stack.yamlprovider.vercel.teamId): Settings → Integrations → GitHub → Connect
  2. Re-run propagate auth vercel or propagate apply (apply runs a live probe before Pulumi)

Monorepo packages

PackageRole
packages/coreZod schemas, catalog loader, capability resolver, validation
packages/cliCommander + Clack prompts
packages/webHosted auth app (wallet login + GitHub App install)
packages/infraPulumi program (GitHub fork + Vercel deploy)
catalog/apps.yamlApp catalog with local paths and source URLs
Last updated on