PostEverywhere — Official CLI & Agent Skill

Post and schedule to Instagram, TikTok, YouTube, LinkedIn, Facebook, X, Threads, Pinterest, Bluesky, Telegram, Discord and WordPress from your terminal — or hand the whole thing to an AI agent.
This repo is two things at once: a CLI you can drive by hand, and an Agent Skill that teaches Claude Code, Cursor, Codex and other agents how to use it. Every command emits JSON, so an agent can read the result of what it just did.
Install as an agent skill
npx skills add posteverywhere/cli
That's it. Your agent now knows the whole command surface — connecting accounts, checking per-platform limits, scheduling, and reading back per-destination results. Then just ask:
"schedule a post to all my accounts for tomorrow at 9am"
Claude Code users can alternatively add it as a plugin, which brings auto-updates:
claude plugin marketplace add posteverywhere/cli
Install as a CLI
npm install -g @posteverywhere/cli
npx @posteverywhere/cli <command>
90-second setup
posteverywhere login
posteverywhere connect instagram
posteverywhere accounts
posteverywhere post -c "Hello 🚀" -a 123,456
For CI or a headless agent, skip login and set a key from Settings → Developers:
export POSTEVERYWHERE_API_KEY=pe_live_...
Commands
login / logout | Device-flow login (browser approval); remove saved credentials |
whoami | The authed account, plan and remaining quota |
accounts | Connected social accounts, with ids and health |
platform-rules [platform] | Character limits, media constraints and supported features |
connect <platform> | Connect a new account |
reconnect <accountId> | Re-authorize an account whose token expired |
account:health <id> | Why one account can't post |
post -c <text> -a <ids> [-s <iso>] [-m <mediaIds>] | Publish now, or schedule with -s |
post -a <ids> --title <t> --body-file <md> [--wp-status draft] [--tags a,b] [--categories c] | WordPress blog post (first image = featured image) |
posts | List posts, filterable by status and platform |
results <postId> | Per-platform success/failure for one post |
retry <postId> | Retry the failed destinations |
upload <url> | Import an image or MP4 video by URL → media_id (videos import async — poll until ready) |
caption -t <topic> | AI captions, tuned per platform |
analytics [--period] | Performance summary |
campaigns | List campaigns |
Add --json for machine-readable output. It turns on automatically when piped, so agents get JSON without asking.
Check the limits before you compose
platform-rules returns what each platform will actually accept, straight from the server:
$ posteverywhere platform-rules bluesky --json
{ "platform": "bluesky", "characterLimit": 300,
"features": ["threads", "quotes", "link_cards"], ... }
The limits differ by two orders of magnitude — Bluesky caps at 300 characters, Facebook at 63,206 — and TikTok rejects images outside its pixel ceiling server-side. Checking costs one call; guessing costs a failed publish. Because the values are server-authoritative, a newly supported platform shows up here with no update on your side.
🔗 Quick Links
CLI, MCP or SDK?
| An agent that can run shell commands (Claude Code, Codex, Cursor) | This CLI + npx skills add posteverywhere/cli |
| An agent that speaks MCP (Claude Desktop, ChatGPT, hosted agents) | @posteverywhere/mcp |
| To write your own application code | @posteverywhere/sdk |
All three hit the same v1 API, so an account connected once works everywhere.
Design notes
Zero runtime dependencies. Pure Node (≥18), one source file. npx is instant and there's no supply-chain surface to audit.
Credentials stay local. login writes a scoped key to ~/.posteverywhere/config.json at mode 600. POSTEVERYWHERE_API_KEY takes precedence when set, so CI never touches the file.
Errors are readable by machines. On failure the CLI prints {"error": "..."} to stderr and exits non-zero, so an agent can tell "account needs reconnect" from "out of quota" and act on it.
License
MIT — see LICENSE.