Claudeで独自のニュースレターを構築する

Hacker Newsのトラフィック急増2日目。4万人の訪問者、再び彼らにリーチする方法がない。ニュースレター登録が必要だった。

Buttondown、Beehiiv、Substack、ConvertKitを調べた。すべてやり過ぎだ。メールアドレスを収集するだけでよかった。キャンペーン、分析、購読者管理は必要ない。そして自分のデータを所有したかった。

そこでClaudeに構築を依頼した。

flowchart LR
    User([User]) --> Form[Newsletter Form]
    Form -->|POST /api/subscribe| Worker[Cloudflare Worker]
    Worker --> KV[(Cloudflare KV)]
    KV -.->|Daily sync| GHA[GitHub Actions]
    GHA -.-> Repo[(subscribers.jsonl)]
flowchart TB
    User([User]) --> Form[Newsletter Form]
    Form -->|POST /api/subscribe| Worker[Cloudflare Worker]
    Worker --> KV[(Cloudflare KV)]
    KV -.->|Daily sync| GHA[GitHub Actions]
    GHA -.-> Repo[(subscribers.jsonl)]

セットアップ

環境変数を介してClaudeにCloudflare APIトークンを渡し、欲しいものを説明した:メールを収集し、自分が管理する場所に保存するフォーム。

30分足らずで、動作するニュースレターができた。

Claudeが構築したもの

コンポーネント技術
フォームHTML + vanilla JS
バックエンドCloudflare Worker
ストレージCloudflare KV
同期GitHub Actions

フォームは/api/subscribeに投稿するHugo partialである:

<form id="newsletter-form">
  <input type="email" name="email" placeholder="[email protected]" required>
  <button type="submit">Subscribe</button>
</form>

バックエンドは42行のCloudflare Worker:

export async function onRequestPost(context) {
  const { email } = await request.json();

  // Validate, normalize, check for duplicates
  const emailKey = email.trim().toLowerCase();
  const existing = await env.SUBSCRIBERS.get(emailKey);
  if (existing) {
    return Response.json({ success: true, message: "Already subscribed" });
  }

  // Store in KV with metadata
  await env.SUBSCRIBERS.put(emailKey, JSON.stringify({
    subscribedAt: new Date().toISOString(),
    source: sanitizedReferer
  }));

  return Response.json({ success: true }, { status: 201 });
}

GitHub Actionsワークフローが毎日実行され、Cloudflare KVからリポジトリ内のJSONLファイルに購読者を同期する。購読者リストはバージョン管理に存在する。Cloudflareが明日アカウントを閉鎖しても、データはまだある。そしてLLMが簡単に扱える形式になっている。

ワークフロー

Claudeはすべてが機能するまでローカルで反復した—フォーム送信、KVストレージ、エラー処理。次にプレビューアプリにプッシュし、完全なフローをテストし、mainにマージした。

トラフィックがまだ流れている間にフォームが公開された。

これはすべて1セッションで構築された。

なぜSaaSではないのか?

Buttondownは必要なら素晴らしい。私には必要なかった。私の要件:

  1. メールアドレスを収集する
  2. 自分が管理する場所に保存する
  3. 素早く出荷する

それだけだ。ドリップキャンペーンやA/Bテストや派手なテンプレートは必要ない。自分が所有するメールアドレスのリストが必要だ。

別の月額サブスクリプションの代わりに42行のコード。時には単純な解決策が正しいものである。

結論:不完全で公開済みは完璧で計画済みに勝る。ニュースレターサービスを評価し、機能を比較し、レビューを読むのに何時間も費やすこともできた。代わりに30分で何かを出荷して前進した。