リーダーコリー (leader-collie)
Slack コミュニティ向けのイベント日程調整・管理ツール。apps/leader-collie/ に置かれた React Router v7 (framework モード) アプリケーションで、Cloudflare Workers 上で SSR する。
tied-inc/tied-event (Next.js + Turso + S3 on Vercel) からの移植版。移植にあたり、フレームワークと外部依存インフラを Cloudflare ファーストで置き換えている。
機能
- 📅 イベント作成(確定 / 日程調整の 2 タイプ)
- 🗳️ 候補日時への投票(◎△✕)と集計
- 👥 メンバー一覧・プロフィール(Slack 同期)
- 📝 イベントレポート(リッチエディタ、画像・動画添付、AI ドラフト生成)
- 📊 Slack 投稿の分析ダッシュボード(投稿量、リアクション、関係性ネットワーク)
- 🗓️ Google カレンダー連携(確定イベントを参加者のカレンダーへ追加)
- 🔐 Slack OAuth ログイン(better-auth)
旧スタックとの対応(設計の不変条件)
| 役割 | 旧 (tied-event) | 新 (leader-collie) |
|---|---|---|
| フレームワーク | Next.js 16 App Router (RSC / Server Actions) | React Router v7 framework モード (loader / action / resource routes) |
| 実行環境 | Vercel | Cloudflare Workers (@cloudflare/vite-plugin + wrangler) |
| メイン DB | Turso (LibSQL) | D1 binding DB + drizzle-orm/d1 |
| 分析 DB | Turso (別 DB) | D1 binding ANALYSIS_DB(libsql 互換の execute アダプタで分析リポジトリは無変更) |
| メディア保存 | S3 + Vercel OIDC | R2 binding REPORTS_BUCKET(presign は aws4fetch + S3 互換 API) |
| 認証ガード | middleware.ts | app/routes/protected.tsx(pathless layout の loader) |
| Server Actions | "use server" | lib/actions/*.server.ts + POST /api/actions/:domain + 同名クライアントラッパー |
| Google API | googleapis パッケージ | fetch ベースの REST 呼び出し(Workers で動かすため) |
| AI | OpenAI 直叩き | AI SDK + OpenAI。OPENAI_BASE_URL で AI Gateway 経由に切替可 |
| アナリティクス | Vercel Analytics | 撤去(必要なら Cloudflare Web Analytics をダッシュボードで有効化) |
維持している不変条件:
- 認証は better-auth (Slack OAuth)。アプリは Cloudflare Access の外の公開 Worker (一般メンバーがログインして使うため)
- API の URL (
/api/...) は旧 Next.js 時代と互換 - レイヤー構成は routes (loader/action) → services → repositories → D1
- D1 は対話型トランザクション非対応のため、
db.transactionは使わない - UI は v0.app 由来の shadcn/ui。大規模な UI 変更は慎重に行う
next/link/next/navigation互換レイヤー(components/link.tsx/hooks/use-router.ts)で コンポーネント層の差分を最小化している
ドキュメント
- アーキテクチャ — レイヤー構造とデータフロー
- Cloudflare リソース — D1 / R2 / binding / secrets
- 運用 / デプロイ — ローカル開発、マイグレーション、デプロイ手順
アプリ内にも詳細ドキュメントがある: apps/leader-collie/README.md、apps/leader-collie/CLAUDE.md、 apps/leader-collie/docs/(DB 設計・テスト方針・Slack OAuth 設定)。