顧客からの要望を集める「フィードバック管理ツール」を、個人開発でCloudflareのサービスだけを使って作りました。Feedury というプロダクトです。この記事では技術的な構成の話を中心に、なぜこの構成を選んだか、実装していて悩んだ点について書きます。
何を作ったか
要望を投稿してもらい、投票やコメントで反応を集め、ステータス(検討中・計画済み・実装中・完了)を管理しながら公開ボードとして運用できるツールです。このジャンルのツールを作ろうと思った理由は、既存の要望管理が「件数を集計して終わり」になりがちだと感じていたからです。件数の裏にある「なぜ欲しいか」を扱う仕組みをプロダクト側に組み込めないかと考えて作り始めました(この考え方は「要望の数を数えても、優先順位は決められない」に書きました)。
技術構成
サーバーサイドはHonoで、Cloudflare Workers上で単一のWorkerとして動いています。マイクロサービス化はせず、ルーティングも画面もすべて1つのWorkerに寄せました。個人開発で複数サービスを運用管理するコストを払いたくなかったのが理由です。
フロントは今回、SPAフレームワークを採用しませんでした。SSRで組んだMPA(Multi Page Application)に、部分更新が必要な箇所だけhtmxを載せています。投票ボタンを押した後に投票数だけ書き換える、といった程度の動的挙動はhtmxで十分にまかなえます。ビルドステップを持たないので、デプロイは次のコマンド一発で完結します。
wrangler deploy
個人開発では「ビルドが壊れて夜中に直す」ような事故を減らせるのがありがたいところです。
データベースはCloudflare D1(SQLite)一本化です。KVは使わず、セッション管理も含めてD1に寄せました。IDにはULIDを採用し、投票数のような集計値は都度JOINで数えるのではなく非正規化カウンタとして持つようにしています。マイグレーションはORMを使わず、素のSQLファイルを次のコマンドで適用する運用にしました。
wrangler d1 migrations apply featury-db --remote
テーブル数がそれほど多くないので、ORMの抽象化コストの方が高くつくと判断しています。
AI機能はCloudflare Workers AIだけで完結させています。外部のLLM APIは使っていません。要約には軽量なLlama系モデル、投稿の類似度判定には埋め込みモデルを使い、コサイン類似度をその場でブルートフォース計算する方式にしました。専用のベクトル検索基盤(Vectorize)は導入していません。今の投稿数の規模であればブルートフォースで十分に速く、専用インフラを増やすメリットがまだないと判断したためです。この判断はデータ量が増えたら見直すつもりです。
メール送信だけは唯一の外部SaaS依存としてResendを使っています。Cloudflareにもメール送信の仕組み(Email Service)が最近パブリックベータで登場していますが、任意の宛先への送信にはWorkers Paid(有料プラン)が前提になるため、現状は無料枠で完結するResendを使い、将来的な移行先として温存しています。
実装で悩んだところ
一番時間を使ったのは、AIによる要約と、投稿後に出す追い質問の設計です。最初は投稿する前に質問を挟む案もあったのですが、それだと「要望を書く」という最初の一歩が重くなってしまいます。今のバージョンでは、投稿はまず保存してから、直後の画面で「もう少し詳しく教えてください」という質問を選択式(3〜4択)+自由記述で出す形に落ち着きました。回答は任意で、スキップしても投稿自体は成立します。
もう一つ悩んだのが、要約に「プロダクトの背景」をどう反映させるかです。同じ「検索が遅い」という投稿でも、対象のプロダクトが何のためのツールかによって、深掘りすべき理由の方向性は変わります。管理画面でプロダクトの背景(対象ユーザー・解決している課題・主要機能)を登録してもらい、それをAIのプロンプトに注入する仕組みを作りました。
なぜ「件数」ではなく「理由」を扱いたかったか
要望を集めるツールの多くは、投票数や件数でランキングを作ります。それ自体は便利なのですが、「10票入った要望」と「3票だけど深刻な理由を抱えた要望」のどちらを先に着手すべきかは、件数だけでは判断できません。実務では結局、担当者が一件ずつ本文を読んで背景を推測する作業が発生します。
Feeduryでは、投稿時点でAIが「誰が・何に困っていて・なぜ欲しいか」を短い文章に要約し、似た投稿をまとめて共感の合算量を見られるようにしています。集計はするけれど、集計だけでは終わらせない、という設計を目指しました。
触ってみたい方へ
サインアップ不要で試せるデモボードを用意しています。架空のタスク管理SaaSへの要望という設定で、実際の投稿・ステータス・投票の様子を見られます。現在はすべての機能を無料で使えるようにしています(クレジットカード登録も不要です)。
さいごに
インフラをCloudflareに寄せたのは低コストで運用したかったからというのが大きいですが、結果としてWorkers・D1・Workers AI・Honoという組み合わせだけで、認証からAI機能まで一通り動くSaaSが作れることが分かったのも収穫でした。個人開発でSaaSを作りたい人の参考に少しでもなれば幸いです。