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 loginEveryday 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 pathTemplate 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 6Because 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 lowSaved 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