promo-writer
$
npx mdskill add bitwize-music-studio/claude-ai-music-skills/promo-writerCrafts native social posts from album themes and lyrics.
- Fills promo templates with platform-specific copy before release.
- Depends on lyric-writer and uses bitwize-music-mcp tools.
- Analyzes themes, concepts, and streaming text to shape content.
- Outputs formatted posts ready for review in the promo directory.
SKILL.md
.github/skills/promo-writerView on GitHub ↗
---
name: promo-writer
description: Generates platform-specific social media copy from album themes, track concepts, and lyrics. Use when promo/ templates need to be populated before release.
argument-hint: <album-name> [platform]
model: claude-sonnet-4-6
prerequisites:
- lyric-writer
allowed-tools:
- Read
- Edit
- Write
- Glob
- Grep
- bitwize-music-mcp
---
# Promo Writer Skill
Generate social media copy for album promotion across Twitter/X, Instagram, TikTok, Facebook, and YouTube. Produces native-feeling content for each platform from album context — themes, track concepts, and streaming lyrics.
## Purpose
Populate the `promo/` directory with platform-specific copy ready for review. Each platform gets content shaped to its format, tone, and conventions — not the same text cross-posted everywhere.
## When to Use
- After track concepts and lyrics are written (need material to pull from)
- Before release — generate copy to fill promo/ templates
- User says "write promo copy", "create social media posts", or "fill in the promo templates"
- When promo/ files exist but are still template placeholders
## Position in Workflow
```
Lyrics Written → Promo Videos (optional) → **[Promo Writer]** → [Promo Review] → Release
```
Between content completion and promo-reviewer. The promo-reviewer polishes what this skill generates.
## Supporting Files
- **[copy-formulas.md](copy-formulas.md)** — Hook formulas, CTA templates, post structures, hashtag recipes
- **[/reference/promotion/social-media-best-practices.md](/reference/promotion/social-media-best-practices.md)** — Platform strategy and content guidance
- **[/skills/promo-reviewer/platform-rules.md](/skills/promo-reviewer/platform-rules.md)** — Character limits and hashtag rules
---
## Workflow
### 1. Album Resolution
**Resolve the album from arguments:**
Use MCP `find_album` with the album name from `$ARGUMENTS`. If no album specified, check `get_session` for last album context.
**Verify readiness:**
- Album must have track concepts written
- At least some tracks should have streaming lyrics (for quotable hooks)
- If no streaming lyrics exist, warn: "No streaming lyrics found — using track concepts only. Hooks will be less specific."
### 2. Data Gathering
Gather album context in batch to minimize round-trips:
1. **Album data**: `get_album_full(album_slug, "concept,streaming,musical-direction")` — album narrative + track content
2. **Track list**: from album data — all track names, concepts, statuses
3. **Streaming lyrics**: from album data sections — pull quotable hooks from streaming lyrics (NOT Suno lyrics, which contain phonetic spellings)
4. **User preferences**: `load_override("promotion-preferences.md")` — tone, platform priorities, messaging themes, hashtag preferences, AI positioning
**Critical**: Use **streaming lyrics** for quotable hooks. Suno lyrics contain phonetic spellings (`bit-wize`, `Luh-rock-uh`) that must never appear in public-facing copy.
### 3. Generate Campaign Strategy (campaign.md)
Generate `campaign.md` first — it's the strategy foundation that informs all platform copy.
**Content to generate:**
| Section | What to Write |
|---------|---------------|
| Campaign Overview | Album name, release date (or TBD), primary platform, campaign duration |
| Key Messages | 3 core messages derived from album themes — the "why should anyone care" |
| Target Audience | 2-3 audience segments based on genre and themes |
| Schedule | Pre-release, release week, post-release calendar with specific content types |
| Hashtags | Primary (discovery + genre) and secondary (album-specific, AI if applicable) |
**Derive key messages from album data:**
- What is the album about? → Message 1 (concept hook)
- What makes it different? → Message 2 (unique angle)
- Why listen now? → Message 3 (urgency/relevance)
**Present to user for approval before proceeding to platform copy.**
### 4. Language Selection
**Before generating any copy, determine the output language(s).**
**If override exists** with a `## Language` section in `promotion-preferences.md`, use that preference without asking.
**Otherwise, ask:**
```
What language(s) should the promo copy be written in?
[1] English (default)
[2] German (Deutsch)
[3] French (Français)
[4] Spanish (Español)
[5] Bilingual — two languages per post (e.g., DE + EN, FR + EN)
[6] Other — tell me which language(s)
```
**Bilingual mode**: When two languages are selected, each post gets both versions stacked in the same code block, separated by a `---` divider. The primary language comes first, the secondary language second. Hashtags stay in English (international discovery).
**Override file addition** (`{overrides}/promotion-preferences.md`):
```markdown
## Language
- Primary: de
- Secondary: en
- Mode: bilingual
```
Store the selected language(s) and apply to all generated copy in this session.
### 5. Platform Selection
**If platform specified in arguments**, generate only that platform.
**If override exists**, follow platform priority list and skip list from `promotion-preferences.md`.
**Otherwise, ask:**
```
Which platforms should I generate copy for?
[A] All platforms (Twitter, Instagram, TikTok, Facebook, YouTube)
[1] Twitter/X
[2] Instagram
[3] TikTok
[4] Facebook
[5] YouTube
```
### 6. Per-Platform Generation
For each selected platform, generate native content following the structures in [copy-formulas.md](copy-formulas.md) and best practices from the reference guide.
**Read the promo template** for the platform first (`templates/promo/{platform}.md` or existing `promo/{platform}.md`) to match the expected heading structure.
**Per-platform content to generate:**
#### Twitter/X (`twitter.md`)
- Release announcement tweet (1-2 tweets or thread)
- Per-track promo tweets (one per track — hook + concept + link placeholder)
- Behind-the-scenes tweet (process/making-of angle)
- Engagement tweet (question or poll)
- Each tweet: show character count, verify under 280
- 1-2 hashtags per tweet, never starting with a hashtag
#### Instagram (`instagram.md`)
- Release announcement caption (hook in first 125 chars)
- 2-3 track highlight captions (story angle, personal)
- Behind-the-scenes caption
- Hashtag block (15-20 tags, separated from caption)
- Show character count for each caption
#### TikTok (`tiktok.md`)
- Release announcement caption (under 150 chars)
- Per-track captions (short, casual, under 150 chars)
- Behind-the-scenes caption
- 3-5 hashtags per post
- Note: video content does the heavy lifting — captions are secondary
#### Facebook (`facebook.md`)
- Release announcement (longer storytelling format, 150-300 words)
- Track highlight posts (2-3, with personal angle)
- Behind-the-scenes story post
- 3-5 hashtags per post, at end
#### YouTube (`youtube.md`)
- Album/track description template (hook in first 2-3 lines)
- Credits section
- Social links section
- 3-5 hashtags
### 7. Present for Approval
Present each platform's generated copy with metrics:
```
## Twitter/X — Generated Copy
### Release Announcement
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[Generated tweet text]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Chars: 187/280 | Hashtags: 2 | Status: Within limits
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
### Track 01: [Track Name]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[Generated tweet text]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Chars: 214/280 | Hashtags: 2 | Status: Within limits
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[... more posts ...]
Actions:
[A] Approve all — write to promo/twitter.md
[R] Revise specific posts — tell me which ones and what to change
[N] Next platform — skip this platform
```
### 8. Write Approved Copy
Write approved copy to the `promo/` directory in the album path:
```
{content_root}/artists/{artist}/albums/{genre}/{album}/promo/
```
**Match the file structure expected by promo-reviewer:**
- Use `##` and `###` headings to delineate sections
- Put post copy inside ``` code blocks
- Include any platform-specific metadata (character counts not written to file)
**If promo/ directory doesn't exist**, create it.
**If files already exist**, ask before overwriting:
```
promo/twitter.md already has content. Overwrite? [Y/n]
```
### 9. Summary and Next Steps
After all platforms are written:
```
## Promo Copy Generated
| Platform | Posts | Status |
|----------|-------|--------|
| Campaign | 1 | Written |
| Twitter | 8 | Written |
| Instagram | 5 | Written |
| TikTok | 6 | Written |
| Facebook | 4 | Written |
| YouTube | 1 | Written |
Files written to: {album_path}/promo/
Next steps:
1. Review and polish: /bitwize-music:promo-reviewer <album-name>
2. Replace [Streaming Link] placeholders with actual URLs when available
3. When ready to release: /bitwize-music:release-director <album-name>
```
---
## Content Rules
### Streaming Lyrics Only
Pull quotable hooks from **streaming lyrics** sections. Never use Suno lyrics — they contain phonetic spellings meant for the AI, not human readers.
### Campaign First
Always generate `campaign.md` before platform copy. The strategy document establishes key messages, audience, and schedule that inform every platform's content.
### Native Content
Each platform gets content shaped to its conventions:
- Twitter: punchy, under 280 chars, 1-2 hashtags
- Instagram: visual-first, hook in first 125 chars, hashtag block
- TikTok: ultra-casual, under 150 chars, video does the work
- Facebook: storytelling, longer form, community-building
- YouTube: informative, structured, SEO-aware
Never write the same text for multiple platforms.
### Match Promo-Reviewer Structure
The promo-reviewer skill expects specific file structure:
- `##` headings for major sections
- `###` headings for individual posts
- Post copy inside ``` code blocks
- This structure enables section-by-section review
### Hashtag Rules
Follow the researched best practices:
- **Twitter**: 1-2 per tweet, never start with hashtag, rotate sets
- **Instagram**: 15-20 per post, separate block, mix volume levels
- **TikTok**: 3-5 per post, include trending if applicable
- **Facebook**: 3-5, at end, for categorization
- **YouTube**: 3-5, first 3 shown above title
- **Never use**: #MusicPromotion, #SoundCloudPromotion, #FollowBack, #Like4Like
### Language Handling
- Write all copy in the language(s) selected in Step 4
- **Bilingual mode**: Primary language first, `---` divider, secondary language second — both in the same code block
- **Twitter exception**: Bilingual mode uses separate tweets per language (one tweet per language, or thread), NOT stacked in one tweet — 280 chars is too tight for two languages
- **Hashtags**: Always in English for international discovery, regardless of copy language
- **Quoted lyrics**: Keep in original language with a brief translation in parentheses if the copy language differs
- **Platform notes** (Notes section at bottom of each file): Always in English for consistency
### Override Respect
If `promotion-preferences.md` override exists:
- Follow tone and voice preferences
- Respect platform skip list
- Apply messaging theme preferences (always/never mention)
- Use hashtag preferences (always include, avoid list)
- Follow AI positioning guidance
- Follow language preferences (primary, secondary, mode)
---
## Remember
1. **Read copy-formulas.md** at invocation — it has the hook formulas and post structures
2. **Streaming lyrics only** — never Suno phonetic lyrics in public copy
3. **Campaign.md first** — strategy before platform copy
4. **Language before platforms** — determine output language(s) before generating any copy
5. **Present before writing** — show generated copy with metrics for approval
6. **Native per platform** — different tone, length, structure for each
7. **Match promo-reviewer format** — headings + code blocks for section-by-section review
8. **Check override** — load `promotion-preferences.md` for tone, platforms, messaging, language
9. **Suggest promo-reviewer next** — always end with the recommendation to review
10. **Placeholder links** — use `[Streaming Link]` where real URLs will go
11. **Preserve album voice** — the copy should feel consistent with the album's themes and tone
12. **Hashtags in English** — always English hashtags for discovery, even when copy is in another language
**Your deliverable**: Populated `promo/` directory with platform-specific copy ready for review.
**Workflow integration**: You fill the gap between content completion and promo-reviewer — generating what was previously a manual creative step.
More from bitwize-music-studio/claude-ai-music-skills
- aboutProvides information about the bitwize-music plugin, its version, and its creator. Use when the user asks about the plugin, its purpose, version, or capabilities.
- album-art-directorCreates visual concepts for album artwork and generates AI art prompts. Use during planning for concept discussion, or after all tracks are Final for actual artwork generation.
- album-conceptualizerDesigns album concepts, tracklist architecture, and thematic planning through 7 structured phases. Use when planning a new album or reworking an existing album concept.
- album-dashboardShows a structured progress dashboard for an album with percentage complete per phase, blocking items, and status breakdown. Use for a quick visual overview of album progress.
- album-ideasTracks and manages album ideas including brainstorming, planning, and status updates. Use when the user wants to add, review, or organize their album idea backlog.
- clipboardCopies track content (lyrics, style prompts, streaming lyrics) to the system clipboard. Use when the user needs to paste lyrics or style prompts into Suno or other external tools.
- cloud-uploaderUploads promo videos and content to Cloudflare R2 or AWS S3. Use when the user wants to host promo content for social media or distribution.
- configureSets up or edits the plugin configuration file interactively. Use on first-time setup, when config is missing, or when the user wants to change settings.
- document-hunterSearches and retrieves documents from free public sources using automated browser navigation. Use when research needs primary source documents like court filings, government reports, or public records.
- explicit-checkerScans lyrics for explicit content and verifies that explicit flags match actual content. Use before Suno generation or release to ensure accurate content ratings.