# Rednote Carousel

> Turn a source-backed narrative into an editable Xiaohongshu (小红书) carousel with deterministic Chinese typography, safe-area and overflow checks, caption, contact sheet, and export manifest. Use for RedNote social cards. Do not use image models to render Chinese text.

- Skill: `leihuang23/rednote-carousel` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add leihuang23/rednote-carousel`
- Raw SKILL.md: https://api.skillmd.com/api/skills/leihuang23/rednote-carousel/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Design & Media
- License: Apache-2.0
- Author: leihuang23 (https://skillmd.com/u/leihuang23)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/leihuang23/rednote-carousel

---


# RedNote Carousel

Content structure comes first. Chinese typography must remain deterministic and editable.

## Inputs

Require a reader promise, audience, claim ledger or approved content, desired card count or range, brand context, and publication constraints. If facts are not sourced, invoke `research-claims` before visual production.

## Visual-target gate

Use an existing brand or selected direction when available. For greenfield work without a target, generate exactly three image-based directions that differ in composition, typography, density, color, and illustration behavior. Wait for selection before producing the final cards.

## Workflow

1. Create a narrative spine: cover promise, tension, claims, proof, practical steps, counterpoint, and close.
2. Assign one job and one primary claim to each card. Preserve claim identifiers in card metadata.
3. Write concise Chinese copy. Do not distort certainty or remove essential caveats for engagement.
4. Define editable content, layout, and style tokens separately.
5. Render all Chinese text with deterministic HTML/CSS, SVG, Canvas text, or another typography engine with known fonts.
6. Use generative imagery only for non-text illustration, texture, or photography. Never ask an image model to spell Chinese copy.
7. Export individual PNGs, an overview contact sheet, caption copy, source ledger, and machine-readable manifest.
8. Test every card for overflow, line breaks, safe area, contrast, font fallback, cross-card consistency, factual traceability, and export dimensions.

## Staged renderer fast path

Use the bundled `scripts/render_carousel.py` before writing a custom renderer. It resolves one exact font file, draws every text run with that file, stages the complete card batch and contact sheet, and writes the hashes, manifest, and validation report in one command.

Create `carousel/content.yaml` as JSON-compatible YAML and `carousel/tokens.json`, then copy the active skill's renderer into the evidence packet and execute it:

```sh
mkdir -p carousel
cp <active-skill-directory>/scripts/render_carousel.py carousel/render.py
python3 carousel/render.py --content carousel/content.yaml --tokens carousel/tokens.json --out carousel
```

The content object contains `title`, `reader_promise`, `caption`, `card_count_range`, `claims`, and `cards`. Each claim has `id`, `text`, `confidence`, and optional `source`. Each card has `id`, `kicker`, `title`, `body` as an array, `claim_ids`, optional `accent` (`evidence` or `failure`), and optional `footer`.

The token object may override `canvas`, `safe_area`, `colors`, `type`, `font_candidates`, and `mono_font_candidates`. Put preferred CJK body font and monospace label font files first. If a label font lacks a CJK glyph, the renderer records the fallback and draws that label with the resolved body font. The renderer fails if no body candidate can be loaded, required glyphs are missing, the card count is outside the requested range, any measured element leaves the safe area, content enters the footer safe area, any required claim is unmapped, or a required color pair falls below WCAG AA contrast.

Do not install a browser stack, author a replacement renderer, or debug per-card screenshot sessions before trying this path. If Pillow is unavailable, make one bounded probe for an already installed deterministic vector or browser renderer. Report a blocker if that probe fails.

### Production-package intent gate

Treat requests for a production package, editable carousel package, export manifest, rendered cards, or contact sheet as explicit requests to create those artifacts now. A simultaneous request for a validation plan does not downgrade production into a plan-only deliverable. Run the staged renderer and require the actual files listed under Deliverables. Do not satisfy the request with a manifest skeleton, future file tree, or `planned-not-rendered` document when the production outputs were requested.

## Bounded production contract

Build for reliable completion before optional polish:

1. Create the editable content, tokens, claims mapping, card source, caption, and manifest skeleton first.
2. When the requested range allows it, use the smallest card count that preserves the narrative and all approved claims.
3. Render every card and the contact sheet in one batch process. Do not open a separate interactive browser session for each card.
4. Run one complete validation pass across the batch.
5. Make at most one focused correction pass for failed required checks, then rerender only affected outputs and refresh the contact sheet and hashes.
6. When the required deliverables exist and required checks pass, stop. Report optional visual refinements or unresolved platform uncertainty instead of continuing to iterate.

Do not add optional generative imagery, animation, extra cards, or alternate themes until the required package is complete and the execution budget clearly permits it.

Reserve the final response for a concise delivery summary, validation result, reproduction command, and artifact paths. Do not paste full generated source files into the response. Once the staged renderer reports `passed: true`, stop.

## Deliverables

```text
carousel/
  content.yaml
  tokens.json
  render.py or cards.html or cards.svg
  exports/01-cover.png ...
  contact-sheet.png
  caption.md
  claims.csv
  manifest.json
```

The manifest records card number, title, primary claim IDs, dimensions, file hash, declared fonts, verified font availability, render engine and version, and export timestamp. It must not label a font as resolved from computed CSS alone. The bundled renderer may label its exact font file as resolved because Pillow loads that file directly for every text draw; it records the path and SHA-256 as evidence.

## Card checks

- The cover makes one defensible promise, not a vague topic label.
- Body text remains readable at phone scale.
- No important text enters platform or crop safe areas.
- Long words, punctuation, mixed Latin text, and numbers wrap intentionally.
- Color is not the only carrier of meaning.
- Font fallback does not change line breaks silently.
- A CSS `font-family` value or fallback list proves only what was declared, not which font rendered each glyph. Font availability checks also do not prove actual glyph resolution. Record declared fonts and availability separately; claim a resolved font only when the renderer exposes that evidence. Otherwise state the uncertainty.
- Visuals do not add unsupported factual detail.
- Caption citations map to the same claim ledger as the cards.
- Every factual sentence on a card is supported by all claim IDs needed for that sentence. Do not add a causal explanation, benefit, or recommendation as if it came from the ledger. Label necessary connective copy as editorial synthesis and keep it clearly separate from sourced claims.
- Restrained monospace labels use a separately resolved font file. When a label contains unsupported CJK glyphs, record the explicit fallback to the resolved CJK body font.

## Evidence packet

Return the editable source, exports, contact sheet, caption, claims, manifest, render and validation commands, failures corrected, and remaining platform-specific uncertainty.

