Post to every network
from your terminal

Schedule and publish to X, LinkedIn, Instagram, TikTok, YouTube and more with one command. Script it, cron it, or run it from CI.

$ npm install -g bulkit-cli
Why the CLI

Built for pipes and pipelines

A terminal tool that behaves the way your shell expects.

Publishing

One command, a native post everywhere

posts create sends one post to every channel you pass with -c, and each network gets it in its own format. Attach media with -m, or tailor the text per channel with --file.

Scripting

Pipes cleanly into anything

Ids go to stdout and messages to stderr, so id=$(bulkit posts create …) just works. --json prints the API's objects unchanged, and stays stable between releases.

CI

Never hangs a pipeline

Without a terminal the CLI never prompts: anything that needs a yes fails until you pass --yes. Every kind of failure has its own exit code, and --wait holds the job until every channel is done.

Completion

Tab knows every command

Tab completes commands, flags and values like --status, with descriptions in zsh and fish. One line in your shell's startup file sets it up.

Channels

Every network, one -c away

Pass -c once per channel, by id, @username, name or platform. One post goes to all of them.

FAQ

CLI FAQ

  • What do I need to run it?

    Node.js 22.12 or later. Install it globally with npm install -g bulkit-cli, or run it without installing: npx bulkit-cli --help.

  • How do I log in?

    Create an API key in the Bulkit app under Developers → API & Webhooks, then run bulkit auth login and paste it (input is hidden). Keys are saved in ~/.config/bulkit/config.json, readable only by you. Use --profile to keep keys for several workspaces.

  • How do I use it in CI?

    Set BULKIT_API_KEY in the environment, or pipe the key into bulkit auth login --with-key. Without a terminal the CLI never prompts: anything that would ask for confirmation fails until you pass --yes. Exit codes tell your pipeline what went wrong.

  • Can I try it without posting anything?

    Yes. A test key (bk_test_…) validates every request like a live key but never publishes and is never billed. With a live key, the CLI asks before anything public or destructive, and posts create --dry-run prints the request body without sending it.

  • What if a post fails to publish?

    bulkit posts list --status failed finds it, and bulkit posts publish <id> retries it: channels that already published are skipped. In scripts, pass the same --idempotency-key when you retry a create and the API won't make a duplicate.

  • Does --now mean the post is live?

    Not yet. Publishing is asynchronous: --now and posts publish return once the post is queued. Add --wait to block until every channel has finished; the command exits 1 if any channel failed.

  • Does the CLI cost extra?

    No. CLI calls are billed like any other action, included in your 500 monthly actions, then $0.01 each. The package itself is MIT-licensed.

One command away from every network

$4.99/mo, 500 actions included. The CLI is free on every plan.