移行後に起きること:8日間の複利リターン
ブログをNext.jsに移行して、大変な部分は終わったと思っていました。そしたら複利が始まりました——6本のメガガイド・より賢いAIアシスタント・ネイティブニュースレター・ボット対策・SEO刷新を8日間で。
8日前、ブログのバックエンド全体を4日間で再構築しました。WordPress の485記事をNext.jsに移行し・Sydney(私のAIチャットボット)を復活させ・プロダクションサイトを出荷しました。
それがストーリーだと思っていました。移行完了・お祝い・前に進む。
間違っていました。移行は目的地ではなく——スタートラインでした。
2月5日と今日のサイトの状態を比べてみます:
| 機能 | 2月5日(移行日) | 2月13日(今日) |
|---|---|---|
| ブログ投稿 | 485(WordPressから移行) | 492(6本の新しいメガガイド) |
| Sydney AI | 基本RAG、品質未テスト | 評価・最適化済み、ヒット率81% |
| ニュースレター | Beehiivエンベッド(サードパーティ) | ネイティブSupabase + Resend、興味ベース |
| SEO | 基本のサイトマップ+メタタグ | 構造化データ・FAQスキーマ・llms.txt・AEO |
| セキュリティ | レート制限のみ | Cloudflare Turnstile+レート制限 |
| パフォーマンス | 基本的なLighthouseチェック | Chrome DevTools MCPを使った体系的プロファイリング |
| アイキャッチ画像 | 手動作成 | AI生成パイプライン(Gemini+自動最適化) |
これらの改善はすべて、前のものが次を楽にしたから起きました。これが予期していなかった複利です。
アンロック:ブログが今やコードになった
WordPressからコードベースのスタックへの移行について誰も教えてくれないこと:移行自体がポイントではありません。 ポイントは移行後に何が可能になるかです。
ブログがMySQLデータベースの行ではなくGitリポジトリの492個のMDXファイルになると、すべてが変わります:
- すべての投稿はファイルです — Claude Codeがスケールで読み取り・検索・修正できる
- すべての変更はdiffです — 50記事にわたって何が変わったかを正確にレビューできる
- すべての機能はコンポーザブルです — ニュースレターシステムがAIチャットボットと同じ投稿メタデータを読める
- すべてのデプロイはコマンドです —
pnpm build && vercel --prod、完了
WordPressで12のブログ投稿を更新するとは、wp-adminにログインして・それぞれをクリックして・変更を加えて・更新して・繰り返すことを意味していました。MDXファイルとClaude Codeがあれば?「12の既存公園ガイドすべてに国立公園ピラーポストへのリンクを追加して」と言えば、各ファイルを読んで・正しいコンテキストに正しいクロスリンクを追加して・diffを見せてくれます。全12件の更新が数分で。
これがアンロックです。移行ではありません。その後に来るベロシティです。
4日間で6本のメガガイド
移行後に最初に構築したもの?コンテンツ。大量に。
何ヶ月もかけてアメリカに移住する混乱をナビゲートする人々を本当に助ける包括的な駐在員ガイドを書きたいと思っていました——2,000〜4,000語のピラー投稿の種類。WordPressではそれが苦痛でした。各投稿には手動フォーマット・画像アップロード・SEOプラグインの設定・カテゴリー管理が必要でした。
今は?パイプラインはこのようになっています:
- 投稿の構造とアウトラインをブレインストーム
- SEO/AEO最適化を組み込んだフルMDXを執筆
- アイキャッチ画像を生成 — Claudeが投稿を読んで・プロンプトを書いて・Geminiに送って画像を生成させる
- 最適化 — PythonスクリプトがWebPに変換・ウェブ用に圧縮
- Vercel Blobにアップロード
- 公開 —
git push・vercel --prod・pnpm db:publish - Sydneyがすぐに知る — 投稿はエンベディング付きでSupabaseに同期される
その4日間で出荷されたもの:
| 投稿 | トピック | 語数 |
|---|---|---|
| 医療ガイド | HSA・FSA・HDHP解説 | 〜3,200 |
| クレジット構築 | ゼロから720以上のクレジットスコアへ | 〜3,500 |
| 貯蓄と投資 | T-Bills対HYSA比較 | 〜2,800 |
| クレジットカードリワード | ポイント・マイル・キャッシュバック戦略 | 〜3,000 |
| 移住ガイド | アメリカ移住の完全プレイブック | 〜3,800 |
| 国立公園 | 26公園・4つのロードトリップ | 〜4,200 |
各投稿は同じAEOパターンに従います:アンサーファーストの書き出し・比較テーブル・120〜180語のセクション・太字の定義・ボトムのFAQスキーマ。AI引用が340%増える構造の種類です。
国立公園ガイドが最大のものでした——12の既存公園レビューにリンクするピラーポスト。そのためにPhotoGalleryコンポーネントも構築しました。20枚の個別画像をスクロールするのは大変だったので、ライトボックス付きのクリーンなグリッドにしました。シンプルだけど効果的。
Sydneyが賢くなった
移行中にSydneyを復活させたとき、動いていました——ローンチ前に手動でテストしました。質問に答えられて・関連する投稿を見つけて・ソースを引用できた。でも手動テストでわかることは「これは大丈夫そう」だけ。どれくらい大丈夫か・どこにギャップがあるか・どう改善するかはわかりません。
品質を体系的に測定する方法がなかった——測定なしに改善する方法もなかった。
だからRAG評価フレームワークを構築しました。12カテゴリーにわたる32のテストクエリ、それぞれ私が手動でキュレートした期待される結果を持っています。「駐在員はどのクレジットカードを持つべき?」という質問はクレジット構築ガイドを返すべき。「Yosemiteについて教えて」はYosemite旅行レポートを返すべき。
次に30の異なる設定の組み合わせをテストしました——6つの類似度閾値×5つの結果数——ヒット率・精度・時間的多様性を測定しました。
結果は目を見張るものでした:
| 指標 | 以前(デフォルト) | 最適化後 |
|---|---|---|
| ヒット率 | 〜30% | 81.2% |
| ゼロヒットクエリ | 30件中6件 | 30件中0件 |
| 時間的スプレッド | 1.2年 | 6.7年 |
最大の修正は恥ずかしいものでした:OpenAI SDKがNext.js下で実行されるとdimensionsパラメータをサイレントにドロップしていました。Sydneyは1536次元のエンベディングを生成していたのに384次元のインデックスを検索していました。結果が悪い理由も当然です。直接fetch()呼び出しに切り替えると一晩で修正されました。
また、Sydneyのシステムプロンプトを490以上のブログトピック全体をカバーするように拡張しました——今では国立公園・クレジットカード・医療・完全な駐在員コンテンツライブラリについて知っています。AIとマーケティングだけでなく。
自分でテストするためのコマンドは2つ:
pnpm eval:rag # ローカルSupabaseに対してテスト
pnpm eval:rag:prod # プロダクションに対してテスト
Sydneyがいつ賢くなるか実際に測定できるようになりました。これはWordPressを運営しているときには決して構築しないインフラです。
スケールでのSEOとAEO
2026年のSEOはGoogleだけについてではありません。あなたのコンテンツが答える質問を誰かが尋ねたとき、ChatGPT・Perplexity・Claudeに引用されることについてでもあります。
一つの週末で完全なSEO/AEOスタックを実装しました:
従来の検索のために:
- ダイナミックサイトマップ(639ページインデックス済み)
- 構造化データ — Person・WebSite・Article・BreadcrumbList・FAQPageスキーマ
- シンジケーションのためのRSSフィード
- Google Search Console確認済み
AIエンジンのために(AEO/GEO):
llms.txt— AIクローラー向けの優先コンテンツガイド(GPTBot・Claude-Web・PerplexityBotはすべてrobots.txtで許可)- すべてのセクション冒頭でのアンサーファーストパターン(最初の150語に太字のキーステートメント)
- AI アシスタントへの質問の仕方に合わせた質問形式のH2
- 自動検出されてFAQPageスキーマとしてレンダリングされるFAQセクション
パフォーマンスのために:
Chrome DevTools MCPを使って異なるページタイプ——ホームページ・ブログ一覧・個別の投稿・/askページ——をプロファイルし、ボトルネックを特定しました。パフォーマンストレースを実行し・結果を分析し・同じClaude Codeセッションで問題を修正できることは……不合理なほど効率的です。
結果は?書く新しい投稿はすべて自動的に構造化データ・FAQスキーマ(FAQセクションがある場合)を持ち・AI抽出のためにフォーマットされます。プラグインなし。手動設定なし。これがサイトの動き方になりました。
BeehiivをやめてネイティブニュースレターへIn
これは驚きでした。動いているBeehiivのニュースレターがありました。メールを収集していた。更新を送っていた。なぜ置き換えるのか?
3つの理由:
- コントロール — 興味ベースのサブスクリプションが欲しかった。「AI&テクノロジー」サブスクライバーは国立公園のコンテンツを受け取るべきではない。Beehiivの無料ティアではそれがサポートされていなかった。
- 統合 — サブスクライバーデータが今やSydneyの検索インデックスと同じSupabaseデータベースに住んでいます。一つの真実のソース。
- コスト — Supabase(無料ティア)+ Resend(低ボリュームで無料ティア)= 月$0。
構築したシステム:
- ダブルオプトイン — 購読 → 確認メール → 確認済み → パーソナライズされたおすすめ付きウェルカムメール
- 5つの興味グループ — AI・駐在員生活・リーダーシップ・マーケティング・トラベル&国立公園
- スマートマッチング — 投稿カテゴリーがサブスクライバーの興味に自動マッピング。クレジットカードガイドを公開すると「駐在員生活」サブスクライバーだけが通知される
- 毎日のcron — VercelがPST午前11時にジョブを実行し、過去48時間の投稿を見つけてターゲット通知を送る
- 重複排除 —
notification_logテーブルが重複メールを永遠に防ぐ
最高の部分?すべてのブログ投稿の下にあるサブスクライブフォームが投稿のカテゴリーに基づいて関連する興味を自動選択します。AI記事を読んでいれば、スクロールしてサブスクライブすると「AI&テクノロジー」ピルがあらかじめ選択されています。
これをゼロから構築するのは大変な作業のように聞こえます。それはある夜の集中した作業くらいでした。Supabaseの移行・APIルート・メールテンプレート・cronジョブ——Claude Codeが足場を作り、私はロジックとコピーに集中しました。
セキュリティ:必要になるまで見えない
公開AIチャットボットとニュースレターサインアップがあれば、ボットが悪用したがる2つのエンドポイントがあります。レート制限はすでに設置していましたが(Upstash Redis、1分に5リクエスト)、もう一層欲しかった。
Cloudflare Turnstileの出番——不審なアクティビティを疑うときだけチャレンジを表示する、見えないCAPTCHA。実際のビジターの99%には完全に見えません。ボットには?壁です。
まず/askエンドポイント(Sydneyチャット)に追加し、/api/subscribeに全く同じパターンを再利用しました。同じ検証ライブラリ・同じグレースフルデグラデーション:
- 環境変数が設定されていない → バイパス(ローカル開発はなしで動く)
- CloudflareのAPIがダウン → フェールオープン(レートリミッターがフォールバック)
- トークンが欠けているがシークレットキーが設定されている → 拒否(フロントエンドをバイパスするボットをキャッチ)
再利用こそが複利ストーリーを作っているものです。ニュースレターのTurnstile統合は数時間ではなく数分かかりました。なぜなら、インフラはすでにSydneyから存在していたからです。
複利効果
計画していなかったけれど自然に起きたこと:
Next.jsへの移行(2月1〜5日)
└─→ MDXファイルがClaude Codeにスケールでコンテンツを読み/修正できるようにする
└─→ 6本のメガガイドをSEO/AEO最適化付きで執筆(2月6〜11日)
└─→ 新コンテンツがSydneyの検索品質の問題を露わにする
└─→ RAG評価フレームワーク構築・Sydney最適化(2月11日)
└─→ コンテンツが増えてニュースレターが必要(Beehiivではなく)
└─→ ネイティブニュースレターをSupabaseで構築(2月12日)
└─→ 公開エンドポイントにボット対策が必要
└─→ TurnstileをSydney+サブスクライブに追加(2月12〜13日)
これらはシーケンスとして計画されていませんでした。それぞれが次のニーズを明らかにしました。移行がコンテンツ作成を速くした。速いコンテンツ作成が検索品質のギャップを明らかにした。検索の修正がより良い配信を求めさせた。より良い配信には保護が必要だった。
それが複利です。 各改善は価値を追加するだけでなく——それ以前のすべての価値を乗算します。:)
そしてそれを貫く共通のスレッドは?私のサイトのすべてのピースが今やプログラム的に読み取れ・テストでき・修正できるコードだということ。それが本当のアンロックです。
数字
なぜなら、あなたが気になっていることがわかるから:
| 指標 | 値 |
|---|---|
| 移行からの日数 | 8 |
| 新しいブログ投稿 | 7(これを含む) |
| 出荷された新機能 | 6(ニュースレター・Turnstile×2・RAG評価・SEOスタック・PhotoGallery) |
| 更新されたブログ投稿 | 12以上(クロスリンク・壊れたリンクの修正) |
| 追加されたコード行数 | 〜5,600 |
| 追加されたデータベーステーブル | 2(subscribers・notification_log) |
| 追加されたAPIエンドポイント | 4(subscribe・verify・unsubscribe・cron) |
| コスト増加 | $0/月(すべて無料ティア) |
次は
終わっていません。複利は止まっていません:
- 更なる駐在員ガイド — 税務戦略・ビザのタイムライン・銀行比較。シリーズには勢いがあります。
- Sydneyはより賢くなる — 今や品質を測定できるので、ヒット率を90%超に押し上げたい。
- AIを使った構築についての更なる深掘り — ツールは毎週進化しています。進行中にドキュメント化しています。(最新:Swiftを知らずにネイティブiOSアプリを構築することと、AIが60%まで連れて行ってくれる——プロダクトが実際に生きているのは最後の40%だと発見しました。)
でも正直に言えば?主に書き続けることに興奮しています。ブログを始めて17年で初めて、新しい投稿を公開するのが本当に楽しい——45分のWordPressの苦行ではなく。:D
移行や大きな技術的決断の後にこのような複利を経験したことはありますか?驚いた最初の予期しないアンロックは何でしたか?
よろしくお願いします、Chandler
よくある質問
ウェブサイト開発における複利効果とは何ですか?
複利効果とは、サイトへの各改善が次の改善をより速くより簡単にすることです。 例えば、コードベースのスタックへの移行がAI支援のコンテンツ作成を可能にし、それが検索品質の問題を明らかにし、評価フレームワークの構築につながりました。各ステップが前のものを積み上げました。
AI検索エンジン向けにブログ投稿を最適化するには?
AI検索エンジンは明確な見出しと簡潔なセクションを持つ構造化されたアンサーファーストのコンテンツを好みます。 主なテクニック:最初の150語に太字の定義的なステートメント・質問形式のH2見出し・比較テーブル・120〜180語のセクション・FAQスキーマ。これらのパターンでAI引用が最大340%増えます。
RAG評価フレームワークとは何ですか?
RAG評価フレームワークは、AIアシスタントが関連するコンテンツを見つけて返す能力をどれだけ上手くテストするものです。 期待される結果(グランドトゥルース)を持つ事前定義されたクエリを使い、ヒット率・精度・時間的多様性などの指標を測定します。これにより推測ではなく体系的に検索設定を最適化できます。
BeehiivをカスタムニュースレターシステムとReplace した理由は?
カスタムニュースレターシステムはサブスクライバーデータ・興味ベースのターゲティング・既存データベースとの統合について完全なコントロールを提供します。 Supabase + Resendを使うことで、興味ベースのサブスクリプション・自動通知・$0/月のホスティング——すべてSydneyの検索インデックスと統合——が得られました。
Cloudflare Turnstileは従来のCAPTCHAとどう違いますか?
Cloudflare Turnstileは不審なビジターにのみチャレンジを表示する見えないボット検出システムです。 全ユーザーにパズルを解かせる従来のCAPTCHAとは異なり、Turnstileはブラウザシグナルでボットをユーザーエクスペリエンスを妨げずに検出します。
まだコーディングして・まだ学んで・まだ複利の利子が増えるのを見ています。




