Coop Demo And Deploy Runbook
Date: March 13, 2026
This is the canonical runbook for local demos, peer pairing, and production deployment. Keep the other docs aligned to this one.
Shared Rules
- Use the repo-root
.env.localfor local development. Do not create package-specific env files. - Default local safety remains:
VITE_COOP_CHAIN=sepoliaVITE_COOP_ONCHAIN_MODE=mockVITE_COOP_ARCHIVE_MODE=mockVITE_COOP_SESSION_MODE=off
- Session keys are opt-in:
off: local issue and inspection onlymock: UI rehearsal without live user operationslive: bounded Smart Session execution for phase-1 Green Goods actions
- Production passkeys must be created on the final production PWA domain.
Environment 1: Two-Dev Local/Local
Use this when two developers are both running source locally and want the full pair flow on their own machines.
Root .env.local
VITE_COOP_CHAIN=sepolia
VITE_COOP_ONCHAIN_MODE=mock
VITE_COOP_ARCHIVE_MODE=mock
VITE_COOP_SESSION_MODE=off
VITE_COOP_RECEIVER_APP_URL=http://127.0.0.1:3001
VITE_COOP_SIGNALING_URLS=ws://127.0.0.1:4444
Processes
Run these from the repo root:
bun install
bun run dev:app
bun run dev:extension
bun run dev:signaling
Expected local surfaces:
- App and receiver PWA:
http://127.0.0.1:3001 - Signaling server:
ws://127.0.0.1:4444 - Extension bundle:
packages/extension/dist
Chrome Setup
Each developer should:
- Open
chrome://extensions. - Turn on
Developer mode. - Click
Load unpacked. - Select
packages/extension/dist. - Reload the extension after each rebuild.
- Pin the extension and open the sidepanel.
Two-Person Local Demo
- Dev A opens the extension sidepanel and creates a coop.
- Dev A generates a receiver pairing from the
Coopstab. - Dev B opens
http://127.0.0.1:3001/pairand accepts the pairing payload or QR. - Dev B goes to
http://127.0.0.1:3001/receiver, captures a voice note, photo, or link. - Dev A confirms the item lands in
Private Receiver Intake. - Dev A converts it into the Roost, edits it, and publishes it.
- Both devs verify the published artifact in
Feedand on the board route. - Dev A archives the snapshot and exports the latest receipt.
Environment 2: Two-Dev Local Extension + Production PWA
Use this as the default peer demo path before the owned production signaling host is ready.
Root .env.local
VITE_COOP_CHAIN=sepolia
VITE_COOP_ONCHAIN_MODE=mock
VITE_COOP_ARCHIVE_MODE=mock
VITE_COOP_SESSION_MODE=off
VITE_COOP_RECEIVER_APP_URL=https://<vercel-prod-domain>
VITE_COOP_SIGNALING_URLS=wss://<temporary-public-yjs-signal>
Notes:
- Both developers still run
bun run dev:extension. - Running
bun run dev:appis optional in this mode unless someone is testing the local landing page or board shell. - The extension build must be reloaded in Chrome after changing
VITE_COOP_RECEIVER_APP_URL.
Demo Flow
- Both developers run
bun run dev:extension. - Both load the unpacked extension from
packages/extension/dist. - Dev A creates or opens the coop locally in the extension.
- Dev A generates a receiver pairing.
- Dev B opens
https://<vercel-prod-domain>/pair. - Dev B accepts the pairing and captures from
https://<vercel-prod-domain>/receiver. - Dev A verifies sync into the local extension intake.
- Dev A publishes to Feed and opens the board on the production PWA.
Use this mode when you want the extension under active development while validating the deployed receiver origin and passkey scope.
Environment 3: Production
This is the release target.
PWA
- Host the app/PWA on Vercel.
- Set the Vercel project Root Directory to
packages/app. - Keep the SPA rewrites from
packages/app/vercel.json. - Ensure the final production domain is the same domain used for passkey enrollment.
Extension
- Distribute through the Chrome Web Store.
- Launch order:
UnlistedPublic
- Build from
packages/extension/dist. - Zip the contents of
distat the archive root before upload.
Signaling
- Public launch must not depend on a shared public relay.
- Self-host the open-source signaling server using the existing repo script as the baseline:
bun run dev:signaling
- Move that service behind a durable
wss://endpoint before public release.
Live Modes
Enable only when the required credentials are present:
VITE_COOP_ONCHAIN_MODE=live
VITE_COOP_ARCHIVE_MODE=live
VITE_COOP_SESSION_MODE=live
VITE_PIMLICO_API_KEY=...
VITE_COOP_TRUSTED_NODE_ARCHIVE_SPACE_DID=...
VITE_COOP_TRUSTED_NODE_ARCHIVE_DELEGATION_ISSUER=...
VITE_COOP_TRUSTED_NODE_ARCHIVE_SPACE_DELEGATION=...
Session-key live execution is limited to:
green-goods-create-gardengreen-goods-sync-garden-profilegreen-goods-set-garden-domainsgreen-goods-create-garden-pools
Human-confirmed only:
safe-deploymentgreen-goods-submit-work-approvalgreen-goods-create-assessmentgreen-goods-sync-gap-admins- treasury movement, approvals, and arbitrary calls
Local Demo Script
Use this for a clean two-person rehearsal.
Person A: Extension Operator
- Open the extension sidepanel.
- Check
Settings -> Nest Runtimeand confirm chain, modes, receiver origin, and signaling. - Create a coop with the right preset:
friends,family,personal,project, orcommunity. - If needed, enable
Green Goods gardenduring setup. - Generate a receiver pairing in the
Coopstab. - Watch the
Feedtab after sync. - Run
Manual round-up, review the Roost, and publish. - If live session mode is enabled, open
Feed -> Operator Console -> Session Keysand issue or inspect the bounded session.
Person B: Receiver
- Open
/pairon the local or production PWA. - Accept the pairing payload or QR.
- Move to
/receiver. - Capture one voice note, one link, or one photo.
- Open
/inboxand confirm the item is queued or synced.
Demo Close
- Person A confirms the private intake item arrived.
- Person A converts it into the Roost and publishes it.
- Open the board route.
- Archive the coop snapshot.
- Export the latest receipt.
Adversarial Checklist
Use this before demos and before production launch.
Create A Coop
- Preset-specific copy renders correctly.
- Friends, family, and personal never fall back to generic
communitylanguage. - State badges and extension icon states match the actual coop state.
- Onchain mode, archive mode, and session mode are visible in
Settings -> Nest Runtime.
Join And Sync With A Peer
- A second profile can join and see published state.
- Expired or inactive invites fail clearly.
- Missing signaling, duplicate sync, and sidepanel-closed cases fail safely.
- Local-only fallback still leaves the receiver usable.
Pair A Receiver And Capture Privately
/pair,/receiver, and/inboxwork on local and production origins.- QR, share, notifications, badges, and file export degrade gracefully when unsupported.
- Bridge injection works on
http://127.0.0.1:3001and on the production Vercel domain. - Wrong-member and expired-pairing envelopes are rejected.
Run The Agent Loop
- Manual round-up, observation capture, plan generation, and Roost draft creation work without duplicate or conflicting states.
- Auto-run never bypasses action policy.
- Operator logs stay readable enough to narrate during a live demo.
Execute Green Goods Actions
- An allowed session-key action succeeds in
VITE_COOP_SESSION_MODE=live. - A disallowed action is rejected before send.
- Replay protection still blocks re-use.
- Revoked, expired, or exhausted sessions are blocked.
- Missing Safe, missing Pimlico, wrong chain, or missing session material surface actionable errors.
Publish, Archive, And Export
- Publish reaches Feed and the board route.
- Archive receipts remain legible.
- Export works with file picker or download fallback.
- The latest snapshot and receipt are easy to find during the demo.
Deployment Checklist
PWA On Vercel
- Set the project Root Directory to
packages/app. - Keep the SPA rewrites in
packages/app/vercel.json. - Set production environment variables in the Vercel dashboard.
- Deploy and verify:
//pair/receiver/inbox/board/<coop-id>/manifest.webmanifest/sw.js
Extension To Chrome Web Store
- Run
bun run --filter @coop/extension build. - Zip the contents of
packages/extension/dist. - Upload to the Chrome Web Store dashboard.
- Start as
Unlisted. - Add clear reviewer notes for:
- sidepanel entry
- passkey flows
- mock vs live modes
- receiver pairing and private intake behavior
Validation Commands
Use these before demo day:
bun run validate production-readiness
Use this only when the live Smart Session env vars are present:
bun run validate session-key-live