Project Launch Skill
A repeatable playbook for launching a CLI/open-source project, distilled from the gitshot launch. This documents not just what was done, but the decisions, pivots, and lessons from the full conversation.
Phase 0: Ideation + Deep Research
What happened with gitshot:
Started from a Slack screenshot showing a conversation about GitHub CLI's inability to attach images to PRs/issues. The user identified this as a viral CLI opportunity.
Research Process
- Read the screenshot carefully — extracted exact issue numbers, people mentioned, and the core pain point
- Deep-dive the upstream issues — read ALL comments on the canonical issues (one from 2020, one from 2026)
- Cataloged 21+ existing tools — none filling the gap:
- gh-attach (Go, browser cookies) — fragile
- Addono/gh-attach (TypeScript, MCP) — heavy
- img402.dev (external service) — 7-day retention
- images-upload-cli (Python, 49 stars) — no GitHub-native option
- Identified the gap — no tool combined: zero-config + works with gh auth + headless + agent-first + minimal deps + one-command output
- Validated the opportunity — 5.5 years of requests, 32+ thumbs up, AI agents making it urgent
Decisions made in this phase
- Language pivot: User initially suggested Go → then reconsidered → chose Node.js for
npx discoverability and npm ecosystem
- Backend strategy: Started with catbox.moe as default → pivoted to GitHub Release Assets after user pointed out reliability. Release assets became default, catbox became fallback
- Scope: Upload + return URL only (Unix philosophy). Actions (--pr, --issue) added later
Checklist
Phase 1: Core Product (Code + Package)
Implementation Timeline
- Scaffolding — package.json, tsconfig, directory structure
- Upload interface —
Uploader interface with upload(filepath) → {url, filename, backend}
- Backends built in order:
- Catbox.moe (simplest, zero config) — with retry logic for flaky connections
- Cloudinary (parse CLOUDINARY_URL, multipart upload)
- imgbb (base64 encode, POST)
- GitHub Release Assets (the big one):
- Auto-creates
<user>/gitshot-images repo via gh API
- Initializes empty repo with README via API (releases need at least one commit)
- Creates
_gitshot release tag
- Uploads with random suffix to avoid collisions
- Constructs download URL directly
- CLI entry point —
node:util.parseArgs (zero deps), file validation, backend auto-detection
- Post-upload actions (added later based on user feedback):
--pr [N] — comment on PR (auto-detects from branch if no number)
--issue N — comment on issue
--new-issue "title" — create new issue
-m "text" — caption/message
- Spinner (added later) — animated progress on stderr, TTY-aware (silent when piped)
- GitHub integration —
gh pr comment, gh issue comment, gh issue create via child_process
Key Technical Decisions
- Zero runtime deps — only
typescript and @types/node as devDeps
- Node 22+ — for built-in
fetch(), FormData, Blob
- stdout = URLs only, stderr = logs — critical for piping and agent use
- Release assets as default — permanent URLs, GitHub infrastructure, works with private repos (with auth)
- Auto-create image repo —
gh repo create, then gh api to push initial README (empty repos can't have releases)
- Bare
--pr flag handling — parseArgs throws for string type with no value, so added manual handleBareFlag fallback parser
Gotchas Encountered
- Empty GitHub repos can't have releases → must push an initial commit via API first
- Catbox.moe rate-limits rapid sequential uploads → added retry with backoff
parseArgs can't handle optional string values (bare --pr) → needed manual argv parsing
- Node.js
FormData + Blob work differently than browser → had to read file into Buffer then wrap in Blob
Checklist
Phase 2: Branding + Messaging
The Tagline Evolution
This went through many iterations based on user feedback:
"One command. Image in your PR." — original, too generic
"Upload. Get URL. Ship." — user picked from 4 options (three-beat rhythm)
"Screenshots in GitHub without a browser." → "Screenshots on GitHub, now without a browser." — user corrected grammar
"Shot taken. PR updated. No browser needed." — user picked from 5 mixes of two candidates
- Description:
"Zero-config, agent-first CLI to upload images to issues, PRs, and comments. Screenshots on GitHub, now without a browser." — user wrote this themselves
What to Learn
- Give options, not answers — present 3-4 tagline choices with previews
- The user will riff — they'll take pieces from different options and combine them
- Update everywhere atomically — when tagline changes, grep for ALL occurrences and update in one pass (README, CLI source, package.json, llms.txt, website, video, docs)
- The user's voice wins — the final tagline was the user's own creation, not any option presented
Surfaces to Keep in Sync
When ANY branding text changes, update ALL of these:
package.json description
README.md (hero section + subtitle)
src/index.ts (CLI banner + help screen)
llms.txt and llms-full.txt
website/ copies
video/ scenes
- GitHub repo description (
gh repo edit --description)
- Agent skill SKILL.md
Phase 3: README + Visual Identity
README Structure (final)
<p align="center"> logo.png </p>
<p align="center"> badges (npm, license, node) </p>
<p align="center"> tagline </p>
<p align="center"> demo GIF </p>
Why do I need this?
Installation (Humans / Agents / gh CLI)
Usage (code examples)
How It Works
Privacy notice
Backends table
Comparison table
Background
Contributing
License
Design Directions
- Logo as top hero image (
logo.png)
- Badges: rounded
for-the-badge style, NOT flat
- Remove noisy badges (dependencies, stars, downloads early on)
- npm badge: distinctive color (
f38ba8 pink)
- Center-aligned header with
<p align="center">
- Demo GIF right below tagline, 700px width
- Install section split into: Humans / Agents / gh CLI
- Privacy advisory as a blockquote after "How It Works"
Checklist
Phase 4: Demo Assets
VHS Demo Tape
The demo GIF went through iterations:
- First version: just upload + issue command
- Second version: added
npx gitshot (banner) first, then two commands
- Final structure: banner → upload → issue comment with caption
Final VHS tape structure:
1. npx gitshot (show the ASCII banner)
2. npx gitshot rick.gif (simple upload, spinner + URL)
3. npx gitshot rick.gif --issue 1 -m 'Rickrolling' (upload + action)
Key Lessons
- Use a fun test asset — rick.gif makes demos memorable and shareable
- Show the banner first — gives people the brand impression
- Keep it under 25 seconds — attention spans are short
- Use VHS (charmbracelet/vhs) — reproducible terminal recordings from tape files
Checklist
Phase 5: Social Copy + Launch Content
Platforms and Content Types
| Platform |
Format |
Key focus |
| Twitter/X |
Long-form Premium tweet + thread |
Hook + demo + install |
| LinkedIn |
Professional post |
Problem → solution → bigger vision |
| Hacker News |
Show HN |
Technical approach + trade-offs |
| Reddit |
r/commandline, r/programming, r/node |
Community-specific framing |
| Dev.to |
Blog post |
Thought leadership angle |
Blog Post Approach
The blog evolved from a "how I built it" post to a thought leadership piece:
- Don't lead with the tool — lead with the insight ("Agents can't show their proof of work")
- Frame the gap, not the feature — agents collaborating on GitHub without visual evidence
- The tool is the resolution, not the topic
- Keep technical details brief — readers care about the problem more than architecture
Tweet Strategy
- User wrote their own tweet, asked for help refining specific lines
- Formula: Pop culture hook (Taylor Swift quote) + problem statement + bigger vision tease
- Don't over-polish — the user's authentic voice > copywriter perfection
- Offer 5 versions of a line, let user pick and remix
Checklist
Phase 6: Distribution + Outreach
CRITICAL: Avoid Cross-Reference Spam
Never put external issue numbers in commit messages. Writing org/repo#1234 in a commit message creates a cross-reference on that issue — every rebase/amend creates ANOTHER reference. This makes you look spammy on upstream issues.
Rules:
- Commit messages: NO issue refs to external repos. Ever.
- README: Use full URLs or describe the problem without issue numbers
- Reference upstream issues ONCE in the README background section, max
- Blog posts and tweets: Full URLs are fine (no auto-linking outside GitHub)
How Claude Code Researched Outreach Targets
The user's prompt: "Where can I post about gitshot in actual user threads, issues, PRs, reddit, social threads. Give me all the links from web search research."
Tactic: Parallel WebSearch in waves of 4. Each wave targets a different angle. Results are categorized into tiers and presented as tables with URL + angle.
Wave 1 — Core pain point:
site:github.com/cli/cli/issues "upload image" "issue" "PR" "comment" "API"
site:reddit.com "github upload image programmatically"
site:github.com "github image upload API missing feature" issues
site:stackoverflow.com "attach screenshot github PR programmatically"
Wave 2 — Adjacent ecosystems:
github MCP server upload image attachment site:github.com
"github upload image issue API" reddit 2024 2025
AI agent screenshot github PR cursor copilot claude
github actions screenshot PR comment image upload
Wave 3 — Deeper cuts (after user asked "give me 20 more"):
stackoverflow github API upload image issue comment attachment
microsoft vscode-pull-request-github image paste screenshot site:github.com
github docs embed image attachment API site:github.com/github/docs
playwright cypress visual test screenshot upload PR github action
Wave 4 — Fill the gaps:
"gh-attach" OR "ghpic" OR "github image upload" tool CLI alternative
github community discussion upload file attachment REST API 2024 2025
bitbucket jira image upload pull request comment API limitation
stackoverflow github embed image pull request API programmatically
What worked:
site:github.com/orgs/community/discussions is a goldmine — users asking the exact question your tool answers
- VS Code extension repos (
microsoft/vscode-pull-request-github) are underrated targets
- CI/testing tool issues (Cypress, Playwright) surface users who need image-in-PR workflows
- Competitor tool searches (
gh-attach, GHPic) find articles comparing approaches
- GitHub docs repo issues surface documentation gaps you can fill
What failed:
site:reddit.com with specific terms → returns empty almost every time. Drop the site filter.
site:stackoverflow.com → same problem. Search without site filter, let SO surface naturally.
- First attempt used Agent tool for parallel search — user rejected it. Switched to direct WebSearch calls.
Where to Post (by priority)
Tier 1 — GitHub Issues (highest signal, careful about spam)
Found ~15 threads for gitshot:
- The upstream feature request (cli/cli#1895 — the 5+ year old mothership issue)
- Duplicate/related issues (cli/cli#4228, #4465, #9046)
- GitHub CLI discussions (cli/cli Discussion #4745)
- GitHub MCP server (github/github-mcp-server#738)
- Unofficial trackers (isaacs/github#1133)
- Claude Code issues (anthropics/claude-code#31210)
Tier 2 — GitHub Community Discussions
Found ~10 threads:
- REST API upload requests (#46951, #157555, #24723, #68171)
- Image comment API (#28219, #147466)
- Upload failures/frustrations (#47688, #50303, #28947, #74738)
- Token access for PR images (#69034)
Tier 3 — IDE / VS Code
Found ~3 threads:
- VS Code PR extension image paste broken (#5348, #2760)
- Core VS Code markdown image pasting (#106955)
Tier 4 — AI Agent / Copilot threads
Found ~5 threads:
- Copilot can't attach images (#153112)
- Copilot adding screenshots to PRs (#169913)
- Copilot can't read images (#171733)
- Pasting screenshots in Copilot Chat (#150766)
Tier 5 — Q&A and Forums
- Stack Overflow (github API image upload questions)
- Dev.to articles about screenshot automation
- Blog comment sections (Marek Šuppa, Semantic Art, coreyja)
- Gists with manual workarounds
- Medium articles about GitHub API file uploads
- Zenn articles about gh-attach (competitor, Japanese dev audience)
Tier 6 — CI / Visual Regression
- Cypress PR screenshot issues (cypress-io/github-action#193)
- Playwright screenshot upload issues
- GitHub Actions marketplace (comment-pr-with-images, upload-image, screenshot actions)
- Blog posts about CI screenshot workflows
Tier 7 — Social
- Reddit (r/github, r/programming, r/webdev, r/commandline)
- Hacker News (Show HN + related threads)
- Twitter/X (reply to people complaining about the problem)
Outreach Templates
User's prompt: "Create a nice little template reply I can post on these places with installation instruction, demo link, tweet link and repo link."
Then refined: "Generate markdown I can easily copy" — wanted raw markdown, not explanation + markdown mixed together.
Then: "Convert to table" — for the install section specifically.
GitHub Issues (detailed):
I built [**<tool>**](https://github.com/<author>/<tool>) to solve exactly this — <one-line description>.
\`\`\`bash
# One command — uploads and comments on a PR
npx <tool> screenshot.png --pr 42
\`\`\`
<2-3 sentences on how it works>
It also works as a `gh` extension:
\`\`\`bash
gh extension install <author>/<tool>
gh shot screenshot.png --pr 42
\`\`\`
Or install as an [agent skill](https://github.com/<author>/<tool>) for Claude Code, Cursor, Copilot, and 40+ other AI coding agents:
\`\`\`bash
npx skills add <author>/<tool>
\`\`\`
[Demo](<tweet-link>) | [Repo](https://github.com/<author>/<tool>)
Short version (Reddit, HN, blog replies):
I hit this wall too, so I built [<tool>](https://github.com/<author>/<tool>) — <one-line description>.
npx <tool> screenshot.png --pr 42
<one sentence on mechanism>
[Repo](https://github.com/<author>/<tool>) | [Demo](<tweet-link>)
One-liner (drive-by comments):
Shameless plug: I built [<tool>](https://github.com/<author>/<tool>) for this — `npx <tool> img.png --pr 42`. No <pain-point> needed. [Demo](<link>)
Dev.to / blog comment:
Nice post! If anyone's looking for a simpler approach — I built [<tool>](https://github.com/<author>/<tool>), <one-line description>:
npx <tool> screenshot.png --pr 42
<one sentence on mechanism>. Also works as a `gh` CLI extension and as a skill for AI coding agents.
[GitHub](https://github.com/<author>/<tool>) | [Demo](<tweet-link>)
Install table (reusable in any template):
| Method | Command |
|--------|---------|
| Install globally | `npm i -g <tool>` |
| Install as gh CLI extension | `gh extension install <author>/<tool>` |
| Install as agent skill | `npx skills add <author>/<tool>` |
Checklist
Phase 7: npm Publish + GitHub Release
npm Publish Gotchas
- Need
npm login first (interactive, can't be automated by agent)
- 2FA OTP required — user must run
npm publish --otp=CODE themselves
prepublishOnly script should run tsc build
files array in package.json controls what gets published — keep it minimal
- Don't publish docs/, video/, demo tapes — only dist/, skills/, README, LICENSE
GitHub Push Gotchas
- Remote may have changes from other sessions → always
git pull --rebase before push
- If rebase fails due to unstaged changes →
git stash && git pull --rebase && git stash pop
- Force push only when explicitly asked
- Make atomic commits — each commit is one logical change
Checklist
Key Lessons from the gitshot Launch
Product
- Start with the gap, not the feature — "GitHub has no API for image uploads" is the hook
- One hero command —
npx gitshot rick.gif --pr 42 tells the whole story
- Agent-first means one command — agents shouldn't pipe two CLIs together.
--pr 42 beats | gh pr comment 42 --body-file -
- Auto-detect everything — PR from branch, backend from env vars, repo from gh auth
- Privacy advisory early — if your tool creates public repos, warn users upfront
Branding
- Give tagline options with previews — user picks, then remixes
- Update every surface atomically — grep for old text, replace everywhere in one pass
- Fun test assets — rick.gif makes demos memorable and tweets shareable
- Three install paths — npm, gh extension, agent skill covers all user types
- Rounded badges, minimal set —
for-the-badge style, skip deps/stars badges early
Process
- Never put external issue refs in commits — creates spammy cross-references on upstream issues
- Keep docs/ gitignored — launch copy, tweets, blog drafts are local-only
- Atomic commits — each commit should be one logical change
- User voice wins — present options, let the user write the final copy
- Test with real uploads — don't just unit test, actually upload and verify URLs work
Social
- Lead with thought leadership — "Agents can't show their proof of work" > "I built a CLI tool"
- Pop culture hooks work — Taylor Swift quote made the tweet memorable
- Don't over-reveal the bigger vision — tease without exposing product details
- Blog ≠ README — blog is about the problem and insight, README is about usage
Outreach
- Outreach is a research task — treat finding threads like finding code: parallel queries, multiple waves, categorize results
- Templates need multiple tones — GitHub issue reply ≠ Reddit comment ≠ drive-by one-liner
- Ask for copyable markdown explicitly — default Claude Code output mixes explanation with content; say "generate markdown I can easily copy"
- Ask for volume — "give me 20 more links" forces deeper searching past the first page of results
- Provide reference links in your prompt — give Claude Code the exact tweet URL, repo URL, demo link to embed, don't make it guess
Prompt Patterns That Worked (from this conversation)
These are actual prompts from the launch sessions, annotated with why they worked:
1. Batch design directions in one prompt
"Remove dependencies, stars badges. Make them rounded. Change the npm color to something else. Make the README heading center aligned and great looking. Use @logo.png as your top image."
Why: Multiple related changes applied in one read-edit cycle. Avoids 5 back-and-forth turns.
2. One-word action prompts
"push"
Why: After a commit, intent is obvious. Claude Code stages, commits, pushes in one flow.
3. Ask for specific output format
"Convert to table" / "Generate markdown I can easily copy"
Why: Claude Code defaults to mixing explanation with content. Explicitly requesting format (table, raw markdown, code block) gets usable output in one shot.
4. Ask for volume with a number
"Give me 20 more links like this"
Why: Forces additional search waves. Without a number, Claude Code stops after the first pass of results.
5. Provide all reference links upfront
"Create a template reply with installation instruction, demo link, tweet link and repo link from my github https://x.com/vipulgupta2048/status/..."
Why: Gives Claude Code the exact assets to embed. No follow-up questions needed.
6. Ask Claude Code to document its own process
"Summarize this entire conversation into a project launch skill. Including changes I have made in each commit or direction I have given to Claude Code."
Why: Turns a one-off session into a reusable skill. Claude Code reconstructs the process from git history + conversation context.
7. Iterative refinement in short prompts
First: "Create a template" → Then: "Generate markdown I can easily copy" → Then: "Convert to table"
Why: Each prompt narrows the output format. Faster than explaining the exact format upfront.
Claude Code Tactics & Behaviors
What worked well
- Parallel WebSearch x4 — 4 simultaneous searches per wave, 4 waves total = ~50 links in minutes
- Read before edit — always read the file before modifying, even if just wrote it
- Single Edit for multiple changes — all badge changes in one Edit operation, not 4 separate ones
- Categorized output as tables — tiers with URL + title + angle columns for quick scanning
- Multiple template variants — created 4 tones (detailed, short, one-liner, blog) without being asked
- Git workflow —
git add <specific files> (not git add .) + signed commits + push
What to watch for
- Cannot access other CC sessions — each conversation is isolated. Only git history, disk files, and current conversation available.
site:reddit.com searches return empty — always have a fallback query without site: filter
site:stackoverflow.com also fails frequently — same, drop the site filter
- Agent tool may be rejected — user denied Agent for web search, switched to direct WebSearch. Always have a fallback.
- Files may be edited externally between turns — README was modified outside Claude Code by user/linter between prompts. Always re-read before assuming content matches.
- User edits the skill file themselves between sessions — the skill grew from 206 lines to 320+ lines from user's own additions from other sessions. Always read current state before updating.
1---2name: project-launch3description: End-to-end playbook for launching a CLI tool as an open-source project. Covers ideation, deep research, implementation, README polish, demo assets, social copy, outreach, and distribution. Distilled from the gitshot launch — a full conversation-to-ship cycle. Includes prompt patterns, pivot decisions, and Claude Code tactics.4license: MIT5---67# Project Launch Skill89A repeatable playbook for launching a CLI/open-source project, distilled from the gitshot launch. This documents not just what was done, but the decisions, pivots, and lessons from the full conversation.1011---1213## Phase 0: Ideation + Deep Research1415**What happened with gitshot:**16Started from a Slack screenshot showing a conversation about GitHub CLI's inability to attach images to PRs/issues. The user identified this as a viral CLI opportunity.1718### Research Process191. **Read the screenshot carefully** — extracted exact issue numbers, people mentioned, and the core pain point202. **Deep-dive the upstream issues** — read ALL comments on the canonical issues (one from 2020, one from 2026)213. **Cataloged 21+ existing tools** — none filling the gap:22 - gh-attach (Go, browser cookies) — fragile23 - Addono/gh-attach (TypeScript, MCP) — heavy24 - img402.dev (external service) — 7-day retention25 - images-upload-cli (Python, 49 stars) — no GitHub-native option264. **Identified the gap** — no tool combined: zero-config + works with gh auth + headless + agent-first + minimal deps + one-command output275. **Validated the opportunity** — 5.5 years of requests, 32+ thumbs up, AI agents making it urgent2829### Decisions made in this phase30- **Language pivot**: User initially suggested Go → then reconsidered → chose Node.js for `npx` discoverability and npm ecosystem31- **Backend strategy**: Started with catbox.moe as default → pivoted to GitHub Release Assets after user pointed out reliability. Release assets became default, catbox became fallback32- **Scope**: Upload + return URL only (Unix philosophy). Actions (--pr, --issue) added later3334### Checklist35- [ ] Identify a real pain point with evidence (GitHub issues, forum complaints, years of waiting)36- [ ] Research ALL existing tools — catalog what exists and why it's not enough37- [ ] Identify the specific gap your tool fills38- [ ] Validate with real user signals (thumbs up counts, comment frequency, years open)39- [ ] Choose language/runtime based on distribution strategy, not just preference40- [ ] Define MVP scope — what's the one command that tells the whole story?4142---4344## Phase 1: Core Product (Code + Package)4546### Implementation Timeline471. **Scaffolding** — package.json, tsconfig, directory structure482. **Upload interface** — `Uploader` interface with `upload(filepath) → {url, filename, backend}`493. **Backends built in order:**50 - Catbox.moe (simplest, zero config) — with retry logic for flaky connections51 - Cloudinary (parse CLOUDINARY_URL, multipart upload)52 - imgbb (base64 encode, POST)53 - GitHub Release Assets (the big one):54 - Auto-creates `<user>/gitshot-images` repo via `gh` API55 - Initializes empty repo with README via API (releases need at least one commit)56 - Creates `_gitshot` release tag57 - Uploads with random suffix to avoid collisions58 - Constructs download URL directly594. **CLI entry point** — `node:util.parseArgs` (zero deps), file validation, backend auto-detection605. **Post-upload actions** (added later based on user feedback):61 - `--pr [N]` — comment on PR (auto-detects from branch if no number)62 - `--issue N` — comment on issue63 - `--new-issue "title"` — create new issue64 - `-m "text"` — caption/message656. **Spinner** (added later) — animated progress on stderr, TTY-aware (silent when piped)667. **GitHub integration** — `gh pr comment`, `gh issue comment`, `gh issue create` via child_process6768### Key Technical Decisions69- **Zero runtime deps** — only `typescript` and `@types/node` as devDeps70- **Node 22+** — for built-in `fetch()`, `FormData`, `Blob`71- **stdout = URLs only, stderr = logs** — critical for piping and agent use72- **Release assets as default** — permanent URLs, GitHub infrastructure, works with private repos (with auth)73- **Auto-create image repo** — `gh repo create`, then `gh api` to push initial README (empty repos can't have releases)74- **Bare `--pr` flag handling** — `parseArgs` throws for string type with no value, so added manual `handleBareFlag` fallback parser7576### Gotchas Encountered77- Empty GitHub repos can't have releases → must push an initial commit via API first78- Catbox.moe rate-limits rapid sequential uploads → added retry with backoff79- `parseArgs` can't handle optional string values (bare `--pr`) → needed manual argv parsing80- Node.js `FormData` + `Blob` work differently than browser → had to read file into `Buffer` then wrap in `Blob`8182### Checklist83- [ ] Ship a working v0.0.1 to npm (`npm publish`)84- [ ] Zero runtime dependencies if possible (Node built-ins only)85- [ ] Support multiple output modes: markdown, raw URL, JSON86- [ ] Add `--help` with clear usage examples and ASCII banner87- [ ] Make it work as a single command (upload + action, no piping required)88- [ ] Add spinner/progress feedback on stderr (TTY-aware)89- [ ] Register as gh CLI extension (`gh extension install`)90- [ ] Create agent skill file91- [ ] Publish agent skill (`npx skills add <author>/<name>`)9293---9495## Phase 2: Branding + Messaging9697### The Tagline Evolution98This went through many iterations based on user feedback:991001. `"One command. Image in your PR."` — original, too generic1012. `"Upload. Get URL. Ship."` — user picked from 4 options (three-beat rhythm)1023. `"Screenshots in GitHub without a browser."` → `"Screenshots on GitHub, now without a browser."` — user corrected grammar1034. `"Shot taken. PR updated. No browser needed."` — user picked from 5 mixes of two candidates1045. Description: `"Zero-config, agent-first CLI to upload images to issues, PRs, and comments. Screenshots on GitHub, now without a browser."` — user wrote this themselves105106### What to Learn107- **Give options, not answers** — present 3-4 tagline choices with previews108- **The user will riff** — they'll take pieces from different options and combine them109- **Update everywhere atomically** — when tagline changes, grep for ALL occurrences and update in one pass (README, CLI source, package.json, llms.txt, website, video, docs)110- **The user's voice wins** — the final tagline was the user's own creation, not any option presented111112### Surfaces to Keep in Sync113When ANY branding text changes, update ALL of these:114- `package.json` description115- `README.md` (hero section + subtitle)116- `src/index.ts` (CLI banner + help screen)117- `llms.txt` and `llms-full.txt`118- `website/` copies119- `video/` scenes120- GitHub repo description (`gh repo edit --description`)121- Agent skill SKILL.md122123---124125## Phase 3: README + Visual Identity126127### README Structure (final)128```129<p align="center"> logo.png </p>130<p align="center"> badges (npm, license, node) </p>131<p align="center"> tagline </p>132<p align="center"> demo GIF </p>133134Why do I need this?135Installation (Humans / Agents / gh CLI)136Usage (code examples)137How It Works138Privacy notice139Backends table140Comparison table141Background142Contributing143License144```145146### Design Directions147- Logo as top hero image (`logo.png`)148- Badges: rounded `for-the-badge` style, NOT flat149- Remove noisy badges (dependencies, stars, downloads early on)150- npm badge: distinctive color (`f38ba8` pink)151- Center-aligned header with `<p align="center">`152- Demo GIF right below tagline, 700px width153- Install section split into: Humans / Agents / gh CLI154- Privacy advisory as a blockquote after "How It Works"155156### Checklist157- [ ] Create logo/banner image158- [ ] Center-aligned header: logo + badges + tagline159- [ ] Demo GIF below tagline160- [ ] Three install paths (npm, agent skill, gh extension)161- [ ] "Why" section leading with pain point162- [ ] Comparison table vs alternatives163- [ ] Privacy/security advisory if tool creates public resources164- [ ] Background section — explain the gap without spammy issue references165166---167168## Phase 4: Demo Assets169170### VHS Demo Tape171The demo GIF went through iterations:1721. First version: just upload + issue command1732. Second version: added `npx gitshot` (banner) first, then two commands1743. Final structure: banner → upload → issue comment with caption175176### Final VHS tape structure:177```1781. npx gitshot (show the ASCII banner)1792. npx gitshot rick.gif (simple upload, spinner + URL)1803. npx gitshot rick.gif --issue 1 -m 'Rickrolling' (upload + action)181```182183### Key Lessons184- **Use a fun test asset** — rick.gif makes demos memorable and shareable185- **Show the banner first** — gives people the brand impression186- **Keep it under 25 seconds** — attention spans are short187- **Use VHS (charmbracelet/vhs)** — reproducible terminal recordings from tape files188189### Checklist190- [ ] Record terminal demo GIF using VHS191- [ ] Show banner first, then most common workflows192- [ ] Use a memorable test file (rick.gif, nyan.gif, etc.)193- [ ] Keep GIF under 1MB if possible194- [ ] Optionally create a Remotion video for social media195196---197198## Phase 5: Social Copy + Launch Content199200### Platforms and Content Types201| Platform | Format | Key focus |202|----------|--------|-----------|203| Twitter/X | Long-form Premium tweet + thread | Hook + demo + install |204| LinkedIn | Professional post | Problem → solution → bigger vision |205| Hacker News | Show HN | Technical approach + trade-offs |206| Reddit | r/commandline, r/programming, r/node | Community-specific framing |207| Dev.to | Blog post | Thought leadership angle |208209### Blog Post Approach210The blog evolved from a "how I built it" post to a thought leadership piece:211- **Don't lead with the tool** — lead with the insight ("Agents can't show their proof of work")212- **Frame the gap, not the feature** — agents collaborating on GitHub without visual evidence213- **The tool is the resolution**, not the topic214- **Keep technical details brief** — readers care about the problem more than architecture215216### Tweet Strategy217- User wrote their own tweet, asked for help refining specific lines218- Formula: **Pop culture hook** (Taylor Swift quote) + **problem statement** + **bigger vision tease**219- Don't over-polish — the user's authentic voice > copywriter perfection220- Offer 5 versions of a line, let user pick and remix221222### Checklist223- [ ] Write launch tweet (include demo GIF, hero command, install)224- [ ] Write LinkedIn post (professional, problem-first)225- [ ] Prepare Show HN (technical, honest about trade-offs)226- [ ] Prepare Reddit posts (community-specific framing)227- [ ] Write a blog post (thought leadership angle, not just a tutorial)228- [ ] Keep docs/ folder gitignored — launch copy is local-only, never published229230---231232## Phase 6: Distribution + Outreach233234### CRITICAL: Avoid Cross-Reference Spam235**Never put external issue numbers in commit messages.** Writing `org/repo#1234` in a commit message creates a cross-reference on that issue — every rebase/amend creates ANOTHER reference. This makes you look spammy on upstream issues.236237Rules:238- **Commit messages**: NO issue refs to external repos. Ever.239- **README**: Use full URLs or describe the problem without issue numbers240- **Reference upstream issues ONCE** in the README background section, max241- **Blog posts and tweets**: Full URLs are fine (no auto-linking outside GitHub)242243### How Claude Code Researched Outreach Targets244245The user's prompt: *"Where can I post about gitshot in actual user threads, issues, PRs, reddit, social threads. Give me all the links from web search research."*246247**Tactic: Parallel WebSearch in waves of 4.** Each wave targets a different angle. Results are categorized into tiers and presented as tables with URL + angle.248249**Wave 1 — Core pain point:**250```251site:github.com/cli/cli/issues "upload image" "issue" "PR" "comment" "API"252site:reddit.com "github upload image programmatically"253site:github.com "github image upload API missing feature" issues254site:stackoverflow.com "attach screenshot github PR programmatically"255```256257**Wave 2 — Adjacent ecosystems:**258```259github MCP server upload image attachment site:github.com260"github upload image issue API" reddit 2024 2025261AI agent screenshot github PR cursor copilot claude262github actions screenshot PR comment image upload263```264265**Wave 3 — Deeper cuts (after user asked "give me 20 more"):**266```267stackoverflow github API upload image issue comment attachment268microsoft vscode-pull-request-github image paste screenshot site:github.com269github docs embed image attachment API site:github.com/github/docs270playwright cypress visual test screenshot upload PR github action271```272273**Wave 4 — Fill the gaps:**274```275"gh-attach" OR "ghpic" OR "github image upload" tool CLI alternative276github community discussion upload file attachment REST API 2024 2025277bitbucket jira image upload pull request comment API limitation278stackoverflow github embed image pull request API programmatically279```280281**What worked:**282- `site:github.com/orgs/community/discussions` is a goldmine — users asking the exact question your tool answers283- VS Code extension repos (`microsoft/vscode-pull-request-github`) are underrated targets284- CI/testing tool issues (Cypress, Playwright) surface users who need image-in-PR workflows285- Competitor tool searches (`gh-attach`, `GHPic`) find articles comparing approaches286- GitHub docs repo issues surface documentation gaps you can fill287288**What failed:**289- `site:reddit.com` with specific terms → returns empty almost every time. Drop the site filter.290- `site:stackoverflow.com` → same problem. Search without site filter, let SO surface naturally.291- First attempt used Agent tool for parallel search — user rejected it. Switched to direct WebSearch calls.292293### Where to Post (by priority)294295**Tier 1 — GitHub Issues (highest signal, careful about spam)**296Found ~15 threads for gitshot:297- The upstream feature request (cli/cli#1895 — the 5+ year old mothership issue)298- Duplicate/related issues (cli/cli#4228, #4465, #9046)299- GitHub CLI discussions (cli/cli Discussion #4745)300- GitHub MCP server (github/github-mcp-server#738)301- Unofficial trackers (isaacs/github#1133)302- Claude Code issues (anthropics/claude-code#31210)303304**Tier 2 — GitHub Community Discussions**305Found ~10 threads:306- REST API upload requests (#46951, #157555, #24723, #68171)307- Image comment API (#28219, #147466)308- Upload failures/frustrations (#47688, #50303, #28947, #74738)309- Token access for PR images (#69034)310311**Tier 3 — IDE / VS Code**312Found ~3 threads:313- VS Code PR extension image paste broken (#5348, #2760)314- Core VS Code markdown image pasting (#106955)315316**Tier 4 — AI Agent / Copilot threads**317Found ~5 threads:318- Copilot can't attach images (#153112)319- Copilot adding screenshots to PRs (#169913)320- Copilot can't read images (#171733)321- Pasting screenshots in Copilot Chat (#150766)322323**Tier 5 — Q&A and Forums**324- Stack Overflow (github API image upload questions)325- Dev.to articles about screenshot automation326- Blog comment sections (Marek Šuppa, Semantic Art, coreyja)327- Gists with manual workarounds328- Medium articles about GitHub API file uploads329- Zenn articles about gh-attach (competitor, Japanese dev audience)330331**Tier 6 — CI / Visual Regression**332- Cypress PR screenshot issues (cypress-io/github-action#193)333- Playwright screenshot upload issues334- GitHub Actions marketplace (comment-pr-with-images, upload-image, screenshot actions)335- Blog posts about CI screenshot workflows336337**Tier 7 — Social**338- Reddit (r/github, r/programming, r/webdev, r/commandline)339- Hacker News (Show HN + related threads)340- Twitter/X (reply to people complaining about the problem)341342### Outreach Templates343344User's prompt: *"Create a nice little template reply I can post on these places with installation instruction, demo link, tweet link and repo link."*345346Then refined: *"Generate markdown I can easily copy"* — wanted raw markdown, not explanation + markdown mixed together.347348Then: *"Convert to table"* — for the install section specifically.349350**GitHub Issues (detailed):**351```markdown352I built [**<tool>**](https://github.com/<author>/<tool>) to solve exactly this — <one-line description>.353354\`\`\`bash355# One command — uploads and comments on a PR356npx <tool> screenshot.png --pr 42357\`\`\`358359<2-3 sentences on how it works>360361It also works as a `gh` extension:362\`\`\`bash363gh extension install <author>/<tool>364gh shot screenshot.png --pr 42365\`\`\`366367Or install as an [agent skill](https://github.com/<author>/<tool>) for Claude Code, Cursor, Copilot, and 40+ other AI coding agents:368\`\`\`bash369npx skills add <author>/<tool>370\`\`\`371372[Demo](<tweet-link>) | [Repo](https://github.com/<author>/<tool>)373```374375**Short version (Reddit, HN, blog replies):**376```markdown377I hit this wall too, so I built [<tool>](https://github.com/<author>/<tool>) — <one-line description>.378379npx <tool> screenshot.png --pr 42380381<one sentence on mechanism>382383[Repo](https://github.com/<author>/<tool>) | [Demo](<tweet-link>)384```385386**One-liner (drive-by comments):**387```markdown388Shameless plug: I built [<tool>](https://github.com/<author>/<tool>) for this — `npx <tool> img.png --pr 42`. No <pain-point> needed. [Demo](<link>)389```390391**Dev.to / blog comment:**392```markdown393Nice post! If anyone's looking for a simpler approach — I built [<tool>](https://github.com/<author>/<tool>), <one-line description>:394395npx <tool> screenshot.png --pr 42396397<one sentence on mechanism>. Also works as a `gh` CLI extension and as a skill for AI coding agents.398399[GitHub](https://github.com/<author>/<tool>) | [Demo](<tweet-link>)400```401402**Install table (reusable in any template):**403```markdown404| Method | Command |405|--------|---------|406| Install globally | `npm i -g <tool>` |407| Install as gh CLI extension | `gh extension install <author>/<tool>` |408| Install as agent skill | `npx skills add <author>/<tool>` |409```410411### Checklist412- [ ] Run 4-wave parallel web search to find all relevant threads413- [ ] Categorize results into tiers (GitHub issues > Community > IDE > AI > Q&A > CI > Social)414- [ ] Generate outreach templates (detailed, short, one-liner, blog comment)415- [ ] Post on the upstream issue (ONE comment, not spam)416- [ ] Show HN submission417- [ ] Reddit posts in relevant subs418- [ ] Reply to people complaining about the problem on Twitter419- [ ] Comment on competitor tool articles/repos420- [ ] Comment on CI/testing blog posts and issues421- [ ] Monitor and respond to all comments within 2 hours422423---424425## Phase 7: npm Publish + GitHub Release426427### npm Publish Gotchas428- Need `npm login` first (interactive, can't be automated by agent)429- 2FA OTP required — user must run `npm publish --otp=CODE` themselves430- `prepublishOnly` script should run `tsc` build431- `files` array in package.json controls what gets published — keep it minimal432- **Don't publish docs/, video/, demo tapes** — only dist/, skills/, README, LICENSE433434### GitHub Push Gotchas435- Remote may have changes from other sessions → always `git pull --rebase` before push436- If rebase fails due to unstaged changes → `git stash && git pull --rebase && git stash pop`437- Force push only when explicitly asked438- Make atomic commits — each commit is one logical change439440### Checklist441- [ ] Verify `npm whoami` is authenticated442- [ ] Ensure `files` array excludes docs/, video/, demo/443- [ ] Build before publish (`npm run build`)444- [ ] `npm publish --access public --otp=CODE`445- [ ] Push all commits to GitHub446- [ ] Update GitHub repo description via `gh repo edit --description`447448---449450## Key Lessons from the gitshot Launch451452### Product4531. **Start with the gap, not the feature** — "GitHub has no API for image uploads" is the hook4542. **One hero command** — `npx gitshot rick.gif --pr 42` tells the whole story4553. **Agent-first means one command** — agents shouldn't pipe two CLIs together. `--pr 42` beats `| gh pr comment 42 --body-file -`4564. **Auto-detect everything** — PR from branch, backend from env vars, repo from gh auth4575. **Privacy advisory early** — if your tool creates public repos, warn users upfront458459### Branding4606. **Give tagline options with previews** — user picks, then remixes4617. **Update every surface atomically** — grep for old text, replace everywhere in one pass4628. **Fun test assets** — rick.gif makes demos memorable and tweets shareable4639. **Three install paths** — npm, gh extension, agent skill covers all user types46410. **Rounded badges, minimal set** — `for-the-badge` style, skip deps/stars badges early465466### Process46711. **Never put external issue refs in commits** — creates spammy cross-references on upstream issues46812. **Keep docs/ gitignored** — launch copy, tweets, blog drafts are local-only46913. **Atomic commits** — each commit should be one logical change47014. **User voice wins** — present options, let the user write the final copy47115. **Test with real uploads** — don't just unit test, actually upload and verify URLs work472473### Social47416. **Lead with thought leadership** — "Agents can't show their proof of work" > "I built a CLI tool"47517. **Pop culture hooks work** — Taylor Swift quote made the tweet memorable47618. **Don't over-reveal the bigger vision** — tease without exposing product details47719. **Blog ≠ README** — blog is about the problem and insight, README is about usage478479### Outreach48020. **Outreach is a research task** — treat finding threads like finding code: parallel queries, multiple waves, categorize results48121. **Templates need multiple tones** — GitHub issue reply ≠ Reddit comment ≠ drive-by one-liner48222. **Ask for copyable markdown explicitly** — default Claude Code output mixes explanation with content; say "generate markdown I can easily copy"48323. **Ask for volume** — "give me 20 more links" forces deeper searching past the first page of results48424. **Provide reference links in your prompt** — give Claude Code the exact tweet URL, repo URL, demo link to embed, don't make it guess485486---487488## Prompt Patterns That Worked (from this conversation)489490These are actual prompts from the launch sessions, annotated with why they worked:491492### 1. Batch design directions in one prompt493> "Remove dependencies, stars badges. Make them rounded. Change the npm color to something else. Make the README heading center aligned and great looking. Use @logo.png as your top image."494495**Why:** Multiple related changes applied in one read-edit cycle. Avoids 5 back-and-forth turns.496497### 2. One-word action prompts498> "push"499500**Why:** After a commit, intent is obvious. Claude Code stages, commits, pushes in one flow.501502### 3. Ask for specific output format503> "Convert to table" / "Generate markdown I can easily copy"504505**Why:** Claude Code defaults to mixing explanation with content. Explicitly requesting format (table, raw markdown, code block) gets usable output in one shot.506507### 4. Ask for volume with a number508> "Give me 20 more links like this"509510**Why:** Forces additional search waves. Without a number, Claude Code stops after the first pass of results.511512### 5. Provide all reference links upfront513> "Create a template reply with installation instruction, demo link, tweet link and repo link from my github https://x.com/vipulgupta2048/status/..."514515**Why:** Gives Claude Code the exact assets to embed. No follow-up questions needed.516517### 6. Ask Claude Code to document its own process518> "Summarize this entire conversation into a project launch skill. Including changes I have made in each commit or direction I have given to Claude Code."519520**Why:** Turns a one-off session into a reusable skill. Claude Code reconstructs the process from git history + conversation context.521522### 7. Iterative refinement in short prompts523> First: "Create a template" → Then: "Generate markdown I can easily copy" → Then: "Convert to table"524525**Why:** Each prompt narrows the output format. Faster than explaining the exact format upfront.526527---528529## Claude Code Tactics & Behaviors530531### What worked well532- **Parallel WebSearch x4** — 4 simultaneous searches per wave, 4 waves total = ~50 links in minutes533- **Read before edit** — always read the file before modifying, even if just wrote it534- **Single Edit for multiple changes** — all badge changes in one Edit operation, not 4 separate ones535- **Categorized output as tables** — tiers with URL + title + angle columns for quick scanning536- **Multiple template variants** — created 4 tones (detailed, short, one-liner, blog) without being asked537- **Git workflow** — `git add <specific files>` (not `git add .`) + signed commits + push538539### What to watch for540- **Cannot access other CC sessions** — each conversation is isolated. Only git history, disk files, and current conversation available.541- **`site:reddit.com` searches return empty** — always have a fallback query without site: filter542- **`site:stackoverflow.com` also fails frequently** — same, drop the site filter543- **Agent tool may be rejected** — user denied Agent for web search, switched to direct WebSearch. Always have a fallback.544- **Files may be edited externally between turns** — README was modified outside Claude Code by user/linter between prompts. Always re-read before assuming content matches.545- **User edits the skill file themselves between sessions** — the skill grew from 206 lines to 320+ lines from user's own additions from other sessions. Always read current state before updating.