Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
今のツールを活かす業務支援「Tiramisu Works」と、店舗の情報をまとめる経営管理「Tiramisu OS」。目的に合わせて選べる、2つのTiramisuをご案内します。
Translation pending
BusinessGitHub @IFs1991OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗整骨院・治療院向けのマルチテナント業務管理 SaaS です。Next.js 15 (App Router) と Supabase をベースに、予約、患者、日報、収益、スタッフ、管理設定、セキュリティ監視を 1 つのアプリで扱います。
テナント境界は clinic_id。患者情報を扱う医療系システムのため、認可・RLS・テナント分離を最優先しています。現行バージョンは 0.1.0-pilot です。変更完了、パイロット出荷、一般商用出荷、顧客価値検証は、それぞれ独立した現行ゲートで判断します。
App Router のルートグループでアクセス境界を分離しています。
(public) — 未認証導線
/ ランディング/login スタッフログイン / /admin/login 管理者ログイン / /admin/callback/register, /register/verify, /invite, /forgot-password, /reset-password/[source]/booking/[clinic_id] 公開予約/terms, /privacy, /unauthorized(app) — 認証必須の業務画面(AppShell レイアウト)
/dashboard/reservations, /reservations/new, /reservations/list, /reservations/register, /reservations/[id]/reservations/settings/menus, /reservations/settings/resources/patients, /patients/list, /patients/[id]/daily-reports, /daily-reports/input, /daily-reports/edit/[id]/revenue, /staff, /staff/shift-requests, /staff/shift-requests/admin/multi-store, /onboarding, /chat, /ai-insights, /blocks, /master-data(app)/manager — manager(多店舗統括)向け画面
/manager/clinic-comparison, /manager/shift-requests, /manager/staff, /manager/staff-analysis(app)/admin/(protected) — 管理者機能
/admin/users, /admin/tenants, /admin/settings, /admin/managers, /admin/master/admin/security-dashboard, /admin/security-monitor, /admin/session-management/admin/mfa-setup, /admin/chat, /admin/beta-monitoring, /admin/shift-requestsAPI は src/app/api/**/route.ts。網羅一覧ではなく主要なドメイン単位で記載します(正本はソースを参照)。
reservations, customers, patients, daily-reports(および daily-reports/items の pricing / tags / care-episode), revenue, revenue-estimates, dashboard(dashboard/bootstrap), menus, menu-templates(billing-profiles 含む), resources, blocks, clinics, care-episodes, customers/[id]/insurance-coveragesstaff, staff/shifts, staff/preferences, staff/demand-forecast, staff/shift-requests(convert 含む), staff/shift-request-periodsmanager/dashboard, manager/assigned-clinics, manager/clinic-comparison, manager/revenue/analysis, manager/patients/analysis, manager/daily-reports/overview, manager/staff, manager/staff-analysispublic/menus, public/reservations, public/resourcesonboarding/*(clinic / profile / invites / status / seed), auth/profile, mfa/*(setup / verify / status / disable / backup-codes)admin/settings, admin/users(accounts / candidates / [permission_id]), admin/tenants/[clinic_id], admin/managers/[managerUserId]/clinics, admin/master-data(export / import / rollback), admin/security/*, admin/rate-limit/*, admin/staff/invites, admin/dashboard, admin/chat, admin/ai-insights, admin/notifications, admin/monitoring/sentry-test, admin/tablesai-insights, ai-comments, chat, clinic/analysis, customers/analysisbeta/feedback, beta/backlog, beta/metricsinternal/process-email-outbox(outbox → Resend), webhooks/resend, security/csp-report, notifications, , email_outbox 経由の outbox パターン)主要依存とスクリプトは package.json を正本としてください。
@/lib/supabase から import(@/lib/supabase/server の直 import は ESLint エラー)。
createClient() / getServerClient(): リクエスト毎の SSR クライアント(RLS 適用、通常はこれ)createAdminClient(): service role で RLS バイパス(サーバー専用・最小限)createScopedAdminContext(): clinic scope 検証付き admin クライアント(管理系・多店舗操作)src/lib/schemas/)→ processApiRequest()(src/lib/api-helpers.ts、管理 API は verifyAdminAuth())→ clinic scope 強制(ensureClinicAccess() / processClinicScopedBody())→ 統一エンベロープ { success, data | error } → handleRouteError() + AppError。user_permissions の role + clinic_id(単店舗)/ clinic_scope_ids(複数店舗)。manager スコープは resolveEffectiveClinicScope()、role 正規化は normalizeRole()(clinic_manager → clinic_admin)。RLS が最後の砦。supabase/migrations/ のみ。旧 src/database/ 等の参照SQLは docs/archive/sql-reference-assets/ に隔離済みで直接適用禁止。予約は reservations が SSOT(appointments はレガシー読み取り専用)。src/types/supabase.ts は npm run supabase:types の生成物(手書き編集禁止)。src/lib/jst.ts の JST ユーティリティを使う(UTC/JST 混在で E2E が落ちた実績あり)。src/lib/env.ts で起動時に検証します(NODE_ENV=test は除外)。
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYNEXT_PUBLIC_APP_URLPROTECTED_ROUTE_PREFIXES)とログイン分岐は middleware.ts で管理しています。
/admin/** は管理者ログイン(/admin/login)へ/login、redirectTo 付き)へCSP_ROLLOUT_PHASE: report-only | partial-enforce | full-enforce、失敗時 fail-open)③保護ルート判定 ④Pilot mode リダイレクト。NEXT_PUBLIC_PILOT_MODE=true)時は /chat, /ai-insights, /admin/security-*, /admin/beta-monitoring, /admin/session-management, /admin/master, /admin/chat, /blocks, /master-data を /dashboard へリダイレクトします。supabase/config.toml で管理し、auth.hook.custom_access_token により clinic scope を JWT claim に反映します。24.x>=10.0.0npm install
npm 固定です。他パッケージマネージャのロックファイル導入は禁止しています。
最小構成は .env.local.example をベースに .env.local を作成します。
cp .env.local.example .env.local
最低限、以下は設定が必要です。
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
NEXT_PUBLIC_APP_URL=http://localhost:3000
用途別のテンプレート:
.env.local.example.env.test.example.env.production.example主要フラグ: NEXT_PUBLIC_PILOT_MODE / NEXT_PUBLIC_ENABLE_CHAT / NEXT_PUBLIC_ENABLE_AI_INSIGHTS / CSP_ROLLOUT_PHASE。
環境変数の取り扱い方針は docs/operations/ENV_MANAGEMENT_POLICY.md を参照してください。
npm run dev
http://localhost:3000dev は npx next dev --hostname 0.0.0.0 を実行します(predev で SWC バイナリを検証)。supabase start
supabase status
npm run verify:supabase
ローカル構成の主要ポートは supabase/config.toml に定義されています(デフォルトと異なる点に注意)。
54331543325433354334歴史的な安定化 DoD では以下を基準としていました。
supabase startsupabase statussupabase db push --local --dry-run(スキーマ drift = diff ゼロが基準)npm run verify:supabase詳細は歴史的証跡 docs/stabilization/DoD-v0.1.md を参照してください。現在の出荷判断には リリースガバナンス索引 を使用します。
開発用:
docker compose -f docker-compose.dev.yml up -d
docker compose ps
本番相当:
docker compose up -d
docker compose ps
ヘルスチェックは GET /api/health で確認できます。実装は src/app/api/health/route.ts です。
npm run lint # ESLint(lint:fix で自動修正)
npm run type-check # tsc --noEmit
npm run test -- --ci --testPathIgnorePatterns=e2e
npm run build # standalone 出力
*.test.tsx → client (jsdom) / *.test.ts → server (node)。拡張子で実行環境が決まります。scripts/run-jest.mjs 経由で、Windows では --runInBand が自動付与されます。src/__tests__/ は tsconfig 型チェック・ESLint の対象外(テスト内は any 許容)。.github/workflows/ci.yml)PR 前にローカルで通すこと。
npm run scan:secretssrc/types/supabase.ts の先頭が export type Jsonnpm run e2e:validate-fixtures(静的)npm run test:pr05:focused(CI 必須ゲートの 9 スイート回帰)npm run e2e:validate-fixtures
npm run e2e:seed
npm run test:e2e:pw
npm run e2e:cleanup
PLAYWRIGHT_BASE_URL > NEXT_PUBLIC_APP_URL > http://127.0.0.1:3000。webServer は npm run dev を自動起動します(seed 必須)。npm run supabase:types # → src/types/supabase.ts
npm run scan:secrets # 機密スキャン(CI 必須)
docs/stabilization/spec-*.mdsupabase/migrations/)src/
app/
(public)/ 未認証導線(login, register, booking ほか)
(app)/ 認証必須の業務画面(manager / admin 配下を含む)
api/ 業務 / 公開 / 管理 / manager / internal API
components/ 画面・UI コンポーネント(ui/ は shadcn ベース)
hooks/ React Query フック(queries/ にクエリ定義)
lib/ auth, supabase, schemas, services, security, rate-limiting,
notifications, reservations, staff, insurance-fees, ai ほか
providers/ query-provider / selected-clinic-context / user-profile-context
types/ TypeScript 型(supabase.ts は生成物)
__tests__/ Jest / Playwright テスト(api, lib, security, rls, stabilization ほか)
supabase/
config.toml ローカル Supabase 設定
migrations/ 現行マイグレーション(実行 SSOT)
rollbacks/ ロールバック SQL(migration 追加時にセットで用意)
scripts/
e2e/ E2E 用 seed / cleanup / validate-fixtures
docs/
stabilization/ 安定化仕様(spec-*)と DoD
operations/ Runbook と運用ドキュメント
archive/ 歴史的資料と直接適用禁止の参照SQL
src/app/ のソースを参照してください。db reset / db push、ボリューム削除、force-push 等)は AGENTS.md の approval ルールに従ってください。src/legacy/ は lint・型チェック対象外のレガシーです。拡張・パターン流用は禁止しています。UNLICENSED。社内利用前提です。
system/statushealth