launchday 是做什么的?
大多数优秀的开源项目发布得很糟糕:README 只是大段解释而非演示,没有 demo,没有安装命令,名称与另外三个工具冲突,Show HN 帖子在美东时间凌晨 3 点发布。这个技能一次性修复所有这些问题,然后交给用户一个可以在一个晚上执行完毕的发布计划。
你来准备。用户做任何公开的事情:创建公开仓库、推送标签、上传社交预览图和发帖。发布很难撤销,并且是以用户的名义发言,所以你将一切准备到只需复制粘贴的程度,然后停下并移交。
如何运行
按顺序完成各个阶段。每个阶段都会在仓库中留下具体产出。告知用户你当前处于哪个阶段,以便他们跟进。
脚本放在此技能文件夹旁边的 scripts/ 目录下。它们只使用 Python 的标准库(预览图生成额外需要 ffmpeg)。使用该技能文件夹的路径运行它们,例如 python3 <skill-dir>/scripts/audit.py .。
| 阶段 | 产出 | 脚本或参考文档 |
|---|---|---|
| 1. 理解 | 一段你需要与用户确认的总结 | 无 |
| 2. 名称检查 | 保留或重命名的决定 | scripts/name_check.py |
| 3. 审计 | 评分和修复清单 | scripts/audit.py |
| 4. README | 重写为着陆页的 README | references/readme.md |
| 5. 演示 | GIF 或截图以及社交预览图 | references/demo.md,scripts/social_preview.sh |
| 6. 发布 | CI 和发布工作流 | references/release.md |
| 7. 发布工具包 | 包含帖子和计划的 LAUNCH.md | references/launch-posts.md,scripts/launch_time.py |
| 8. 移交 | 用户需要运行的确切命令 | 无 |
如果用户只要求其中一部分(比如“只修复我的 README”或“写我的 Show HN 帖子”),那就只做那个阶段。不过,如果成本不高,仍然先运行审计,因为它常常能揭示真正的阻碍。
阶段 1:理解项目
阅读 README、包清单文件(package.json、Cargo.toml、pyproject.toml、go.mod)和入口文件。如果可以安全地运行项目,则运行项目。然后写一段话,涵盖三件事:
- 它做什么,用非专家也能理解的一句话说明。
- 谁有痛点。 要具体:例如“维护 10 个以上仓库的维护者”,而不是“开发者”。
- 证明时刻:新用户看到后会想“哦,不错”的那第一件事。README 和演示将围绕这一点构建。
用一条简短的消息与用户确认。这里的总结错了,后续所有工作都会受影响。同时询问你自己找不到的信息:哪个 GitHub 账户将托管仓库,以及用户的时区(用于制定发布计划)。
阶段 2:名称检查
python3 <skill-dir>/scripts/name_check.py <name> [alternative ...]
该脚本会检查 crates.io、npm、PyPI、Homebrew 和 GitHub。名称冲突会分散搜索结果,导致听说过项目的人找不到它,而且已被占用的注册表名称会阻止发布。如果判断结果是 AVOID 或 CROWDED,请提出 3 到 4 个替代名称,并在同一轮运行中检查它们。好的名称要么说明工具的功能,要么让人联想到它,并且听过一次后就能拼写出来。
重命名由用户决定。如果他们重命名,需要更改所有出现的地方:清单文件、二进制名称、README、链接、CI、配置路径和 User-Agent 字符串。使用一个能遍历文件的脚本,而不是用 shell 的词分割功能(后者在路径包含空格时会出错)。然后重新构建并运行测试。
阶段 3:审计
python3 <skill-dir>/scripts/audit.py <repo-path>
你会得到一个百分制和一份按权重排序的修复清单。它涵盖了 README 的吸引力、靠近顶部的视觉内容和安装命令、许可证和社区文件、CI 和发布工作流、泄露的密钥、个人提交邮箱,以及如果 gh 已登录,还会检查 GitHub 描述、主题、社交预览图和发布版。
有两项发现优先于其他所有事项,因为它们一旦被推送到公开仓库就无法撤销:
- 已跟踪文件中的密钥。 移除它,并告知用户轮换该密钥。它已存在于 git 历史中。
- 个人提交邮箱(Gmail 等)。每次公开提交都会显示这个邮箱。将仓库的邮箱设置为用户的 GitHub noreply 地址:
[email protected]。从gh api user --jq .id获取 ID。
在阶段 6 结束时重新运行审计。评分上升就是用户的进度条,所以要展示出来。
阶段 4:将 README 重写为着陆页
阅读 references/readme.md,并按照该结构重写 README。核心思想是:访问者大约在 10 秒内,仅凭第一屏信息就做出决定。所以第一屏必须包含痛点、证明(GIF)和安装命令。解释说明放在后面。
README 中的每一个声明都必须与当前代码的真实情况相符。在写入之前,请对照源代码或实际运行来检查每个特性、标志和数字。夸大宣传会在第一个 HN 评论中被发现,并且它损失的信任比它带来的好处更多。将未来工作放在“路线图”部分,并明确标注。
阶段 5:演示与社交预览图
阅读 references/demo.md。根据项目类型选择格式:
- CLI 或 TUI: 使用 VHS 录制 GIF,将磁带文件提交到
docs/demo.tape,这样任何人都可以重新录制。 - Web 应用程序: 截图,或一段简短的屏幕录制。
- 库: 包含实际输出的 before/after 代码片段。
然后制作社交预览图:
sh <skill-dir>/scripts/social_preview.sh docs/demo.gif docs/social-preview.png
在继续之前,务必亲自检查帧画面。 用 ffmpeg 提取 2 到 3 帧并查看。录制可能会静默失败:因为环境变量设置了 NO_COLOR 导致颜色消失、令牌被输入到屏幕上、所选行的文本难以辨认、或者抓取的帧显示的是加载动画。修复后重新录制。查看帧的成本很低;而 README 顶部有一个损坏的 GIF 则代价高昂。
阶段 6:发布与 CI
根据项目的生态系统阅读 references/release.md。目标是为没有工具链的用户提供安装路径:通过推送标签,生成预构建二进制文件或发布包。确保任何发布步骤在其对应的密钥未设置时能干净地跳过,这样用户的首次发布就不会显示红色的失败标志。在本地运行项目自己的 lint、格式检查和测试命令,并让它们通过,因为 CI 会在首次推送时运行它们。
阶段 7:发布工具包
python3 <skill-dir>/scripts/launch_time.py --tz <user's IANA time zone>
这个脚本会选择下一个星期二、星期三或星期四的美东时间上午 8:30,并将时间转换为用户的时区,同时遵循夏令时规则。它会跳过美国大选周、感恩节周、圣诞节到新年期间以及 7 月 4 日,并说明原因。不要自行手动转换:美国/欧洲的夏令时变化每年会使偏移量来回变动一小时。如果你能搜索网络,也请检查所选周是否有任何会主导科技新闻的事件(如 Apple、Google 或 OpenAI 的重大活动、重大宕机事件),如果需要,则调整一天。
然后阅读 references/launch-posts.md,并在仓库的父文件夹中(或者如果用户偏好,可以放在 docs/ 中)编写 LAUNCH.md。它包含计划、发布前检查清单、Show HN 标题和第一条评论、针对最合适子版块的 2 到 3 个 Reddit 帖子、一个 X 帖子串、以及发布后第二天的计划。
帖子中的故事必须是真实的。使用项目存在或构建过程中学到的真实情况。如果你不知道,请向用户询问一句他们的真实动机。永远不要编造背景故事、用户数量或基准测试数据。
阶段 8:移交
最后发送一条简短消息,包含以下内容:
- 审计评分,之前和之后。
- 仓库中现在有什么,以文件列表的形式给出。
- 用户用于发布的精确命令,按顺序:创建公开仓库、推送、等待 CI、打标签发布。
- 没有 API 能完成的步骤:上传社交预览图(在 Settings 中,然后选择 Social preview)、置顶仓库、以及修复个人资料详情。
- 用户所在时区的发布日期和时间,以及
LAUNCH.md的位置。
在他们说已发布后,主动提出进行验证。检查仓库是否为公开、CI 是否绿色、发布版是否包含附件、安装命令是否能在干净的目录中工作、以及社交预览图是否已设置(使用 gh api graphql -f query='{repository(owner:"o",name:"r"){usesCustomOpenGraphImage}}')。
什么让发布成功
以下是这些阶段所服务的核心理念。当步骤没有具体说明时,可以用它们来做决策。
- 先展示,再描述。 一个演示工具运行效果的 GIF 胜过三段说明文字。
- 一行命令就能试用。 在用户说出第一个“哦,不错”之前,每增加一个步骤都会损失用户。
- 诚实且具体。 “根据本周获得的星标数对你的仓库进行排名”胜过“AI 驱动的分析平台”。HN 社区会惩罚夸大宣传,并奖励真实故事。
- 时机和回复与帖子本身同样重要。 在用户清醒时发帖,并在前 3 小时内回复每一条评论。
- 永远不要要求点赞或加星。 在 HN 上这会导致帖子被标记。在其他地方则看起来像垃圾信息。