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
翻訳待ち
No updates detected yet. GitHub releases will appear here.
RelationNote — 顧客・関係者のつながりをまとめて管理
Loading the full README.
Read the full README ↗顧客・関係者のつながりをまとめて管理。顧客や関係者のデータを組織ごとに管理する汎用のSaaS
基本設計書 v0.1(2026-10-21)に沿った実装です。最初の想定利用者はNPO(基本設計書の前提)。複数の組織が共通基盤を使うマルチテナント型で、 応募フォームの回答を人物単位に整理し、イベント参加履歴と、写真からの人数推定を管理します。
| 設計書 | 実装 |
|---|---|
| 画面・業務API | Next.js 16(App Router / Server Actions / Route Handlers)・TypeScript |
| DB・組織分離 | Supabase PostgreSQL。全主要テーブルに organization_id、外部キーにも組織IDを含め、RLS で参照・追加・更新・削除を制御 |
| 認証・権限 | Supabase Auth + memberships(オーナー/管理者/編集者/閲覧者 + 一括出力・一括削除・人物統合・権限変更の個別権限) |
| 写真保存 | Supabase Storage の非公開バケット。アップロードは期限付きURL、閲覧は所属メンバーのみ期限付きURL |
| 非同期処理 | Supabase Queues(pgmq)+ Edge Function process-jobs + Supabase Cron(毎分起動) |
| 人物検出 | Amazon Rekognition DetectLabels(Person)。開発用にダミー検出器(DETECTOR=mock) |
ディレクトリ:
supabase/migrations/ … スキーマ・RLS・業務ロジック(名寄せ、統合、利用枠、ジョブ、集計)supabase/functions/process-jobs/ … ワーカー(写真解析・回答の取り込み・一括出力・期限切れ整理)src/app/orgs/[orgId]/ … 管理画面src/app/api/ … アップロード・取り込み・外部フォーム受信・出力ダウンロードtests/ … 単体テストと、ローカルSupabaseに対する受け入れテストnpm install
supabase start -x studio,postgres-meta,imgproxy,vector,logflare,realtime,supavisor
supabase status -o env # 値を .env.local に転記(.env.example 参照)
cp supabase/functions/.env.example supabase/functions/.env # WORKER_SECRET を設定
supabase functions serve --env-file supabase/functions/.env --no-verify-jwt # ワーカー
./scripts/setup-local-cron.sh # Cron から毎分ワーカーを呼ぶための Vault 登録
node scripts/seed-dev.mjs # デモ組織とサンプルデータ(任意)
npm run dev # http://localhost:3080
ポートは他プロジェクトと衝突しないよう API 55621 / DB 55622 にしています。
CSV取り込みの試験用ファイル: scripts/sample-volunteer-form.csv
npm test
ローカルの Supabase が起動している必要があります。設計書 §16 の受け入れ条件のうち、自動で確かめられるものを網羅しています。
| 状況 | 結果 |
|---|---|
| メールまたは電話が一致し、氏名も一致する人物が1人 | 既存人物に紐づけ(空欄の補完と連絡先・タグの追加のみ。上書きしない) |
| メール・電話は一致するが氏名が違う | 確認待ち(家族で共有している可能性) |
| 氏名だけ一致 | 確認待ち(同姓同名の可能性) |
| 一致なし | 新規作成 |
確認待ちは「確認待ちの回答」画面でスタッフが判断します。登録済み人物どうしの重複は「重複候補」画面で統合でき、統合前の状態は履歴に残ります。
ワーカー(Edge Function)の環境変数 MAIL_TRANSPORT=smtp・SMTP_*・MAIL_FROM・APP_URL(supabase/functions/.env.example 参照)を設定し、
Vercel の環境変数 MAIL_SENDING_CONFIGURED=1 を入れると画面の送信ボタンが有効になる。Edge Functions は 25・587 番ポートに接続できないため、Gmail は 465 を使う。
ローカルでは Supabase 付属のテスト用メールサーバー(Mailpit、http://127.0.0.1:55624)に送られ、外部には届かない。
外部サービスを使わず、RelationNote の中でフォームを作って公開できる。「フォーム・取り込み」→ 方式「申し込みフォームを作る」。
/f/<推測できない文字列> の URL を発行。ログイン不要、スマートフォン対応、検索エンジンには載せない公開の入口を増やすため、次のように守っている(supabase/migrations/20261029000001_public_forms.sql、src/app/f/)。
未対応:回答者への自動返信メール(メール送信の設定後に検討)、ファイル添付、CAPTCHA(外部サービスの契約が要るため。回答数に合わせて判断)、回答一覧の CSV 出力(人物一覧の出力は使える)。
「フォーム・取り込み」でフォームを追加するときに方式を選ぶ。取り込んだ回答は CSV と同じ流れ(二重取り込み防止 → 名寄せ → 確認待ち)に乗る。
| 方式 | 仕組み | 利用者の操作 |
|---|---|---|
| Google フォーム | OAuth(読み取り専用)で連携し、Forms API から前回以降の回答を定期取得(既定15分ごと) | 「Google と連携」→ フォームの URL を貼る → 提案された項目の対応を確認 →「自動取り込みを始める」 |
| Google スプレッドシート | 同上。Sheets API で1行目を見出しとして読み、内容が同じ行は二重に取り込まない | 同上(シート名は任意) |
| Typeform / Tally | 相手のサービスから Webhook。署名(HMAC-SHA256)で送信元を確認 | 「署名用の秘密を発行」→ 相手の Webhook 設定に URL と秘密を入れる |
| 汎用 Webhook | Authorization: Bearer <秘密> 付きの JSON | Apps Script などから送る |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET を Vercel と Edge Function の両方に設定する。
承認済みのリダイレクト URI は https://relationnote.vercel.app/api/connectors/google/callback。
フォームの回答・スプレッドシートの読み取りは Google の「機密性の高いスコープ」のため、一般公開には Google の審査が必要(審査前はテストユーザーに登録した100人まで)node scripts/mock-google.mjs(Google を模した疑似サーバー)で、連携から取り込みまで確認できる。本物の Google での検証ではないThis is the beginning of the README. Read the rest at the original. Read the full README ↗