MY PACEという自作SNSの開発でやらかした話です。
Claude Codeの罠
Claude Codeが補助してくれると、今まで時間的、能力的に諦めていたアプリやサービスを作れちゃうので、調子に乗って作ってたら、GitHubのリポジトリ数が200近くになりました。
Maxプランで5時間ごとのリミットまでに使い切れないともったいないので、常にコーディングしてるようになります。
Web版ができたおかげで、病院での待ち時間に「幽遊白書に出てくる、蔵馬とゲームマスターが戦ってた架空の落ち物パズルを遊びたい……」と思ってから、2時間後に順番を呼ばれるまでに完成して遊んでました。
それが落とし穴でした。
空き時間には、もっと基本的な勉強をすべきだったんです。
Cloudflare Pagesの便利さ
その落ち物パズルも、Cloudflare Pagesにデプロイしてました。
スマホのclaude.aiからClaude Codeを使ってるので、画面で動作確認できません。できたものはPRを通してデプロイして、別タブで見るしかない。必然的にHTML5ゲーム、アプリになります。
GitHub Pagesでもぜんぜんイイのですが、Cloudflare Pagesも、GitHubと連携すれば使い勝手は同じ。変更を自動的にpullして、スマホのChrome内のゲームが更新される。
それで満足してました。
そんなホビー用途ばっかりだったので、本番環境しかない異常さに気づけなかったのです。
ステージング環境……なにそれ……?
って知識のまま、次に作り始めたのが独自SNSでした。
Xみたいな巨大なコードをいきなり書かなくても、Nostrというプロトコルを使えば、スモールスタートできるのでは……? と考えたためです。
Nostrには公開リレーという善意で成り立ってる仕組みがあり、それを頼れば初期のTwitterのように、個人開発者が自由に勝手クライアントを作れる文化が残っていました。
ワクワクするでしょう?
「おれのかんがえたさいきょうのSNSクライアント」の画面を作ってみたくありませんか?
超楽しいです。
その裏で、時限爆弾のようにXデイは近づいていたのでした。
メタ構造への憧れ
リーナスが初めて、GitでGitをホストした時のコミットメッセージが好きです。
C言語のコンパイラはC言語で作られているとか、こういうメタ構造にゾクゾクします。
それを自分でも味わいたくて、独自にエディタを作って、盛り込む機能をそのエディタでメモって満足しました。
Agasteerというエディタです。まだ開発中ですが、だいたい動きます。
Xデイ
これら、自分だけで完結するゲーム、アプリなら問題なかったんです。
でもSNSは違いました。
自分の作ったNostrクライアント兼SNSである「MY PACE」。
タイムラインの表示確認のためには、既存のNostrネットワークに流れる投稿たちをフェッチするじゃないですか。表示に成功して喜ぶじゃないですか。
次に試すのは、投稿できるか? なことは、コーラを飲んだらゲップが出るくらい確実です。
無事投稿に成功して喜んでると、タイムラインに自分以外のアカウントが、MY PACEについて言及してる投稿が見えました。
あれー? 流行ってるように見えるように、そのうちbotも作りたいなーって思ってたけど、もう作ったんだっけ……?
ってプロフィールをクリックすると、めっちゃリアルのヒューマンだ!
はわわ……ってなりました。
Xでなく、Mastodon、Blueskyでもなく、あえてNostrを選ぶような人たちって、初期のWebみたいに使う人イコール作る人な濃密空間だから、1つの投稿からURLを当てれちゃうのですね。
その後
それから慌ててCloudflare Pagesのステージング環境の仕組みを調べて、それ以降のWebサービスでは注意するようになりました。
では、MY PACEはどうなったかというと、あえてステージング環境を作らず、1日10回くらいプッシュのたびに見た目が変わったり、機能が増えたりする牧歌的なSNSになってます。
さすがに、動かなくなるような不具合は、ローカル環境でデバッグした上でやってますけど……。
おわりに
最初はクソアプリのアドベントカレンダーを選ぼうと思いましたが、いちおうクソでなくなる予定だし、本番環境でやらかした例にしました。
初期のTwitterとか、ロブロックスが好きな人は遊んでみてください。
Nostrの仕組み上、メアドもいらないし、いきなり投稿できる状態から始まります。
1回投稿して去っても、ネットワークの海に1つの投稿が眠るだけで、誰かも分からないままの気軽なものです。