Communitygithub.com

geoqiao/short-video-skills

Publish short videos to Douyin, WeChat Channels, and Xiaohongshu (for Bilibili, only write copy): First, read search suggestions from Douyin, Xiaohongshu, and Google to write titles, descriptions, topics, cover text, and pinned comments; then use playwright-cli to auto-fill the publishing forms in a user's already-logged-in Chrome browser, uploading videos and covers, filling in collections, location, AI declarations, trending topics and events. Works regardless of how the video was made. Defaults to stopping before the publish button, only clicking it after the user explicitly says to publish. Suitable for writing or editing publishing copy, checking search suggestions, selecting topics, publishing on behalf, replacing videos or covers, and reviewing completed forms.

What is short-video-skills?

This skill streamlines the process of publishing short videos across major Chinese social platforms—Douyin, WeChat Channels, and Xiaohongshu—by first generating optimized copy based on actual user search intent, then auto-filling the publishing forms in the user's already-logged-in Chrome browser via playwright-cli. It queries search suggestion APIs from Douyin, Xiaohongshu, and Google to confirm audience terminology and intent, then crafts titles, descriptions, topics, cover text, and pinned comments that align with a single core query. The skill ensures that the copy isn't just keyword-stuffed but genuinely answers user questions, reducing bounce rates. The second phase uses playwright-cli to interact with the browser, filling in video upload, cover images, collections, location, AI declarations, trending topics, and events. It strictly stops before clicking the publish button unless the user explicitly approves. The skill handles platform-specific quirks—drag-and-drop uploads, dropdowns that require precise text matching, and buttons only visible on hover—with detailed guidance in reference documents. It does not modify or delete published content without user request, and it logs publishing times and post details for tracking. This skill is ideal for content creators, social media managers, or AI agent users who need to efficiently manage multi-platform video publishing while maintaining quality and search relevance.

Works with~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/geoqiao/short-video-skills/tree/HEAD/skills/video-publish

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

Publish Short Videos

Two steps: write the copy, then fill in the form. Write the copy into post.md in the issue directory (see structure in references/post-template.md), then fill the form accordingly. Platform rules and references are in references/platform-rules.md; the submission page is the final authority.

1. Write the Copy

Write the copy based on search intent: first confirm that viewers actually ask this question and which term they use, then align the title, cover text, and first sentence of the description with that same question. On Douyin and WeChat Channels, most traffic comes from recommendations rather than search; these keywords primarily help the system push the video to the right audience.

First, Check Search Suggestions

  1. List the questions this video can answer. Each question corresponds to a type of intent: get to know the subject ("What is X?", "Is X good?"), compare tools ("X vs Y", "which is better?"), concepts ("What is a certain term?"), how-to ("How to use X?").
  2. Read the search suggestions to confirm that viewers actually search this way and which term they use. Search suggestions have no search volume; they only indicate someone searched. Re-read on the day of publication—don’t reuse results saved days ago.
    • Douyin: Open a logged-in Chrome (see "Connecting to Browser" below), open a www.douyin.com tab and switch to it, modify SEEDS in scripts/douyin-suggest.js, then run playwright-cli -s=chrome --raw run-code --filename=scripts/douyin-suggest.js.
    • Xiaohongshu: Open a www.xiaohongshu.com/explore tab, modify SEEDS in scripts/xhs-suggest.js, then run. Reload the page for each term, about 6 seconds per term; max 25 terms at a time.
    • Google: Run node scripts/google-suggest.mjs '[["seed phrase","zh-CN"],["seed","en"]]', no browser needed.
    • These three scripts are read-only. Close only the tabs you opened.
  3. Save the raw results as a JSON file with a date, and reference the filename in the copy.
  4. Focus on the intent that aligns perfectly with the video content—write it into the title, cover, and first sentence of the description. If the video only partially answers an intent (e.g., only compares two products but the question is "which is the best?"), only include it in the topic tags; otherwise, viewers will swipe away. If a question appears repeatedly in suggestions but the video doesn’t answer it, don’t force it—note it as a new topic.

Several proven experiences:

  • English terms alone as primary keywords often fail to attract relevant content. Use Chinese phrasing for the cover keyword, and put English in the description and tags.
  • When the terminology in the video differs from what viewers use (e.g., viewers search "context decay" instead of "context corruption"), follow the viewers’ language in the title, cover, and narration.
  • The two platforms often use different terms; use the term that appears on both in the title.

