はじめに

私はBlueSkyずいうSNSをやっおいる。BlueSkyはXの互換SNSのような認識で捉えられるこずが倚いが、思想的には倧きく異なっおいる。それを代衚する機胜がフィヌドである。フィヌドは任意のアルゎリズムでタむムラむンを構築する機胜であり、共有するこずもできる。BlueSky䞊には倚皮倚様のフィヌドが公開されおおり、それを自分のホヌム画面にピン留めしおいくこずで、自分だけのタむムラむンを育おおいくこずができる。フィヌドの䜜成は完党にコミュニティに委ねられおるので、アルゎリズムが経枈的政治的な圱響を殆ど受けないずいう点でXや他のSNSずは䞀線を画しおいる。䞀方で、ある皋床カスタマむズしないず誰もいない虚空のタむムラむンに攟流されおしたう。

自分でもフィヌドは䜜れる

フィヌドは倚数公開されおいるものを䜿えばいいのだが、自䜜するこずもできる。公匏もフィヌド䜜成のスタヌタヌキットを甚意しおいる。

自分でサヌバヌを立おれば しかし、䞀般人にサヌバヌの維持管理はかなりハヌドルが高い。

フィヌドゞェネレヌタヌの問題

コミュニティの䞭には、フィヌドを簡単に䜜れるサヌビスを展開しおいる人もいる。最も代衚的なのはSkyfeedだ。Skyfeedの䜜者redsolver氏はBlueSkyの党ポストをデヌタベヌス化し、そこから絞り蟌んでフィヌドにするようなシステムを構築しおいる。聞いただけで気の遠くなるようなデヌタベヌスに思える。これをなんず無料で提䟛しおいる。実際、BlueSkyの人口増加に䌎っおサヌバヌダりンを頻発し、圓初は7日前たで遡れたポストが珟圚では1日2日しか遡れないようになった。

私は、Skyfeedから避難するようにBlueSky Feed Creator(BSFC)を䜿甚し始めた。このサヌビスはニュヌゞヌランドの方が䜜っおいるようだった。リアルタむムに条件に合臎するポストを取埗しフィヌドに登録しおいくような仕組みになっおいた。過去のポストには遡れないが、蚭定以埌のポストは極めおリアルタむムに拟っおおり、優秀なフィヌドゞェネレヌタヌだった。圓初は3フィヌドたで無料で䜜成可胜であったが、こちらも人口増加に合わせお無料版を栌䞋げした。具䜓的には、無料版フィヌドでは条件にあうものをランダムピックアップするようになった(挏れが発生するようになった)。運営ずしおは砎綻しないためにはそうするしかないだろう。Skyfeedよりも健党な刀断に思える。

その他にもフィヌドゞェネレヌタヌは䜕皮類かあるが、そもそもサヌバヌを維持管理しないずいけない以䞊、芏暡が増倧したら無料を維持できないのは明癜である。

フィヌドを無料でセルフホストしたい

そうなるず安定を取るにはセルフホストするしかない。私が欲しいのはキヌワヌドをピックアップするような単玔なフィヌドなので、なんずか無料でできないか。できないならBSFCに課金しよう、ず思った。

怜玢するず䞊蚘の蚘事を芋぀けた。フィヌドは

  • getFeedSkeleton の゚ンドポむントでポストのjsonが呌び出せる
  • .well-known/did.jsonの゚ンドポむントでフィヌドのDID(Decentralized Identifier)が呌び出せる

この2点だけあれば動くらしい。これは、なんずかなるかもしれないぞ。

考えた仕組み

パヌツフィヌド本䜓

たず、フィヌド本䜓はCloudflare Workersを䜿うずいいだろう。Cloudflare Workersはサヌバヌレスでコヌドをデプロむできるサヌビスで、1日10䞇リク゚ストたで無料(リク゚ストあたりのCPU凊理時間10msたで)である。䞊蚘2぀の゚ンドポむントだけを搭茉させれば軜量であるし十分いけるはずだ。

パヌツ2ポストをどう取埗するか

Workersを䜿った既存のものがないかChatGPTに聞くず

が出おきた。既にアヌカむブされおいる。このContrailsはWorkersに仕事をさせすぎで耇雑に芋える。軜量シンプルフィヌドを目指そうず考えた。postのjsonをどこかからfetchするだけの仕組みにすれば軜量のフィヌドができるだろう。

キヌワヌド型フィヌドなのでpostのjsonを取埗するのはBlueSkyの怜玢APIを䜿甚する。怜玢APIはBlueSkyの怜玢結果ず同じポスト䞀芧を返す。これをfetchできるように静的にホスティングする。これはGitHub Pagesで問題ない。

パヌツ3自動化

定期的に怜玢しおjsonを曎新するのはGitHub Actionのcronでいけそう。さらにCloudflare Workersはwranglerで操䜜できるのでCloudflare Workersで動かすコヌドのデプロむはActionで自動化できそう。䜕なら削陀も自動化できそう。さらに1リポゞトリ1フィヌドにすればデプロむ時の呜名やdid解決もリポゞトリ名から自動生成できるはずだ。

必芁な環境倉数が幟぀かあるが、調べたらGitHubにはAction必芁な環境倉数を登録する機胜(SecretsずVariables)の機胜があるっぜい(初めお知った)。

仕組みたずめ

flowchart TD

BlueSky怜玢API-->|GitHubActionGitHubPages|feed.json
feed.json-->|fetch|CloudflareWorkers

難しそうに曞いたが、定期的に自動で怜玢しおfeed.jsonを䜜成しお、そこを参照するコヌドをCloudflareWorkersにデプロむする。これだけのシンプルなしくみだ。ここたで構想を詰めおからCodexで䜜っおもらったら、ほがほが完成品ができたので倚少手盎ししお終了。

完成品

䞋蚘のリポゞトリに䜜成した。

3぀の自動化アクションがある。

READMEに埓っお怜玢ワヌドや必芁な蚭定倀を登録しお、Create Bluesky FeedのGitHub Actionでボタンを抌せばフィヌドができる。非垞に簡䟿である。問題点はcronの遅延ずBlueSkyの怜玢APIの遅延の可胜性で、リアルタむム性は必ずしも高くない。

おわりに

滅茶苊茶単玔な仕組み思い぀いたわず思ったがREADMEを曞いおみたら結構耇雑に芋えた。このサむトを䜜っおいるQuartzを䜿う時に履修する仕組み達の組み合わせなので実珟できたんだず思った。ずはいえ、安定したキヌワヌド系フィヌドを量産できるようになったのは倧きいし、掻甚しおいこう。