Skip to main content
Run mel --help or mel <group> --help at any time for the same reference in your terminal. Every command that creates a resource auto-generates a UUID if you don’t pass --id, and returns the created object as JSON.

Authentication

CommandDescription
mel auth login --api-key <key>Store and validate an API key in ~/.mel/config.json
mel auth logoutClear stored credentials
mel auth whoamiShow the current user (id, name, email)
mel auth create-key --name <name>Create a new API key (raw key shown once)
mel auth list-keysList keys for the current team
mel auth revoke-key --key-id <id>Revoke an API key (takes effect immediately)

Teams

CommandDescription
mel team listList the teams your key can act on (find a teamId here)
mel team currentShow the active team
mel team switch <teamId>Set the active team

Projects

CommandDescription
mel project listList projects in the current team
mel project get <id>Get a project by id
mel project create --title <t>Create a new project

Canvases

CommandDescription
mel canvas create <projectId>Create a canvas (returns the id used by every later command)
mel canvas list <projectId>List canvases in a project
mel canvas get <canvasId>Get canvas metadata
mel canvas content <canvasId>Primary read — live canvas state; add --node-id and --include-all-versions to inspect one node plus its edges
mel canvas plan-layout <canvasId>Compute positions for planned nodes (read-only)
mel canvas delete <canvasId>Delete a canvas and all its content

Nodes

Node mutations write directly to the live canvas — changes sync to connected browser clients in real time.
CommandDescription
mel node create <canvasId> --type <t>Add a node. Types: text, image, video, file, group
mel node bulk-create <canvasId> --json -Create multiple nodes and edges in one call
mel node update <canvasId> <nodeId>Update fields (prompt, title, geometry, model)
mel node delete <canvasId> <nodeId>Remove a node and its orphaned edges
mel node get <canvasId> <nodeId>Read a persisted node (prefer mel canvas content for live state)
mel node set-version <nodeId> --version-id <id>Switch the active output version
mel node group <canvasId> --node-ids <ids>Group existing nodes (computes the bounding box)
mel node ungroup <canvasId> <groupId>Ungroup and delete the group
mel node create options:
--type <type>        REQUIRED. text, image, video, file, group
--id <uuid>          Auto-generated if omitted
--title <title>      Defaults to the type name ("Image", "Text", …)
--prompt <text>      Text prompt
--model <m>          Model name (requires --variant)
--variant <v>        Model variant (requires --model)
--aspect-ratio <r>   21:9, 16:9, 4:3, 3:2, 1:1, 2:3, 3:4, 9:16, 9:21
--duration <n>       Output duration in seconds (video only)
--x --y --w --h      Geometry (sensible defaults per type)
--z-index <n>        Stacking order
--group-id <uuid>    Parent group
mel node update takes the same options (all optional); geometry must be updated as a full set (--x --y --w --h together).

Edges

CommandDescription
mel edge create <canvasId> --src <id> --dst <id> --type <t>Connect two nodes. Types: text, image, video, file
mel edge bulk-create <canvasId> --json -Create multiple edges at once
mel edge delete <canvasId> <edgeId>Remove an edge
Edge type determines data flow — an image edge passes the source node’s image output to the destination.

Runs

A run generates the output for a single node.
CommandDescription
mel run start <nodeId> --canvas-id <canvasId>Start a generation. Returns { id }
mel run get <runId>Status: pending, running, finished, failed
mel run wait <runId>Block until done. Exit 0 = finished, 1 = failed, 4 = timeout
mel run latest <canvasId>Latest run status for every node on a canvas
mel run download <runId>Presigned URL for a finished run’s output
mel run magic-resize <sourceNodeId> --canvas-id <id> --ratios <list>Resize a finished image into up to 5 aspect ratios in one call
Auto-model resolution. When --model/--variant are omitted, mel run start resolves the right model from platform defaults — including picking image-to-image when the node has an incoming image edge. --canvas-id is required so the CLI can verify the node and do edge-aware detection.
mel run start <nodeId> --canvas-id <canvasId>                               # auto
mel run start <nodeId> --canvas-id <canvasId> --model flux-pro --variant text-to-image

Bulk runs

Run an entire canvas in dependency order.
CommandDescription
mel bulk-run start <canvasId>Run all nodes tier by tier. Add --wait to block, --node-ids <ids> to scope
mel bulk-run get <bulkRunId>Status and per-node progress
mel bulk-run wait <bulkRunId>Block until done. Exit 0 = finished, 1 = failed, 4 = timeout
mel bulk-run download <bulkRunId>ZIP of leaf-node outputs → { url, filename, size }
Downstream nodes wait for their inputs; if a node fails, its dependents are skipped while independent branches continue.

