Marcel, the companion
Every studio has that colleague who's seen everything — knows which film your lighting reference is from, which tool does the job cheapest, and what you tried last Tuesday. In Brut, that colleague is Marcel (named after Marcel Breuer — Bauhaus, brutalism, the Brut lineage).
His panel is open when the app starts, showing the conversation view (the Raw events toggle adds the full engineer feed); the Marcel button on the left rail (the pulse icon) hides and shows it. The panel is two things at once:
The studio timeline
A chronological diary of everything that happens in the project — runs, results, planner reasoning, errors, and your conversations. It's saved with the project (a plain text file, ledger/activity.jsonl), so it survives restarts and travels with a NAS share or a folder export. On a shared project, everyone writes to the same diary, and entries are tagged with who was signed in.
The Raw events / Chat only toggle switches between the full engineer view and just the conversation. When the panel is closed, anything Marcel says on his own — a remark, a suggestion, a failure diagnosis — badges the Marcel button on the rail, so ambient commentary never lands invisibly.
A long diary stays comfortable: the panel opens at the newest message and follows the conversation as it streams; scroll up to read history and it stops following (a ⤓ Latest button brings you back). Only the newest stretch renders by default — ⋯ Show earlier unfolds the rest in place. And the 🔎 search at the top of the panel searches the whole diary — every chat, plan, and failure back to the project's first day, not just what's on screen — with dated results.
The chat
Type at the bottom of the panel and Marcel answers — streamed live, in whatever language you write. Enter sends, Shift+Enter starts a new line, and the box grows with your message. The whole panel resizes too — drag its left edge to make Marcel as wide as you like (double-click the edge to reset). He knows Brut inside out: every model in the catalog with its real price, every node and how its ports wire, and the whole of this documentation. Ask him things like:
- "Which model should I use for a photoreal archviz still, and what does it cost?"
- "What's the cheapest way to get a 5-second clip?"
- "How do I route one shot from a Multi-Shot into Image → Video?"
He recommends only from the catalog — if a price isn't pinned, he says so instead of guessing. Every model also carries a short "best for" note (hero stills, cheap iteration, native audio, reference-driven identity…), so "which model for this job?" gets a grounded answer, not a vibe.
The artistic advisor
Marcel is a seasoned artistic director, not just a manual. Ask him for direction and he answers with concrete, citable references — named photographers, films, DPs, architects, eras — never "make it more cinematic."
He carries a style library: a curated set of named looks across photography (Stoller, Shulman, Binet…), archviz conventions (the MIR mood, the clay model, the dusk money shot…), cinema (Deakins nights, Villeneuve scale, Kubrick symmetry…) and current trends — each with a description, ready-to-use prompt language, and which models render it well. Ask "give me three directions for this facade" and he'll cite them by name, with the prompt fragments to try. The library is a plain data file (engine/catalog/styles.json) — it's yours to edit: rewrite the looks, delete what you disagree with, add the studio's own.
Show him your work. The 📎 button in the chat composer lists every still currently on your canvas — selected nodes first, Reference Board pools in board order, Multi-Shot grids as their curated set. Attach a render and ask "what would you change about the light?" — Marcel actually looks at it. A few practical notes:
- Images are downscaled to ≤2048px for the conversation (provider request limits — your originals are untouched, and generation always uses full resolution).
- Attachments ride only the message you send them with. Later turns re-send text alone, so an image-heavy conversation doesn't re-bill the pixels on every reply.
- An image-heavy turn costs more than a text turn — the exact number lands in the ledger per call, like everything else.
- Marcel looks at stills; videos can't be attached (yet).
Marcel acts — building and running the graph
Marcel doesn't just advise; ask him to do it and he works on your actual canvas:
"Give me a 6-shot dusk study of this render."
He'll place the nodes, wire them, set the prompts and parameters, and offer to run it — you watch each step land on the canvas as he narrates. His toolkit is the same as yours: add, wire, rewire, edit, delete nodes, drop in a saved library composite (yes, the whole Cinema Team), read any node's output, search the project diary, and run nodes.
In the chat, his actions fold into a compact "🤖 N actions on the canvas" block between his messages — expand it to see every step, or ignore it and just read the conversation. When he names a node (multi_shot-21), that id is visible in the node's own title bar — click it there to copy it. And the layout isn't his problem (or yours): whatever he builds is auto-arranged into tidy columns that follow the wiring, placed where you're working — beside the nodes it connects to, or centered on your current view when it stands alone, always nudged clear of your own nodes, which are never touched. The same layout is available for any graph via the ⌗ Tidy button in the toolbar (Ctrl+Z undoes it, like everything).
Three rules keep this comfortable:
- One Ctrl+Z undoes the whole turn. Everything Marcel does in one reply — however many nodes and wires — collapses into a single undo step. Don't like the construction? One keystroke removes it all (and undoing a delete brings a node back with its cached results).
- Paid work always asks first. Free actions (building, wiring, editing) apply immediately. But before anything would bill one of your keys, you get an itemized confirm — which nodes, which models, the catalog price per step — and nothing is generated until you click. Declining costs nothing and Marcel takes it in stride. Film Shots keeps its own per-clip confirm on top.
- What ran is what's ledgered. Marcel's runs go through the exact same engine path as your clicks — same caching (unchanged steps replay free), same history, same ledger rows.
He can also save a style: when a look you've been chasing together deserves a name, he'll offer to add it to the style library — only with your go-ahead, and only citing models that exist in the catalog.
How present? The Assist slider
Marcel can also speak unprompted — and how much is entirely your call. The slider at the top of the panel has four levels; each one adds exactly one behavior to the previous, so you always know what you've turned on (and what it can cost):
| Level | What Marcel does |
|---|---|
| Off | Nothing. The timeline stays a passive journal; Marcel never calls a model on his own — not even the quiet taste passes. |
| Reactive | Answers when spoken to, and diagnoses failures: when a run errors, one short remark names the likely cause and the fix to try first. He knows Brut's classic traps on sight — the Gemini silent content refusal (finishReason: OTHER, almost always an input image), the first-call 429 that means billing not enabled rather than throttling, truncated replies. |
| Narrator | + run commentary (a sentence or two when a run that actually generated something finishes — free cache replays stay silent, and re-running an already-generated graph is exactly that) and a recap when you open a project: where things stood, what finished or failed while you were away, what's still running. If nothing happened since the last recap, he doesn't spend the call at all. |
| Partner | + unsolicited 💡 suggestions — an artistic direction, a model swap (always with real catalog prices), a next step — appearing as small cards in the timeline. |
The setting is per-account, so your level doesn't change Zina's. Ambient remarks run on the cheap narrator lane and deliberately travel light — they don't carry Marcel's full Brut knowledge, just the moment's context — so a remark is a few hundred tokens: a fraction of a cent on Haiku or Gemini Flash. Every one of them is a ledgered call you can verify, like everything else. And when there's genuinely nothing worth saying, Marcel says nothing — silence is a designed outcome, not a failure.
Memory — Marcel learns your taste
Marcel keeps two plain-text memory documents, both stored on your disk and both yours to read and edit (the 🧠 Memory button in the panel):
- A taste profile — tied to your account and shared across every project. What you make, references you love, looks you avoid, the palette and light you keep reaching for. It's private, never synced anywhere, and hand-edits are respected on Marcel's very next reply.
- Project notes — a small memory for this project: what it is, decisions made, where it's heading. It travels with the project (a NAS share or a folder export), so the studio's context follows the work.
He builds the profile as you work. In quiet moments — when you switch projects — Marcel runs a cheap pass over your recent prompts, re-rolls, and rejections and proposes a note or two: "Noticed you keep re-rolling golden-hour skies → prefers cool, overcast light." Each proposal appears in the timeline as a card you rule on — Keep (folds it into your profile, and you can Edit the wording first) or Discard. Nothing is locked in without your say-so; until you rule, it's treated as a working hypothesis.
The taste interview. The first time Marcel can run (once you've added a text key), he offers a short, entirely optional interview — what you make, references you love, pet peeves, preferred vibe. You don't have to describe your taste from a blank page: two rows of chips (drawn to golden-hour warmth, clinical minimalism, brutalist mass… / allergic to sterile renders, HDR crunch, plastic skin…) write editable sentences straight into your answers, so you react instead of invent — and every word stays yours to rewrite before anything is sent.
Then, instead of filing your answers raw, Marcel can distill them: one call on his brain lane reads what you wrote and proposes back a structured profile in his own words — palette, light, mood, composition, references, hard NOs — "here's what I think you like — correct me." The proposal appears in an editable box; fix anything that's off, then Accept to make it your taste profile (or Redo for another read, or go back and answer more). Prefer no model call at all? Save without distilling files your raw answers exactly as before. The distillation is ledgered like every Marcel call — a few cents on a flagship model.
The interview is never one-shot: relaunch it any time from Marcel's memory (🧠 → Redo the taste interview) or ⚙ Settings → Marcel. Re-running pre-selects the chips that match your current profile, and nothing is overwritten until you accept the new proposal — the rest of your profile (learned notes, hand edits) stays untouched.
Bring your own brain
Marcel runs on your own text-model key, like everything else in Brut — there is no Brut server in the conversation. Add a Gemini, OpenAI or Anthropic key and chat works; without one, the panel remains a fully working journal and the composer shows a quiet add a key link.
One OpenRouter key also works. If you hold no native text key but have an OpenRouter key, Marcel's lanes route through it — chat, ambient narration, acting, everything — visibly (the composer shows ⇄ runs via OpenRouter), at pass-through token rates, with Anthropic prompt caching intact so long conversations stay as cheap as on a native key. A native key added later takes over automatically.
Two model lanes, both pickable in ⚙ Settings → Marcel:
- Brain — the model behind chat and advice. Auto picks your best configured model (Claude Sonnet 5 when an Anthropic key exists).
- Narrator — the cheap lane behind everything ambient: failure diagnoses, run commentary, session recaps, and the quiet taste passes. Auto picks Claude Haiku or Gemini Flash, whichever key exists.
Both lanes carry a Reasoning dial and a Thinking switch under their pickers — full control over speed and cost, per lane. The dial (how deeply the model reasons before answering; deeper = more output tokens) is live on the GPT-5.6 family (none → xhigh, details) and on Claude Sonnet 5 / Opus 4.8 (low → max, Claude's default is high — details); on models without a declared dial the row shows not supported rather than hiding. The Thinking switch is Claude-specific: Sonnet 5 thinks adaptively by default and bills those tokens as output, so off is the faster/cheaper setting when you don't need deep deliberation. Every call's ledger row records the settings it ran with.
What it costs — honestly
Every Marcel call is ledgered like a generation: provider, model, exact token counts reported by the provider, and a dollar estimate from the catalog's per-token prices. Click the spend readout in the toolbar to open the full ledger — per-lane totals up top, then every call newest-first, Marcel's rows tagged with what kind of turn they were.
Real numbers from a measured full-day session (your ledger will show yours):
- Ambient remarks (failure diagnoses, run commentary, recaps, taste passes) run on the cheap narrator lane and cost well under a cent each — measured ≈0.1¢ for a diagnosis, ≈0.7¢ for a recap on Claude Haiku.
- Chat carries Marcel's full Brut knowledge (about 60K tokens of catalog, nodes, docs, styles and memory), which on a flagship model used to bill about 19¢ per turn. That prefix is now prompt-cached (Anthropic models): the first turn of a session writes the cache, and every following turn re-reads it at a tenth of the price — turns after the first land in the cents range, scaling mostly with how long his reply is. Cache accounting shows up in the ledger per call (write and read token counts), so the saving is verifiable, not promised.
- By default the cache lives for 1 hour and survives you working on the canvas between chats — chat, render for twenty minutes, chat again, and the second turn still reads the cache instead of rebuilding it. The first write costs about double a plain turn (≈36¢ on Sonnet at list), then following turns are cents. If your style is one rapid uninterrupted conversation, switch ⚙ Settings → Marcel → Prompt cache to 5 minutes for a cheaper first write (≈23¢) with a cache that expires in any pause. Studio events that land between turns (runs finishing, errors) re-bill only a small slice, not the whole prefix.
- Cheap-lane chat (Gemini Flash, GPT-5.4 Mini) stays in the 1–2¢ range per turn.
- One honesty note in your favor: Brut estimates at each provider's list price (estimates are ceilings, never surprises). Anthropic currently bills Claude Sonnet 5 at introductory rates (≈33% below list through August 2026), so your real Anthropic invoice runs under what the ledger shows for those calls.
When Marcel acts, one reply may take several model rounds (think → act → look at the result → continue). Each round is its own ledger row, so an acting turn costs a few text calls rather than one — still cents; the generations he triggers are the real spend, and those sit behind the confirm.
Ambient remarks (the Assist slider) are the cheapest of all: they skip the full knowledge pack, so a failure diagnosis, run comment or recap is typically well under a cent on the narrator lane — and at Off, exactly zero, because nothing fires. Each remark is its own ledger row (look for the narrator entries in the Marcel lane), so a typical session's ambient total is a number you can read, not a promise.
Privacy
The conversation goes from your machine straight to your chosen text provider on your key, and the diary, your taste profile, and project notes never leave your disk — see Privacy. Your taste profile is per-account and private; it is never included in an export or synced anywhere. When exporting, a checkbox controls whether the journal travels: on by default for folder exports (backups), off by default for .brutpack handoffs. Project notes travel with the project either way.