accessibility-complian…
Web accessibility patterns for news and academic sites. Use for WCAG audits, alt text, accessible data viz, and assistive tech.
Email newsletter workflows. Use when creating newsletters, building subscriber lists, designing templates, or tracking engagement.
$ npx -y skills add jamditis/claude-skills-journalism --skill newsletter-publishing --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/newsletter-publishingContext preview
The summary Claude sees to decide when to auto-load this skill.
Email newsletter workflows. Use when creating newsletters, building subscriber lists, designing templates, or tracking engagement.
name: newsletter-publishing description: Email newsletter workflows. Use when creating newsletters, building subscriber lists, designing templates, or tracking engagement.
Practical workflows for building and managing email newsletters for journalism and academia.
## Newsletter strategy document ### Core identity - **Name**: - **Tagline** (one line): - **What readers get**: [specific value proposition] - **Frequency**: [ ] Daily [ ] Weekly [ ] Bi-weekly [ ] Monthly ### Target audience - Primary reader: - What they care about: - Why they'll subscribe: - What they'll do with this info: ### Content pillars 1. [Core topic 1] - [how often] 2. [Core topic 2] - [how often] 3. [Recurring feature] - [how often] ### Voice and tone - Formal ↔ Conversational: [1-5] - Serious ↔ Light: [1-5] - Reported ↔ Personal: [1-5] ### Success metrics (first 6 months) - Subscriber goal: - Target open rate: - Target click rate:
## [Newsletter Name] - Issue #[XX] **Date**: [Date] **Subject line**: [Subject] **Preview text**: [First 50-90 characters readers see] --- ### Opening hook [2-3 sentences that make readers want to keep reading] ### Main story [Your primary content - 300-600 words for most newsletters] ### Secondary items (if applicable) - **Quick hit 1**: [Brief item with link] - **Quick hit 2**: [Brief item with link] ### Recurring section [Weekly column, data point, recommendation, etc.] ### Sign-off [Personal note, call to action, or preview of next issue] --- **Unsubscribe** | **Preferences** | **Forward to a friend**
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{newsletter_name}}</title>
<style>
/* Reset styles for email clients */
body { margin: 0; padding: 0; width: 100%; }
table { border-collapse: collapse; }
img { border: 0; display: block; }
/* Responsive container */
.container {
max-width: 600px;
margin: 0 auto;
font-family: Georgia, serif;
font-size: 18px;
line-height: 1.6;
color: #333;
}
/* Dark mode support */
@media (prefers-color-scheme: dark) {
.container { background-color: #1a1a1a; color: #e0e0e0; }
a { color: #6db3f2; }
}
/* Mobile styles */
@media only screen and (max-width: 480px) {
.container { padding: 15px !important; }
h1 { font-size: 24px !important; }
}
</style>
</head>
<body>
<table role="presentation" width="100%">
<tr>
<td align="center" style="padding: 20px;">
<div class="container">
<!-- Header -->
<table width="100%">
<tr>
<td style="padding-bottom: 20px; border-bottom: 2px solid #333;">
<h1 style="margin: 0;">{{newsletter_name}}</h1>
<p style="margin: 5px 0 0; color: #666;">{{issue_date}}</p>
</td>
</tr>
</table>
<!-- Content -->
<table width="100%">
<tr>
<td style="padding: 30px 0;">
{{content}}
</td>
</tr>
</table>
<!-- Footer -->
<table width="100%">
<tr>
<td style="padding-top: 20px; border-top: 1px solid #ddd; font-size: 14px; color: #666;">
<p>You're receiving this because you subscribed to {{newsletter_name}}.</p>
<p>
<a href="{{unsubscribe_url}}">Unsubscribe</a> |
<a href="{{preferences_url}}">Update preferences</a>
</p>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</body>
</html>from dataclasses import dataclass, field
from datetime import datetime
from typing import List, Dict, Optional
from enum import Enum
import hashlib
class SubscriberStatus(Enum):
ACTIVE = "active"
UNSUBSCRIBED = "unsubscribed"
BOUNCED = "bounced"
COMPLAINED = "complained"
@dataclass
class Subscriber:
email: str
name: Optional[str] = None
subscribed_at: datetime = field(default_factory=datetime.now)
status: SubscriberStatus = SubscriberStatus.ACTIVE
tags: List[str] = field(default_factory=list)
custom_fields: Dict = field(default_factory=dict)
@property
def hash_id(self) -> str:
"""Generate unique ID for unsubscribe links."""
return hashlib.md5(self.email.encode()).hexdigest()[:12]
@dataclass
class NewsletterIssue:
subject: str
preview_text: str
html_content: str
plain_text: str
scheduled_at: Optional[datetime] = None
sent_at: Optional[datetime] = None
issue_number: int = 0
# Metrics
sent_count: int = 0
delivered_count: int = 0
opened_count: int = 0
clicked_count: int = 0
bounced_count: int = 0
unsubscribed_count: int = 0
@property
def open_rate(self) -> float:
if self.delivered_count == 0:
return 0.0
return (self.opened_count / self.delivered_count) * 100
@property
def click_rate(self) -> float:
if self.delivered_count == 0:
return 0.0
return (self.clicked_count / self.delivered_count) * 100
class NewsletterManager:
"""Core newsletter operations."""
def __init__(self, name: str):
self.name = name
self.subscribers: List[SubscA collection of Agent Skills for journalists, researchers, academics, media professionals, and communications practitioners. The same repository serves Claude Code and Codex while keeping Claude-only commands, agents, and hooks clearly labeled.
Repo: jamditis/claude-skills-journalism
Web accessibility patterns for news and academic sites. Use for WCAG audits, alt text, accessible data viz, and assistive tech.
Scans the session for lessons and workflows, then proposes scoped CLAUDE.md edits. Use for save this lesson or add to context.
Manages attention and evidence in long agent sessions. Use for lost instructions, dropped evidence, or large multi-agent contexts.
Directs the current request through configured lower-tier agents. Use only for explicit /director or /dev-toolkit:director invocation.
Electron desktop apps with React, TypeScript, and Vite. Use for IPC, window/tray, PTY terminals, WebRTC, and packaging.
Remote JavaScript console and debugging on mobile. Use for phone/tablet console errors, responsive testing, Eruda, and vConsole.