ERENOA
← Works に戻る 個人開発

VRCShift — VRChatイベントのシフト管理SaaS

作ったもの
VRChatイベントのシフト管理SaaS、VRCShift。
担当
一人で設計・実装。AIエージェントと協働。
難所
出欠の集計、欠員・交代への対応、当日の案内の属人化。
どう解いたか
出欠回答から割り当て・当日案内までを一つの流れに。
出欠の収集
VRCShiftの出欠の収集。ログイン不要のデモ画面
出欠の収集の拡大。実際のデモ画面から切り出し
割り当て・シフト枠
VRCShiftの割り当て・シフト枠。ログイン不要のデモ画面
割り当て・シフト枠の拡大。実際のデモ画面から切り出し
GoReactTypeScriptPostgreSQLDDDClean Architecture

紹介

VRChatのバー・カフェなどのイベント運営向けに、シフト管理・出欠収集・日程調整をまとめたVRCShift。GoのDDD・クリーンアーキテクチャの設計と、マルチテナントのデータ境界を紹介します。

VRChat向けシフト管理SaaS

VRChatイベント向けのシフト管理SaaSを設計・開発。出欠の収集から担当者の割り当てまでをまとめました。

VRChatイベントのシフト管理をゼロから設計・開発した本番稼働中のSaaS。マルチテナント・Discord通知・Stripe決済をDDD+クリーンアーキテクチャで実装。最初のコミットから18日で v1.0.0 をリリース。

Case study / 04

誰のどんな課題か

VRChatでバー・カフェなどを毎週開催する運営者に向けたWebサービスです。複数フロア・複数時間帯にキャストやスタッフを割り当てる作業を、スプレッドシートとDiscordのDMで繰り返す運営では、出欠の集計や当日の欠員・交代への対応、告知が属人化しやすいという課題がありました。

やったこと・設計の判断

テンプレートから当日の案内までをつなぐ

シフトのテンプレートを営業日に展開し、割り当て・出欠収集・当日案内までを一つの流れにしました。公開URLからログイン不要で出欠を回答でき、回答を割り当てに反映できます。深夜営業の日を跨ぐシフト枠にも対応し、既存のExcel・CSVからの取り込みと、Excelへの書き出しを用意しています。

業務ルールを外部サービスから独立させる

バックエンドはDDDとクリーンアーキテクチャで構成(ドメイン層がリポジトリなどのインターフェースを定義し、インフラ層がそれを実装する)。DB・Stripe・メール・Discordへの依存は、ドメインが定義するインターフェースを外側のアダプタが実装します。IDにはTenantIDなどの専用型を使い、取り違えをコンパイルエラーにしています。

テナント境界と課金状態をドメインで扱う

すべての集約がTenantIDを保持し、リポジトリのクエリもテナント単位に限定します。課金状態による読み書きの可否はドメイン自身が判定。課金ライフサイクルの遷移表を一か所で宣言し、状態変更は必ずCanTransitionToを通す設計です。

本番で起きた不具合は、修正と同時にCIの再発防止検査へ追加。設定の組み合わせを扱う統合テストと、ユーザーストーリー単位のE2Eを運用しています。公開ショーケースは設計を伝える抜粋に絞り、認証・課金・ライセンスキー生成などの実装は除外しています。

やったこと・設計の判断
  1. domain
  2. interface
  3. infra

枠の設定と出欠の集計

シフト枠と必要人数の設定画面
枠と必要人数を設定する。役割・時間帯ごとのシフト枠。
参加者の出欠集計画面
出欠を集計してシフト調整へ進む。
VRC Shift / Scheduler
イベントメンバーロール出欠確認
シフト管理2025年4月 · VRChat Event+ シフト追加
名前ロール時間ステータス
N Kentoリーダー21:00-23:00出勤
A Aoiスタッフ21:00-22:00出勤
D Discord通知

✓ 本日のシフト 3名に自動送信済み

技術

  • Go:DDD・クリーンアーキテクチャによるバックエンド(domain・app・interface・infra の層)
  • React・TypeScript:利用者向けと管理者向けの2アプリ
  • PostgreSQL:バージョン管理されたマイグレーション
  • Discord Bot:通知/Stripe:サブスクリプション課金
  • Docker・Docker Compose:実行環境
  • ユニットテスト・PlaywrightによるE2E:デモ全ルートのAPI発行ゼロも回帰テストで検査
技術
  1. Go
  2. React
  3. PostgreSQL

規模・数字

最初のコミットから v1.0.0 まで18日。

  • Go(バックエンド):417ファイル・110,678行。Go のコード:11万行
  • TypeScript(管理画面と利用者向けの2つのフロント):285ファイル・59,369行。SQL のマイグレーション:106ファイル。
  • 最初のコミット(2025年12月3日)から18日で v1.0.0 をリリース(2025年12月21日)。以後 v1.11.2 まで18回リリース、コミットは902。リリース(v1.0.0〜v1.11.2):18
  • ドメイン層のパッケージは16(共通部品を除く)。
  • 境界づけられたコンテキストは14領域。
  • 設計ショーケースに公開したGoファイルは60。
  • 料金は30日間無料、その後は月額500円。初期費用・追加料金なし、いつでも解約可能。
  • イベント数・メンバー数・シフト枠数は無制限。

担当

一人で設計・実装(コミットはすべて本人。AI エージェントと協働)。特にドメインモデル、クリーンアーキテクチャによる層構成、マルチテナントを前提としたデータ境界を設計しています。

公開リンク

設計ショーケース

VRC Shift Scheduler の公開リポジトリと設計ショーケースのREADME

DDD × クリーンアーキテクチャ(Go)

本番SaaS のバックエンド設計を、動くコードではなく「読み物」として公開したリポジトリ。ドメイン層の値オブジェクトとエンティティ、ポートの定義、境界づけられたコンテキストの地図、そして設計判断の理由を置いています。完全な実装は非公開で、見せているものと見せていないものを冒頭で明示しました。触れるデモは vrcshift.com/demo(ログイン不要)。