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
- 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?").
- 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.comtab and switch to it, modifySEEDSinscripts/douyin-suggest.js, then runplaywright-cli -s=chrome --raw run-code --filename=scripts/douyin-suggest.js. - Xiaohongshu: Open a
www.xiaohongshu.com/exploretab, modifySEEDSinscripts/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.
- Douyin: Open a logged-in Chrome (see "Connecting to Browser" below), open a
- Save the raw results as a JSON file with a date, and reference the filename in the copy.
- 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
#wordon 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
innerTextof 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 inscripts/: it converts the file to base64, writes it into arun-codescript, usesDataTransferto insert it into a file input, and dispatches achangeevent. In the extension mode,setInputFilesand 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
fillorclickreports "element is not visible", first click the box showing the current value (useboundingBoxor get coordinates inevaluatethenpage.mouse.clickif needed). Wait for the input field to appear before entering. Fields that trigger search requirekeyboard.typecharacter by character;filldoes not trigger. - Select dropdown items precisely: Use full text matching, or in
evaluate, find an element whoseinnerTextexactly 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.moveover 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.