npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@creatorline/cli

v1.1.0

Published

Creatorline CLI - generate AI influencer photos and videos from your terminal, your CI, and your coding agent.

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 ./out

Zero 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 switcher

Every 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 now

posts 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 URLs

Global 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 --wait

models 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> --wait

Media 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 --wait

Cost before you spend

crl gen cost ugc-video --duration 10        # → "48 credits (…, balance 1216)"
crl credits                                 # balance + recent ledger

lipsync, 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
wait

Exit 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 you

The MCP server is remote and stateless — the CLI does not host it. Result URLs from stored objects are time-limited; download what you need.