$npx -y skills add jamditis/claude-skills-journalism --skill newsletter-publishingEmail newsletter workflows for journalists and researchers. Use when creating, managing, or optimizing email newsletters, building subscriber lists, designing email templates, analyzing engagement metrics, or planning newsletter content calendars. For independent journalists, aca
| 1 | # Newsletter publishing |
| 2 | |
| 3 | Practical workflows for building and managing email newsletters for journalism and academia. |
| 4 | |
| 5 | ## When to activate |
| 6 | |
| 7 | - Creating a new newsletter from scratch |
| 8 | - Designing email templates for journalism content |
| 9 | - Building and segmenting subscriber lists |
| 10 | - Analyzing newsletter performance metrics |
| 11 | - Planning editorial calendars for newsletters |
| 12 | - Migrating between newsletter platforms |
| 13 | - Improving deliverability and open rates |
| 14 | |
| 15 | ## Newsletter architecture |
| 16 | |
| 17 | ### Content strategy framework |
| 18 | |
| 19 | ```markdown |
| 20 | ## Newsletter strategy document |
| 21 | |
| 22 | ### Core identity |
| 23 | - **Name**: |
| 24 | - **Tagline** (one line): |
| 25 | - **What readers get**: [specific value proposition] |
| 26 | - **Frequency**: [ ] Daily [ ] Weekly [ ] Bi-weekly [ ] Monthly |
| 27 | |
| 28 | ### Target audience |
| 29 | - Primary reader: |
| 30 | - What they care about: |
| 31 | - Why they'll subscribe: |
| 32 | - What they'll do with this info: |
| 33 | |
| 34 | ### Content pillars |
| 35 | 1. [Core topic 1] - [how often] |
| 36 | 2. [Core topic 2] - [how often] |
| 37 | 3. [Recurring feature] - [how often] |
| 38 | |
| 39 | ### Voice and tone |
| 40 | - Formal ↔ Conversational: [1-5] |
| 41 | - Serious ↔ Light: [1-5] |
| 42 | - Reported ↔ Personal: [1-5] |
| 43 | |
| 44 | ### Success metrics (first 6 months) |
| 45 | - Subscriber goal: |
| 46 | - Target open rate: |
| 47 | - Target click rate: |
| 48 | ``` |
| 49 | |
| 50 | ### Issue structure template |
| 51 | |
| 52 | ```markdown |
| 53 | ## [Newsletter Name] - Issue #[XX] |
| 54 | **Date**: [Date] |
| 55 | **Subject line**: [Subject] |
| 56 | **Preview text**: [First 50-90 characters readers see] |
| 57 | |
| 58 | --- |
| 59 | |
| 60 | ### Opening hook |
| 61 | [2-3 sentences that make readers want to keep reading] |
| 62 | |
| 63 | ### Main story |
| 64 | [Your primary content - 300-600 words for most newsletters] |
| 65 | |
| 66 | ### Secondary items (if applicable) |
| 67 | - **Quick hit 1**: [Brief item with link] |
| 68 | - **Quick hit 2**: [Brief item with link] |
| 69 | |
| 70 | ### Recurring section |
| 71 | [Weekly column, data point, recommendation, etc.] |
| 72 | |
| 73 | ### Sign-off |
| 74 | [Personal note, call to action, or preview of next issue] |
| 75 | |
| 76 | --- |
| 77 | |
| 78 | **Unsubscribe** | **Preferences** | **Forward to a friend** |
| 79 | ``` |
| 80 | |
| 81 | ## Technical implementation |
| 82 | |
| 83 | ### HTML email template (responsive) |
| 84 | |
| 85 | ```html |
| 86 | <!DOCTYPE html> |
| 87 | <html lang="en"> |
| 88 | <head> |
| 89 | <meta charset="UTF-8"> |
| 90 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| 91 | <title>{{newsletter_name}}</title> |
| 92 | <style> |
| 93 | /* Reset styles for email clients */ |
| 94 | body { margin: 0; padding: 0; width: 100%; } |
| 95 | table { border-collapse: collapse; } |
| 96 | img { border: 0; display: block; } |
| 97 | |
| 98 | /* Responsive container */ |
| 99 | .container { |
| 100 | max-width: 600px; |
| 101 | margin: 0 auto; |
| 102 | font-family: Georgia, serif; |
| 103 | font-size: 18px; |
| 104 | line-height: 1.6; |
| 105 | color: #333; |
| 106 | } |
| 107 | |
| 108 | /* Dark mode support */ |
| 109 | @media (prefers-color-scheme: dark) { |
| 110 | .container { background-color: #1a1a1a; color: #e0e0e0; } |
| 111 | a { color: #6db3f2; } |
| 112 | } |
| 113 | |
| 114 | /* Mobile styles */ |
| 115 | @media only screen and (max-width: 480px) { |
| 116 | .container { padding: 15px !important; } |
| 117 | h1 { font-size: 24px !important; } |
| 118 | } |
| 119 | </style> |
| 120 | </head> |
| 121 | <body> |
| 122 | <table role="presentation" width="100%"> |
| 123 | <tr> |
| 124 | <td align="center" style="padding: 20px;"> |
| 125 | <div class="container"> |
| 126 | <!-- Header --> |
| 127 | <table width="100%"> |
| 128 | <tr> |
| 129 | <td style="padding-bottom: 20px; border-bottom: 2px solid #333;"> |
| 130 | <h1 style="margin: 0;">{{newsletter_name}}</h1> |
| 131 | <p style="margin: 5px 0 0; color: #666;">{{issue_date}}</p> |
| 132 | </td> |
| 133 | </tr> |
| 134 | </table> |
| 135 | |
| 136 | <!-- Content --> |
| 137 | <table width="100%"> |
| 138 | <tr> |
| 139 | <td style="padding: 30px 0;"> |
| 140 | {{content}} |
| 141 | </td> |
| 142 | </tr> |
| 143 | </table> |
| 144 | |
| 145 | <!-- Footer --> |
| 146 | <table width="100%"> |
| 147 | <tr> |
| 148 | <td style="padding-top: 20px; border-top: 1px solid #ddd; font-size: 14px; color: #666;"> |
| 149 | <p>You're receiving this because you subscribed to {{newsletter_name}}.</p> |
| 150 | <p> |
| 151 | <a href="{{unsubscribe_url}}">Unsubscribe</a> | |
| 152 | <a href="{{preferences_url}}">Update preferences</a> |
| 153 | </p> |
| 154 | </td> |
| 155 | </tr> |
| 156 | </table> |
| 157 | </div> |
| 158 | </td> |
| 159 | </tr> |
| 160 | </table> |
| 161 | </body> |
| 162 | </html> |
| 163 | ``` |
| 164 | |
| 165 | ### Python newsletter sender |
| 166 | |
| 167 | ```python |
| 168 | from dataclasses import dataclass, field |
| 169 | from datetime import datetime |
| 170 | from typing import List, Dict, Optional |
| 171 | from enum import Enum |
| 172 | import hashlib |
| 173 | |
| 174 | class SubscriberStatus(Enum): |
| 175 | ACTIVE = "active" |
| 176 | UNSUBSCRIBED = "unsubscribed" |
| 177 | BOUNCED = "bounced" |
| 178 | COMPLAINED = "complained" |
| 179 | |
| 180 | @dataclass |
| 181 | class Subscriber: |
| 182 | email: str |
| 183 | name: Optional[str] = None |
| 184 | subscribed_at: datetime = field(default_factory=datetime.now) |
| 185 | sta |