Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證ダンススタジオ向けスクール運営管理 SaaS
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
ダンススタジオ向けのスクール運営管理 SaaS。運営: 合同会社セキレイ。 設計書: docs/studio-flow-design.md 実装ルール: CLAUDE.md http://localhost:3000 を開く。 .env.example を参照。SUPABASE_SERVICE_ROLE_KEY は RLS をバイパスするため、 サーバー側でのみ使用し、NEXT_PUBLIC_ を付けないこと。 Resend の API キーは Next.js 側ではなく、Supabase Edge Function のシークレットに設定する。 マイグレーションは supabase/migrations/ に置く。適用状況は supabase/migrations/APPLIED.md で管理する。 MarcheBase と同じく、Supabase ダッシュボードの SQL Editor に貼り付けて 上から順に実行する。適用したら APPLIED.md を必ず更新すること。 適用済みのファイルは編集しない。修正が必要なら新しいファイルを追加する。 画面に出すサービス名は src/config/app.ts の1か所だけで定義する。 各画面に直接書かないこと。名称が決まったら、このファイルを書き換えれば全画面に反映される。檢視完整 README ↗
ダンススタジオ向けのスクール運営管理 SaaS。運営: 合同会社セキレイ。
設計書: docs/studio-flow-design.md 実装ルール: CLAUDE.md
| 領域 | 採用 |
|---|---|
| フレームワーク | Next.js 16 (App Router) + React 19 |
| 言語 | TypeScript |
| CSS | Tailwind CSS v4 |
| UI 補助 | lucide-react(アイコン)、recharts(グラフ) |
| DB / 認証 / Storage | Supabase(PostgreSQL + RLS) |
| サーバー処理 | Supabase Edge Functions (Deno) |
| 定期実行 | pg_cron + pg_net |
| メール | Resend(Edge Function 経由) |
| ホスティング | Vercel(main への push で自動デプロイ) |
npm install
cp .env.example .env.local # 値を埋める
npm run dev
.env.example を参照。SUPABASE_SERVICE_ROLE_KEY は RLS をバイパスするため、
サーバー側でのみ使用し、NEXT_PUBLIC_ を付けないこと。
Resend の API キーは Next.js 側ではなく、Supabase Edge Function のシークレットに設定する。
| コマンド | 内容 |
|---|---|
npm run dev | 開発サーバー起動 |
npm run build | 本番ビルド |
npm run start | ビルド済みアプリの起動 |
npm run lint | ESLint |
npm run typecheck | 型チェック(tsc --noEmit) |
docs/ 設計書
supabase/migrations/ DB マイグレーション(SQL)
supabase/functions/ Edge Functions(Deno。Next.js の型検査対象外)
public/ 静的ファイル(ロゴは Supabase Storage 側に置く)
src/app/ App Router
src/lib/supabase/ Supabase クライアント(client / server / admin)
src/lib/auth/ セッションとロールの判定
src/proxy.ts セッション更新(Next.js 16 で middleware から改称)
マイグレーションは supabase/migrations/ に置く。適用状況は
supabase/migrations/APPLIED.md で管理する。
MarcheBase と同じく、Supabase ダッシュボードの SQL Editor に貼り付けて 上から順に実行する。適用したら APPLIED.md を必ず更新すること。
適用済みのファイルは編集しない。修正が必要なら新しいファイルを追加する。
画面に出すサービス名は src/config/app.ts の1か所だけで定義する。 各画面に直接書かないこと。名称が決まったら、このファイルを書き換えれば全画面に反映される。
export const APP_NAME = "Studio Flow"; // 仮称
メールの差出人名だけは別。Edge Function は Deno という別の実行環境で動き、 このファイルを読めないため、Supabase のシークレットで設定する。
npx supabase secrets set --project-ref fterpqyvzeqcaltfkpuc MAIL_FROM="新しいサービス名 <noreply@ドメイン>"
スタジオ名が設定されているテナントでは、差出人名はそちらが優先される(設計書 11章)。
なお「サービス名」と「スタジオ名」は別物。前者はこの SaaS の名前で全テナント共通、
後者は契約したスタジオごとの値で brand_settings に入っている。
メール確認コード方式(パスワード不要・設計書 2章)。MarcheBase から移植した。
1. ログイン画面でメールアドレスを入力
2. Edge Function send-verification-code が6桁を発行し、Resend で送信
(コードは平文で保存せず、sha256 のハッシュだけを DB に置く)
3. 届いたコードを入力
4. Edge Function verify-code が照合し、magic link のトークンを返す
5. ブラウザが verifyOtp してセッションを Cookie に確立する
セッションは Cookie に置く(MarcheBase は localStorage)。設計書 3章の
「ロールはサーバーセッションから決定する」を満たすには、サーバー側から
セッションを読める必要があるため。@supabase/ssr を使う。
npx supabase functions deploy send-verification-code
npx supabase functions deploy verify-code
npx supabase functions deploy send-invoice-notice
npx supabase functions deploy send-trial-notice
npx supabase functions deploy send-event-invite
supabase link を通していない場合は、--project-ref <ref> を付けて
SUPABASE_ACCESS_TOKEN を環境変数で渡す。
Next.js の .env.local ではなく、Supabase 側に設定する。
ダッシュボードの Edge Functions → Secrets、または以下のコマンド。
npx supabase secrets set RESEND_API_KEY=... MAIL_FROM="Studio Flow <[email protected]>" ALLOWED_ORIGIN=http://localhost:3000 PUBLIC_SITE_URL=http://localhost:3000
| 名前 | 用途 |
|---|---|
RESEND_API_KEY | Resend の API キー |
MAIL_FROM | 送信元アドレス。表示名はスタジオ名で上書きされる(設計書 11章) |
ALLOWED_ORIGIN | CORS の許可元。カンマ区切りで複数可。* は開発時のみ |
PUBLIC_SITE_URL | メール本文のリンクに使う URL |
SUPABASE_URL と SUPABASE_SERVICE_ROLE_KEY は Supabase が自動で渡すため、
設定は不要。
設計書 3 章のとおり、マルチテナントの前提を崩さないこと。
organizations 以外の全業務テーブルに organization_id を必須列で持たせるorganization_id で絞り込む(RLS は保険であって一次防御ではない)/superadmin/* に分離するtimestamptz で UTC 保存、表示は Asia/Tokyo 固定設計書 9 章のフェーズ1のみ。9.1「やらないこと」には着手しない。