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/posteahora

PosteAhora

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

PropertyValue
nameposteahora
descriptionSocial 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
commandposteahora
allowed-toolsBash(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:

  1. Authenticate — posteahora auth
  2. Discover accounts — posteahora accounts to get the account ID for each platform. You cannot post without an explicit account ID.
  3. Upload media (optional) — posteahora upload <file> → returns a public URL to pass to --media.
  4. Create / schedule / publish — posteahora post …
  5. Verify — posteahora posts (or --json) to confirm status.
  6. 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; from upload)
  • --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, #headings and [text](url) render literally. Use emoji or numbers for bullets. (Discord renders Markdown.)
  • Hashtags go in the caption, as the last block. --hashtags does 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 post WITHOUT --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 --draft and 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 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.
  • HTTP 401 / 403 — key invalid or lacking scope; re-auth with a full-access key.
  • HTTP 429 — rate limited; wait and retry.

See also

Top skills in this category

postfast

@peturgeorgievv

Schedule 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.

86.0k

YouTube

@byungkyu

YouTube 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).

14529k

ATXP

@emilioacc

Access ATXP paid API tools for web search, AI image generation, music creation, video generation, X/Twitter search, email, and agent account management. Use...

3149k

Openai Whisper Api

@steipete

Transcribe audio via OpenAI Audio Transcriptions API (Whisper).

5228k

Edge TTS

@i3130002

Text-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.

3323k