Agents

Command line

Drive braaand from your terminal, or wire it into scripts.

If you work in a terminal, the braaand command does everything the AI connector does. It's handy for scripting, and for setups like Claude Code.

Set it up

npm install -g braaand
braaand auth login

Everyday commands

braaand whoami
braaand resolve <id>            # any braaand id (or a braaand.ai/r/<id> link) → what it is + where to open it
braaand brands list
braaand brands info my-brand

braaand system-templates list
braaand system-templates instantiate hero-statement --brand my-brand
braaand templates list my-brand
braaand templates create my-brand "Campaign Quote" --from ./template.json
braaand render my-brand <creativeId> --all-formats
braaand render batch my-brand <creativeId> <creativeId>

Add --json to most read commands for output you can pipe into other tools.

braaand resolve is the universal lookup: paste a creative's crv_… id (copied from any sidebar in the app, or from a Slack delivery's #N · crv_… label) and it answers with the kind, name, brand, and app URL — brand-agnostic, so it works on any id you can access.

The synced brand folder

braaand sync mirrors every brand into one canonical local folder — assets, build-ready dist/ token artifacts, guidelines, and agent instructions. That folder is what coding agents build from; see The synced brand folder.

braaand sync                      # everything → ~/Documents/Braaand (default)
braaand sync status --json        # root + per-brand version/staleness (agent discovery)
braaand sync set-root ~/Sites/Braaand
braaand path my-brand             # print a brand folder's path

Template work

System templates are the shared catalog. Use them as starting points: instantiate one into a brand, then tune the resulting brand template. If a client needs a layout that does not exist in the catalog, create a brand template from JSON.

braaand system-templates instantiate hero-statement --brand my-brand --name "Hero Statement"
braaand templates create my-brand "Checklist Note" --from ./template.json
braaand templates update-element my-brand <templateId> headline --patch '{"formatOverrides":{"9x16":{"styles":{"fontSize":72}}}}'

Brand templates can include the full document surface: formats, elements, guides, clusters, groups, brandFit, styles, concept typeStyles, and roleColors.

Lists of subjects

A Set is a list of subjects — candidates, municipalities, audience segments — that a pipeline's For each node turns into one creative apiece.

braaand sets create my-brand --name "Candidates 2026" --csv ./candidates.csv
cat kommuner.csv | braaand sets create my-brand --name "Kommuner" --csv -
braaand sets list my-brand
braaand sets update my-brand <setId> --csv ./corrected.csv   # replaces every row
braaand sets find-person my-brand "Frida Karlsson"

--csv takes a file path, - for stdin, or the text itself. find-person searches your Sets and every photo carrying person details, and refuses to guess between two people who share a name — it returns the candidates instead, with the detail that tells them apart.

If your subjects are people you already have photos of, you may not need a Set at all: point the For each node straight at a collection or tag of images and it reads one subject per photo.

People

The brand's own people — the records a site's contact cards and team lists bind to.

braaand people sync my-brand                      # seed one record per name from person-tagged photos
braaand people list my-brand
braaand people create my-brand --first-name Anna --last-name Berg --title "Head of Strategy" --email anna@example.com
braaand people update my-brand <personId> --phone "+46 70 000 00 00"   # every bound site section follows
braaand people archive my-brand <personId>        # off every site, the record stays (restore brings them back)
braaand people erase my-brand <personId> --confirm <personId>   # permanent, for a data erasure request (admin)

sync is safe to run again: it fills blank fields and never overwrites a value someone set.

Editing images

images convert is the whole image editor on the command line — everything the Image Tool's controls do, batched over local files. It walks folders recursively, so you can point it at a whole directory. The work runs server-side on sharp, so it is exact, instant, and never charged as AI usage.

# Convert a folder of photos to WebP and add them to a brand's library
braaand images convert ./photos --brand my-brand --to webp --optimize --type photo --tags product

# Or write the converted files to a local folder instead
braaand images convert ./photos --out ./web --to avif --quality 55

# Exact ad dimensions, cropping the overflow
braaand images convert hero.jpg --out ./web --resize 1200x628 --fit cover

# Key a flat background out, then tighten the canvas to the artwork
braaand images convert badge.png --out ./web --remove-color "#ff00ff" --trim

# Straighten a scan, mirror it, sharpen it
braaand images convert scan.jpg --out ./fixed --rotate -1.5 --flip-h --sharpen 30

# Black out a region (left, top, width, height in source pixels)
braaand images convert scan.jpg --out ./redacted --mask-mode fill --mask-color "#000000" --mask-rect 120x340x480x90

# Erase everything outside a region, softening the edge
braaand images convert shot.jpg --out ./cut --mask-mode erase --mask-rect 200x150x800x800 --mask-invert --mask-feather 6

Because it runs as a subprocess, this is the right tool when a coding agent (like Claude Code) needs to "convert these and add them to brand X": the image bytes stream through the command, never through the conversation.

