@creatorline/cli
v1.1.0
Published
Creatorline CLI - generate AI influencer photos and videos from your terminal, your CI, and your coding agent.
Maintainers
Readme
@creatorline/cli
Generate AI influencer photos and videos from your terminal, your CI, and your coding agent.
npm install -g @creatorline/cli
crl auth login # paste a key from Settings → API
crl gen create text-to-photo --prompt "golden hour rooftop" --wait --output-dir ./outZero runtime dependencies, Node 20+. Full docs: docs.creatorline.io · Help: [email protected]
Grammar
crl <command> <subcommand> [args] [flags]
| Command | Subcommands |
| --- | --- |
| auth | login, logout, whoami |
| models | list [tool], get <model-id> |
| voices | list |
| accounts | list, use <id\|name>, current, clear |
| gen | create <tool>, cost <tool>, get <id>, wait <id>, list |
| posts | create, publish <id>, list, get <id> |
| assets | list, get <id> |
| upload | crl upload <file> |
| credits | — |
| mcp | config, install |
generate aliases gen, creators aliases accounts, clips aliases posts.
Pick a creator once
crl accounts list
crl accounts use Eda # persisted, like the studio's creator switcherEvery later gen create and posts create runs as that creator — the output lands on
their wall and posts go to their connected channels. --account-id overrides it for one
command.
Generate, then publish
ASSET=$(crl gen create text-to-photo --prompt "matcha latte flatlay" --wait --json | jq -r '.output[0].asset_id')
crl posts create --asset "$ASSET" --caption "morning ritual ☕️" --publish nowposts create alone leaves the post in the studio's review queue (pending_review)
— nothing is public. --publish now|schedule|queue chains the publish call, and
crl posts publish <id> --now does it later. Publishing to a live account asks for
confirmation on a TTY; pass --yes in scripts.
crl posts list --status published
crl posts get <clip-id> # per-channel status and the live URLsGlobal flags
| Flag | Default | |
| --- | --- | --- |
| --json | | machine-readable output, and nothing else on stdout |
| --wait | | block until the generation finishes |
| --wait-timeout | 10m | give up waiting (the run continues server-side) |
| --wait-interval | 3s | poll interval |
| --output-dir | | download results to disk |
| --api-key, --api-url | | override the stored credentials |
| --no-color, --help, --version | | |
Every flag accepts both spellings: --aspect-ratio and --aspect_ratio are the same
flag. Model parameters are snake_case and CLI convention is kebab-case; guessing wrong
should not be a failure mode.
The model's flags are the model's schema
crl gen create fetches the model's schema first, then interprets the remaining flags
against it. So the CLI never hardcodes a model's parameters, and a new model works the day
it ships:
crl models get bytedance-seedance-2-0-reference-to-video-fast
crl gen create ugc-video --prompt "unboxing" --image ./face.png --duration 5 --aspect_ratio 9:16 --waitmodels get prints the whole schema: each input's modality and cap, each parameter's
allowed values or its numeric bounds (--duration 4–60 step 1), what opaque values
like caption styles and scene modes mean, whether a prompt is required, and the model's
maximum take length.
A wrong flag tells you the fix:
error Unknown flag --durations for model bytedance-seedance-2-0-reference-to-video-fast.
inputs: --image_urls --source_video
parameters: --duration --aspect_ratio --resolution --generate_audio
Run `crl models get bytedance-seedance-2-0-reference-to-video-fast` for values and defaults.Run flags that are not model parameters
| Flag | |
| --- | --- |
| --source-url <url> | work from a video link instead of a file, for a tool that takes one (short-clip). A bare URL positional does the same. |
| --no-account-avatar | keep the selected creator out of the output — a product shot posted on their account. |
| --voice_id, --voice_a, --voice_b | a voice from crl voices list; without one, the creator's own cloned voice is used. |
crl gen create short-clip https://youtu.be/xyz --wait --output-dir ./shorts
crl voices list --scope library --search "warm female" --language en
crl gen create text-to-speech --prompt "hey, welcome back" --voice_id <voice-id> --waitMedia flags take a path OR an id
--image ./face.png uploads the file and uses it. --image <asset-id> reuses an existing
asset. --image https://… hands the URL over as-is. No separate upload step, no
juggling ids — though crl upload <file> exists when you want to pin one.
Prompts from stdin
echo "a cinematic city at dusk" | crl gen create text-to-photo --waitCost before you spend
crl gen cost ugc-video --duration 10 # → "48 credits (…, balance 1216)"
crl credits # balance + recent ledgerlipsync, motion-control, scene-video, change-voice and short-clip are billed per
second of the source, not of the output. Give gen cost the same media the real run
will use — an asset id, a URL or --source-url — and it prices the actual length:
crl gen cost short-clip https://youtu.be/xyz # → "32 credits (short-clip, 635s, …)"Failed and moderation-blocked runs are refunded automatically.
Scripting and agents
Results go to stdout, progress and errors to stderr, so pipes stay clean:
crl gen list --json | jq -r '.data[] | select(.status=="succeeded") | .output[0].url'With --wait, crl gen create prints the media URL(s). Without it, the generation id.
Parallel fan-out is just shell job control — --wait blocks per process:
for tool in text-to-photo ugc-video; do
crl gen create "$tool" --prompt "$PROMPT" --wait --output-dir "./out/$tool" &
done
waitExit codes: 0 success · 1 usage or runtime error · 2 not authenticated · 3 out of
credits.
Configuration
Precedence: flags → environment → config file.
| | |
| --- | --- |
| CREATORLINE_API_KEY | the key |
| CREATORLINE_API_URL | the API root (default https://api.creatorline.io; a dev server is http://localhost:3000/api) |
| CREATORLINE_APP_URL | the studio, for printed links (default https://app.creatorline.io) |
| ~/.config/creatorline/config.json | written by crl auth login, mode 0600 |
CI wants the environment variable; there is no interactive login there.
MCP
crl mcp config # print the snippets
crl mcp install # run `claude mcp add` for youThe MCP server is remote and stateless — the CLI does not host it. Result URLs from stored objects are time-limited; download what you need.
