Workflow Engine

Boards

The review surface — where a run's results land, get judged by humans, and go out for sign-off.

A board is where creatives go to be looked at: a durable review canvas of rendered cards, sorted into sections, with keep/discard, comments, and the command bar to edit them. Runs produce, boards hold — one board can collect the results of many runs, so a standing "Q3 winners" board keeps aggregating while campaigns come and go.

Boards are reached through their collection, and every run gets one automatically. You can also create one empty (from the API, CLI braaand boards create, or an agent) and fill it by hand — add any creative to any board, no run required.

A creative reaches a board by going through a Board node. Producing it isn't enough: a run whose graph has no Board node makes creatives you review on the canvas, and a Route path wired to nothing leaves its creatives off the board rather than dropping them in unsorted. That is what keeps a board an edited selection instead of a dump of everything the run touched.

Sending to a board afterwards. On a finished run's canvas, tick the creatives you want (the checkbox on each card) and use Send to a board in the right rail: pick this run's board, an existing board, or name a new one, optionally with a section. It is the Board node's own placement, applied to exactly what you picked.

Reviewing

A scored run arrives pre-sorted — Approved for 75 and up, Needs review for the rest, biggest score first within a section. Cards fill in live as the run builds. Each card shows the render, its score, and a one-line critique.

  • Keep or discard. Hover a card: ✓ keeps (ring), ⃠ discards (dims). The header keeps count. Kept creatives are the ones you deliver — and because a section's meaning is also where a card belongs, Tidy up afterwards moves what you kept into the kept section.
  • Iterate by talking. Open the command bar (⌘K, or the orb in the corner) and give plain direction — "make the top one punchier", "remove variant 3", "try #2 aimed at parents". The board reads as one conversation of its own, kept per board, and the grid updates as the work lands. Cards carry a #N badge: say "#3" and it resolves.
  • Reference a creative anywhere with its id. Select a card and the comments rail shows its canonical crv_… id — click to copy, or copy the braaand.ai/r/<id> link beside it. That id is unambiguous everywhere: paste it in the palette, a Slack mention, an email to a teammate, or braaand resolve in the terminal, and it means exactly this creative. The same chip shows on the client share page, so feedback can name the exact creative too.
  • Target specific cards. Select one or more on the canvas and your next message applies to exactly those. Explode a card into its content fields and select those to scope down to single lines. Clear the selection to address the whole board.
  • Open any card in the editor for hand fine-tuning; it opens in a new tab.

Sections mean things

Beyond visual grouping, a section can confer a status: drop a card into a section set to confer approved and the creative is approved, wherever else it appears. Color and meaning are independent — a red section named "Hot" can still confer approved. Pipelines use the same mechanism: a Board node targeting a named section applies that section's meaning to everything it delivers.

That meaning is also where a creative lands. However work arrives — a pipeline delivering, an iteration you asked for in the command bar, a creative you added by hand — it gets a real place, in the section whose meaning matches its status. An approved creative lands in the section that confers approved. Anything no section claims goes to the staging lane below the sections, so new work gathers in one spot instead of scattering over the arrangement.

Tidy up re-packs the board by that same rule: every card into the section it belongs in, gaps closed, sections resized to fit. It creates and destroys nothing — a card already sitting somewhere sensible stays there, and a group you arranged by hand is never emptied. On a board nothing has sorted yet, the button instead offers Sort into score bands, which creates High / Review / Cut sections and sorts the scored cards into them. Only one of the two shows at a time, so a board can never end up with two sorters disagreeing about it.

Downloading everything

Download in the board's top bar renders every creative on the board in every format it carries and saves them as one zip. A creative carries the formats of the template it was made from, so that is exactly the set its layout was designed for: a 3:4 feed post and a 4:5 fallback for one template, a 9:16 story as well for another. Choose All, Approved (only what has been approved on the board) or Selected (the cards you have picked). The menu shows how many files the zip will hold.

The download runs in the background: you can leave the board while it works, progress shows by the orb, and the zip saves itself when it's ready. Every image also lands in the brand's Renders library as it finishes, so an interrupted download never loses work. Finished video clips on a creative are included beside its stills.

Sharing for sign-off

Reviewers can approve a creative or request changes on it. The first time, requesting changes opens a note box on the card itself — what you write is filed against that creative and shows in the Comments rail, so the team receives the reason along with the verdict rather than an unexplained flag. Once a creative has notes, the same button opens the Comments rail on it instead, where you can read the thread, reply and keep the conversation going. The card carries a count of the notes on it.

Every board can mint a share link — a public, read-only review page that needs no braaand account. Hand it to whoever signs off; they see the current state of the board (renders update as you iterate, no re-send needed). The link authorizes exactly that board's renders and nothing else, and you can revoke it any time from the board's Share button. Runs started over the API or MCP return a shareUrl up front, so an external tool can pass the review link straight along.

Minting is idempotent: sharing a board that already has a link hands back the same one, so nothing a client has already opened stops working.

Sharing hand-built work

An agent that builds a creative by hand can finish the same way a pipeline run does — with a link. Adding to a board and sharing it is one call:

add_to_board({ brandId, boardTitle: "Client review", creativeIds: ["crv_…"], share: true })
  → { boardId, boardUrl, shareUrl }
braaand boards add <brandId> --title "Client review" --creatives crv_… --share

boardTitle finds-or-creates the board by name, so there's nothing to set up first. To share a board later, use share_board (MCP) or braaand boards share <brandId> <boardId>; revoke: true / --revoke kills the link. Over REST it's POST /api/brands/{brandId}/boards/{boardId}/share, or share: true in the body when you create the board or attach creatives.