xiaohongshu-content-benchmark
About xiaohongshu-content-benchmark
A skill for benchmarking Xiaohongshu accounts or explicitly requested keyword searches. It collects and normalizes post data, ranks examples by like signal and theme relevance, then summarizes recurring hooks, title patterns, cover shapes, and content types.
Key features
- 01Benchmarks profile posts or requested keywords
- 02Collects and normalizes post data
- 03Ranks posts by likes and theme relevance
- 04Summarizes title and cover patterns
- 05Flags missing data and dataset issues
Use cases
- 01Compare recent posts from selected Xiaohongshu profiles
- 02Find recurring title hooks and cover patterns
- 03Shortlist example notes for card adaptation
- 04Review content-type patterns across a benchmark set
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ postplusai/ postplus-skills --skill xiaohongshu-content-benchmarkAfter installing, type/xiaohongshu-content-benchmarkin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
_postplus_shared/00-core/shared-collection/scripts/collection_actor_run.mjs_postplus_shared/00-core/shared-collection/scripts/lib/hosted_collection_bridge.mjs_postplus_shared/00-core/shared-runtime/scripts/download_videos_from_manifest_with_ytdlp.mjs_postplus_shared/00-core/shared-runtime/scripts/lib/execution_approval.mjshosted_billing_summary.mjshosted_execution_protocol.mjshosted_media_generation_bridge.mjslocal_skill_cli.mjsnetwork_runtime.mjspostplus_cli_config.mjspostplus_cloud_client.mjsskill_runtime.mjs_postplus_shared/scripts/lib/campaign-report-manifest.mjsreferences/actor-selection.mdbrief-schema.mdnormalized-schema.mdscripts/analyze_xhs_benchmark_dataset.mjsbuild_xhs_benchmark_actor_input.mjsnormalize_xhs_benchmark_dataset.mjsrank_xhs_benchmark_posts.mjsscripts/lib/xhs_common.mjsDetails
From the project READMEXHS Content Benchmark
Follow shared public skill rules in:
postplus-sharedpublic skill rules
Legacy alias: xhs-content-benchmark.
Use this skill when the user wants to:
- benchmark competitor or inspiration accounts on Xiaohongshu
- identify repeated Xiaohongshu title hooks and cover patterns
- shortlist strong note examples before adapting them into local XHS cards
- compare recent post output from one or more known Xiaohongshu profiles
Read these references before implementation:
skills/20-research/xhs-content-benchmark/references/actor-selection.mdskills/20-research/xhs-content-benchmark/references/brief-schema.mdskills/20-research/xhs-content-benchmark/references/normalized-schema.md
Default posture
Start from account-based benchmarking, not broad keyword search.
Default starting surface:
- known profile URLs -> recent post benchmark pool
Do not use this as the default first surface:
- keyword or topic search as the first collection surface
Do not silently switch between surfaces. If the user asks for keyword search, use the keyword-search route explicitly and fail visibly if it returns no items.
Validated actor path
Default actor for this skill:
rednote-xiaohongshu-user-posts-scraper
Use it when the user provides:
- one or more Xiaohongshu
profileUrls - one or more Xiaohongshu
profileIds
This is the current default because it returns the post-level fields this benchmark flow needs:
- note URL
- note id
- title
- post type
- like count
- author metadata
- cover image metadata
Experimental route
Keyword route:
rednote-xiaohongshu-search-scraper
Use it only when the user explicitly wants keyword or topic benchmarking.
Current operational rule:
- require
maxItems >= 100 - fail if the actor returns zero items
Do not pretend keyword benchmarking succeeded when the actor returned an empty dataset.
Not part of this skill
- comment mining
- audience language extraction
- media downloading
- profile health snapshots
- publishing or scheduling notes
Route those later to dedicated XHS skills.
Recommended workflow
- classify the request:
- account benchmark
- keyword benchmark
- compile a small benchmark brief into actor input
- run the chosen actor through the shared collection runner
- normalize into one local post dataset
- rank by like signal plus theme relevance
- summarize:
- recurring hooks
- title pattern families
- cover aspect patterns
- content-type split
- strongest benchmark examples
Cost discipline
Validated account route:
- start with 8-15 recent posts per profile
- benchmark 1-3 profiles at a time
Experimental keyword route:
- the actor currently enforces a much higher minimum item count
- do not hide that constraint
- keep keyword batches narrow and specific
Public Skill Execution Contract
- keep benchmark briefs, actor inputs, raw datasets, normalized datasets,
rankings, and analysis outputs under
<work-folder>/.postplus/xiaohongshu-content-benchmark/ - keep only final user-facing benchmark summaries or shortlists outside
.postplus/ - start with a bounded first pass:
1-3profiles for the validated account route- narrow keyword batches only when the user explicitly requests search
- if PostPlus Cloud service is unavailable, unauthorized, or returns a stable network error, stop immediately instead of switching to ad hoc shell glue
Main scripts
scripts/build_xhs_benchmark_actor_input.mjsscripts/normalize_xhs_benchmark_dataset.mjsscripts/rank_xhs_benchmark_posts.mjsscripts/analyze_xhs_benchmark_dataset.mjs
Use the shared collection runner for actor calls:
${CLAUDE_SKILL_DIR}/_postplus_shared/00-core/shared-collection/scripts/collection_actor_run.mjs
Minimal workflow
Account benchmark
Build actor input from a brief:
node ${CLAUDE_SKILL_DIR}/scripts/build_xhs_benchmark_actor_input.mjs \
--brief <work-folder>/.postplus/xhs-benchmark-brief.json \
--output <work-folder>/.postplus/xhs-benchmark-actor-input.json
Run the validated actor:
node ${CLAUDE_SKILL_DIR}/_postplus_shared/00-core/shared-collection/scripts/collection_actor_run.mjs \
--collection-key xhs-account-posts \
--input <work-folder>/.postplus/xhs-benchmark-actor-input.json \
--output <work-folder>/.postplus/xhs-benchmark-raw.json
Normalize, rank, analyze:
node ${CLAUDE_SKILL_DIR}/scripts/normalize_xhs_benchmark_dataset.mjs \
--input <work-folder>/.postplus/xhs-benchmark-raw.json \
--output <work-folder>/.postplus/xhs-benchmark-normalized.json
node ${CLAUDE_SKILL_DIR}/scripts/rank_xhs_benchmark_posts.mjs \
--input <work-folder>/.postplus/xhs-benchmark-normalized.json \
--theme "workplace,office workers,office" \
--output <work-folder>/.postplus/xhs-benchmark-ranking.json
node ${CLAUDE_SKILL_DIR}/scripts/analyze_xhs_benchmark_dataset.mjs \
--input <work-folder>/.postplus/xhs-benchmark-normalized.json \
--output <work-folder>/.postplus/xhs-benchmark-analysis.json
Keyword benchmark
Use the same build script, but provide keywords in the brief.
Operational constraint:
- keep
limit >= 100 - expect a visible failure if the actor returns zero items
Good output
Return:
- benchmark shortlist
- top note URLs
- recurring title hooks
- title pattern breakdown
- cover-shape breakdown
- observed content-type split
- data-quality warnings when fields are missing
- suggested card angles that can later feed
skills/40-creative/xiaohongshu-card-notes
Failure posture
- fail if the request mixes profile benchmarking and keyword benchmarking without saying which should be primary
- fail if no
profileUrls,profileIds, orkeywordsare provided - name the missing input in the failure copy: either a Xiaohongshu profile URL, profile id, or explicit keyword route
- fail if the keyword-search actor returns zero items
- fail if the normalized dataset has no note URLs
- keep raw actor output for debugging