{"slug":"promote","title":"promote","summary":"Generate X/Twitter release promotion posts with ASCII tables and CodeSnap rendering. Use when writing release posts, promotion tweets, plugin announcements, or preparing social media content for new versions.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-04T15:14:19.892972Z","repo":{"url":"https://github.com/oliver-kriska/claude-elixir-phoenix","stars":560,"forks":44,"license":"MIT","updatedAt":"2026-10-02T04:11:38Z"},"bodyHtml":"<hr>\n<h2>name: promote\ndescription: Generate X/Twitter release promotion posts with ASCII tables and CodeSnap rendering. Use when writing release posts, promotion tweets, plugin announcements, or preparing social media content for new versions.\neffort: medium</h2>\n<h1>/promote — Release Promotion Post Generator</h1>\n<p>Generate data-driven X/Twitter posts for plugin releases with ASCII cards ready for CodeSnap screenshots.</p>\n<h2>When to use</h2>\n<p>Run <code>/promote vX.Y.Z</code> after tagging a release. Optionally add a title: <code>/promote v2.8.0 \"LiveView Streams Overhaul\"</code>.</p>\n<h2>Output</h2>\n<p>All files go to <code>scratchpad/x-posts/{version}-release.md</code> (create directory if needed).</p>\n<p>The output file contains three sections:</p>\n<ol>\n<li><strong>ASCII Card</strong> — box-drawing table for CodeSnap screenshot</li>\n<li><strong>Tweet Thread</strong> — 3-5 tweets in proven format</li>\n<li><strong>CodeSnap Command</strong> — exact CLI command to render the card</li>\n<li><strong>Fact-Check</strong> — every claim with verifiable data source</li>\n</ol>\n<h2>Execution Flow</h2>\n<h3>Step 1: Gather Data</h3>\n<p>Collect these metrics (all are verifiable commands — run them, don't estimate):</p>\n<table>\n<thead>\n<tr>\n<th>Metric</th>\n<th>How to get it</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>File count + insertions/deletions</td>\n<td><code>git diff --stat {prev-tag}..{tag}</code></td>\n</tr>\n<tr>\n<td>Skill count</td>\n<td><code>ls plugins/elixir-phoenix/skills/ \\| wc -l</code></td>\n</tr>\n<tr>\n<td>Agent count</td>\n<td><code>ls plugins/elixir-phoenix/agents/*.md \\| wc -l</code></td>\n</tr>\n<tr>\n<td>Iron Law count</td>\n<td>Grep for numbered Iron Laws in CLAUDE.md</td>\n</tr>\n<tr>\n<td>Eval scores</td>\n<td><code>make eval-all</code> (run it, report actual numbers)</td>\n</tr>\n<tr>\n<td>Changelog entries</td>\n<td>Read CHANGELOG.md for this version's section</td>\n</tr>\n<tr>\n<td>Before/after metrics</td>\n<td>Depends on release — look for quantifiable changes</td>\n</tr>\n</tbody>\n</table>\n<p>The strongest posts have <strong>before/after comparisons</strong>. Look for changes in CHANGELOG.md that have measurable deltas (line counts, counts of affected files, error rates, coverage numbers).</p>\n<h3>Step 2: Write the ASCII Card</h3>\n<p>The card is the visual centerpiece — it gets screenshotted via CodeSnap and attached to tweet 1.</p>\n<p>Rules:</p>\n<ul>\n<li><strong>Exactly 72 characters wide</strong> (including borders) — consistent with past posts</li>\n<li>Use Unicode box-drawing: <code>┌─┐│└┘╞═╡╤╪╧</code> for borders and separators</li>\n<li>Include: version + title, headline stats, before/after table, repo URL</li>\n<li>The table content comes from Step 1 data — pick the 3-5 most impressive changes</li>\n<li><strong>VERIFY ALIGNMENT</strong>: After writing the table, run a Python script to check every line has the same visual width. Off-by-one errors are the most common problem — em dashes (<code>—</code>) and arrows (<code>→</code>) are single-width but easy to miscount. Every line between the top <code>┌</code> and bottom <code>└</code> borders must be exactly 72 visual characters</li>\n</ul>\n<p>Also save the ASCII card as a separate <code>.txt</code> file at <code>scratchpad/x-posts/{version}-table.txt</code> for CodeSnap input.</p>\n<p>See <code>${CLAUDE_SKILL_DIR}/references/templates.md</code> for the proven card format and past examples.</p>\n<h3>Step 3: Write the Tweet Thread</h3>\n<p>Follow the <strong>hook → findings → details → CTA</strong> structure. Read <code>${CLAUDE_SKILL_DIR}/references/templates.md</code> for proven tweet patterns.</p>\n<p><strong>Thread rules (from analytics on 7 posts, 6.9K-9.9K views):</strong></p>\n<ul>\n<li><strong>Tweet 1 (Hook)</strong>: Version + one compelling sentence about what changed. Include headline stats (files changed, skills, agents). Repo link here — not in a reply. Add <code>#ElixirLang #ClaudeCode</code> hashtags.</li>\n<li><strong>Tweet 2-3 (Findings)</strong>: The specific changes with numbers. Use numbered lists. Before/after metrics are the highest-performing content type.</li>\n<li><strong>Tweet 4-5 (Details/CTA)</strong>: Additional changes + soft CTA (\"Try it and let me know how it feels\"). Link to release page.</li>\n<li><strong>Max 5 tweets</strong> — casual readers drop off after 4-6. If you have more content, cut the least impactful items.</li>\n</ul>\n<p><strong>Voice and tone:</strong></p>\n<ul>\n<li>Data-heavy, transparent, no-hype — this is the proven #1 strength</li>\n<li>Write like a builder sharing real numbers, not a marketer</li>\n<li>Concrete numbers over adjectives (\"32/40 descriptions rewritten\" not \"improved many descriptions\")</li>\n<li>Never mention API costs or token prices — subscription user, cost per call is irrelevant</li>\n</ul>\n<h3>Step 4: CodeSnap Command</h3>\n<p>Output the exact command to render the ASCII card as an image. The card <code>.txt</code> file from Step 2 is the input.</p>\n<p>Use the config file at <code>scratchpad/x-posts/codesnap-claude-dark.json</code> (dark gradient, tight margins, no watermark):</p>\n<pre><code>codesnap -f scratchpad/x-posts/{version}-table.txt \\\n  -o scratchpad/x-posts/{version}-card.png \\\n  --config scratchpad/x-posts/codesnap-claude-dark.json \\\n  --title \"claude-elixir-phoenix {version}\" \\\n  -l text\n</code></pre>\n<p>Then render and verify the image looks correct by reading the output PNG.</p>\n<h3>Step 5: Fact-Check</h3>\n<p>Every claim in the tweets must have a corresponding entry in the fact-check section:</p>\n<pre><code>## Fact-Check\n\n- File stats: `git diff --stat {prev}..{tag}` (output: N files, +X/-Y)\n- Eval scores: `make eval-all` output — N skills avg X.XXX, N agents X.XXX\n- [claim]: [exact command or file:line that proves it]\n</code></pre>\n<p>If a claim can't be verified with a command or file reference, flag it as <strong>UNVERIFIED</strong> and suggest rewording.</p>\n<h2>Bundling Strategy</h2>\n<p>When deciding whether a release warrants its own post:</p>\n<ul>\n<li><strong>Standalone post</strong>: Major features, impressive before/after metrics, new capabilities</li>\n<li><strong>Bundle with next release</strong>: Bug fixes, description tweaks, minor config changes</li>\n<li><strong>Skip entirely</strong>: Patch releases with &lt;5 files changed and no user-facing changes</li>\n</ul>\n<p>The v2.6.1 post (37 likes, 1.4K views) vs v2.6.0 (150 likes, 5.5K views) demonstrates this — back-to-back releases dilute signal. When in doubt, wait and bundle.</p>\n","files":[{"path":"references/templates.md","sizeBytes":8733,"isText":true},{"path":"SKILL.md","sizeBytes":5509,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-04T15:15:58.073958Z","sha256":"C429AB4742C4B6BD60B73544D691CD3E7E78560F960E3116777A831DADBF0726","sizeBytes":5923},"review":null,"source":{"repositoryUrl":"https://github.com/oliver-kriska/claude-elixir-phoenix","path":".claude/skills/promote","license":"MIT","commit":"9767a82d24ddddad553e85f88efc2869a7fd7d88","subtreeSha":"F84D9259F5666C4C6F0E6A6F79879A2D24846C1A106F910B4181BC20B48E07F0","lastSyncedAt":"2026-10-04T15:14:09.139242Z"},"reviewedAt":"2026-10-04T15:18:37.591855Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/oliver-kriska/claude-elixir-phoenix/tree/main/.claude/skills/promote"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install oliver-kriska-claude-elixir-phoenix@llmmart"},{"target":"git","command":"git clone https://github.com/oliver-kriska/claude-elixir-phoenix.git"}]}