Install
openclaw skills install @sashadiz/posteahoraSocial media scheduling & publishing CLI — plan, schedule and publish posts across Instagram, TikTok, YouTube, X (Twitter), Facebook, LinkedIn, Threads, Bluesky and Discord, powered by PosteAhora.
openclaw skills install @sashadiz/posteahoraSchedule and publish social media posts across every major network from the command line, powered by PosteAhora. Use this skill to create, schedule, publish and manage social content, organize a content-idea backlog, upload media, and read analytics on the user's behalf.
Check whether the CLI is available:
posteahora --version
If it isn't installed:
npm install -g @posteahora/cli
# or
pnpm install -g @posteahora/cli
The installed command is posteahora. It can also run via npx @posteahora/cli.
Official resources
| Property | Value |
|---|---|
| name | posteahora |
| description | Social media scheduling CLI for publishing across Instagram, TikTok, YouTube, X, Facebook, LinkedIn, Threads, Bluesky and Discord |
| command | posteahora |
| allowed-tools | Bash(posteahora:*) |
You MUST authenticate before running any other command. Every command fails without a valid key.
Check status first:
posteahora auth
If not authenticated, the user creates an API key in the app under
Settings → API & integrations (it looks like pah_live_…), then:
posteahora auth --key pah_live_xxxxxxxx
The key is validated and stored in ~/.posteahora/config.json. It can also be
supplied via the POSTEAHORA_API_KEY environment variable (useful in CI). Never
print, log, or echo the key.
Follow this order for any publishing task:
posteahora authposteahora accounts to get the account ID for each
platform. You cannot post without an explicit account ID.posteahora upload <file> → returns a public URL
to pass to --media.posteahora post …posteahora posts (or --json) to confirm status.posteahora analytics.posteahora auth --key pah_live_xxxx # save & validate a key
posteahora auth # show current status
posteahora logout # remove the saved key
posteahora accounts # human-readable table
posteahora accounts --json # machine-readable
Each row includes platform, username, the account id, and connection status.
Use the id in --to platform:accountId.
# Publish now to one or more channels
posteahora post "Launch day 🚀" --to twitter:a1b2 --to linkedin:c3d4
# Schedule for a future time (ISO 8601)
posteahora post "Morning tip" --to instagram:e5f6 --at 2026-07-20T09:00:00Z
# Draft only (nothing goes live)
posteahora post "Draft idea" --to twitter:a1b2 --draft
# With uploaded media
posteahora upload ./reel.mp4
posteahora post "New reel" --to instagram:e5f6 --media https://cdn.posteahora.com/… --at 2026-07-20T09:00:00Z
post options
--to platform:accountId — target channel (repeatable or comma-separated) (required)--media <url> — attach media (repeatable; from upload)--at <ISO 8601> — schedule for a future time (else publish now)--draft — create a draft instead of publishing--title, --hashtags a,b, --media-type image|video, --post-type post|reel|story--json — machine-readable outputposteahora posts --status scheduled # list posts by status
posteahora ideas add "5 hooks" --tags launch # add a backlog idea
posteahora ideas list
posteahora analytics --period 30d # performance across platforms
posteahora upload ./photo.jpg # upload media → public URL
The user will describe channels by name ("post to my Instagram and X"). Map each
name to a real account ID by running posteahora accounts and matching the
platform/username. Never guess an ID, and never fall back to "the first
account" — if a requested platform has no connected account, tell the user and
skip it.
posteahora post WITHOUT --draft, confirm the caption, channels, and time
with the user. When unsure, create a --draft and ask.posteahora auth --key pah_live_… (or set
POSTEAHORA_API_KEY).--at must be in the future — the scheduled time is in the past; pick a
future ISO 8601 timestamp.Invalid --to … — the value isn't platform:accountId; run
posteahora accounts and use a real ID.