Snapshots

A jam turns a card into finished work, never paying twice

Being built
  • One jam per card, owned by the team, so a second person joins it.
  • The stage is one bar: Draft, Make, Send, with one primary button.
  • Studio makes every picture and video behind a price and a yes.
  • Guests may chat, edit the brief and draft; paid makes stay the team's.
  • v2-only routes remain until the access log shows no hits for 14 days.
Your call

Does Set-up v2 go to production? Proposal: yes, after one clean partner session on staging.

Engineering · 5.8

The jam and Studio

DraftLast checked Mon Oct 26Owner Param

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 prefixed jp- 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 by tools/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

  1. A blank stage on a creative card means ch.studio is null for that recipe: check studioOf and planFor first. memory brew-v1-creative-stage
  2. 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

  1. A new paid maker must take a make claim, save its job id before polling, and show its price.
  2. 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

  1. 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.
  2. Does Set-up v2 go to production? Proposal: yes after one partner session on staging with no layout findings.
Sources
  • brew origin/main: remix.js:1-8, 1920 (PACK_V); studio.js:1-6; jams.js:1-8; drafts.js:1-8; drafts-bg.js:1-10; media.js:1-7; finals.js:1-10; publish-pack.js:1-5; publish-ready.js:1-6; claims.js:1-6
  • brew origin/main: jam2/studio.js:1-5, jam2/make.js:1-5, jam2/creative.js:1-8, jam2/engines.js:1-9, jam2/context.js:1-5, jam2/routes.js:1-3, jam2/make-claim.js:1-4, jam2/brandbook.js:1-8
  • brew origin/main: feed-service.js:261 (GUEST_DO); SCOPE.md (Jam, Make our version); DUMMY.md rows 5, 8, 10
  • brew origin/main git log: 9ee9d14 (retire Jam v2 screen), b91e364, 94b332c, 93ce29a, 9fd1de4, bc12997
  • memory brew-jam-v2, brew-v1-creative-stage, brew-one-stage, brew-setup-v2, brew-draft-quality, brew-sloosh-finals, brew-jam-rca-2026-10-26, brew-team-jams, brew-one-version, brew-viral-remakes

Source file content/engineering/the-jam-and-studio.md · For agents: Markdown · JSON