posteahora
Social media scheduling & publishing CLI — plan, schedule and publish posts across 16 networks: Instagram, TikTok, YouTube, X (Twitter), Facebook, LinkedIn, Threads, Bluesky, Masto…
Alexander Osso
@sashadiz
What This Skill Does
CLI, MCP server, and REST API to schedule and publish social media posts across Instagram, TikTok, YouTube, X, Facebook, LinkedIn, Threads, Bluesky, and Discord. Supports media uploads, drafts, scheduling, and analytics retrieval.
Replaces manually posting to each social platform or using separate scheduling tools for each network by providing a single command-line interface to manage all major channels.
When to Use It
- Schedule a promotional post to publish simultaneously on Instagram, Twitter, and LinkedIn at a specific time
- Upload a video file and attach it to a TikTok or YouTube post from a CI/CD pipeline
- Create a draft post for client review before publishing to Facebook and Threads
- Pull analytics data for all connected social accounts to measure post performance
- Publish a breaking news update immediately to X, Facebook, and Discord from a terminal script
- Automate a weekly content calendar by scripting recurring posts across multiple platforms
Install
$ openclaw skills install @sashadiz/posteahoraPosteAhora
Schedule 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.
Install PosteAhora CLI if it doesn't exist
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
- Website: https://posteahora.com
- Docs: https://posteahora.com/docs
- API reference: https://posteahora.com/docs/api
- CLI on npm: https://www.npmjs.com/package/@posteahora/cli
- CLI on GitHub: https://github.com/posteahora/cli
- MCP server: https://github.com/posteahora/mcp
| Property | Value |
|---|---|
| name | posteahora |
| description | Social media scheduling CLI for publishing across 16 networks: Instagram, TikTok, YouTube, X, Facebook, LinkedIn, Threads, Bluesky, Mastodon, Discord, Telegram, WordPress, Dev.to, Tumblr, Pinterest and Google Business |
| command | posteahora |
| allowed-tools | Bash(posteahora:*) |
⚠️ Authentication Required
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.
Core workflow
Follow this order for any publishing task:
- Authenticate —
posteahora auth - Discover accounts —
posteahora accountsto get the account ID for each platform. You cannot post without an explicit account ID. - Upload media (optional) —
posteahora upload <file>→ returns a public URL to pass to--media. - Create / schedule / publish —
posteahora post … - Verify —
posteahora posts(or--json) to confirm status. - Analyze (optional) —
posteahora analytics.
Command reference
Authentication
posteahora auth --key pah_live_xxxx # save & validate a key
posteahora auth # show current status
posteahora logout # remove the saved key
Accounts
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.
Create a post
# 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; fromupload)--at <ISO 8601>— schedule for a future time (else publish now)--draft— create a draft instead of publishing--title,--media-type image|video,--post-type post|reel|story--json— machine-readable output--hashtags a,b— stored on the post but never published. Put hashtags in the caption text instead (see Caption formatting).
Caption formatting
The caption is published byte for byte — nothing re-wraps or trims it — so spacing is entirely your responsibility.
Multi-line captions need a heredoc. The caption is a raw positional argument
and the shell does not expand a backslash-n inside double quotes, so
posteahora post "line one\nline two" publishes the characters \n verbatim:
CAPTION=$(cat <<'EOF'
Hook line
🍷 Feature one
🥂 Feature two
Which one would you pick?
#tag #tag
EOF
)
posteahora post "$CAPTION" --to instagram:a1b2
Rules that apply to every caption:
- One empty line between blocks (hook, body, CTA, link, hashtags); a single line break inside a list. Never 3+ breaks in a row.
- No Markdown —
**bold**,- bullets,#headingsand[text](url)render literally. Use emoji or numbers for bullets. (Discord renders Markdown.) - Hashtags go in the caption, as the last block.
--hashtagsdoes not publish. - No URL in Instagram or TikTok captions — use "link in bio". URLs are fine on every other network.
- Caption limits: X 280 · Bluesky 300 (graphemes) · Threads 500 · Mastodon 500
(your instance may differ) · Pinterest 800 (description) · Google Business 1500 ·
Discord 2000 · Instagram/TikTok video 2200 · LinkedIn 3000 · Telegram 4096 (1024
with media) · TikTok photos 4000 · YouTube 5000 · Facebook 63206. Blog platforms
(WordPress, Dev.to, Tumblr) take the caption as the article body, with the title
as a separate field. Per-platform caption overrides exist in the API/MCP
(
platformCaptions) but the CLI has no flag for them — post separately per channel when the text has to differ.
Manage & analyze
posteahora 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
Handling account IDs
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.
Guardrails
- Publishing is outward-facing and hard to undo. Before running
posteahora postWITHOUT--draft, confirm the caption, channels, and time with the user — showing the caption with its real line breaks, so they approve the spacing that will actually publish. When unsure, create a--draftand ask. - Scheduled times must be in the future and ISO 8601.
- Never invent media URLs, analytics numbers, or claims in captions.
- Respect each platform's limits (e.g. X character count) — offer a per-platform caption instead of silently truncating.
- If a command fails, report the exact error message and stop; do not retry blindly.
- Never print or store the API key.
Errors
- "No API key…" — run
posteahora auth --key pah_live_…(or setPOSTEAHORA_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'tplatform:accountId; runposteahora accountsand use a real ID.- HTTP 401 / 403 — key invalid or lacking scope; re-auth with a full-access key.
- HTTP 429 — rate limited; wait and retry.
See also
- QUICK_START.md — the fastest path to a published post.
- ../schedule-content/references/caption-format.md — the caption contract in full.
- ../schedule-content/references/media.md — generating, uploading and sizing visuals.
- ../schedule-content/references/content-themes.md — brand voice and content pillars.
- FEATURES.md — full capability list.
- PLATFORMS.md — per-platform support.
- PUBLISHING.md — how publishing & scheduling work.
- SUPPORTED_FILE_TYPES.md — accepted media formats.
- examples/ — ready-to-run command examples.
Top skills in this category
postfast
@peturgeorgievvSchedule and manage social media posts across TikTok, Instagram, Facebook, X (Twitter), YouTube, LinkedIn, Threads, Bluesky, Pinterest, Telegram, and Google Business Profile using the PostFast API. Use when the user wants to schedule social media posts, manage social media content, upload media for social posting, list connected social accounts, check scheduled posts, delete scheduled posts, cross-post content to multiple platforms, manage Google Business Profile posts, geotag posts with real-world places, pick trending pre-cleared TikTok sounds for photo and carousel posts, read or reply to the comments on their posts (social inbox — TikTok, Instagram, Facebook, Threads), triage or moderate comment conversations, generate a connect link so an agency client or their own app's user can connect accounts without a PostFast account, or automate their social media workflow. PostFast is a SaaS tool — no self-hosting required.
YouTube
@byungkyuYouTube Data API integration with managed OAuth. Search videos, manage playlists, access channel data, and interact with comments. Use this skill when users want to interact with YouTube. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Calls run through the `maton` CLI with OAuth login, or over raw HTTP with a Maton API key where the CLI cannot be installed. Every call is authenticated as the user's connection and reaches only what that connection's authorization allows, which the provider enforces on every request; the endpoints documented here are the ones this skill uses, and any other endpoint of this app needs the user to ask for it by name. Default to read and list calls, and confirm every write or new connection with the user. This file also documents the three constructs that turn a YouTube connection into automation, in the order they are used: the connection (the first step), a hosted function that runs a YouTube action through the Maton SDK, and a trigger that calls that function on a schedule or on an event. Those sections are the platform's own reference text, shared with the api-gateway skill, with YouTube examples; they add no YouTube capability - YouTube is not an event source, a trigger cannot read YouTube data, and the files under `references/<source>/triggers.md` are the platform's event catalogues for the sources Maton offers (time, Calendly, GitHub, Gmail, HubSpot, Linear, Notion, Slack, Stripe).
ATXP
@emilioaccAccess ATXP paid API tools for web search, AI image generation, music creation, video generation, X/Twitter search, email, and agent account management. Use...
Openai Whisper Api
@steipeteTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
Edge TTS
@i3130002Text-to-speech conversion using node-edge-tts npm package for generating audio from text. Supports multiple voices, languages, speed adjustment, pitch control, and subtitle generation. Use when: (1) User requests audio/voice output with the "tts" trigger or keyword. (2) Content needs to be spoken rather than read (multitasking, accessibility, driving, cooking). (3) User wants a specific voice, speed, pitch, or format for TTS output.