PDF / Word をアップロード → AI 要約・タグ付け → 検索・共有までを最短で。
🔗 Live
- アプリ(日本語):
https://docuflow-azure.vercel.app/app?lang=ja - アプリ(英語):
https://docuflow-azure.vercel.app/app?lang=en - LP(英語):
https://docuflow-azure.vercel.app/en - デモ(英語 / ログイン不要):
https://docuflow-azure.vercel.app/demo/en
- English version:
README_en.md
- 採用/面接で「成果物」を最速で見たい:
Dashboard→Document detail→Share viewの順(下のスクショ参照)- 英語UIは
?lang=enで切替可
- 実装の堅さ(RLS/RBAC/共有/監査)を見たい:
- アーキテクチャ/設計判断を見たい:
- 3分でわかる(何ができる?)
- スクリーンショット(主要導線)
- 面接/レビュー用:5分デモ台本
- セキュリティ / 共有リンクの考え方(要点)
- 言語(EN/JA)挙動
- ローカルで動かす(最短)
- CI / 運用メモ
- トラブルシューティング
- さらに読む
- アップロード: PDF / Word を投入すると、本文を抽出して保存
- AI: 要約・タグ・(必要に応じて)埋め込みを生成し、検索性を上げる
- 検索: キーワード検索 + 類似検索で「見つかる」導線に寄せる
- 共有: 期限付きの閲覧専用リンクを発行(匿名列挙を防ぐ設計)
- 組織: RBAC(owner/admin/member)とRLSでマルチテナントを堅く運用
「どこを見てほしいか」を5分で説明するための台本を用意しています:
おすすめの見せ順:
/appダッシュボード(検索・ピン・お気に入り)- 新規アップロード → AI要約/タグ
- 共有リンク発行 →
/share/<token> - 組織(RBAC)/ 請求(Stripe)/ Vitals(運用)
- 共有は閲覧専用(編集/削除/コメントは常に認証必須)
- 匿名列挙の防止:
- 共有ページは
documentsを直接SELECTしない - RPC
get_shared_document(token)経由のみで取得(tokenを知らないと取れない)
- 共有ページは
- 期限:
share_expires_atは DB 関数側で失効判定し、期限切れは取得不可 - 監査ログ:
share_access_logsに閲覧を best-effort で保存- IP / User-Agent は SHA-256 でハッシュ化(生データは保存しない)
- 保持は90日(best-effortで自動削除)
関連ドキュメント: docs/security.md
- 優先順位:
docuflow_langCookie →Accept-Language(jaなら日本語、それ以外は英語) - URLで明示:
?lang=en/?lang=ja - 共有ページ:
?langが無い場合は推論で自動判定。右上の EN/日本語トグルで切替可能。
- Node.js(推奨: LTS)
- Supabase プロジェクト(DB + Auth)
npm ci| 変数 | 必須 | 目的 |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
✅ | Supabase URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
✅ | Supabase anon key(公開) |
SUPABASE_SERVICE_ROLE_KEY |
任意 | 共有閲覧ログ/管理系(service_role) |
OPENAI_API_KEY |
任意 | AI要約/タグ/埋め込み(無くても動く) |
NEXT_PUBLIC_SITE_URL |
任意 | Stripe等の戻りURL(本番運用向け) |
※ SUPABASE_SERVICE_ROLE_KEY が無い場合でもアプリは動きますが、共有閲覧ログ(share_access_logs)の記録/閲覧は無効化されます。
cp docs/env.example .env.localsupabase/migrations/を Supabase Dashboard の SQL Editor で適用- 共有/監査ログ関連の追加分:
20251217_harden_shared_access.sql20251218_fix_get_shared_document_tags.sql20251218_add_share_access_logs.sql
npm run dev/app?lang=jaにログインできる- ドキュメントを1件作成できる
- 共有リンクを有効化 →
/share/<token>が開ける - 共有ページを数回リロード →
share_access_logsに行が増える
.github/workflows/supabase-migrations.ymlはSUPABASE_DB_URLSecret が無い場合はスキップ(CIが赤くならない)- 自動適用したい場合は GitHub Secrets に
SUPABASE_DB_URLを設定
Vercel の環境変数に DOCUFLOW_AI_GLOBAL_MONTHLY_LIMIT を設定すると、
プロジェクト全体のAI呼び出し回数に上限を掛けられます(超えたらAIだけ停止、アプリは動く)。
例: 月500回で止める
DOCUFLOW_AI_GLOBAL_MONTHLY_LIMIT=500
プランごとの monthlyAICalls を DB の原子的カウンタ(ai_usage_monthly)で強制しています。
AI操作(例: 要約再生成)に 簡易レート制限を入れているので、短時間の連打で料金が膨らみにくいです。
- AIを完全停止: Vercel で
OPENAI_API_KEYを削除(AI機能が無効化) - 今月だけ止める:
DOCUFLOW_AI_GLOBAL_MONTHLY_LIMIT=0
- 言語ルーティング(EN-first):
proxy.ts,lib/serverLocale.ts - 共有の安全設計:
app/share/[token]/page.tsx,lib/shareAudit.ts,supabase/migrations/*share* - RBAC/組織:
lib/organizations.ts,lib/billingScope.ts - AI使用量の強制:
lib/aiUsage.ts,ensureAndConsumeAICallsの呼び出し箇所 - メタデータ/SEO:
app/layout.tsx,app/en/*
よくある詰まりどころはここに集約しています:
特に多いもの:
- Supabase接続(env不足)
- AIが動かない(
OPENAI_API_KEY未設定 / 予算上限) - 共有URLが404(期限切れ / 共有OFF / アーカイブ)
- アーキテクチャ:
docs/architecture.md - DB/RLS:
docs/db-schema.md - 運用:
docs/operations.md - API:
docs/api.md




