Content: plan and create
Plan a brand's content and produce it end to end: a researched story, a hook that earns attention, copy without AI tells, a build in the brand's design, and a publish sheet per channel. Everything brand-specific lives in a brand pack; the method here works for any brand. Frames are built in Figma or written as HTML and rendered to PNG, whichever the brand chose at setup.
The words decide whether anyone stops. Most effort goes into research and writing,
before Figma or a camera. Read references/writing-craft.md and the two worked examples
before writing anything: references/examples/linux-7.4-carousel.md (a news record) and
references/examples/ai-cost-js-carousel.md (someone else's experiment). Each lists the
drafts that lost and why; imitate the moves, not the sentences.
Start here, every run
Paths to scripts/, references/, templates/, and brands/ are inside this skill's
folder; content/ is in the project you work in. Run commands from the project root
with the skill's path, for example python3 <skill>/scripts/new_item.py content ...
(<skill> is the folder this file is in). Scripts that use Pillow (contact_sheet.py,
slides_to_pdf.py, artefact_marks.py, ref_sheets.py) run without python3 -I.
- Setup check. Read
content/setup.mdin the project. If it does not exist, this is the first run: run the setup-content skill (installed alongside; in this repository at../setup-content/SKILL.md; invoke it, or follow it by hand) before anything else. It asks which brand, collects the brand's own assets from its site and profiles with permission, chooses the renderer (Figma or HTML → PNG), and writes the brand pack. - Find the brand pack (
brands/README.md):content/brand/in the project, elsebrands/<name>/in this skill. Readbrand.md,design.md, andcontent/brand/assets/README.mdif it exists (the brand's own photos and logos come before stock). Anything marked(proposed)is not settled; ask before a plan depends on it. - Take stock of tools and use every one that helps (
references/research-tools.md): web search, page fetch, a real browser (ego-browser), social-media MCPs or built-in X access, Figma MCP, and image generation: your own image tool if you have one (Grok Bot's Grok Imagine, Codex, ChatGPT, Antigravity), thenpython3 <skill>/scripts/gen_image.py detect(agy, OpenAI, Gemini, xAI keys). Note what is missing. - Find the workspace (
templates/workspace.md):content/withplan/,items/,reviews/,ideas.md,design-log.md. Create it the first time. - Pick the mode below.
| The user wants | Mode |
|---|---|
| a plan, a calendar, "rencana konten bulan ini" | Plan |
| one piece: carousel, single post, thread, Reels script, LinkedIn post, article | Create |
| several pieces from one source | Repurpose |
| to know what worked and what to change | Review |
| to set up a new brand, change the renderer, or refresh assets | Setup (the setup-content skill) |
Plan
- Read the inputs (
references/planning.mdsection 1): brand pack, last review,ideas.md, the month's moments (verify dates), capacity, the owner's goal. - Write
content/plan/YYYY-MM.mdfromtemplates/plan-month.md: pillars at their shares, series on their cadence, about a quarter of slots reactive, each strong item cut into 3–5 formats on different days. python3 <skill>/scripts/check_plan.py content/plan/YYYY-MM.md --brand <pack>/brand.mduntil no FAIL; explain any warning you keep in the plan's notes.- Report: the month in three lines, what is proposed and needs a yes, the gaps.
Create
- Item folder:
python3 <skill>/scripts/new_item.py content <date> <slug> <format>. - Research (
research-tools.md): primary source, one link deep, corrections since publication, named people's own words, the local angle, a second source per number. - Story in
brief.md(writing-craft.mdsections 1–4): five questions, the turn, the ladder (berita, uji coba, daftar referensi, or a rubric fromcopy-playbook.md), the slide or post worth saving, five hooks in at least three shapes put through the gates and the duels, one metaphor family with itsVerbs:line. - Copy in
copy.mdfor the format (references/formats/:carousel.md,single-post.md,x.md,threads.md,linkedin.md,reels-tiktok.md,long-form.md), a>source note under every number, name, and quote. Every headline passes "lalu kenapa?" and the metaphor is in at least three of them; caveats go wherewriting-craft.md7b puts them; the action passes "who, with what, when". Thenpython3 <skill>/scripts/lint_copy.py <item>/copy.md --format <format> --brand <pack>/brand.mdmust exit 0 (new_item.pyprints the right--format:threadlints asx,documentaslinkedin). Read its warnings and its headline-only read; write that read intobrief.md, and read the copy aloud once. - Images (
image-sourcing.md): real artefacts on evidence frames; for metaphor frames the brand's own photos, then a generated image made automatically when nothing fits (your own image tool first, thenagy, then a paid API only ifcontent/setup.mdallows it), then Unsplash; one visual thread, credits kept from the manifest. The owner can switch the image tool or stop generating at any time. - Choose the scheme and the layouts (
design-variety.md): the series' colour scheme, or for a one-off piece one the previous pieces did not use; then a variant per slide by the slide's job and by whatcontent/design-log.mdsays was used recently, so no two pieces look alike. Write them in the "Design" table ofbrief.md, with one headline mark style and one slide that breaks the pattern. The brand pack's gallery pages (Figma) orcontent/setup-gallery/*.jpg(HTML), andrefs/when the pack has them, show the options. - Build with the renderer in
content/setup.md(design-system.md); when it says both, follow its rule for which pieces go where, else ask:- Figma (
figma-mechanics.md): the layout functions inscripts/figma-helpers.js, bundled with the pack'sBRANDblock byscripts/figma_bundle.py --brand <pack>/design.md --page "<name>" --scheme <scheme> --n <frames>(the tool takes 50,000 characters), on a new page of the brand's Figma file; never touch other pages. Upload images, then tone them in a second call with the scheme's pairs (duotone(id, 'light' | 'dark')). - HTML → PNG (
html-render.md):scripts/new_html.pysets up the item'shtml/folder with the kit and the brand's CSS; writeslides.htmlwith the kit's layouts, with the chosen photos and generated images copied intohtml/img/;scripts/render_slides.pyrenders one PNG per slide. Reels:storyboard.md+ a 1080×1920 cover frame (Figma, or a separate HTML page ashtml-render.mdsection 4 says).
- Figma (
- Verify cheaply: the layout check first (
layoutCheck()in Figma, the issuesrender_slides.pyprints in HTML) and fix what it reports; then look at the cover, the data frame, and what changed (screenshots one at a time in Figma; the PNGs in HTML). If the user stops screenshots, stop and say which frames went unchecked. - Publish sheet:
publish.mdwith the text per channel, hashtags within limits, alt text, time, links, credits; add a row tocontent/design-log.md. Publishing is the owner's step unless they explicitly ask you to post a specific piece through a connected tool; confirm first. - Report: where it is, the direction in two lines, the layouts chosen, what was and was not verified, which research tools you had and lacked, and the caption.
Repurpose
Plan the cuts together (planning.md section 6), one item folder, one row per cut in
the plan. Each cut is rewritten for its format (references/formats/), says something
whole on its own, and links back. The carousel frames double as the LinkedIn document
(scripts/slides_to_pdf.py) and the Threads/TikTok photo post.
Review
Write content/reviews/YYYY-MM.md from templates/review-month.md: numbers only from
the platform or the owner, dated;
compare each piece with the brand's own median for its format; decide keep, fix, or stop
per series; carry the decisions into next month's plan. No numbers shared: list what to
collect, and stop.
Writing rules that carry the most weight
Full method in writing-craft.md, rules in copy-playbook.md, language in
language/<lang>.md.
- Hook = exact number + scene + stakes, or one of the six shapes in
writing-craft.mdsection 3b. Write five in three shapes, gate them (≤30 words, plain, no caveat, honest, the answer held back, tension), duel the survivors, and write why each loser lost. Do not score them: self-scores tie. - Headlines are claims with a consequence: each passes "lalu kenapa?". Topic words go in the eyebrow. Mark the one or two words that carry the claim.
- One metaphor family, said once, then carried in the verbs of at least three headlines.
- A turn late in the story; one frame or post worth saving.
- Bring it home: the audience's own price, date, place, company, or action.
- Numbers compare fairly, charts start at zero, hedges are copied from the source, first person only for what the brand did.
- Hedges stay in the sentence; caveats have a budget: none on the cover or in a headline, one on the data slide, one on the opinion slide, the rest in the caption.
- Opinion is labelled and ends in an action that passes "who, with what, when".
- One CTA from the brand pack; the promise describes what the piece just did.
- Language from the brand pack; another language only when the user explicitly asks for it for that piece.
- No stock openers, no AI tells; the lint catches most.
Quality gate
- Brand pack read; nothing
(proposed)used as settled without asking. - Every research tool available was used where it helps; gaps reported.
- Five story questions answered with the local angle; the turn placed.
- Hook workshop done with gates and duels; the cover is ≤30 words with no caveat and works alone.
- Headline-only read written in
brief.mdand tells the story; the metaphor is in at least three headlines; one piece worth saving, named. - The action passes "who, with what, when".
-
lint_copy.pyexits 0 for the format; every number, name, and quote has a note. - Platform limits respected (
formats/specs.md): hashtags, characters, safe zones. - Layouts chosen per slide in
brief.md; cover and headline mark differ from the previous piece incontent/design-log.md; one slide breaks the pattern. - One scheme applied; the brand's own photos used where they fit; photos toned; screenshots in colour, unaltered, credited, marked with highlighter marks.
- Layout check clean (
layoutCheck()in Figma,render_slides.pyin HTML) or each note explained; cover and data frame seen (or the gap reported). - Close: one CTA, all sources and credits; generated images labelled as illustrations.
-
publish.mdcomplete and a row added tocontent/design-log.md; nothing posted, liked, or followed without explicit consent. - Plans pass
check_plan.py.
File map
| File | Read when |
|---|---|
brands/README.md, brands/<brand>/brand.md, design.md | every run |
../setup-content/SKILL.md, references/brand-onboarding.md | first run (no content/setup.md), a new brand, a new renderer |
references/planning.md | planning, repurposing, reviewing |
references/writing-craft.md, references/examples/*.md (two worked carousels with rejected drafts) | before writing anything |
references/copy-playbook.md | frameworks, copy.md format, CTA, caption |
references/language/id.md, en.md | the brand's language |
references/formats/*.md | the format being made; specs.md for limits |
references/design-system.md, design-variety.md, design-references.md | before building frames: roles, layout variants and how to choose them, patterns from other accounts |
references/figma-mechanics.md | before the first use_figma; upload, duotone, screenshots |
references/html-render.md, templates/html/ | the HTML → PNG renderer: setup, class reference, render, check |
references/image-sourcing.md, research-tools.md | research and images |
references/patterns-from-data.md | why the rules are what they are |
references/prerequisites.md | installing companions and optional tools |
templates/ | workspace, setup, plan, brief, publish, review, ideas, design log; html/ (slide kit and example) |
scripts/ | lint_copy.py, check_plan.py, new_item.py, figma-helpers.js (layouts, schemes), figma_bundle.py, figma-gallery.js + figma-gallery-2.js, figma-gallery-schemes.js, brand_css.py, new_html.py, render_slides.py, crawl_site.py, capture_profile.sh, artefact_marks.py, ref_sheets.py, slides_to_pdf.py, capture_artefact.sh, x_post.py, scan_site_tokens.sh, unsplash_search.py, gen_image.py, agy_image.sh, contact_sheet.py, export_oss.sh |
When not to use this
Not for a slide deck or presentation (use a slides skill), not for building a website, and not for a one-word fix in an existing post (edit it directly).