このブログを、二年間構想していた

「思っていた」というのは正確ではなく、むしろ執念に近い。フロントエンドもバックエンドも書けず、組み込みのコードも書けなかった頃から、それはもうあった。当時はまだ電子工作をいじっていて、たまたま @ushioの動画とサイトを見つけた。はすごく面白いと思って、自分も欲しくなった。それから半年近くかけて、ゼロから C を覚え、JS と CSS も少しかじって、Hexo で静的ブログを作り Github Pages に置いた。これでようやく自分の小さな居場所ができたわけだ。

Hexo: A fast, simple & powerful blog framework. , hexo.io, 新しいタブで開きます
ダークモードで表示された Hexo プロジェクトのホームページのスクリーンショット。左上に青い六角形の「H」ロゴがあり、その横に Docs、API、News、Plugins、Themes、About のナビゲーションリンク、GitHub アイコン、Cmd-K のヒント付き検索ボックス、そして右端に英語の言語切り替えが並ぶ。ヒーロー部分には「A fast, simple & powerful blog framework」と表示され、その下にコピー可能なインストールコマンド `$ npm install hexo-cli -g` と青い矢印ボタンがある。さらにその下にはバッジの列が並び、GitHub スター 41k、フォーク 5k、月間ダウンロード 212k、Follow @hexojs リンクが示されている。リリース一覧には hexo 8.1.0 が 2025-10-26、hexo 8.0.0 が 2025-09-16、hexo 7.3.0 が 2024-07-02、Hexo 7.2.0 が 2024-04-17 と並び、次のセクションは「Blazing Fast」「Markdown Support」という機能見出しで始まる。リリース日とダウンロード数から、このキャプチャは 2025 年 10 月下旬以降のものと分かる。
ushio , sakura-ushio.icu, 新しいタブで開きます
個人ブログの記事一覧のスクリーンショット。左側の暗いサイドバーには、丸いアニメ風のアバター、小汐という名前、主页リンク、所有文章 / 友链 / 关于我 のリンクが並ぶ行、そして GitHub と QQ を含む4つの円形ソーシャルアイコンが配置されている。メインカラムには、2023-01-29 の日付が付いた PD-METER-R4 というタイトルの固定記事カードが表示され、その中国語の概要には、開発中であり、R3 と比べてレイアウトを最適化し、メインコントローラを交換し、いくつかの新機能を追加したと書かれている。その下には、USBC-R4 SAKURA と記された小さな緑色の PCB の表と裏を写した2枚の写真があり、白い布の上で撮影され、Xiaomi 12S Ultra のカメラのウォーターマークに 2023.02.06 15:47 と表示されている。このカードには 置顶 (固定) タグと 展开全文 >> の展開ボタンが付いており、その下には 2023-02-14 の日付が付いた WORX-BAT-Charger の2枚目のカードが始まっている。ハードウェア愛好家のブログが USB-C パワーデリバリー計測ボードの各世代を記録している様子を示すものと見られる。

その後、@Innei の個人サイトを見つけた。デザインは洗練され、機能も充実していて、一目見ただけで欲しくなり、支援までした。結局使う機会はなかったけれど、そのお金を惜しいとは思わない。おかげで React のソースコードに触れられたからだ。初めて C を見たときと同じように、「所詮はコードじゃないか。大したことはない。いつか自分で一つ書いてやる」と思った。

静かな森 , innei.in, 新しいタブで開きます
ダークモードの個人ブログのトップページのスクリーンショット。ほぼ黒に近い背景に、淡い色の花びらが舞っている。上部中央にはピル型のナビゲーションバーがあり、中国語の項目として首页(選択中)、文稿、手记、时光、思考、更多が並ぶ。左上には小さなアニメ風のアバター、右上にはサインインのアイコンがある。左側のヒーローテキストには「Hi, I'm Innei 👋。」とあり、その下に「A NodeJS Full Stack <Developer />」、さらに「An independent developer coding with love.」の一行が続く。その下には丸いソーシャルボタンが横一列に並び、Bilibili、NetEase Cloud Music、GitHub、メール、RSS、Telegram、X が置かれている。右側には、ピンクのリボンを付けた銀髪の少女を描いた大きな円形のアニメ風ポートレートが配置され、下端には責任と内なる強さについて述べた灰色の中国語の引用文が横に走っている。デスクトップ幅のブラウザで表示された Innei の個人サイトのランディング画面と見られる。

