Skip to content
Content
Skill

/tt-caption-writer

Write a TikTok caption under 2,200 chars (hashtags included), pick a tasteful 3 to 5 hashtag set with mixed reach, and set the platformSettings.tiktok flags (viewer setting, comments, duet, stitch, commercial and branded content). Front-loads a reason to comment, runs the

From plugin
tiktok-skills
1038 skills

Claude Code

$ npx -y skills add sergebulaev/tiktok-skills --skill tt-caption-writer --agent claude-code

SKILL.md

tt-caption-writer.SKILL.md
name: tt-caption-writer
description: "Write a TikTok caption under 2,200 chars (hashtags included), pick a tasteful 3 to 5 hashtag set with mixed reach, and set the platformSettings.tiktok flags (viewer setting, comments, duet, stitch, commercial and branded content). Front-loads a reason to comment, runs the humanizer pass, and publishes the rendered video via Publora on approval. Use to caption a finished video. Not for the in-video hook (use tt-hook-scripter) or scrubbing a script (use tt-humanizer)."

TikTok Caption Writer

Write the caption that sits under the video: a tight caption inside the 2,200 char API limit, a mixed-reach hashtag set, and the `platformSettings.tiktok` flags that control reach and interaction. On TikTok the caption supports the video, it does not carry it. The hook is in the first 1-3 seconds of the clip (see `tt-hook-scripter`); the caption's job is to add context and earn a comment.

When to use

  • User has a video (or a script) and needs the caption, hashtags, and settings
  • User is about to upload and wants the posting flags right
  • User wants Claude Code or Codex to schedule a rendered .mp4 via Publora

What this skill produces

  • **Caption** (<= 2,200 chars on the API; aim much shorter), first line front-

loaded with a reason to read or comment

  • **Hashtag set** (3 to 5, mixed reach), placed at the end
  • **platformSettings.tiktok** flags with a plain-English summary
  • On approval, the publish call (draft -> upload -> schedule) when a video file

is supplied

The TikTok settings (platformSettings.tiktok)

Build these with `lib.tiktok_settings(...)`. Defaults match Publora's.

| Setting | Values / default | What it does | |---|---|---| | `viewerSetting` | PUBLIC_TO_EVERYONE (default), MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY | who can view. Effectively required; an empty value is rejected | | `allowComments` | true (default) | viewers can comment | | `allowDuet` | false (default) | viewers can Duet | | `allowStitch` | false (default) | viewers can Stitch | | `commercialContent` | false (default) | the video is commercial | | `brandOrganic` | false (default) | promoting your own brand | | `brandedContent` | false (default) | paid partnership / sponsored |

Two gotchas you must surface to the user

1. **Boolean inversion bug.** Publora currently maps `allowComments`, `allowDuet`, `allowStitch` to TikTok's `disable_*` flags, so the booleans can land inverted (sending `allowDuet: true` may disable duets). The status cannot be confirmed from the API alone. **Test with a `SELF_ONLY` draft before trusting these values.** Tell the user this whenever they change a flag. 2. **Commercial disclosure.** If `commercialContent` is true, at least one of `brandOrganic` (your own brand) or `brandedContent` (paid partnership) must also be true, or Publora rejects it. `lib.tiktok_settings` enforces this.

Posting reality

  • **Unaudited apps post PRIVATE only.** Until the publishing app passes TikTok's

review, posts are forced to `SELF_ONLY` regardless of `viewerSetting`. Warn the user if a "public" post lands private.

  • For reach, use `PUBLIC_TO_EVERYONE`. For an end-to-end test, use `SELF_ONLY`.

Steps

**Voice profile first (all drafts).** If `../../references/voice-profile.md` has `filled: yes`, load it and match the user's voice fingerprint, hard rules, and CTA/link style throughout. If it is not filled, mention once that `tt-humanizer --mode profile` can learn their voice from a few posts, then proceed with the generic voice rules.

**Never invent the specifics.** The rules below ask for a concrete number, a date and a named entity, because that is what separates a real post from a generated one. Take them from what the user actually said in this conversation. **Do not invent a figure, a date, a client name or a result, and do not soften a vague claim into a plausible-looking number.** If the user has nothing concrete for a beat, ask them once, and if they still have nothing, drop the claim rather than decorate it. A published invented number is a retraction; a missing one is only a weaker post.

1. **Gather inputs, goal first.** Ask (or infer) what the caption should earn, then shape for it: comments -> end on one specific question tied to the video; saves -> promise reference value ("the 3 settings are in the caption"); shares -> a claim people will want to show someone; profile taps -> an open loop the pinned video pays off. Then gather the video topic/script, the niche, whether it is commercial, and whether a rendered .mp4 path exists. 2. **Draft the caption.** Front-load the first visible line with a reason to read or a specific question to comment on. Keep it tight. Em dashes under the cap (about one per 100 words; a short caption rarely needs one), no AI vocab cluster. Optionally restate the hook's open loop as a comment prompt. 3. **Pick hashtags.** 3 to 5, mixed reach: one broad, one to two niche-defining, one to two specific to the video. Put them at the end. Never stuff. 4. **Set the flags.** Default to `PUBLIC_TO_EVERYONE`, comments on, duet/stitch off, no commercial flags. Adjust per the user, and surface the two gotchas. Build with `lib.tiktok_settings(...)`. 5. **Char check.** Confirm caption + hashtags <= 2,200. If over, tighten. 6. **Humanizer pass.** Scrub 2026 AI vocab by density, cap em dashes (about one per 100 words, never swap one for a period), break stacked triads, generic openers, reveal bridges and sincerity openers ("not gonna lie"). Leave the rhythm alone; never chop a line for punch. Canonical rules: `tt-humanizer` V3. 7. **Approval card.** Show: caption, char count, hashtag set, settings summary, and the resolved `viewerSetting` (flag if it may post private). 8. **On approval.** Call `lib.publish("video", caption, target_url=<upload or profile URL>, video_path=<path or None>, platform_settings=<settings>, scheduled_ti

Read more
@sergebulaev
Ships withtiktok-skills

Part of the linkedin-skills family (400+ stars). Same voice engine and approve-before-publish flow, now for TikTok. Also available for Instagram · X · YouTube · Threads · Facebook. 8 skills that turn Claude Code and Codex into your TikTok content team.

Stars on GitHub

Momentum

stars in total
103
Star history of sergebulaev/tiktok-skills on GitHub, a chart by star-history.com

Other skills on tiktok-skills.

tt-humanizer

tt-humanizer

Remove the AI-script tells viewers hear in a TikTok spoken script and caption: 2026 vocabulary by density, reveal bridges,…

tt-repurposer

tt-repurposer

Repurpose content into a native TikTok script and caption. Take a LinkedIn post, blog, newsletter, or X thread that worked…

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…

officecli13d33k
@iofficeai@iofficeaiInstall Skill

Questions about tt-caption-writer.

Which coding agents can use tt-caption-writer?
tt-caption-writer 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.