What Flags
Output --to webp|avif|jpeg|png, --quality 1-100, --optimize
Size --max <px> (cap the longest edge), --resize WxH (exact), --fit cover|contain|inside, --pad <#hex>
Geometry --flip-h, --flip-v, --rotate <deg>, --rotate-bg <#hex>, --trim, --trim-threshold
Tone --brightness, --contrast, --saturation, --sharpen 0-100, --blur 0-100
Transparency --remove-color <#hex>, --remove-color-at XxY, --key-tolerance 0-100, --flatten <#hex>
Regions --mask-mode erase|fill, --mask-rect LxTxWxH, --mask-color <#hex>, --mask-invert, --mask-feather <px>
Library --type, --tags

--max only ever shrinks; --resize hits an exact canvas — --fit cover fills and crops it, --fit contain fits the whole image and pads the rest with --pad.

Three ways to say which part of the picture you mean. A flat color you can point at is --remove-color (or --remove-color-at, which samples the color at a source pixel): exact, instant, free, and it cleans the color cast out of the edge pixels so nothing fringes. An explicit rectangle is --mask-rect, with --mask-mode erase for real transparency or --mask-mode fill --mask-color to cover something up; --mask-invert keeps only what is inside the rectangle, at the same canvas size. A photographic edge is the one case worth credits, and that is images remove-background below. Rectangles are in source pixels, measured before any crop or rotation.

Generating images (AI)

images generate creates a new image from a text prompt. Unlike images convert, this uses credits (billed to the brand's pool — roughly 2, 18, or 71 credits at low, medium, or high quality) and takes 15-60 seconds.

# Generate and save into a brand's asset library
braaand images generate "misty pine forest at dawn, soft golden light" --brand my-brand --aspect 16:9 --quality medium

# Or download it locally instead
braaand images generate "abstract blue gradient texture" --out ./generated --aspect 1:1 --quality low

Saved images land tagged generated / ai / agent and are analyzed so focal-point alignment works in templates. Write rich prompts (subject, composition, lighting, mood) — not stock-search keywords.

Removing a background

images remove-background cuts the subject out of a photograph and returns a real transparent edge. It is an AI edit under the hood, so it uses credits and takes 15-60 seconds.

# A local file, downloaded as a cutout
braaand images remove-background ./product.jpg --out ./cutouts --subject "the red bicycle"

# Or an image already in a brand's library, saved back as a new asset
braaand images remove-background --brand my-brand --asset <assetId>

Pass --subject whenever more than one thing in the frame could plausibly be the subject — without it the model chooses, and on a busy photo it can choose wrong. The original is never overwritten.

If the background is already a flat color, a generated sticker or a studio sweep or a screenshot, don't use this: images convert --remove-color "#hex" does the same job exactly, instantly and for free. If the part you want is simply a rectangle, images convert --mask-mode erase --mask-rect LxTxWxH --mask-invert is free too. Save this command for photographs, where no color test could find the subject.

Launching campaigns

workflows start hands braaand a brief: it matches templates, writes on-brand copy, then renders and scores a batch on a durable run that ends in a share-ready review board. Add --templates to pin exact brand templates instead of letting braaand match — matching is skipped and the run builds on your picks in order.

braaand workflows start my-brand --brief "spring campaign for our new espresso line" --count 8 --wait
braaand workflows start my-brand --brief "May 30 tasting event" --templates <id>,<id>
braaand workflows status my-brand <workflowId> --watch
braaand workflows log my-brand <workflowId>

Runs use the brand's plan credits and keep going after you close the terminal.

Running pipelines

A pipeline recipe is a node graph — score, route, board sections, variation fan-outs — with slots you fill in at run time. Three ship with every brand, no setup:

Recipe Slots What it does
batch brief, count N creatives from a brief, delivered to a board. No scoring.
reviewed-campaign brief, count, goal?, tone?, audience? The default campaign: scored and pre-sorted into Approved / Needs review.
variations-of-this creativeId, count N fresh takes on ONE creative you already have.

You can also save your own from the pipeline canvas in the web editor (or braaand pipelines create from a graph JSON) and launch it anywhere. A canvas save automatically makes the brief a required slot (and the creative count an optional one), so --bindings '{"brief":"…"}' is all a re-run needs; pin templates on the Templates node before saving and the graph becomes a fixed-layout recipe — same templates, fresh brief every run. A saved recipe named the same as a starter shadows it, which is how you customize one.

braaand pipelines list my-brand
braaand pipelines run my-brand batch --bindings '{"brief":"three posts about the reef","count":3}'
braaand pipelines run my-brand variations-of-this --bindings '{"creativeId":"crv_…","count":5}'
braaand pipelines run my-brand <ptl_id> --bindings '{"topic":"winter sale"}' --mode run

--mode run (the default) launches a durable run and spends credits; --mode draft sets it up on the canvas for a human to press Run. This is the same durable engine the web editor and MCP use — a batch launched here survives you closing the terminal.

Deleting safely

Destructive commands ask you to confirm:

braaand brands delete my-brand --yes --confirm-brand-id my-brand
braaand templates delete my-brand <templateId>   # checks where it's used first