それは2024年のことだった。そして24年、25年、26年を経て今に至る

それ以来、止まらなくなった。

制御不能

きっかけは、@colmugx の Hexo テーマ Nlvi にライト/ダークの切り替えを付けたい、ただそれだけだった。Dark Reader の JS を使って適当にでっち上げてはみたが、見た目が汚くて納得できなかった。それから CSS の @media を学び、JS による SPA 切り替えへ、TailwindCSS の .dark class へ、SSR の next-theme へと進み、最後は Cookie と Head Sync のインラインスクリプトを、FOUC のちらつきを潰した。四つか五つのやり方を試したことになる。

🎨 A simple theme for hexo. , github.com, 新しいタブで開きます
Hexo ブログテーマのプロモーション用モックアップ。左側には大きな薄いグレーの文字でワードマーク「NIvi」が置かれ、その下に短いサーモンピンクの下線が引かれている。右側にはブラウザ風のスクリーンショット 2 枚が重ねて配置されている。大きいほうのデスクトップ幅のパネルには、筆記体ロゴ「Hexo」と search、ARTICLE、ARCHIVES、TAGS、ABOUT のナビゲーションを備えたクリーム色のヘッダーが表示され、その下には 2013-12-27 の日付が付いた「Elements」というタイトルのタイポグラフィ検証用記事がある。これは Hexo の標準サンプルページで、Heading 1 から Heading 6 まで、ピンクのインラインリンク・太字・斜体・下線・コードスパンを含む lorem ipsum の Paragraph セクション、ピンクの縦線が付いた引用ブロック、そして「Table Header 1–3」の見出しに「Division 1–3」の行が並ぶ 3 列のテーブルを順に見せていく。同じページをより狭いモバイルまたはタブレット幅でレンダリングしたものが右下で重なっており、ロゴが中央揃えになり、同一の内容が 1 カラムに再配置されている。全体は白一色の背景に置かれ、テーマのショーケースとして読める。デザインが HTML 要素一式をどちらの幅でも綺麗にレンダリングすることを示す証拠となっている。

だが、これは氷山の一角にすぎない。React を知ってからというもの、石器時代のような Hexo と素の JavaScript から Next.js 13 のページルーターまで一気に進み、さらに寄り道して Vue を触り、単一ページアプリケーションのルーティングを研究し、index.html へのフォールバックを理解しようとして、プロジェクトを数え切れないほど作り直した。サーバーを買って Docker、Nginx、ネットワーク接続ストレージをいじり、1Panel の見た目が気に入らず Canopy パネルを自作し、ストレージアレイを研究して RFS を書き、セキュアソケットレイヤー証明書の設定では中国国内の環境で不調を繰り返す acme.sh に苦しめられた末、Rust で Vane と Lazyacme というリバースプロキシまで書いた。もともとはある晩に3時間で書いた800行のごみコードにすぎなかったのに、グループの仲間にけしかけられ、結局4か月を費やして HTTP/3、ゼロコピー、レイヤーモデル、フローエンジンを片っ端から詰め込んだ。その後には Seam というフルスタックフレームワークもあるが、これも底なし沼なので、話はまた今度にしよう。

過剰設計

そしてAI時代が到来し、不安はさらに倍増した。

いちばん皮肉なのは、これらは本来ブログを持ってから、記録しながら作るはずのものだったということだ。ところがブログのほうは、アイデアばかりが増えていくのに、それを書き留める場所がひとつもなかった。一方では内心がずっと自分を責めていた。Vane は完成させると決めたのだから、止めるわけにはいかない、と。もう一方では、進めば進むほど遠ざかっていく無力感があった。自分が何をすべきかはずっと覚えている。ただ、作り上げることができない。よく考えてみると、腰を据えて何かを書くということを、もう随分と長いあいだしていなかった。いま振り返ると、すべては同じひとつのものを指している——過剰設計だ。

当時、実は自分が脱線していると感じていなかったわけではない。Vane?どうせブログもいずれ公開するのだから、リバースプロキシは必要だろう。Seam?どうせ遅かれ早かれフルスタックで書くのなら、先に理想のフレームワークを作ってしまえばいい。一歩一歩に理由があり、そのどれもが「いずれ役に立つ」ものだった。だが問題は、その「いずれ」が永遠に来ないことだ。私は一度も始めてすらいなかったのだから……

失敗

