Linkedin post skill
Use when Chan Meng wants to write an English LinkedIn post for personal-brand marketing — either an "idea" post (sharing a framework/opinion) or a post-event "recap" (reflecting on an offline tech meetup, mentioning speakers/organizers/companies to grow her network). Drafts on-brand copy with emoji + hashtags, generates a Caldera-branded visual (Mermaid diagram, OpenAI image, or HTML card), and drafts it into the LinkedIn composer via claude-in-chrome for review — never auto-posts.From its SKILL.md
npx -y skills add ChanMeng666/linkedin-post-skillAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.6 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it
LinkedIn post writer (Chan Meng / Caldera brand)
Write English LinkedIn posts that build Chan Meng's personal brand and expand her network, then draft them straight into the LinkedIn composer for one-click review. You never click Post — Chan reviews and publishes.
When to use
- "Write a LinkedIn post about <idea>" → idea mode.
- "I went to <event>, write a recap" / "post-event reflection" → recap mode.
Reference docs (read the ones you need)
references/brand.md— colors, fonts, logo, voice do/don'ts, imagery direction.references/voice-and-structure.md— post anatomy + mechanics (read every run).references/hashtag-bank.md— curated hashtag sets + rules.references/recap-playbook.md— recap research, verification, @mention mechanics.examples/post.txt+examples/diagram.mmd— a real reference idea post + its diagram.
Workflow
Step 0 — Pick mode & gather inputs
- Mode from the
/linkedin-post <idea|recap>arg, else infer, else ask once. - Idea: the thought/angle, target audience, any proof points (repos, numbers, links).
- Recap: event name/date/city/link, the people and orgs to credit, and Chan's 1–2 genuine takeaways. Don't block on completeness — gather what she has.
Step 1 — (Recap only) Research & verify mentions
Follow references/recap-playbook.md:
- WebSearch + claude-in-chrome to confirm exact name spelling, current title, employer, and the LinkedIn profile/company URL for each person/org Chan named.
- Write
output/<YYYY-MM-DD>-<slug>/MENTIONS.md(the role/name/title/URL/tag-yes table). - Never invent a profile. Unverified names → plain text only, flagged in MENTIONS.md.
Step 2 — Draft the copy
- Follow the anatomy in
references/voice-and-structure.mdand the voice rules inreferences/brand.md: strong hook, emoji-led structure, mental-shift/takeaway, CTA question, then 8–12 hashtags (idea) or 6–10 (recap) fromreferences/hashtag-bank.md. - Architecture-grade vocabulary, evidence-first, no marketing fluff. English only.
- Plain text (LinkedIn renders no markdown); blank line between beats; emoji as bullets.
- Show Chan the draft and iterate before generating the visual or opening the browser.
Step 3 — Choose & generate ONE visual
Write assets into the same output folder. Visual priority (Chan's stated preference): (1) Mermaid diagram → (2) HTML-rendered image (card or bespoke) → (3) OpenAI image only as a last resort. Default idea posts to a Mermaid diagram; reach for HTML to craft more beautiful bespoke visuals. Ask Chan only if genuinely unsure.
a) Brand Mermaid diagram — PREFERRED (frameworks, before/after, concept maps — great for idea posts):
- Write the diagram to
output/<date>-<slug>/diagram.mmd. Do NOT add a--- config ---frontmatter block (the brand config is applied via the CLI). Use the brand classDefs for accents:
Keep one orange accent per diagram (brand rule). Un-classed nodes already render on-brand.classDef accent fill:#FC5000,stroke:#070607,color:#fff; %% the ONE orange block classDef ink fill:#070607,stroke:#070607,color:#fff; classDef glare fill:#F5F28E,stroke:#070607,color:#070607; classDef surface fill:#F7F6F2,stroke:#070607,color:#070607; %% default-ish - Render:
node scripts/render-mermaid.mjs output/<date>-<slug>/diagram.mmd→ producesdiagram.pngon a basalt background at 2× scale.
b) HTML-rendered image — PREFERRED for richer visuals. Two ways:
b1) Quick branded card (quotes, theses, recap "field-note" cards):
node scripts/render-card.mjs output/<date>-<slug>/card.png \
--eyebrow "EVENT RECAP" \
--headline "<short punchy line — the thesis or a quote>" \
--sub "<one-line context / attribution>" \
--size square # or: landscape
Headline auto-fits; keep it short (a quote or thesis), not a paragraph.
b2) Bespoke HTML — author a custom on-brand layout when the card is too plain. Write an HTML
file that links the brand CSS and wraps content in a .stage element, then screenshot it:
<!-- output/<date>-<slug>/visual.html -->
<link rel="stylesheet" href="../../templates/brand.css"> <!-- ../ depth: output/<slug>/ → repo root -->
<div class="stage square"> …your Caldera layout using --orange/--ink, .display, .rule, blocks… </div>
node scripts/render-html.mjs output/<date>-<slug>/visual.html output/<date>-<slug>/visual.png --selector ".stage"
templates/brand.css gives tokens + helpers (.stage, .eyebrow, .display, .rule,
.block/.px, .card, logo at templates/assets/chan-monkey-logo-black.svg). Honor the brand:
basalt ground, one orange accent per unit, Anton display + DM Sans body, flat (no shadows/gradients).
Use templates/post-card.html as a worked reference.
c) OpenAI image — FALLBACK ONLY (use when neither a diagram nor an HTML layout fits):
node scripts/gen-image.mjs "<prompt>" output/<date>-<slug>/image.png --size landscape
Prompt from references/brand.md → Imagery direction (risograph halftone, orange→violet, flat,
abstract — NO portraits of Chan, no stock scenes). Exit code 2 = no key; tell Chan how to set it
(.env.local) and fall back to a Mermaid/HTML visual.
d) Plain text — some posts need no visual. Skip this step.
Show Chan the rendered asset (Read the PNG) and confirm before drafting into LinkedIn.
Step 4 — Draft into the LinkedIn composer (claude-in-chrome)
Load the browser tools, then:
tabs_context_mcpto see current tabs; create a new tab andnavigatetohttps://www.linkedin.com/feed/. If not logged in, ask Chan to log in, then continue.- Open the post composer ("Start a post").
- Type the copy from
post.txtinto the editor. - Resolve @mentions (recap): for each verified person/company in MENTIONS.md, type
@+ name, wait for the dropdown, and click the matching entry so the tag turns into a real linked chip. Verify each chip is linked. Only tag verified entries. - Attach the visual: try
find/read_pagefor an<input type="file">ref and usefile_upload. Known limitation (LinkedIn web): the composer injects no usable file input into the accessibility tree, and clicking the photo icon opens a native OS file picker you must NOT drive (it can block the session). So by default, hand the image attach to Chan: tell her the exact PNG path and ask her to click the photo icon and select it. Don't risk the native dialog. - STOP. Do not click Post. Tell Chan the draft + the visual path, and ask her to attach the image (if not done) and publish.
Browser note: this environment auto-resizes the window between actions, which can close the composer. Type the full post (body + hashtags) in ONE
typecall, screenshot once to confirm, and avoid extra round-trips while the modal is open.
Optional: record the composer steps with
gif_creatorif Chan wants a replay. Caution: avoid clicking anything that triggers a browser dialog (see global browser guidance).
Step 5 — Final output
Leave the folder output/<YYYY-MM-DD>-<slug>/ containing:
post.txt— the final copy (copy-paste-ready fallback).- the visual (
diagram.mmd+diagram.png,card.png, orimage.png). MENTIONS.md— recap only.
Setup / dependencies (already installed in this repo)
npm installdone (playwright + openai + mermaid-cli local);npx playwright install chromiumdone.- OpenAI image needs a key: copy
.env.example→.envand setOPENAI_API_KEY. Without it, image mode falls back to Mermaid/card — everything else works. mmdcreuses the existingpuppeteer-config.json; the brand theme lives intemplates/mermaid-brand-config.json+templates/mermaid-brand.css.
Guardrails
- English only; on-brand voice; one orange accent per visual.
- Never auto-publish; always stop at the staged draft for Chan's review.
- Never invent a person's identity/handle; verify before tagging (
recap-playbook.md). - Keep generated work in
output/(gitignored); never write drafts to the repo root.
What ships with it: 30 files
211.0 KB alongside SKILL.md, 5 of them executable
examples/
- diagram.mmd1.4 KB
- diagram.png124.6 KB
- post.txt1.8 KB
references/
- brand.md4.9 KB
- hashtag-bank.md2.2 KB
- recap-playbook.md5.2 KB
- visuals.md5.5 KB
- voice-and-structure.md6.4 KB
scripts/
- gen-image.mjsruns2.1 KB
- lib/load-env.mjsruns1.4 KB
- render-card.mjsruns3.5 KB
- render-html.mjsruns2.3 KB
- render-mermaid.mjsruns1.8 KB
templates/
- assets/chan-monkey-logo-black.svg16.9 KB
- brand.css3.1 KB
- mermaid-brand-config.json952 B
- mermaid-brand.css517 B
- post-card.html4.0 KB
- CHANGELOG.md4.5 KB
- CODE_OF_CONDUCT.md5.1 KB
- CONTRIBUTING.md1.5 KB
- .env.example210 B
- .gitignore155 B
- GOVERNANCE.md1.8 KB
- LICENSE1.0 KB
- package.json553 B
- puppeteer-config.json59 B
- README.md5.2 KB
- SECURITY.md1.2 KB
- SUPPORT.md1.1 KB