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は必要なら素晴らしい。私には必要なかった。私の要件:
- メールアドレスを収集する
- 自分が管理する場所に保存する
- 素早く出荷する
それだけだ。ドリップキャンペーンやA/Bテストや派手なテンプレートは必要ない。自分が所有するメールアドレスのリストが必要だ。
別の月額サブスクリプションの代わりに42行のコード。時には単純な解決策が正しいものである。
結論:不完全で公開済みは完璧で計画済みに勝る。ニュースレターサービスを評価し、機能を比較し、レビューを読むのに何時間も費やすこともできた。代わりに30分で何かを出荷して前進した。