Skip to content
Content
Skill

/post-publisher

Publish assets to Instagram, Threads, TikTok, X, YouTube, Telegram or LinkedIn, and syndicate articles to dev.to, Telegraph or Hashnode with a canonical URL. Dry-run by default. Use when: 'опубликуй это', 'выложи карусель в треды', 'post this to Instagram', 'кросс-постинг

From plugin
skills
2645 skills2 commands1 hook

Claude Code

$ npx -y skills add Mikefluff/skills --skill post-publisher --agent claude-code

SKILL.md

post-publisher.SKILL.md
name: post-publisher
description: "Publish assets to Instagram, Threads, TikTok, X, YouTube, Telegram or LinkedIn, and syndicate articles to dev.to, Telegraph or Hashnode with a canonical URL. Dry-run by default. Use when: 'опубликуй это', 'выложи карусель в треды', 'post this to Instagram', 'кросс-постинг статьи', 'syndicate this article'."

license: MIT
allowed-tools:
  - Read
  - Write
  - Edit
  - Bash
  - Grep
  - Glob

<objective> The last mile. Every other skill in this collection stops at `./generated/...`; this one sends what is there to the platform and records that it did.

Input: an output directory from `carousel-builder` / `reel-builder` (or a single file, or just text). Output: a live post or a platform-side draft, plus a `posted.json` receipt.

This skill does NOT:

  • Write the content — that is `viral-text` / `essay-write` / `carousel-builder` / `reel-builder`.
  • Schedule anything. There is no queue and no cron. It publishes now, or it stages a draft you finish by hand.
  • Post to a platform you have not connected. Credentials are yours; nothing is bundled.
  • Guarantee reach, or touch analytics.

</objective>

ROLE

Resolve a source directory → build one platform-neutral `Post` → preflight it against each target platform's real limits → show the user exactly what would go where → ask → publish → write a receipt.

**Publication is irreversible. Dry-run is the default and `--yes` is what leaves it.** Even with `--yes`, each platform is confirmed separately: approving an Instagram post is not approval to also post to X.

PIPELINE

1. **Resolve the source.** A directory is inspected in this order: `final.mp4` → video; several images → carousel (sorted numerically, so `slide-2` precedes `slide-10`); one image → image; nothing → text post. Override with `--kind`.

2. **Resolve the caption.** From `--text`, else `--text-file`, else `captions.md` in the source directory. The parser looks for a `## Main post` / `## Основной пост` heading and takes everything up to the next heading; with no such heading it takes the whole file minus headings. **Always check the extracted text in the dry-run preview** — `captions.md` is written by an agent, so its shape is a convention, not a contract.

3. **Preflight, per platform.** Character limits including hashtags, media count, file size, extension, missing alt text, and each platform's own rules (Telegram's 1024-char caption ceiling that does not apply to text posts; Instagram's 24h posting cap; TikTok's audit caveat). A `block` finding means nothing is sent; a `warn` means it goes but you should know.

4. **Preview + confirm.** Full text, character count, every file with its size and alt text, and whether it is going out live or as a draft.

5. **Publish, then record.** The receipt (`posted.json`) is written immediately after each platform succeeds — a crash mid-fan-out cannot cause a re-post of the platforms already done. A later run with identical content is refused unless `--force`.

PLATFORMS

| Platform | Post kinds | Draft | The thing that will bite you | |---|---|---|---| | `telegram` | text, image, carousel, video | — | Caption on media caps at 1024 chars (text-only gets 4096). Video ≤50 MB. **The only one testable end-to-end without OAuth — start here.** | | `threads` | text, image, carousel, video | container | 500 chars. Text-only posts need no S3 — the easiest real connection. | | `instagram` | image, carousel, video | container | Business/Creator account required. Media is fetched by URL, so **S3 is mandatory**. Video publishes as a Reel (≤300 MB, ≤15 min). 100 posts/24h. | | `tiktok` | video, image, carousel | **inbox** | Direct publishing needs an audited app; without one, posts are silently forced to SELF_ONLY. **Use `--draft`.** | | `x` | text, image, carousel, video | — | 280 chars. 10,000/24h per app, 100/15min per user; what you may spend depends on the plan. Threads publish incrementally — a failure mid-chain leaves earlier posts live. | | `youtube` | video | `private` | 100 uploads/day on their own allocation, drafts included. Cleanest draft of the seven. | | `linkedin` | text, image, carousel, video | — | 3000 chars. Member posts work with `w_member_social`; company pages need the partner-gated Community Management API. |

