show-hn-writer について
show-hn-writerは、Hacker News投稿のタイトルと、必要に応じて本文を作成するスキルです。上位250件の投稿から得た傾向を用い、リーチや議論などの目的に合わせて案を調整します。
主な機能
- 01タイトル案を3種類作成
- 02通常、Show HN、Ask HN、Tell HNの形式を提案
- 03観察された投稿に基づく長さと文体の指針
- 04技術的な説明に価値がある場合のみ本文を作成
- 05最近のHN投稿を取得して参考にできる
活用シーン
- 01リリースやプロジェクトのHacker News投稿の準備
- 02リーチや議論に合わせたタイトル表現の選択
- 03最近のHN投稿に類似投稿がないか確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ varnan-tech/ opendirectory --skill show-hn-writerインストール後、Claude Code で/show-hn-writerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.env.exampleREADME.mdevals/evals.jsonreferences/hn-rules.mdtitle-formulas.md詳細
Show HN Writer — データに基づくエディション
このスキルは、実際に上位にランクインした250件の投稿から抽出したパターンを使って、HN投稿の下書きを作成します。 以下のルールはすべて、慣例ではなく観測データに基づいています。
データが示すこと(何かを書く前に理解してください)
以下は、2026年4月18日にスクレイピングした、HNで上位にランクインした250件の投稿から得られた知見です。HNの書き方に関する一般的な通説より、こちらを優先してください。
タイトルの長さは、スコアを左右する最も強い要因です。
- 40文字未満:平均248ポイント(n=82)
- 40~59文字:平均192ポイント(n=68)
- 60~79文字:平均150ポイント(n=91)
- 80文字以上:平均131ポイント(n=9) デフォルトの目標:40文字未満。厳守する上限:60文字。
本文はスコアに影響しません。 投稿の90%に本文はありませんでした。本文ありの平均:189。本文なしの平均:193。統計的に同じです。本文を書く価値があるのは、タイトルに収まらない、本当に興味深い技術的な詳細がある場合だけです。信頼性を高めるために、本文を付け足してはいけません。
Show HNの接頭辞はスコアを下げます。 Show HNの投稿は平均94ポイントで、通常の文言の投稿は186ポイント以上でした。このラベルは「自分のプロジェクトへのフィードバックが欲しい」という印象を与え、より懐疑的に読まれるきっかけになります。プロジェクトが本当に斬新な場合に限り、「Show HN:」を使ってください。必ず、接頭辞のないタイトル案も提示してください。
一人称のタイトルは、匿名的な文言よりも高い成果を上げます。 一人称(「I…」「My…」「We…」):平均291ポイント(n=9)。 通常の文言:平均186ポイント(n=126)。 作り手の視点がストーリーの一部なら、それを先頭に持ってきてください。
疑問形は、賛成票よりコメントを集めます。 疑問形のタイトルは、平均コメント数対スコア比が1.0倍を超えます。スコアを最大化するより、議論を促すのに適しています。書き始める前に、ユーザーがどちらを重視するか尋ねてください。
一貫して高い成果を上げているテーマ:
- セキュリティ/バックドア/情報漏えいのストーリー:平均308ポイント
- プライバシー/監視/データに関するストーリー:平均282ポイント
- AI/LLMのリリース:平均266ポイント(42件で、最多のカテゴリー)
- オープンソースのリリース:平均485ポイント(サンプル数は少ないものの、強い傾向)
最も高いスコアを獲得したタイトルには、共通点が1つあります。トピックではなく、ストーリーになっていることです。 「誰かがWordPressプラグインを30個買い、そのすべてにバックドアを仕込んだ」— 1192ポイント。 「Googleは私との約束を破り、ICEが私のデータを持つことになった」— 1688ポイント。 トピックは「WordPressプラグインのセキュリティ」です。ストーリーには、行為者、行動、そして利害が含まれます。
ステップ1:何よりも先に、ユーザーに質問を1つする
下書きを作る前に、次のように尋ねてください。
「簡単な質問が2つあります。
- スコア(リーチ)とコメント(議論)のどちらを重視しますか?
- プロジェクトは何をするものですか?形容詞を使わず、技術的に一文で説明してください。」
両方の回答を得るまで、先に進まないでください。
ステップ2:適切な投稿形式を決める
プロジェクトと目標に基づいて、使用する形式を決めてください。
通常のタイトル(デフォルトとして推奨) 接頭辞は付けません。何なのか、何が起きたのかだけを書きます。平均スコアが最も高い形式です。 使用する場面:リリース、記事、ツール、イベントを共有するとき。
Show HN: の接頭辞(控えめに使用) 使用するのは、プロジェクトが動作するデモであり、作り手が質問に回答でき、技術的な実装が興味を引くポイントである場合に限ります。 平均スコアは低い(94)ものの、プロジェクトが本当に斬新なら、信頼性を示すことができます。 比較できるよう、接頭辞のないタイトル案も必ず作成してください。
Ask HN: の接頭辞 目的が宣伝ではなく議論である場合に使用します。平均エンゲージメント比は1.0倍超です。 「Xを使っている人はいますか?」や「Yをするべきでしょうか?」といった投稿に最適です。
Tell HN: の接頭辞 内部告発、説明責任、情報開示に使います。データポイントは1件で、819ポイントです。 投稿が事実に基づき、検証可能で、作り手の名前が明示されている場合に限り使用してください。
ステップ 3:タイトルを作成する
投稿のすべてはタイトルです。 本文は任意と考えてください。
データから導かれたルール:
- 40 文字未満を目指します。20 文字超過するごとに、平均スコアが約 30 ポイント下がります。
- カテゴリーではなく、ストーリーを書きます。名詞句よりも、行為者+行動+ stakes(何が懸かっているか)のほうが効果的です。
- 一人称(「私は…」)は、作り手の視点が重要な場合、単なる説明と比べて平均約 100 ポイント加算されます。
- マーケティング用の形容詞は使いません。「高速」「シンプル」「強力」「軽量」は、文字どおりの仕様(例:「35B-A3B」は仕様、「強力」は仕様ではありません)でない限り使いません。
- 一般性より具体性を優先します。「人気の CMS プラグイン」より「30 個の WordPress プラグイン」のほうが効果的です。
- 角括弧内の年は、今も読む価値のある定番記事であることを示します:(2008)、(1956)。古くても価値が保たれているコンテンツへのリンクに使います。
- サブタイトル形式には en dash(–)を使います:「製品名 – その機能」。ハイフン(-)は使いません。
3 つの案を作成します:
- 可能な限り短く(35 文字未満を目標) — 不要なものをすべて削ります
- ストーリー重視 — 行為者+行動+何が懸かっているか
- 技術重視 — 興味深い技術的判断を先に示します
次に長さを確認します。それぞれの文字数を数え、60 文字を超えるものには印を付けます。
ステップ 4:本文を書くかどうかを決める
技術的な実装に、タイトルには収まらず、HN のエンジニアが本当に興味を持つような詳細があるか、自問してください。
ある場合は、本文を書きます(ステップ 5 を参照)。 ない場合は、タイトルだけで終わりにします。内容を水増しした本文より、本文がないほうがよいです。
データによると、本文を書いてもスコアは上がりません。本文を書く唯一の理由は、実装がエンジニアに「これはどう動くの?」と尋ねさせるほど興味深く、その答えをあらかじめ伝えておきたい場合です。
ステップ 5:本文を書く(ステップ 4 で書くと決めた場合のみ)
構成 — 簡潔にまとめます:
1 行目: 1 文で、何を作ったのか、そしてなぜ作ったのかを書きます。一人称で書きます。 「X をご紹介します。」ではありません。「X は、〜するツールです。」でもありません。ただ「Y のために X を作りました。」と書きます。
2〜4 行目: 本当の理由を書きます。正直に、具体的に。自分自身が直面した問題でしたか?仕事で困っていたことですか?好奇心からですか?「〜にうんざりしていました」は、「開発者はしばしば〜に苦労します」よりも適切です。作り手自身の声が大切です。
5〜8 行目: 実際の仕組みを書きます。HN の読者が知りたいのはここです。 具体的な技術の選択肢を挙げます。どのようなトレードオフを選び、その理由は何かを述べます。興味深い技術的判断を 1 つ示すほうが、機能の一覧を並べるより価値があります。
9 行目: 現在の状態を 1 文で示します。オープンソースですか?無料ですか?アルファ版ですか?個人開発ですか?どのくらいの期間取り組んでいますか?
10 行目: フィードバックや質問を歓迎する締めの文を 1 つ書きます。 「実装に関する質問には喜んでお答えします。」「批判も歓迎します。」 アップボート、シェア、登録を求めてはいけません。
厳守するルール:
- 150〜300 語。通常は 200 語未満が望ましいです。
- 全体を通して一人称で書きます。
- 箇条書きにしません。見出しを付けません。太字を使いません。
- 本文にリンクを入れません。URL は投稿欄に記入します。
- 次のようなマーケティング用語は使いません:画期的、革命的、強力、堅牢、シームレス、革新的、業界最高、効率化する、活用する、変革する、最先端。
ステップ 6:提示する前にセルフチェックする
次のリストを確認します。出力前に、条件を満たしていない箇所を修正します。
タイトル:
- 60 文字未満(数えて確認)
- マーケティング用の形容詞がない
- ストーリーになっているか、それとも話題の説明か?(ストーリーのほうが効果的)
- 作り手の視点が加わる場合は一人称になっている
- 感嘆符がない
本文(書いた場合):
- 「私は…を作りました」または「過去 N か月間…」で始まっている
- 具体的な技術名またはアーキテクチャ上の判断が少なくとも 1 つ含まれている
- 300 語未満
- リンクがない
- 行動を促す呼びかけではなく、フィードバックを歓迎する言葉で締めくくっている
- マーケティング用語が一切ない(ステップ 5 のリストを確認)
投稿の種類:
- Show HN の接頭辞を使う場合、接頭辞なしのタイトル案も作成している
- コメントが目的の場合、質問形式または意見が分かれるような切り口になっている
- スコアが目的の場合、質問ではなく断定文になっている
ステップ 7:出力を提示する
次の形式を厳守します。前後に説明を付けません。
## HN Post
### Recommended title
[title — the shortest, strongest variant]
### Alternative titles
1. [variant 2]
2. [variant 3]
---
### Body
[body text, or "Not recommended — title is sufficient." if Step 4 said no body]
---
### Notes
- Goal: [score / comments] — based on user's answer in Step 1
- Post type used: [plain / Show HN / Ask HN / Tell HN]
- Title length: [N chars]
- Best time to post: Tuesday–Thursday, 8–10 AM US Eastern
- After posting: respond to every comment in the first two hours
- Do not share the link elsewhere for 24 hours — HN penalises vote rings
ステップ 8:任意 — 現在の HN 人気投稿をスクレイピングして背景情報を得る
類似の投稿が最近投稿されたか確認したい場合や、 現在そのカテゴリで何が注目されているか知りたい場合は、スクレイパーを実行します。
import requests
from concurrent.futures import ThreadPoolExecutor
HN_API = "https://hacker-news.firebaseio.com/v0"
def fetch_item(id_):
try:
r = requests.get(f"{HN_API}/item/{id_}.json", timeout=10)
return r.json() if r.ok else None
except Exception:
return None
ids = requests.get(f"{HN_API}/topstories.json").json()[:250]
with ThreadPoolExecutor(max_workers=20) as ex:
items = [i for i in ex.map(fetch_item, ids) if i]
# Filter by keyword relevant to the user's project
keyword = "YOUR_KEYWORD_HERE"
matches = [i for i in items if keyword.lower() in i.get("title","").lower()]
for i, item in enumerate(matches, 1):
score = item.get("score", 0)
title = item.get("title", "")
by = item.get("by", "")
print(f"{i:>2}. [{score:>4}pts] {title} — {by}")
print(f"\nTotal matching: {len(matches)}")
結果を使って、次のことを行います。
- 過去 48 時間以内にほぼ同一の投稿がないか確認する(重複を避ける)
- 現在このカテゴリで好評なタイトルのパターンを確認する
- このトピック分野でのスコアの最低ラインを把握する
完全なスクレイパーを使用すると、結果は hn_log.csv にも自動的に追記されます。
参考:データセットで確認された人気投稿
トップ 250 に入った実際の投稿です。タイトルのパターンを参考にしてください。
| スコア | タイトル |
|---|---|
| 1941 | Claude Opus 4.7 |
| 1688 | Google broke its promise to me – now ICE has my data |
| 1244 | Qwen3.6-35B-A3B: Agentic coding power, now open to all |
| 1192 | Someone bought 30 WordPress plugins and planted a backdoor in all of them |
| 1141 | DaVinci Resolve – Photo |
| 990 | Codex for almost everything |
| 982 | Stop Flock |
| 909 | A new spam policy for "back button hijacking" |
| 893 | GitHub Stacked PRs |
| 819 | Tell HN: Fiverr left customer files public and searchable |
| 668 | I wrote to Flock's privacy contact to opt out of their domestic spying program |
| 619 | Measuring Claude 4.7's tokenizer costs |
| 561 | God sleeps in the minerals |
| 503 | Want to write a compiler? Just read these two papers (2008) |
スコア別 Show HN の人気タイトル: 341 | Show HN: Smol machines – subsecond coldstart, portable virtual machines 199 | Show HN: PanicLock – Close your MacBook lid disable TouchID → password unlock 187 | Show HN: Every CEO and CFO change at US public companies, live from SEC 177 | Show HN: I made a calculator that works over disjoint sets of intervals 152 | Show HN: MacMind – A transformer neural network in HyperCard on a 1989 Macintosh
コメント数とスコアの比率が高い投稿(議論向けに最適化された投稿): 1.91× | Why is IPv6 so complicated? 1.43× | Ask HN: Building a solo business is impossible? 1.20× | Ohio prison inmates built computers and hid them in ceiling 1.13× | Ask HN: Who is using OpenClaw? 1.05× | The future of everything is lies, I guess: Where do we go from here?