ブログを作るのに、実のところリバースプロキシも自作フレームワークも必要ない。けれど当時の私は、それらを前提条件だと思い込み、いつまでも自分を足止めしながらも筋が通っているように見える理由にしていた。しかし、最初から前提条件などではなかった。本当に必要なことはただ一つ、腰を据えて最初の記事を書くことだった。

実はブログにまったく手をつけていなかったわけではない。むしろ逆で、三度も取り組んだ。

Vercel , vercel.com, 新しいタブで開きます
ダークモードの Next.js ホームページのスクリーンショットで、デスクトップブラウザで表示したランディングのヒーロー部分を写している。上部のナビゲーションには左に Vercel の三角形ロゴと NEXT.js のワードマーク、その横に Showcase、Docs、Blog、Templates、Enterprise のリンク、右側には「Search documentation...」の入力欄と ⌘K のヒント、Deploy ボタン、Learn ボタンが並ぶ。ページ中央には大きな白い文字で「The React Framework for the Web」とあり、その下に「Used by some of the world's largest companies, Next.js enables you to create high-quality web applications with the power of React components」というサブヘッドが続き、さらに淡い色の「Get Started」ボタンと暗い色の「Learn Next.js」ボタン、その下にコマンド `~ npx create-next-app@latest` が置かれている。テキストの背後には、薄いドットのグリッド線と部分的に見える2つの円の輪郭が背景装飾として配置されている。

最初に挑戦したのは、まだ Next.js 13 の Page Router が使われていた頃だった。当時の私は、シングルページアプリケーションが何なのかをぼんやり理解している程度で、SSR、SSG、ISR といった概念は何一つ分かっていなかった。それでも、みんなが SSR は良いと言うので、自分も使おうとした。ところが、書き進めるうちに、そもそもこれらのアーキテクチャが何の問題を解決するためのものなのか、まったく理解していないことに気づき、続けられなくなった。その後は Vue 2 の純粋なシングルページアプリケーションに切り替えた。なぜ Vue を選んだのか?恥ずかしながら、名前の響きが良かったからだ。どうせ自分には新しいものだったので、とりあえず試してみようと思った。しかし、それも長くは続かなかった。三度目は React に戻り、素の JSX から始めた。TypeScript を学び、TSX を使えるようになり、CJS と ESM の違いを理解し、リアクティブプログラミングに魅了され、後に手放せなくなる Lucide、Framer Motion、Radix UI といったライブラリも使い始めた——今度こそ、ようやくそれらしい形になった。それでも私は失敗した。本質的には、ただ他人をまねていただけだったからだ。誰かが使っているものをそのまま取り入れ、見た目だけはそれらしくても、なぜそうすべきなのかはまったく理解していなかった。そこに AI の幻覚まで加わり、最低限実用可能な製品として動かすところまでは何とかできても、規模を拡大しようとすると、至る所が落とし穴だらけだった。

Remix , remix.run, 新しいタブで開きます
Remixウェブサイトのランディングページのスクリーンショット。淡いグレーから白へのグラデーション上に描画され、左上にワードマーク「Remix」、右上にBlog、Jam、Store、V2 Docsと並ぶナビゲーション行がある。中央の見出しは「Remix 3 is under active development」と告げ、その下に「A new full stack framework built on Web APIs」というサブタイトルが置かれている。下部3分の2を占めるのは、黒い覆いの下に隠された車の様式化されたイラストで、布のひだが光を受けており、虹色の縞模様の斜めのバナーと白いレーシングストライプの閃光が中央を横切っている——覆われたスーパーカーによる典型的なティーザーのモチーフである。フレームワークの書き直しがリリース前に告知されている、Remix 3プロジェクトページの発表前段階を示す証拠として読み取れる。

その後は React(Remix)Router の Loader、Next.js 15 の App Router、RSC も学んだが、その頃には日々がすっかり忙しくなり、コードを書く時間もほとんどなく、結果として4度目の失敗をする機会もなかった。今思えば、私のサイトは Next.js 13 から Next.js 15 まで書き続け、移行を終えたばかりでまだ公開すらしていないうちに、Next.js 16 beta 1 がリリースされた。

手放そう

「吹っ切れた」と言うのは正確ではない。ただ、疲れたのだ。