MODES

Source

  • `post-publisher <dir>` — a `carousel-builder` / `reel-builder` output directory
  • `post-publisher <file>` — a single image or video
  • `post-publisher --kind text --text "..."` — no source at all

Targeting

  • `--platform a,b,c` — comma-separated; each is confirmed separately
  • `--draft` — stage instead of publish. A platform without drafts is **skipped**, not published live
  • `--kind text|image|carousel|video|article` — override auto-detection

Content

  • `--text` / `--text-file` — caption (overrides `captions.md`)
  • `--title` — YouTube title / LinkedIn article title
  • `--hashtags "a,b,c"` — kept separate from the body so preflight can count them
  • `--alt "..."` — repeat once per media file, in order
  • `--link` — attached where the platform supports it

Article syndication (`--kind article`)

  • `--canonical <url>` — **the important one.** The URL of the original on your own domain
  • `--description` — SEO excerpt / subtitle
  • `--series` — dev.to series name, Hashnode series id
  • `--cover-url` — cover image, already hosted
  • `--packets <dir>` — write submission packets for the platforms with no API

Execution

  • *(nothing)* — dry-run. Prints what would happen and stops
  • `--yes` — leave dry-run. Still asks before each platform
  • `--force` — publish despite a matching receipt in `posted.json`
  • `--publish-container <id>` — publish a Meta container left by an earlier `--draft`
  • `--check --platform X` — readiness: credentials present, token usable
  • `--list-platforms` — everything, with what each is missing

Exit codes

| Code | Meaning | |---|---| | `0` | Everything asked for happened, or was already done | | `1` | At least one platform failed — blo

Read more
@mikefluff
Ships withskills

45 skills for Claude Code that make content — and refuse to let it read like a machine made it. Prose editing that strips the tells. Prompt engineering for 40+ image, video and music models, with optional one-command execution against the real APIs.

Stars on GitHub

Momentum

stars in total
26
Star history of Mikefluff/skills on GitHub, a chart by star-history.com

Other skills on skills.

audio-mix-maker

audio-mix-maker

Mix music/audio onto an existing video via ffmpeg. Modes: replace, overlay, duck (sidechain compressor lowers music under…

@mikefluff@mikefluffInstall Skill
avatar-maker

avatar-maker

Turn a user photo into N profile-pic / headshot / avatar variants in a consistent style. Identity-preserve focused, defaults to…

@mikefluff@mikefluffInstall Skill
banner-maker

banner-maker

Banner-ad / display-creative generator with standard-size presets: Google Display (leaderboard, medium rectangle, mobile,…

@mikefluff@mikefluffInstall Skill
bg-remover

bg-remover

Background removal utility — image in, transparent PNG out. Wraps Replicate-hosted models (851-labs/background-remover default;…

@mikefluff@mikefluffInstall Skill
canon-check

canon-check

Read-only story-bible auditor for fiction series with a documented canon. Cross-references character / artifact / location…

@mikefluff@mikefluffInstall Skill
carousel-builder

carousel-builder

Turn a topic or research brief into an N-slide Instagram / LinkedIn / TikTok carousel with consistent visual style and…

@mikefluff@mikefluffInstall Skill

More skills from other plugins.

prompt-lookup

prompt-lookup

Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use…

@gh-f@gh-fInstall Skill
ppt-master

ppt-master

AI-driven presentation workflow for generating editable PPTX decks and slides, reconstructing page visuals, creating reusable…

@hugohe3@hugohe3Install Skill
morph-ppt

morph-ppt

Use this skill when the user wants a .pptx with smooth cross-slide animation — PowerPoint Morph transitions, Keynote-style…

@iofficeai@iofficeaiInstall Skill

Questions about post-publisher.

Which coding agents can use post-publisher?
post-publisher installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.