Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/travsteward-newsletter-writer
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: documents, backend, data, writing
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/newsletter-writer
What's inside
- Skill 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.
- License
- MIT
- Metadata
- author: travsteward · version: 0.2.0
- Instructions
- 585 lines in SKILL.md · view on GitHub
Before installing
- Instructions call the network
Agent Skills spec issues
- body: 585 lines (spec recommends under 500)
Files (3)
- SKILL.md
- config.md
- convert-to-blog.md · docs/
SKILL.md (first lines)
# 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` — Publish to your OpenWriter site, which emails it to your subscribers
- `/newsletter status` — Subscriber count, last sent, domain status
**Format rules for newsletter documents (subject, preview line, body, images, cover, sending and scheduling) arrive from OpenWriter when the document is opened.** This skill keeps voice, structure, section strategy and the weekly pipeline.
## 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. Install the authors-voice skill with `claude install github:travsteward/authors-voice`.
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:
```json
[
{"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}, "content": [{"type": "text", "text": "Section 4"}]},
{"type": "paragraph", "content": [{"type": "text", "text": "[Article or thread deep dive]"}]},
{"type": "horizontalRule"},
{"type": "heading", "attrs": {"level": 2}, "content": [{"type": "text", "text": "Section 5"}]},
{"type": "paragraph", "content": [{"type": "text", "text": "[From the Archives]"}]},
{"type": "horizontalRule"},
{"type": "heading", "attrs": {"level": 2}, "content": [{"type": "text", "text": "The Reading Room"}]},
{"type": "paragraph", "content": [
{"type": "text", "marks": [{"type": "link", "attrs": {"href": "https://deeprest.example.com"}}], "text": "DeepRest"},
{"type": "text", "text": " is the home for people fixing their sleep for good. [Edition-specific CTA — echo themes]."}
]},
{"type": "paragraph", "content": [
{"type": "text", "marks": [{"type": "italic"}], "text": "The Sleep Brief is a weekly email from DeepRest."}
]},
{"type": "paragraph", "content": [
{"type": "text", "marks": [{"type": "italic"}], "text": "Powered by "},
{"type": "text", "marks": [{"type": "italic"}, {"type": "bold"}, {"type": "link", "attrs": {"href": "https://www.openwriter.io"}}], "text": "OpenWriter"}
]}
]
```
After scaffolding, tell the author the skeleton is live at localhost:5050. Then proceed to gather.
### Workspace Ordering
All newsletter docs live in the "Newsletter" workspace. Order: most recent at top, working notes directly below its newsletter, oldest at bottom.
```
The Sleep Brief #N ← newest
SB#N — Working Notes
The Sleep Brief #N-1
...
The Sleep Brief #1 ← oldest
```
When creating the scaffold and companion doc, add both to the Newsletter workspace and use `move_item` with `afterId` to place the working notes directly after its newsletter.
### Standalone `/newsletter scaffold`
When run standalone (not part of the full pipeline), just scaffold and stop. The author reviews the bones in the editor.
## Phase 2: Gather
Collect all data before presenting anything to the author.
### Tweet Metrics
If the author keeps a local tweet-metrics database (a JSON file of posts + view counts, refreshed via fxtwitter or similar), pull from it:From travsteward/openwriter, MIT.
More from travsteward/openwriter
- 0.658score
x-writer
travsteward
Writing format, image generation, and pipeline for X (Twitter) content.
SkillAFreshness: A★ 35Claude Code +9 - 0.653score
anti-ai
travsteward
Anti-AI detection pass for any written text.
SkillAFreshness: A★ 35Claude Code +9 - 0.653score
blog-writer
travsteward
Channel-master writer for long-form blog posts.
SkillAFreshness: A★ 35Claude Code +9 - 0.653score
book-writer
travsteward
Orchestration skill for book-scale long-form writing (fiction or nonfiction).
SkillAFreshness: A★ 35Claude Code +9 - 0.649score
beat-writer
travsteward
Channel-agnostic writer for any piece of content that doesn't yet belong to a specific channel.
SkillAFreshness: A★ 35Claude Code +9 - 0.648score
polish
travsteward
Polish copy to 90/100.
SkillAFreshness: A★ 35Claude Code +9 - 0.644score
openwriter
travsteward
OpenWriter — the writing surface for AI agents.
SkillAFreshness: A★ 35Claude Code +9
Compare and alternatives
Featured in
Signals
- Stars
- 35
- Forks
- 2
- Open issues
- 7
- Last commit (this folder)
- Oct 14, 2026 (13 days ago)
- Last release
- Oct 23, 2026 (4 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- Version
- 0.2.0
- License
- MIT
- Repository
- github.com/travsteward/openwriter
- Website
- openwriter.io
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from travsteward
- 0.658score
x-writer
travsteward
Writing format, image generation, and pipeline for X (Twitter) content.
SkillAFreshness: A★ 35Claude Code +9 - 0.653score
anti-ai
travsteward
Anti-AI detection pass for any written text.
SkillAFreshness: A★ 35Claude Code +9 - 0.653score
blog-writer
travsteward
Channel-master writer for long-form blog posts.
SkillAFreshness: A★ 35Claude Code +9 - 0.653score
book-writer
travsteward
Orchestration skill for book-scale long-form writing (fiction or nonfiction).
SkillAFreshness: A★ 35Claude Code +9 - 0.649score
beat-writer
travsteward
Channel-agnostic writer for any piece of content that doesn't yet belong to a specific channel.
SkillAFreshness: A★ 35Claude Code +9 - 0.648score
polish
travsteward
Polish copy to 90/100.
SkillAFreshness: A★ 35Claude Code +9
Cite this page
newsletter-writer skill. Agent Mart. https://agentmart.dev/skills/travsteward-newsletter-writer (last updated 2026-10-24)