個人開発 クリエイターブログをアグリゲーションするサイトを公開したよ
なにを作ったか
個人開発で主にクリエイターブログをアグリゲーションするサイトを公開しました
解決したい課題
このサービスは以下の課題を解決することを目指しています
- 複数のプラットフォーム(Zennやnoteなど)を横断して、自分の興味のある分野の情報をフォローしたい
- そこから、発信元の個人や企業に興味を持ってもらえるようにしたい
特に企業が運営するクリエイターブログは、記事を公開しても有名企業でフォロワーが多い企業かSNSやはてなブックマークでバズらない限りなかなか読まれないのではないかなと思います
そのため、カテゴライズするという切り口で知らない企業のクリエイターブログと出会える場を作れたら良いなと思いっています
主な機能と実装
クリエイターブログやconnpass、speakerdeckのRSSをチェックし、タイトルやdescriptionをもとに生成AIを利用してカテゴライズと要約をしています
カテゴリごとにRSSをフォローすることが可能です
運用コスト
個人開発のため缶コーヒー1本程度で運営していくためにサーバーや生成AIの費用や今後のメンテナンスを極力減らすところに注力しています
2024年12月時点ではGeminiで50円/月程度かかっています
gemini-2.0-flash-exp
は試験運用のため2025年1月は請求がないかもしれません🙏
利用技術
RSSや企業情報の管理
microCMS にクリエイターブログのRSSや企業の情報を登録しています
当初はGitHubで企業ごとにJSONで管理し、JSON Schemaも用意してオープンに管理できるようにしたのですが、各企業のサイトやRSSを調べるだけでも大変なので一旦CMSで管理してある程度集まってからオープンにしたほうが良いかなと思いとりやめました
RSSのクロールとカテゴライズ
コンパイルもはやく、GeminiのSDKもあるためGoで開発しています
RSSのクロールはgofeedを利用し、CloudRun Jobsで1日に1回しています
RSS内のタイトルやdescriptionをGeminiでカテゴライズ、要約してもらっています
モデルは gemini-1.5-flash
-> gemini-1.5-flash-8b
-> gemini-2.0-flash-exp
とコスパを求めて変わっていっています
また、JSONモードにも対応したのでカテゴライズ結果が安定して取得できるようになりました
ORMは当初GROMを利用していましたが、SQL書いたほうが書きやすいのでsqlc に乗り換えました
CloudRun Jobsは無料枠に収まっております
WEBサイト
TypeScript、Astro
tailwindcss、日時周りはTEMPO、DB周りはPrismaのTypedSQLにしました
当初ORMは利用せず生のSQLを書いていたのですが、型情報が欲しくなったのでPrisma TypedSQLを利用するようになりました
CloudRun Jobsでカテゴライズ後にCloudFlare PagesのWebHookをコールし、日次で静的にサイトをビルドしてホスティングしています
CloudFlare Pagesの無料枠は20,000ページまでホスティング、500ビルド/月のため現時点では問題ないですが、ページ数が増えてきたらR2でのホスティングも検討していかなければならなそうです
Astroでは差分更新が簡単にはできなそうなので、現状は全ページ更新しています
concurrencyを設定し複数のページを同時に生成しています
現在は4並列で数カ月分のカテゴリ毎のページとカテゴリ毎のRSS、企業毎のページを2分程度で生成できています
データベース
Cloud Firestoreや集めた情報をJSONでGCSに置いてBigQueryで参照するなども試してみたものの普段の開発でRDBMSに慣れてしまっておりPostgreSQLに近いのインターフェイスのCockroachDBを利用しはじめました
Basic Planでは10GBのストレージを無料枠で利用できます
開発上の問題はなく、WEBのコンソールも使いやすかったのですが、チューニングの問題かスループット頭打ちになり、WEBサイトの生成に時間がかかるため別のデータベースに乗り換えることにしました
現在はTURSOに乗り換え、Freeプランで9GBの無料枠もあり、スループットもまずまずで個人開発には十分でした
まとめ
個人開発は新たな技術の実験の場としてとても楽しいです
登録しているクリエイターブログが60件程度なのでさらに増やしていき、企業の採用情報やポッドキャストなどの情報も充実させていきたいです
Discussion