WeChat Official Account Poster
JimLiu/baoyu-skills
Publishes articles and image-text posts to a WeChat Official Account through the API or Chrome CDP, converting markdown to WeChat-ready HTML with link citations.
A skill your agent uses when a finished article has to land on Medium correctly — profile vs publication, cross-posting under a canonical link so your own site keeps the SEO credit, import-tool…
$ npx skills add ericrisco/rsc-harness --skill medium-publishing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness medium-publishing --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/medium-publishing .claude/skills/medium-publishing && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "medium-publishing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/medium-publishing into .claude/skills/medium-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "medium-publishing", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ericrisco/rsc-harness/tree/main/skills/medium-publishingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ericrisco/rsc-harness --skill medium-publishing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness medium-publishing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/medium-publishing .agents/skills/medium-publishing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "medium-publishing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/medium-publishing into .agents/skills/medium-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "medium-publishing", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ericrisco/rsc-harness --skill medium-publishing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness medium-publishing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/medium-publishing .cursor/skills/medium-publishing && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "medium-publishing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/medium-publishing into .cursor/skills/medium-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "medium-publishing", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ericrisco/rsc-harness.git --path skills/medium-publishing--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ericrisco/rsc-harness --skill medium-publishing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness medium-publishing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/medium-publishing .gemini/skills/medium-publishing && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "medium-publishing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/medium-publishing into .gemini/skills/medium-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "medium-publishing", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ericrisco/rsc-harness medium-publishingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ericrisco/rsc-harness --skill medium-publishing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/medium-publishing .github/skills/medium-publishing && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "medium-publishing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/medium-publishing into .github/skills/medium-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "medium-publishing", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ericrisco/rsc-harness --skill medium-publishing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ericrisco/rsc-harness medium-publishing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/medium-publishing .opencode/skills/medium-publishing && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "medium-publishing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/medium-publishing into .opencode/skills/medium-publishing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "medium-publishing", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
medium-publishingA skill your agent uses when a finished article has to land on Medium correctly — profile vs publication, cross-posting under a canonical link so your own site keeps the SEO credit, import-tool…
Medium Publishing is an agent skill from ericrisco/rsc-harness. Use when a finished article has to land on Medium correctly — profile vs publication, cross-posting under a canonical link so your own site keeps the SEO credit, import-tool failures, the 5-tag cap, pseudo-Markdown gotchas. NOT writing or headlining the piece (that is medium-writing), NOT cadence or earnings (that is medium-strategy).
Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/cross-post-and-canonical.md`).
It sits in Marketing & SEO, covering Social publishing and cross-posting. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.
Read from SKILL.md and the folder at commit 92fde8f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.medium.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
MEDIUM_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Medium Publishing loads about 2.5k tokens when it runs, and up to ~4.3k if it reads all its reference files. Until then it costs about 90 tokens; SKILL.md has 1,168 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from ericrisco/rsc-harness at commit 92fde8f, republished under its MIT licence (© ericrisco). 1,168 words, ~2,501 tokens.
.claude/skills/medium-publishing/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.Land a finished article on Medium with correct metadata: right destination, no duplicate-content penalty, valid tags, intact formatting. Writing the article is ../medium-writing/SKILL.md; deciding when/where/how-often to publish and how it grows is ../medium-strategy/SKILL.md. This skill is only the mechanics of getting bytes onto the platform with the right metadata attached.
The Medium API is closed to new integrations. As of 2025-01-01 Medium issues no new integration tokens and accepts no new integrations; only tokens minted before that date still work. Why it matters: any plan that starts with "register a Medium API token and automate it" is dead on arrival for anyone who didn't already have one. Integration platforms confirm this — the Medium app in Make is marked legacy, and n8n's Medium credentials can no longer be newly configured.
So the default publishing path is web editor + import tool + canonical link, done through the UI. Treat the API as a legacy escape hatch (last section), not the plan — when asked "can I get a token and automate this?", the honest answer is almost always no, so say why and route to the import path below rather than promising automation.
Branch on where the article already lives and what you control:
| Situation | Path | Canonical handling |
|---|---|---|
| Article only ever lives on Medium | Write or paste natively in the web editor, publish | None needed — Medium is the original |
| Article already published on your own site/blog | Import tool: paste the original URL | Auto-set to that URL + auto-backdated |
| Import tool fails (403/404/timeout) | Native paste, then set canonical by hand | Manual: Story settings -> Customize canonical link |
| You hold a pre-2025 API token and want automation | Legacy POST /v1/users/{id}/posts | canonicalUrl field in the request body |
| Destination is a publication you write for | Submit draft to the publication | Same as above; submission is separate from canonical |
When the article already lives on your own site, you must tell search engines that the origin — your page, never the Medium URL — is canonical, or Google sees two copies and may credit Medium or neither. Two mechanisms, in order of preference:
1. Import tool (preferred). Pasting the original URL into Medium's import field does three things at once:
article:published_time meta tag.Path: New story -> import icon (or medium.com/p/import) -> paste the original URL -> Import. Review the draft, then publish.
2. Manual canonical (fallback). If you drafted natively or the import failed, set it per story: More options (•••) -> Story settings -> advanced/edit -> "Customize canonical link", paste the origin URL, then publish. This is per-story; there is no global default.
Bad: Open a new Medium story, paste the article body, hit Publish.
-> Duplicate content, no canonical, wrong date. Your own page now
competes with Medium for its own ranking.
Good: Use the import tool (canonical + backdate set automatically), or if
you paste natively, set "Customize canonical link" to the origin URL
BEFORE publishing.The importer is an HTTP crawler hitting your URL; failures are crawl failures, not Medium bugs. Map the symptom to the cause:
| Symptom | Likely cause | Fix |
|---|---|---|
| 400 / 404 | URL unreachable, redirected, or page metadata missing | Verify the URL loads anonymously; ensure <link rel="canonical"> and article:published_time exist |
| 403 | Bot-blocking (WAF, Cloudflare challenge, login wall) | Serve a clean static copy the crawler can reach, or paste natively + set canonical manually |
| 500 / 504 | Crawl timeout — heavy JS, slow page | Provide a lightweight static HTML version of the article |
| Imports but body is empty/garbled | Content rendered client-side only (JS) | Same: static HTML with the content in the initial markup |
The reliable workaround for stubborn pages: publish a minimal static HTML page of the article carrying <link rel="canonical"> and <meta property="article:published_time">, import that, then you can take it down. Full recipe and the complete error -> cause -> fix matrix are in references/cross-post-and-canonical.md.
Five tags, exactly. Medium allows up to 5 tags per story; they drive topic distribution and discovery, so they are functional metadata, not decoration. Pick 5 real topics readers browse, not keyword-stuffed variants.
Bad: tags: react, reactjs, react.js, react-hooks, javascript, frontend, webdev (7, redundant)
Good: tags: react, javascript, web-development, frontend, programming (5, distinct surfaces)Medium is NOT a full Markdown editor. The web editor interprets a subset of Markdown shortcuts as you type, and silently ignores the rest. Know the gotchas:
#, ##), blockquote (>), emphasis (*/_), ordered/bulleted lists (1., *), and the --- separator work as you type.| col | col | table renders as plain text. Restructure into a list, or insert the table as an image.Cmd/Ctrl + Option + 6. Do not rely on indentation-based code.Bad: Paste a raw Markdown table and assume it renders as a table.
Good: Convert the table to a labeled list, or screenshot/export it as an
image and insert the image. Reserve real tables for the original site.(The legacy API's contentFormat: markdown is more permissive than the web editor — but that path is closed to new users.)
Two outcomes, often confused:
Do not attempt to register a new token; it will be refused. This applies only to tokens minted before 2025-01-01.
# 1. Resolve your user id
curl -s -H "Authorization: Bearer $MEDIUM_TOKEN" \
https://api.medium.com/v1/me
# -> { "data": { "id": "<userId>", ... } }
# 2. Create a post with canonical + publish status
curl -s -X POST \
-H "Authorization: Bearer $MEDIUM_TOKEN" \
-H "Content-Type: application/json" \
https://api.medium.com/v1/users/<userId>/posts \
-d '{
"title": "My title",
"contentFormat": "markdown",
"content": "# My title\n\nBody...",
"canonicalUrl": "https://mysite.com/original-post",
"tags": ["react", "javascript", "web-development"],
"publishStatus": "draft"
}'publishStatus is public | draft | unlisted. For a publication, POST to /v1/publications/{publicationId}/posts; a draft there stays pending an editor. Full field reference and response shapes are in references/legacy-api.md.
| Anti-pattern | Why it's wrong | Do instead |
|---|---|---|
| Paste a copy of your own article, publish with no canonical | Duplicate content; your site loses ranking credit | Import tool, or set canonical to the origin before publishing |
| Plan an automated pipeline on a freshly registered API token | No new tokens since 2025-01-01; it will never authorize | Use the import tool / web editor; reserve API only for pre-2025 tokens |
| Cram 6+ tags or keyword-stuff the tag slots | Max is 5; redundant tags waste distribution surface | Pick 5 distinct topics readers actually browse |
| Paste a raw Markdown table and assume it renders | The web editor has no table support | List or image; keep the table on the origin site |
| Submit to a publication and assume it goes live | Submission is pending until an editor acts; needs writer access | Self-publish for instant, or submit only as an accepted writer |
| Set canonical to the Medium URL | Points credit at Medium, defeating the cross-post | Canonical must point to your origin site |
| Native paste of a backdated piece without checking the date | Manual paste does not backdate; canonical/date mismatch | Use import (auto-backdate) or set the date deliberately |
A correctly cross-posted article passes all of these:
© ericrisco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (references) in skills/medium-publishing of ericrisco/rsc-harness.
Open the folder on GitHubat commit 92fde8f
Medium Publishing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Medium Publishing this skillericrisco/rsc-harness | 156 | — | ~2.5k | Automated safety check: Pass | MIT | |
| WeChat Official Account PosterJimLiu/baoyu-skills | 26k | 2 repos | ~3.6k | Automated safety check: Warn | MIT | |
| Canghe Post To Wechatfreestylefly/canghe-skills | 461 | 3 repos | ~3.4k | Automated safety check: Notes | None | |
| Canghe Post To Xfreestylefly/canghe-skills | 461 | 4 repos | ~1.7k | Automated safety check: Warn | None | |
| Ops SocialsLifecycle-Innovations-Limited/claude-ops | 540 | — | ~3.6k | Automated safety check: Notes | MIT | |
| Post to WeiboJimLiu/baoyu-skills | 26k | 1 repos | ~1.4k | Automated safety check: Warn | MIT |
JimLiu/baoyu-skills
Publishes articles and image-text posts to a WeChat Official Account through the API or Chrome CDP, converting markdown to WeChat-ready HTML with link citations.
freestylefly/canghe-skills
Posts content to WeChat Official Account (微信公众号) via API or Chrome CDP.
freestylefly/canghe-skills
Posts content and articles to X (Twitter). An agent skill from freestylefly/canghe-skills.
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "tweet", "post to linkedin", or…
JimLiu/baoyu-skills
Publish text, image and video posts or long-form Markdown headline articles to Weibo through a real Chrome session, with the final review left to you.
browser-act/skills
Automates the complete Xiaohongshu (XHS / Little Red Book) content operation workflow: pain-point topic collection → style case collection → topic selection → content writing → publishing →…
ericrisco/rsc-harness
A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…
ericrisco/rsc-harness
A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…
ericrisco/rsc-harness
A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…
ericrisco/rsc-harness
A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…
ericrisco/rsc-harness
A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…
ericrisco/rsc-harness
A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.
Categories
A skill your agent uses when a finished article has to land on Medium correctly — profile vs publication, cross-posting under a canonical link so your own site keeps the SEO credit, import-tool…. Medium Publishing is an agent skill from ericrisco/rsc-harness. Use when a finished article has to land on Medium correctly — profile vs publication, cross-posting under a canonical link so your own site keeps the SEO credit, import-tool failures, the 5-tag cap, pseudo-Markdown gotchas.
Medium Publishing fits situations like: A finished article has to land on Medium correctly — profile vs publication; cross-posting under a canonical link so your own site keeps the SEO credit; import-tool failures; pseudo-Markdown gotchas.
Run `npx skills add ericrisco/rsc-harness --skill medium-publishing -a claude-code`. Or copy the skill folder (skills/medium-publishing in ericrisco/rsc-harness) into .claude/skills/medium-publishing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill medium-publishing -a codex`. Or copy the skill folder (skills/medium-publishing in ericrisco/rsc-harness) into .agents/skills/medium-publishing in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill medium-publishing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/medium-publishing, .gemini/skills/medium-publishing, .github/skills/medium-publishing and .opencode/skills/medium-publishing in your project.
Going by SKILL.md and its folder, Medium Publishing needs the command-line tools its instructions call (curl) and credentials named MEDIUM_TOKEN. Our summary lists: A credential in MEDIUM_TOKEN.
SKILL.md names 1 domain. In commands or code: api.medium.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Medium Publishing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.5k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Medium Publishing: WeChat Official Account Poster (JimLiu/baoyu-skills, 26k stars), Canghe Post To Wechat (freestylefly/canghe-skills, 461 stars), Canghe Post To X (freestylefly/canghe-skills, 461 stars) and Ops Socials (Lifecycle-Innovations-Limited/claude-ops, 540 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 156 GitHub stars. The repository holds 229 skills in this directory. The repository was last updated on October 6, 2026.
Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.