Presets

Presets are pre-built canvas templates (nodes, edges, and groups).
CommandDescription
mel preset listList available presets
mel preset apply <canvasId> <presetId>Create all of a preset’s nodes, edges, and groups with proper layout

Models

CommandDescription
mel model list --category <text|image|video>Discover models, modes, aspect ratios, and credit costs
mel model defaultsShow the auto-model defaults per node type

Audio & fonts

CommandDescription
mel audio voice listList available ElevenLabs voices for text-to-speech and audio-to-audio nodes
mel font listList the team’s uploaded custom fonts (for the better-font-32b image model)

Comments

CommandDescription
mel comment list <canvasId>List comment threads
mel comment create <canvasId> --body <text> --x <n> --y <n>Start a thread at a canvas position
mel comment reply <threadId> --body <text>Reply to a thread
mel comment resolve <threadId>Mark a thread resolved

Presence

Show the agent’s live “working here” region on a canvas — visible in real time to everyone with the canvas open.
CommandDescription
mel presence claim <canvasId>Claim a region — --node-ids <ids> for existing nodes, --bounds <x,y,w,h> for empty space
mel presence release <canvasId>Release the claim (the overlay disappears for all viewers)

Assets

Search your team’s Files library (past uploads and generations) and place existing assets onto a canvas by reference — no re-upload, no duplicate. Requires a Pro or Enterprise plan.
CommandDescription
mel asset search <query>Semantic search of the team library, exact filename/title matches first. Returns up to 5 matches, each with assetId, filename, fileType, and preview URLs
mel asset place <canvasId> <assetIds...>Place existing assets onto a canvas by assetId (up to 10) — references the original asset and returns the created file nodeIds
mel asset search options:
--limit <n>          Max results, 1–5 (default 5)
--file-type <type>   Filter by media type: image, video, audio, pdf, text
--canvas-id <id>     Scope to one canvas's assets (filename match within it);
                     omit to search the whole team library by meaning
mel asset search returns assetIds — feed them straight into mel asset place, then wire the resulting nodes into generations with mel edge create:
mel asset search "black jacket shot" --file-type image
mel asset place <canvasId> <assetId1> <assetId2>

Uploads

Upload adds a new local file; mel asset search reuses one already in the team library.
CommandDescription
mel upload <filePath>Upload a local image → { assetId, url, … }
mel upload <filePath> --node-id <id>Upload and link to an existing node
mel upload <filePath> --canvas-id <id>Upload and associate with a canvas
Supported formats: PNG, JPEG, GIF, WebP, AVIF. Video must be generated on the canvas, not uploaded.

Configuration

CommandDescription
mel config get [key]Show all config, or one key
mel config set <key> <value>Set apiKey, baseUrl, or teamId
mel config pathPrint the config file path (~/.mel/config.json)

Shell completion

CommandDescription
mel completion bashPrint a bash completion script
mel completion zshPrint a zsh completion script
mel completion fishPrint a fish completion script
Generated from the live command tree, so completions never drift. See Installation → Shell completion for one-line setup per shell.

Global flags

Available on every command:
--json             JSON output (default)
--text             Tab-separated plain text
--fields <csv>     Select specific fields, e.g. --fields id,title,status
--quiet            Suppress output, exit code only
--verbose          Log request/response metadata to stderr (never your key)

Exit codes and errors

mel uses deterministic exit codes so scripts and agents can branch on the result without parsing text:
CodeMeaningWhat to do
0SuccessParse stdout
1API error (4xx/5xx)Read the error message
2Usage error (bad args)Fix the command
3Auth error (401/403)Re-authenticate or check the team
4TimeoutRetry or raise --timeout
5Network errorCheck connectivity
Errors are structured JSON on stderr:
{
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid or expired API key",
    "status": 401,
    "suggestion": "Run: mel auth login --api-key <key>"
  }
}
Every error carries a machine-readable code, a human-readable message, and usually a suggestion with the exact command to fix it.

Rate limiting

The API is rate limited per plan. On a 429, mel prints Rate limited — waiting Ns… to stderr, honors the Retry-After header (or backs off exponentially), and retries — so polling commands like mel run wait ride through a limit. stdout stays clean. After repeated 429s it gives up with a RATE_LIMITED error (exit 1).
Last modified on July 9, 2026