macOSのターミナルウィンドウのスクリーンショット(左上に信号機ボタン、暗い背景、等幅フォント)。日ごとのLLMトークン使用量とコストを罫線で囲んだ表が表示されており、スクロールによりヘッダー行は画面外になっている。各行は2026-03-03から2026-03-13までの日付と、その日に使用されたモデル(haiku-4-5、opus-4-6、一部の日はsonnet-4-6)が対応し、その後に入力、出力、キャッシュ書き込み、キャッシュ読み込みの各トークン数と合計と読み取れる5つの数値列、そして最後にドル金額が続く。合計は2026-03-12の161,186,904トークン・97.92ドルから、2026-03-09の3,277,442,496トークン・1,765.56ドルまでの幅がある。キャッシュ読み込みが圧倒的に支配的な列で、出力トークンが数百万であるのに対し数十億に達することも多く、コストはその合計値とほぼ連動している。使用量レポート用CLIの出力と思われ、2026-03-06から2026-03-09の期間に1日あたり約1,700ドルでピークに達する、数日にわたる大規模なClaude Codeの稼働を示す証拠である。

AI 時代のテンポは速すぎる。モデルは次から次へと更新され、新しい技術は波のように湧いてくる。私はどんどん焦っていった。立ち止まったら追い抜かれる気がして。いちばん狂っていた頃は一日 16 時間コードを書き、Token だけで一日 $1.9k USD 燃やせた (たしか 2 月ごろ)。体はもうぼろぼろだった。でもそれを全部止めたのは悟りなんかじゃなく、ただ単に疲れただけだ。どんどんきつくなるテンポの中で、最後の一本の藁が乗ったとき、私はかえって吹っ切れた、割り切った、。それでも、これはこれで悪くない。

私は手放すことにした。かつて執着していたものを諦め、ほどほどで切り上げ、明日のことは明日考えるようになった。Vane が完成していない?ひとまず置いておく。Seam はまだ先が長い?また今度やればいい。ブログが完璧じゃない?先に公開する。完全に Vibe Coding へ移行し、問題がなければ触らず、問題が起きたらそのとき考える。

不思議なことに、手を離しても品質は落ちなかった。おそらく、あののプログラミングの日々が無駄ではなかったからだと思う。GPT-2 の時代からすでに AI は使っていたが、当時の自分はまだ一行ずつ真面目にコードを書き、一つひとつの概念を理解していた。あの経験が土台になっている。後の日々は Vibe Coding というより Context Coding で、必要な判断力は残ったままだった。手を離したせいで初歩的なミスをすることも、事故を起こすこともなかった。

これまでの試行錯誤のすべてが、今こうして手放せるだけの土台を与えてくれた。

原点

最終的な解決策は意外にもシンプルだった。すべてを Cloudflare 上に置く。R2 はオブジェクトストレージ、D1 はエッジデータベース、KV はキャッシュ、Worker はサーバーサイドレンダリングに使用する。すべてサーバーレスで、サーバーは不要だ。

Cloudflare Worker , workers.cloudflare.com, 新しいタブで開きます
Cloudflare のマーケティング用トップページのヒーロー部分のスクリーンショットで、ページ上部で切り取られており、彩度の高いオレンジ色の背景に薄いドット状のテクスチャがかかり、下部中央から暖かみのある淡い光が立ちのぼっている。ナビゲーションバーには Products、Solutions、Resources、Pricing がドロップダウン項目として並び、右端に「Login」のピル型ボタンと白い「Start building」ボタンが配置されている。見出しは「Everything we learned from powering 20% of the Internet—yours by default」とあり、続いてサブ見出し「Cloudflare is your AI Cloud with compute, AI inference, and storage — letting you ship applications instead of managing infrastructure.」と、2つ目の白い「Start building」の CTA が置かれている。これは Cloudflare が単なる CDN やセキュリティベンダーではなく「AI Cloud」として自らを位置づけている現在の姿勢を示す証拠であり、インターネットの20%を支えているというリーチの主張をその裏づけとして用いている。

この答えは皮肉かって? あまりにも皮肉だ。この「単純な」ゴールにたどり着くまで、延々と回り道をしてきたからだ。かつてはセルフホスティングを計画し、そのためにサーバーを管理し、Docker と格闘し、コンテナの面倒を見ることになった。そこで、管理パネルの Canopy、証明書管理の Lazycert、リバースプロキシの Vane、リソース監視を計装する Twig を作った。たった一台のろくでもないサーバーに奉仕するためだけに、山ほどプロジェクトを作ったのだ。

