# Leather Changelog

> Generate product changelog entries, X/Twitter posts, and Slack announcements for Leather wallet releases. Use when creating release communications including changelog entries for app.leather.io/changelog, announcement tweets (single or threads), and community Slack posts. Inputs may include verbal feature descriptions, Linear projects, or GitHub PRs.

- Skill: `leather-io/leather-changelog` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add leather-io/leather-changelog`
- Raw SKILL.md: https://api.skillmd.com/api/skills/leather-io/leather-changelog/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: leather-io (https://skillmd.com/u/leather-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/leather-io/leather-changelog

---


# Leather Release Communications

Generate consistent, on-brand release communications for Leather wallet across changelog entries, X posts, and Slack announcements.

## Process

1. **Gather context** — Review provided feature description, Linear project, or GitHub PRs
2. **Identify the "why"** — Determine the user problem being solved or improvement being delivered
3. **Read format references** — See `references/voice-and-formats.md` for voice guidelines and templates
4. **Generate outputs** — Create requested formats (changelog, X post, Slack, or all three)

## Output Summary

| Format | Purpose | Length |
|--------|---------|--------|
| Changelog | Permanent product record at app.leather.io/changelog | 50-150 words |
| X single | Quick announcement for smaller features | 280 chars max |
| X thread | Major releases needing context | 3-5 tweets |
| Slack | Community announcement | 100-200 words |

## Voice Principles

- **Lead with impact** — Start with why this matters to users, not what changed technically
- **Understated confidence** — Let the product speak; avoid hype words ("excited", "thrilled", "game-changing")
- **One idea per sentence** — Short, declarative statements
- **Show don't tell** — Concrete benefits over abstract claims

See `references/voice-and-formats.md` for detailed guidelines and examples.

## Sanity CMS Integration

Use `scripts/sanity-changelog.js` to upload changelog entries to Sanity CMS as drafts.

### Setup

```bash
export SANITY_PROJECT_ID="your-project-id"
export SANITY_DATASET="production"  # optional, defaults to "production"
export SANITY_API_TOKEN="your-write-token"
```

### Usage

```bash
# Test upload without creating (dry run)
node scripts/sanity-changelog.js --title "Feature title" --body changelog.md --dry-run

# Create draft in Sanity
node scripts/sanity-changelog.js --title "Feature title" --body changelog.md

# With custom slug and publication date
node scripts/sanity-changelog.js \
  --title "Feature title" \
  --body changelog.md \
  --slug "custom-slug" \
  --published-at "2025-01-15T10:00:00Z"
```

### Markdown Support

The script converts markdown to Sanity Portable Text:
- Paragraphs (separated by blank lines)
- `## Headings` and `### Headings` → h2 blocks
- `**bold**`, `*italic*`, `` `code` `` inline formatting

### Options

| Option | Description |
|--------|-------------|
| `--title, -t` | Changelog entry title (required) |
| `--body, -b` | Path to markdown file (required) |
| `--slug, -s` | URL slug (auto-generated if not provided) |
| `--published-at` | ISO datetime (default: now) |
| `--hero-image` | Sanity asset ID for hero image |
| `--dry-run` | Test without creating document |

