Motif
One command line over every image model. You name the job; Motif picks the model, prices the run before it spends and hands back the file. It runs on fal today, and the same commands will carry other providers.
npm install -g @howells/motif-climotif "amber apothecary bottles and a stoneware bowl on a stone shelf"
motif "amber apothecary bottles and a stoneware bowl on a stone shelf"Three bottles and a bowl, made from the prompt.
Every command
One verb per job. Motif chooses the model and prices the run before it spends anything.
Make
generateMake an image from a promptvaryVariations of an imageseries runA consistent set from a themesheetA captioned contact sheetanimateTurn an image into a videotileA seamlessly tiling texturemeshA textured 3D meshEdit
eraseRemove something, fill the gapcutoutRemove the backgroundreframeExtend to a new aspect ratioupscaleMake it largerrestoreFix noise, blur, damage or colourrelightRelight a photorestyleRedraw in a reference's styletry-onDress a person in a garmentlayersSplit into transparent layersvectorizeTrace to a clean SVGUnderstand
segmentMask a named thingaskCaption, count, find or askmapDepth, edge, normal or posematerialPBR maps from a photoMake an image from a prompt
A celadon vase made straight onto a transparent background, with no cut-out step.
motif "a ceramic vase with a pale celadon glaze" --transparent
Variations of an image
Three more takes of the same vase. No prompt needed: the picture is the instruction.
motif vary vase.jpg -n 3


A seamlessly tiling texture
The tile on the left, the same file repeated nine times on the right. The joins do not show.
motif tile "Cotswold dry stone wall with lichen"
Looks
Add one to any prompt with --look. A look sets the medium, the finish and the framing.

--look editorialDaylight, restrained palette, space around the subject.
--look drawingPencil under flat washes, the drawing still showing through.
--look ephemeraPrinted paper that has been handled: foxing, wear, a used press.Moods
One kitchen, one prompt, one seed. Only the light changes.

motif "a family kitchen with a scrubbed oak table" --look lived-in --mood lamplit --seed 4217Hold to compare
The big image is the result. The small one sitting on it is what went in. Press and hold the source to see it full size; let go and the result comes back.


before--garment
What runs where
Every command runs on fal today, choosing from the number of models shown. Underneath the commands, the SDK can call four providers itself, for making and editing an image, so a prompt can go to Google, OpenAI or Replicate instead.
| Command | fal | OpenAI, Google, Replicate | |||
|---|---|---|---|---|---|
generateMake an image from a prompt | 31models | Make, edit | Make, edit | Make, edit | Make, edit |
varyVariations of an image | 20models | Make, edit | Make, edit | Make, edit | Make, edit |
animateTurn an image into a video | 2models | Not available | Not available | Not available | Not available |
eraseRemove something, fill the gap | 7models | Not available | Not available | Not available | Not available |
cutoutRemove the background | 6models | Not available | Not available | Not available | Not available |
reframeExtend to a new aspect ratio | 4models | Not available | Not available | Not available | Not available |
upscaleMake it larger | 9models | Not available | Not available | Not available | Not available |
restoreFix noise, blur, damage or colour | 7models | Not available | Not available | Not available | Not available |
relightRelight a photo | 3models | Not available | Not available | Not available | Not available |
restyleRedraw in a reference's style | 1model | Not available | Not available | Not available | Not available |
try-onDress a person in a garment | 1model | Not available | Not available | Not available | Not available |
layersSplit into transparent layers | 3models | Not available | Not available | Not available | Not available |
vectorizeTrace to a clean SVG | 2models | Not available | Not available | Not available | Not available |
segmentMask a named thing | 7models | Not available | Not available | Not available | Not available |
askCaption, count, find or ask | 6models | Not available | Not available | Not available | Not available |
mapDepth, edge, normal or pose | 13models | Not available | Not available | Not available | Not available |
materialPBR maps from a photo | 2models | Not available | Not available | Not available | Not available |
tileA seamlessly tiling texture | 2models | Not available | Not available | Not available | Not available |
meshA textured 3D mesh | 5models | Not available | Not available | Not available | Not available |
series runA consistent set from a theme | Same 31 as generate | Not available | Not available | Not available | Not available |
sheetA captioned contact sheet | No model; made here | Not available | Not available | Not available | Not available |
Make, edit means the SDK calls that provider directly, with that provider's own key, and only for those two jobs. Transparent output already works this way, running on OpenAI rather than fal. Everything else goes through fal, which hosts models from Google, OpenAI, ByteDance, Ideogram, Topaz and others under one key.
For agents
Every command answers --format json, prices a run with --dry-run and fails with a coded error.
motif erase "the bottle" shelf.jpg --dry-run{"cost":0.024,"costBasis":"projected","valid":true}motif remove "the car" street.jpgUnknown command "remove". Did you mean: erase, cutout, segment?
motif --describe tasks --format json{"task":"erase","summary":"Remove something
and fill the gap",
"tiers":["fast","balanced","quality"]}