Skip to content
Content
Skill

/newsletter-writer

Channel-master writer for email newsletter. Weekly pipeline: scaffold structure, gather data, query the author, synthesize in their voice, review, send. Companion doc workflow. Voice-matched via the authors-voice skill. Works for any behind-the-scenes weekly newsletter built on

From plugin
openwriter
288 skills2 agents
Install
$ npx -y skills add travsteward/openwriter --skill newsletter-writer --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/newsletter-writer

Context preview

The summary Claude sees to decide when to auto-load this skill.

Channel-master writer for email newsletter. Weekly pipeline: scaffold structure, gather data, query the author, synthesize in their voice, review, send. Companion doc workflow. Voice-matched via the authors-voice skill. Works for any behind-the-scenes weekly newsletter built on

SKILL.md

newsletter-writer.SKILL.md
name: newsletter-writer
description: |
  Channel-master writer for email newsletter. Weekly pipeline: scaffold structure,
  gather data, query the author, synthesize in their voice, review, send. Companion
  doc workflow. Voice-matched via the authors-voice skill. Works for any
  behind-the-scenes weekly newsletter built on proven content.

  Use when: "/newsletter-writer", "newsletter", "draft newsletter", "scaffold
  newsletter", "newsletter gather", "newsletter review", "newsletter send",
  "newsletter status", "newsletter to blog", "convert newsletter".

  Requires: OpenWriter MCP server configured.
metadata:
  author: travsteward
  version: "0.2.0"
license: MIT

Newsletter Writer Skill — /newsletter-writer

Weekly newsletter pipeline: scaffold structure, gather data, query the author, synthesize in their voice, review, send.

**Worked example throughout:** a fictional newsletter, **The Sleep Brief**, written by a popular-science sleep author whose community site is `deeprest.example.com` and whose X handle is `@sleepauthor`. Substitute your own newsletter name, brand, domain, and handle — they live in your project's `config.md` (see Configuration).

Philosophy

This newsletter is **behind the scenes**, not a content recap. Readers can go read the tweets and articles themselves. The newsletter gives them what they can't get anywhere else: WHY the author wrote it, what they were trying to achieve, the deeper reasoning that didn't fit in 280 characters, and how the author's project interacted with the world that week. Every section answers "what was I thinking?" not "what did I post."

Commands

  • `/newsletter` or `/newsletter draft` — Full pipeline: scaffold → gather → query → enhanced scaffold → draft → review
  • `/newsletter scaffold` — Create doc with empty skeleton structure (header, HRs, placeholder sections, footer)
  • `/newsletter gather` — Data collection only (metrics, top tweets, article)
  • `/newsletter review` — Pre-send checklist + /polish 90/100 scoring on every section
  • `/newsletter send` — Send via OpenWriter newsletter system
  • `/newsletter status` — Subscriber count, last sent, domain status

Critical Rules

1. **ALWAYS use the authors-voice protocol.** Load the voice profile/anchor, pull writing samples from the corpus, write with the profile as behavioral constraints, run anti-AI detection. Never skip this. The authors-voice skill ships with the OpenWriter authors-voice plugin. 2. **NEVER write the author's position for them.** You gather data and present structure. You ASK the author what they think. They tell you. You synthesize their input in their voice. The author's original thinking is the product — you are the editor, not the writer. 3. **Source article content from OpenWriter docs FIRST.** X Articles may not be readable via fxtwitter. The drafts live in OpenWriter. Search `list_documents` before trying external APIs. 4. **Every section headline is specific to that week's content.** No generic recurring labels like "This Week on X" or "The Author's Position." Each section gets a unique, attention-grabbing headline based on the actual topic. Example: "Why the 8-Hour Rule Is Wrong for Shift Workers" not "The Author's Position." "The Tweet That Got 1.75M Views About Sleep Debt" not "This Week on X." Specificity is what grabs attention. 5. **No outbound links except the footer CTA.** The newsletter summarizes and screenshots everything — readers don't need to leave. No "View the post →" or "Read the full article →" links to X or anywhere else. The only link in the entire newsletter is the footer CTA to your brand site. Every other link is a leak.

Phase 1: Scaffold

Create the newsletter document with the empty skeleton FIRST. The author sees the structure in OpenWriter before any ideation begins. This is the visceral starting point — the bones of the newsletter visible in the editor.

Determine Issue Number

Check `list_newsletter_issues` for the latest sent issue number. Increment by 1.

Create & Populate Skeleton

1. create_document({ title: "The Sleep Brief #N", content_type: "newsletter" })
2. populate_document with the full skeleton below

Use a single `populate_document` call with this TipTap JSON structure. All section titles are placeholders — they get replaced during drafting after gather/query:

[
  {"type": "heading", "attrs": {"level": 1}, "content": [{"type": "text", "text": "In this Issue:"}]},
  {"type": "paragraph", "content": [
    {"type": "text", "text": "Section 1"},
    {"type": "hardBreak"},
    {"type": "text", "text": "Section 2"},
    {"type": "hardBreak"},
    {"type": "text", "text": "Section 3"},
    {"type": "hardBreak"},
    {"type": "text", "text": "Section 4"},
    {"type": "hardBreak"},
    {"type": "text", "text": "Section 5"}
  ]},
  {"type": "horizontalRule"},
  {"type": "paragraph", "content": [
    {"type": "text", "marks": [{"type": "italic"}], "text": "The Sleep Brief: Weekly current events and X highlights from the "},
    {"type": "text", "marks": [{"type": "italic"}, {"type": "bold"}, {"type": "link", "attrs": {"href": "https://deeprest.example.com"}}], "text": "DeepRest"},
    {"type": "text", "marks": [{"type": "italic"}], "text": " worldview."}
  ]},
  {"type": "horizontalRule"},
  {"type": "heading", "attrs": {"level": 2}, "content": [{"type": "text", "text": "Section 1"}]},
  {"type": "paragraph", "content": [{"type": "text", "text": "[Current events or lead reflection]"}]},
  {"type": "horizontalRule"},
  {"type": "heading", "attrs": {"level": 2}, "content": [{"type": "text", "text": "Section 2"}]},
  {"type": "paragraph", "content": [{"type": "text", "text": "[Tweet commentary]"}]},
  {"type": "horizontalRule"},
  {"type": "heading", "attrs": {"level": 2}, "content": [{"type": "text", "text": "Section 3"}]},
  {"type": "paragraph", "content": [{"type": "text", "text": "[Tweet commentary]"}]},
  {"type": "horizontalRule"},
  {"type": "heading", "attrs": {"level": 2}, "con
Read more
Ships withopenwriter

Your agent writes. You decide. The open-source writing surface for the agentic era. OpenWriter is a markdown-native rich text editor built for humans and agents working side by side. Your agent writes, and you review and approve every change before it lands.

Get the whole plugin
Stats
28
Stars
1
Forks
Active
Maintenance
TypeScript
Language
MIT
License
7d ago
Last commit
7mo ago
Created

Repo: travsteward/openwriter

Other skills on openwriter.