How to Write

  • Title: The question viewers will ask, plus a specific conclusion. Use the terminology they search for. Don’t include terms no one searches for. Ensure the title, cover text, and first sentence of the narration say the same thing.
  • Description: The first sentence restates the question from the title with a conclusion and numbers. Then list the key points covered in the video, including entity words and numbers that appear in the video. Finally, include data source limitations. If AI is used, add an AI disclaimer (e.g., "The voiceover is AI-generated"). Write for the audience, not about the production process.
  • Topic Tags: The accurate term for the subject, objects compared in the video, category words, and one high-traffic audience-appropriate term. Only use terms that actually appear in the video. When filling the form, enter #word on the publishing page to check the view count; replace overly broad tags with billions of views (e.g., #AI) immediately. Douyin web version allows max 5 tags; series names go into the collection, not tags. WeChat Channels allows one or two extra, including the series name.
  • Pinned Comment: A question viewers can answer based on their own experience, echoing the closing question in the video.
  • Cover Text: Two lines max—a title plus a hook with a number or conclusion. Use the Chinese phrasing for the keyword.
  • Do not include URLs or accounts from other platforms in the copy, cover, narration, or visuals. Don’t say "go to a certain website" or "search for something". You may guide viewers to comment, follow, or check out collections.
  • If AI voiceover, AI visuals, or digital humans are used, add an AI disclaimer; code-video voiceovers are AI-generated, so all videos made with it require a disclaimer. Platform-specific option names are in references/platform-rules.md.

2. Fill in the Form

Each platform’s selectors, pitfalls, and practices:

  • Douyin Creator Center: references/douyin.md
  • WeChat Channels Assistant: references/weixin.md
  • Xiaohongshu Creator Platform: references/xiaohongshu.md

Rules

  • Do not publish on behalf of the user. Stop at the publish button and wait for the user to check. Click only after the user explicitly says "publish" for this particular video; permission for one video does not extend to the next.
  • After clicking publish, verify that the new work appears in the work list and that the collection number and episode are correct, then record the publish time in post.md.
  • Do not modify or delete already published content on the platform unless the user requests it.
  • For items that may change each time (location, collection, events, etc.), if in doubt, ask the user.
  • Close only the tabs you opened. If a tab contains an unpublished form, do not reload it or run other scripts in it.

Connecting to Browser

Requires playwright-cli and its companion Chrome extension. The user must be logged into the creator backends of each platform in Chrome.

playwright-cli -s=chrome attach --extension=chrome   # User clicks "Allow" on the popup from the extension
playwright-cli -s=chrome tab-new <publishing page URL>
playwright-cli -s=chrome tab-list
playwright-cli -s=chrome tab-select <index>            # tab-new does not switch the target for run-code
playwright-cli -s=chrome --raw run-code --filename=<script.js>
playwright-cli -s=chrome screenshot --filename=<image.png>

The script for run-code is an async page => { … } expression; its return value is printed. If the session disconnects and you attach again, previously opened tabs disappear, and the form must be filled from scratch.

General Practices

  • Start each script with await page.bringToFront(). If the user is using Chrome simultaneously, the publishing page often ends up in the background; drag-and-drop and clicks will time out. Before timeout, queued keyboard inputs will be applied after the page returns to focus, messing up the description. If a timeout occurs, clear the description box and fill it again.
  • One step per script; verify after each step. At each step, read the innerText of the relevant area or take a screenshot to confirm the value has changed before proceeding.
  • Uploading video: First try playwright-cli -s=chrome drop "<drop-zone selector>" --path=<mp4>. For platforms where drag-and-drop doesn’t trigger upload, use an injection script in scripts/: it converts the file to base64, writes it into a run-code script, uses DataTransfer to insert it into a file input, and dispatches a change event. In the extension mode, setInputFiles and file pickers don’t work.
  • Uploading cover: First open the cover popup, then run the injection script. All three platforms require two images: a 4:3 landscape cover and a 3:4 portrait cover. A 16:9 cover will have its title cropped.
  • Dropdowns and search fields: Many inputs are only visible when the dropdown is expanded. If fill or click reports "element is not visible", first click the box showing the current value (use boundingBox or get coordinates in evaluate then page.mouse.click if needed). Wait for the input field to appear before entering. Fields that trigger search require keyboard.type character by character; fill does not trigger.
  • Select dropdown items precisely: Use full text matching, or in evaluate, find an element whose innerText exactly matches and is visible within the dropdown area, then click its coordinates. Default to a nearby element with common label. After selection, read the current value once to confirm.
  • Buttons that appear only on hover: Move the mouse with page.mouse.move over the card, wait half a second, then click the button’s position.
  • English options: Some platforms display options in English (e.g., WeChat Channels video annotations); select based on the actual text shown on the page.

After Publishing

Check the "search terms" and the percentage of traffic from search in Douyin’s data center, and compare with the chosen keywords. Record videos with modified writing so you can later identify which change had an effect. Daily data can be collected using the video-data skill.

What to Explain When Delivering

  • The intent targeted by the copy, which search suggestions were used, which were not, and why.
  • What was filled in for each platform: title, number of topics, cover, collection and episode number, location, disclaimers, hot topics or events.
  • Where the process stopped, which items were not filled or differ from the copy, and why.
  • If published: publish time, verification results from the work list, collection episode.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Related Skills