Answer
A jam is the one place a card becomes finished work: v1's jam engine (remix.js) holds the versions, chat, checks and brief, and Brew Studio (the jam2/ engine) makes every picture, set and video behind a price and a yes; this page settles how making works, what is checked and what is never paid twice.
Today
One jam per card, owned by the team
- A brand's jams belong to its team (
private/jams.json); one jam per card, so a second person joins it. Visitors keep their own. brew/jams.js:1-8 memory brew-team-jams - A guest of a shared jam may chat, edit the brief and make drafts (
GUEST_DO), and press remake; paid pictures, videos, finals and variants stay the team's. brew/feed-service.js:261 git bf30637, 9149c3c - Presence and typing show across instances; two people editing merge part by part. brew/presence.js:1-3 brew/shared-doc.js:1-5
The stage contract (since 25 Oct)
- Header: the deliverable, "on
", "For: ". memory brew-one-stage - Stage shows only the piece; a set of 2+ slides shows one big with arrows and a One | All toggle. memory brew-one-stage
- One bar: Draft › Make › Send, one primary button. Panel tabs: Chat, Set-up or Adjust, Details. memory brew-one-stage
- Each deliverable tab has its own brief with a real recipient. git 9fd1de4
- One version, then Redo it, everywhere. memory brew-one-version
The v1 engine
| Part | What it does | Source |
|---|---|---|
| Changes and versions | A card becomes versioned change packages; each says what it touches, before and after | brew/remix.js:1-6 |
| Families | Every action belongs to a family with its fields, knobs and completeness rule | brew/studio.js:1-6 |
| First drafts in a jam | One tap: image of the real product, short video, voice, text | brew/drafts.js:1-5 |
| First drafts on cards | Background drafts for brands opened in the last 3 days, in each card's format | brew/drafts-bg.js:1-8 |
| Draft media | Vertex Gemini image then OpenAI; Veo 3.1 fast then Veo 3.1; Gemini TTS then OpenAI | brew/media.js:1-7 |
| Look judge | References flattened on white; a free pixel check and a fast vision judge; one redo, then held back for the real photo | memory brew-draft-quality |
| Publish pack | A zip per version with what each place needs; Brew writes to no account (PACK_V 8) |
brew/publish-pack.js:1-5 brew/remix.js:1920 |
| Ready to publish | Parts with limits and one final check, the words in the picture included | brew/publish-ready.js:1-6 |
Brew Studio (the jam2/ engine)
- Jam v2's own screen was retired on 25 Oct; every card opens v1's jam, whose Set-up tab drives the Studio engine through a hidden Studio jam linked to the v1 change (
v1ch). Finished takes land as v1 versions. git 9ee9d14 memory brew-v1-creative-stage - Set-up arrives filled from what Brew knows (style, product, cast, reference, kit, size, length, count, quality, direction), each with one line of why; nothing is made up to fill a gap. brew/jam2/context.js:1-5
- Nothing is made before the price is shown and the person says yes (
confirmUsd). A take that fails its checks is retried once. brew/jam2/studio.js:1-5 memory brew-jam-v2 - The creative pipeline: art direction, a product-locked shoot from real catalog photos, a vision critic, real type in the brand's kit, other sizes by outpaint. brew/jam2/creative.js:1-8
- Partners are adapters ordered per capability in
data/engines.json: Vertex (live), Sloosh, Higgsfield, and a free local cut-out. An adapter not connected is skipped, never faked. brew/jam2/engines.js:1-9 - One product for the whole jam: copy and Studio both use
jamProduct(the card's own product first, then the title, then loose words), so the photo and the words can't disagree. A sold-out pick moves to its in-stock twin unless the card is about a restock; free samples never win a tie. brew/remix.js brew/product-match.js git f53630f - Every Higgsfield picture gets one brand context line (scene, light, colour roles, who it is for), marked "never written on the image"; person styles the Brand Book allows also get the saved cast photos. brew/jam2/studio.js brew/jam2/creative.js git 91c392b
- The jam page follows the 26 Oct prototype (first pass). The header shows the piece and its product, a version switcher (‹ vN ›: look, then Use this) and Creative | Brief; every version and the theme sit in the More menu. The panel has no tabs: Brew's one line on what it set up, then the chat, with Change it yourself and the ready-to-post checks opening in place. The piece is drawn in the size it is set up in, with Feed · Square · Story under it (a Story-sized Meta ad is drawn as a Story). Each piece's tab has a status dot. Set-up picks survive a reload. brew/public/stage.css brew/test/stage-redesign.test.js git 9c1b2a7
- Short windows and quick switching (26 Oct). Piece | Brief sits in the header right after the title, one tap and never under ⋯. In a short window a Meta ad steps back in stages so the whole ad and its sizes stay above the bar: first the picture gets smaller, down to a card 260 wide. Below that the picture is cropped shorter, the text drops to two whole lines and the description goes, then the text drops to one line. The room is measured from what the stage overflows by, and the frame no longer sets its width from the window height. The headline and the button always stay. The + menu in Ask Brew keeps its rows from squashing into each other. brew/public/app.js brew/public/canvas.css git 630439d git 9bf0b1e
- Second pass (26 Oct). Point, then ask: tap any part of the piece and it rides in the chat box ("Changing only: Headline"); the ask changes that part and keeps every other word, and a picture part goes to the Studio set-up. Checks: the first problem sits on one line over the button, red (it stops Send brief, and Fix it becomes the button) or amber (advice), each with its own fix. Send brief: each send records who it went to and which version, the email carries the brief's own link, and an open by anyone outside the brand's team is counted. The header says "Sent to Priya · opened 2h ago" and offers to send again once the piece changes. brew/team-brief.js brew/test/stage-redesign.test.js git 3fabacf
- The jam page was rebuilt as the prototype Param approved (26 Oct). The prototype's CSS is ported 1:1 into
public/jam-page.css, every class prefixedjp-so no older rule reaches it. Every piece carries its layout (one of ten), Brew's one line and its product (jam-shape.js). Each layout is drawn in the prototype's frame from the piece's own package: WhatsApp, email, page, community post, account change, checklist, slides, reel, picture at its spec's size, and highlight covers on the brand's Instagram profile as flat circles. A planning piece names a product only when its catalogue entry is about one. The add sheet opens above the page, and slides fit the stage. A made picture or video keeps its platform renderer. A deliverable added under "+" no longer takes the card's first draft or plan. brew/public/jam-page.css brew/jam-shape.js brew/test/jam-page.test.js git e17450e git 4265f60 git 4f6f55f git 96ebcee - "+" on the jam page offers every deliverable in the catalogue (228), searchable by name and channel. 80 open as an action Brew already has, named as the deliverable; the other 148 are planned here: written, checked and handed over as a brief with their own rules, maker and hand-off files, then made and shipped by a person. A new deliverable is a row in
docs/deliverables-catalog.txt, built bytools/deliverables.mjs. brew/deliverables.js brew/data/deliverables.json git b9362bc - A Pinterest pin is made in Studio at 2:3; "+" refuses a deliverable it can't add instead of making the default piece. brew/remix.js git 37967fe
- Films never cast an expert unless the Brand Book has a real consented one; spoken lines lose unbacked claims. Recreate (object swap) runs only on the brand's own videos, so it is effectively off. memory brew-v1-creative-stage
Never paid twice
- One paid make per board across instances: a claim row in
make_claims, taken in one transaction before paying. brew/jam2/make-claim.js:1-4 - Higgsfield jobs are saved the moment they are bought; a restart polls them instead of buying again. Finished set slides are reused on resume. memory brew-jam-v2 memory brew-v1-creative-stage
- Every Studio paid request carries an idempotency key from the press, pinned to the exact request; a job older than 24h, gone or with an expired file is final, and a refunded make gives the day's unit back. brew/jam2/higgsfield.js brew/jam2/studio.js git a559de6
- Finals: a key is written before the paid call;
reconcileAll()finishes or fails open runs at boot. brew/finals.js:1-6
Finals
Make the final goes to Sloosh after a quote and the team's yes; until Brew's Sloosh workspace can pay, an image final is made on Gemini at zero credits and a video final on Veo, labelled so. Production runs with Sloosh off. The demo returns the draft as a Dummy final. brew/SCOPE.md brew/DUMMY.md git 0fc7cfc
Words in drafts
The writer gets the checker's claims rule and the Brand Book's approved claims; a fresh draft that slips is mended once before anyone sees it. Copy naming a bundle picks the bundle. git 94b332c, 93ce29a memory brew-jam-rca-2026-10-26
Spend seen live
| Make | Cost | Source |
|---|---|---|
| Studio product shot | $0.10 | memory brew-jam-v2 |
| Kling motion 5 s, 720p | $0.40 | same |
| Seedance UGC 10 s | $3.02 | same |
| Viral short 30 s | $13.87 | memory brew-v1-creative-stage |
| Paid Arata makes on production, 25 Oct | about ₹37 | memory brew-one-stage |
Tomorrow
| Item | Version | Tag |
|---|---|---|
| One stage contract, one version then Redo, price before every paid make | v1 | Stays |
v2-only routes (boards, concept, approve, /p, /brief) |
v2 | Goes once no shared v2 links are in use |
| Set-up v2 sentence composer on production | v1 | Changes, when Param promotes it |
| Several products per jam, Ads Studio batches | v2 | New |
| Recreate on the brand's own videos | v3 | New |
| Posting from the jam | v3 | New, only behind a person's yes |
How we do it
- A blank stage on a creative card means
ch.studiois null for that recipe: checkstudioOfandplanForfirst. memory brew-v1-creative-stage - After any jam CSS change, run the layout audit on staging share links:
node tools/audit-layout.mjs <jam share links>
memory brew-jam-rca-2026-10-26
- A new paid maker must take a make claim, save its job id before polling, and show its price.
- Test Studio on test brands locally (the demo has no Studio); paid tests on real brands only with Param's yes. memory brew-one-stage memory no-spend-while-building
Numbers
| Metric | Definition | Where measured |
|---|---|---|
| Paid makes per day | Studio and finals spend by brand | budget.js counters, cost.json |
| Takes held back | First drafts held for the real photo by the look judge | drafts state (Proposed to count) |
| Time to first draft | Jam open to first picture | Proposed |
Open
- When do the v2-only routes go? Proposal: check the access log for
/p/and/brief/hits over 14 days; remove them if there are none. - Does Set-up v2 go to production? Proposal: yes after one partner session on staging with no layout findings.