Questal という Web サービスを個人で開発し、リリースしました(現在β版)。
この記事では、前半で Questal のコンセプトや誰のどんな課題の解決を目指して作ったかについてお話しし、後半で技術的な面についてお話しします。
多くの人に届いたらいいなと思い、久しぶりに Qiita で記事を書きます。
作ったもの
Questal は、オンラインの 目標達成コミュニティサービス です。
例えば以下の画像は「1ヶ月間、毎週ブログ記事を書く」という目標を掲げており、期間やルールが書かれています。
現在は同僚と2名で取り組んでいますが、以下のように活動期間が自動的にタームとして区切られ、期間ごとに活動報告をしていきます。
以下は実際にブログ記事を書いた報告をしている様子です。
コンセプト
Questal のコンセプトは「仲間と一緒なら、やり遂げられる」です。
同じ目標・同じ熱量を持った仲間が集まることで生まれる推進力を活かしながら目標達成を目指し、その活動が継続し、ゴールに到達することを支援します。
Questal では「クエスト」という形で目標を掲げ、仲間を集めて活動を行います。自分で新しく目標を掲げて人を集めるのもよいですし、すでに活動中のクエストに途中参加することもできます。
開発の経緯
Questal を開発した理由は大きく2つあります。
1つ目は、自分自身の挫折体験からです。
私自身これまで、個人でアプリを作ろうとしたり、新しいことを勉強しようとしてきましたが、かなりの確率で当初思い描いたようにはいかずに中途半端な形で終わってしまうという体験をしてきました。
仕事が忙しくなったり、プライベートの出来事で時間が取れなかったり、体調を崩してしまったりなど、些細な出来事が活動のリズムを崩し、モチベーションを維持できなくなるというパターンがとても多かったように思います。
ここでは詳細は省きますが、この問題を解決するには 同じ熱量を持った仲間とともに取り組む ことが効果的だと、これもまた自身の体験から思い至りました。
もう1つは、もったいないという気持ちからです。
人が何か新しいことに挑戦しようとしたり、新しいことを学ぼうとするとき、そこにはエネルギーや知的な好奇心で溢れているように思います。
せっかく芽生えたエネルギーや知的な好奇心が、時間とともに途絶えていってしまうのをすごくもったいないと感じました。一方でこれらがまた儚く瞬間的なものであることも感じていたので、なんとか途絶えさせない仕組みを作れないかと考え、開発に至りました。
主な機能
Questal が、どのようにコンセプトを実現しようとしているか、機能にフォーカスを当てて紹介します。
1. クエストの作成
Questal では、まず「クエスト」を作成します。クエストには主に以下の設定をします。
- ゴール:何を達成したいか(例: 1ヶ月間、毎週ブログ記事を書く)
- 期間:どのくらいの期間、活動するか(例: 30日間)
- ルール:どのくらいの頻度で、活動報告をするか(例: 週1回)
このステップで、どのくらいの期間、どのくらいのペースで取り組むかを決めていきます。
2. 仲間を集める
クエストを作成したら、次に仲間を集めます。2通りの集め方を用意しています。
- 招待機能:友人や知り合いなどを想定し、クエストに招待をする
- 募集機能:Questal ユーザに広く公開し、参加リクエストを受け付ける
※ まずは一人ではじめてしまい、あとから集めることも可能です。
3. マイルストーンの自動設定
クエストを開始すると、クエストの活動期間は自動的に タームという単位で区切られます。
例えば「週1回ブログ投稿」のクエストなら、1週間が1タームとなり、そのタームごとに活動報告をしていくことになります。これをマイルストーンとして追いかけていくことで、最終的にゴールにたどり着きます。
4. ジャーナル投稿
各タームで、参加者に求められることは「ジャーナル」という形での活動報告の投稿です。
ジャーナルに書くことは自由です。ジャーナルにリアクションやコメントを送り、インタラクティブなやり取りもできるようになっています。
5. 自動退出機能
Questal には活動が停滞したメンバーを自動で退出させる機能があります。
コミュニティで活動することは、メンバーの悪い方向での影響を受けてしまう可能性もあります。Questal ではオンライン上のメンバーとの活動も想定しているため、自動退出機能により常に一定の熱量を持ったコミュニティを維持する仕組みとして用意しました。
技術スタック
技術スタックはかなりシンプルで Ruby on Rails を中心に、Rails エコシステムの技術中心で開発しました。
フロントエンド
- Hotwire (Turbo + Stimulus)
- Tailwind CSS / Tailwind Plus
バックエンド
- Ruby on Rails (8.0)
- SQLite!!(データベース)
インフラ
- VPS!!(KAGOYA CLOUD VPS)
- Cloudflare R2(オブジェクトストレージ)
その他
- Kamal2(デプロイ)
- Resend(メール送信)
- Google(ユーザ認証)
1台のVPSと数個の外部サービスのみで稼働しています。
外部サービスとの連携部分も Rails 標準搭載の機能を使うことで複雑さをほとんど意識することなく実装できています。
外部サービスも現状は無料枠内であるため、月額のコストはトータルで約715円です。金銭面のコストも安いのは大変うれしいですね。
Rails という選択肢
個人的に Rails に慣れているということもありますが、実際に作りきってみて Rails は個人で高速にプロダクトを作るという点で依然として超有力な選択肢になる と感じました。
DHHの「The One Person Framework」という記事は、その選択をするにあたりとても勇気づけられました。
一人の個人が競争力のある現代的なアプリケーションを素早く開発するためのツールキットとして進化したRails。まさに個人開発者向けといえるのではないでしょうか。
また、データベースとして SQLite3 を使うという選択肢も、開発初期の私は考えてもいないことでしたが、以下の記事を読み SQLite への認識を改めると同時にその可能性を感じ、選択しました。
おかげで、本番でのサーバ構成を考える際の手間も減りました。
まだ今後どうなるかもわからないプロダクトです。最初からコストもかかる複雑な構成にするのではなくシンプルな構成にできたのは、お金も気にせず、機能開発にも時間を当てられるなど様々な恩恵があったように思います。
その他にも、本アプリで必要になった機能の多くは Rails 標準搭載の機能で実現できています。
- 非同期ジョブ:ActiveJob + SolidQueue
- メール配信:ActionMailer + Resend
- オブジェクトストレージ:ActiveStorage + Cloudflare R2
- キャッシュ:SolidCache
- リッチテキスト:ActionText
- デプロイ:Kamal
Rails の機能をふんだんに使いましたが標準搭載であることで躓くことも少なく、スムーズに開発ができたのではと思います。
フロントエンドは Hotwire + Tailwind
フロントエンドといえば、昨今は React や Vue などが当たり前のように選ばれる時代に思いますが、前述の通り Rails エコシステムの技術選択を優先し、フロントエンドはHotwire (Turbo + Stimulus) で実装しました。
結果、私の開発においては十分というか、UI 面で実現したいことができなかったことは全くありませんでした。私はバックエンドが主戦場の人間ですが、一定 Hotwire のインプットは必要だったものの、その後実現したいインタラクション的な面やUIはすんなり実装できたのではと思います。
ただ、よくあるドロップダウンメニューとかトーストメッセージとか、このあたりをゼロから作るのは少々工数がかかります。そこは Stimulus Components と Tailwind Plus Elements(有料) を使うことでほとんどが整いました。
Tailwind Plus は少々お高いですが、Elements 以外にも UI Block がめちゃくちゃ参考になり、デザイン面を考えるのがそこまで得意ではない私にとって大いに助けになり、十分元を取れたように感じています。
また個人的には Turbo による パフォーマンス体験の良さ には感動しました。昔は無効化されがちな Turbo でしたが、今は大きくハマることもなくSPAに劣らないパフォーマンス体験が実現できたように思います。
まとめ
以上、「仲間と一緒なら、やり遂げられる」をコンセプトに個人開発した Questal の紹介でした。
現在β版のため、全機能を無料公開中です。 興味を持っていただけた方は、ぜひ使ってみてほしいです。
個人開発を頑張っていたり、技術学習を頑張っている人は私の想定ペルソナの一人でもあるので(なぜなら自分がそうだったため)、おそらくマッチすると思います!
最後まで読んでいただき、ありがとうございました。






