Brew runs in four places, production, staging, the demo and a laptop, and this page settles who uses each, what may run there and how code and brands move between them.
Since 25 Oct (evening) every design partner's home is production: Arata, Nutrova, Mana, PUMA India and Scrubroom. git 119dc8amemory brew-prod-backend
Staging lists them in MOVED_TO_PROD: their own people get a 302 (pages) or 409 (API) to production; staff stay. brew/deploy.sh:39brew/server.js:1119-1124
Production's STAGING_HOME does the reverse and is empty. brew/tools/prod-env.sh:9
A brand at home on one site gets no background work, outgoing email or Slack, or sign-in renewal from the other. Connector reads keep running on both, so Arata stays connected on both. brew/moved.js:1-8brew/.wt-prod/docs/production.md
Two code comments still say Arata's home is staging again (deploy.sh's smoke list and moved.js's header). They date from commit deb7d90, which 119dc8a reversed 30 minutes later. brew/deploy.sh:51brew/moved.js:5-6git deb7d90, 119dc8a
Cozy Snugglet and Zenant are our own test brands. Other slugs on staging are leftovers. memory brew-live-stores
Pro plan sheet (no billing), Marketplaces "Coming soon", catalog-photo fallback, Delete my data as an email request
memory prod-clean-only
What moves between them
From → to
What moves
How
Source
main → staging
code
./deploy.sh from a clean tree of origin/main
brew/deploy.sh:7
staging → production
the exact image staging runs, by digest
tools/promote.sh
brew/tools/promote.sh:1-20
staging → production
a partner's data, once
tools/partner-copy.sh (job brew-partner-copy): rows, parts, vault re-encrypted, binaries; never jams, finals, raw/, spend or test data
memory brew-prod-backend
staging → demo
a prepared brand's public pack
tools/demo-sync.sh <slug> then tools/demo-strip.mjs and a canary
memory brew-meta-connector-qa
production → anywhere
nothing
Work kept on staging on purpose: the Set-up v2 composer was not promoted as of 25 Oct by Param's choice. memory brew-setup-v2
Local
npm ci
AI_MOCK=1 BUILD_RESUME_OFF=1 RESEARCH_OFF=1 LIVE_OFF=1 TREG_OFF=1 FEED_SIGNIN=0 node server.js
Keys come from ../ugc-factory/.env (override with ENV_FILE). Only test brands serve locally; partners live on production. brew/README.mdmemory brew-jam-rca-2026-10-26
Tomorrow
Item
Version
Tag
Production as the only home for real brands
v1
Stays
A new production domain to replace feed.joinsquareup.com
v2
Changes (domain open)
Staging bucket mirror
v2
Goes
Demo on its own Postgres
v2
New
Shopify public app pointed at production after review
v1
Changes, once Shopify approves
Sloosh connected on production
v2
Open, Param's call
How we do it
Test on staging. Deploy right after a change is tested; Param tests on the live staging URL. memory always-deploy-to-test
Release to production only with tools/promote.sh, from a clean checkout of origin/main. See Release and promote.
Run risky tests (disconnects, resets) only on Cozy or Zenant on staging. memory brew-live-stores
Never wipe or reset the five partners. memory brew-live-stores
Numbers
Metric
Definition
Where measured
Brands per site
Brands whose home is each site
MOVED_TO_PROD and STAGING_HOME
Staging to production lag
Commits on origin/main not yet promoted
git log <prod git-sha>..origin/main (Proposed)
Clean gate findings
Findings per promote run
brew-prod-clean job logs
Open
Is Arata's home production or staging? The settings say production; two comments say staging. Proposal: production, and fix the two comments.
When does production get its own domain? Proposal: keep feed.joinsquareup.com until the brand name is picked, then move with a redirect.
Should Sloosh finals run on production? Proposal: no until the Sloosh workspace has paid credits and Param approves the first quote there.