Posthell cli
Skill Rohan27s/posthell-cli
Schedule and publish social media posts through posthell from the command line. Use when the user wants to draft, schedule, or publish a post, thread, or update to LinkedIn, X, Threads, Bluesky, Instagram, TikTok, YouTube, Facebook, Reddit, Pinterest, Telegram, Discord, Snapchat, Google Business, or WhatsApp - or asks to "post this", "schedule a post", "share this on socials", or "draft a post". Runs the `posthell` CLI (a thin, safe wrapper over the posthell API).From its SKILL.md
npx -y skills add Rohan27s/posthell-cliAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.7 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
posthell
Draft, schedule, and publish social posts across up to 15 networks with the posthell
CLI. Every command prints JSON on stdout (parse with jq); errors print to stderr with
a non-zero exit code.
⚠️ Hard rules (read first)
- Auth is required.
PH_API_KEYmust be set to aph_...key (from posthell Settings -> Agent access). If a command returns an auth error, tell the user to set it:export PH_API_KEY=ph_.... Do not invent a key. draftnever publishes. It queues a draft the user approves in the posthell dashboard. This is the SAFE default - prefer it unless the user clearly asked to publish now or on a schedule.publishis opt-in and X-safe. It only works if the user enabled "Publishing" for the key, and it only sends to NON-X networks. X is always saved as a draft for the user to approve, because X posts cost money. You cannot override this - the server enforces it. Ifpublishsays publishing isn't enabled, tell the user to flip the key to "Publishing" in Settings -> Agent access; do not retry in a loop.shapeuses the user's monthly AI quota. Use it when notes need turning into a post, not on every call.- Never fabricate results. Report exactly what the JSON says (published vs drafted, which networks, any error).
Core workflow
1. Discover posthell accounts # which networks are connected
2. (optional) posthell shape "<rough notes>" # notes -> 2-3 post angles
3a. Safe path posthell draft "<text>" -p <networks> # queue for approval
3b. Publish path posthell publish "<text>" -p <networks> # only if user asked + key allows
4. Verify posthell posts # confirm it is queued/live
Decision rule: if the user said "draft/prepare/queue" or the intent is unclear, use
draft. Use publish only when the user explicitly wants it live now or scheduled.
Commands
posthell accounts
# -> { "accounts": [ { "platform": "linkedin", "handle": "...", "followers": 1200 }, ... ] }
# List connected networks. Call this first so you target networks the user actually has.
posthell shape "shipped dark mode today, 3 users had asked for it"
# -> { "angles": ["...","...","..."], "generationsRemainingThisMonth": 39 }
# Turn rough notes into 2-3 finished post angles in the user's voice. Pick one for -c below.
posthell draft "Dark mode is live." -p linkedin,threads
# -> { "draftId": "...", "status": "draft", "targets": ["linkedin (...)","threads (...)"] }
# Queue a DRAFT. Never publishes. Omit -p to target every connected account.
# Optional -s <ISO 8601> proposes a time that pre-fills the user's scheduler.
posthell publish "Dark mode is live." -p linkedin,bluesky
# -> { "postId": "...", "published": [ { "platform": "linkedin", "status": "publishing" } ],
# "xDraftedForApproval": ["x (...)"], "xDraftPostId": "..." } # X only if it was targeted
# Publish for real to NON-X networks now. Add -s <ISO 8601> to schedule instead of now.
# Any X target comes back under xDraftedForApproval as a separate draft to approve.
posthell posts --status draft
# -> { "posts": [ { "id": "...", "status": "draft", "platforms": [...], "body": "..." } ] }
# List recent posts/drafts. --status one of: draft|scheduled|posted|failed|partly_posted.
# -n / --limit sets how many (default 15). Call before drafting to avoid duplicates.
posthell growth
# -> { "totalGrowth7d": 84, "networks": [...], "read": "linkedin is growing fastest ..." }
# 7-day follower growth per network + where posting matters most.
Flags
| Flag | Meaning |
|---|---|
-c, --content <text> | Post text (or pass it as the trailing argument) |
-p, --platforms <list> | Comma-separated networks, e.g. linkedin,threads,bluesky |
-s, --schedule <iso> | ISO 8601 time, e.g. 2026-07-08T15:00:00Z (schedule instead of now) |
--status <status> | Filter posts: draft|scheduled|posted|failed|partly_posted |
-n, --limit <n> | Max posts to list (default 15) |
Networks
x, linkedin, instagram, threads, bluesky, facebook, tiktok, youtube,
pinterest, reddit, telegram, discord, snapchat, googlebusiness, whatsapp.
- Only
xis metered (it costs credits; a link post costs ~13x a plain one). Every other network is free. - Post the same text everywhere, or run per-network
draft/publishcalls with different-ctext when a network needs its own phrasing (e.g. shorter for X).
Common gotchas (do X, not Y)
- Publishing fails with "not enabled" -> the KEY lacks publishing. Tell the user to enable it in Settings; do NOT keep retrying, and do NOT try to publish X another way.
- Want X posted -> you cannot auto-publish X. Use
draft(or letpublishdraft it) and tell the user to approve it. - No
-pgiven -> the post goes to ALL connected accounts. Pass-pto be specific. - Times must be ISO 8601 with an offset (
2026-07-08T15:00:00Z), not "tomorrow 3pm". - Rate limits (per key): shape 6/min, draft 12/min, publish 6/min, reads 30/min. On a 429, wait a moment and retry once - do not hammer.
- Don't call
shapejust to reword something small; it spends the AI quota.
Copy-paste setups (heartbeat, cron, weekly growth recap): see RECIPES.md in this package.
Full docs: https://www.posthell.com/mcp
What ships with it: 6 files
18.1 KB alongside SKILL.md, 1 of them executable
bin/
- posthell.jsruns8.6 KB
- .gitignore45 B
- LICENSE1.0 KB
- package.json1.1 KB
- README.md3.5 KB
- RECIPES.md3.8 KB
Gives 0 of the 12 instructions most social media skills give in ~1.5k tokens
Counted across 489 of the 492 authors here whose files we hold, read 2026-08-07
- Adapt formats and tone to each platformin 26 of 489, across 14 files
- Build content around three to five pillarsin 25 of 489, across 13 files
- Read product marketing context before asking questionsin 23 of 489, across 13 files
- Respond to all comments on your postsin 21 of 489, across 9 files
- Use the output flag to specify an output directoryin 14 of 489, across 4 files
- Generate output logo images with white backgroundin 13 of 489, across 4 files
- Fix failing generation scripts directlyin 13 of 489, across 4 files
- Ask user about HTML preview after logo generationin 12 of 489, across 3 files
- Run the download script with a URLin 12 of 489, across 3 files
- Implement exponential backoff for 429 responsesin 12 of 489, across 3 files
- Write the hook firstin 12 of 489, across 7 files
- Include a single clear call to actionin 12 of 489, across 9 files
Said here and by no other author read
- list connected networks before targeting them
- use draft when intent is unclear
- check existing posts before drafting
- verify queued posts after sending
- propose schedule times using ISO 8601 format
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.