ストレージも同じだった。オブジェクトストレージは高いと思い、自分のサーバーのハードディスクを使おうとして、データをアトミックに重複排除し、単一ファイルへ統合する VFS「RFS」を作った。さらには1980〜90年代のレジストリという発想まで復活させ、最終的に FUSE 経由でマウントした。結果はどうだったか。より多くの時間を費やして出来の悪い車輪を再発明し、サーバーは一年間も遊ばせたまま。まったく割に合わない商売だった。

Vercel , vercel.com, 新しいタブで開きます
Vercel のマーケティング用ホームページをデスクトップブラウザで撮影したスクリーンショット。背景は黒で、薄いグリッドが重ねられている。暗色のナビゲーションバーには、左に Vercel の三角形のワードマーク、Products、Resources、Solutions、Enterprise、Pricing のメニュー項目、右に Ask AI、Log In、Sign Up のコントロールが並ぶ。ヒーローの見出しは「Build and deploy on the AI Cloud.」で、その下のサブ見出しは「Vercel provides the developer tools and cloud infrastructure to build, scale, and secure a faster, more personalized web.」。さらにその下にはボタンが2つ配置され、三角形のグリフを伴う白い「Start Deploying」がプライマリ、輪郭線のみの「Get a Demo」がセカンダリ。ボタンの下では大きな線画の三角形がグリッドから立ち上がり、背後からの光のにじみに照らされている。にじみは左の青から頂点の緑を経て右の赤へと変化しており、同サイトの現行の AI Cloud ポジショニングを最近キャプチャしたものであることを示している。

結局、ずいぶん遠回りした末にサーバーレスへ戻ってきた。Vercel のコンセプトはよいが、Next.js は好きではない。それに Vercel は魔法が多すぎるし、ミドルウェアを事前コンパイルしてエッジで動かす設計も、結局は分断を生み、CVE までいくつか発生した。それなら、いっそすべてをオリジンサーバーでまとめて動かすほうがましだ。一方、Cloudflare Workers はとてもよく、別の極端に到達している。10 MB 未満の成果物を WASM にコンパイルし、エッジ上で本物のビジネスロジックを動かせる。これこそ私が求めていたものだ。お金がかかること以外に欠点はない――とはいえ、それも欠点とはいえない。結局、節約できる時間はお金なのだから。

少ないほど豊か

この言葉は何度となく耳にしてきたが、その意味を本当に理解するまでに2年かかった。

エンジニアリングの本質に立ち返る。「Make it function, make it correct, then make it exceptional.」ようやく正しい道に戻り、まずは動くものにできた。今のブログは粗末か?粗末だ。未完成か?確かに未完成だ。でも、ないよりはいい。何一つ公開できていないのに、「必要かもしれない」ものを作り続け、目に見えない完璧さばかり追い求めていたら、結局何も形にできない。これは妥協ではなく、エンジニアリング上の取捨選択だ。少なくとも私はもう吹っ切れた。そう、吹っ切れたのだ。一つの細部にこだわるのをやめたら、かえって外へ出られた。スマホの写真には、もう長いこと屋外で撮ったものがなかったので、道端の風景を何気なく一枚撮った——ずっと外に出ていなかったからね(

淡いグレーの花崗岩の縁石の奥を斜めに横切って走る、刈り込まれた常緑低木の低い生垣を見下ろすように撮影された写真。左下の隅にはグレーの舗石とアスファルトの帯が写っている。低木は密に茂っているものの、縁石に近い部分では明らかに疎らで、むき出しの木質の茎と茶色い落ち葉が敷きつめられた地面が透けて見え、葉は春の新芽の黄緑色を帯びている。植え込みからは細い木の幹が上端に向かって伸び、遠景には赤錆色の花壇植物の帯が広がる。光は明るく指向性があり、フレーム外の物体の長く柔らかな影を舗道と縁石に落とすほど低く、午後遅い時間帯を思わせる。

これまで歩んだ遠回りを振り返って、後悔しているか? していない。自分で試してみなければ、いつまでも腑に落ちないこともある。ましてやAI時代の今、私がかつて歩んだ古い道をたどる機会は、もはやほとんどない。あまりにも多くのワークフローが変わってしまったからだ。それに、このプロジェクトは Taki で、コーディングはすべてAIによるものだ。だが、だからといって長期的に保守できないわけでも、人間味がないわけでもない。そもそもAIを使ったかどうかは重要ではない。それに、私が好きなのはコードを書くこと自体ではなく、何かを作り上げることなのだ……