Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Single-user agile toolkit: 100+ tools, agent-controllable via in-app chat + MCP, cross-device cloud sync.
翻譯準備中
正在載入完整 README。
檢視完整 README ↗A free, public toolkit for Scrum masters and agile teams — sprint planning,
daily scrum, retrospectives, estimation, delivery metrics, team health,
prioritization and decision frameworks, whiteboarding — plus the free
"Agile at Work" comic book. About 80 tools are in the main navigation; some
30 more for neighbouring work (AI/LLM product management, security, SRE and
incident response, strategy frameworks) sit on a "More tools" shelf
(/more-tools) that any visitor can switch on.
Every tool works without an account: a visitor's work stays in their browser. The owner's sign-in adds cross-device cloud sync, the in-app agent and MCP.
Built with Next.js 14 (App Router), Zustand, Supabase, and Tailwind.
Five integrated subsystems, layered:
Access model — Public, browser-only tools; owner-only server.
AUTHORIZED_EMAILS, signed in with Google, with a verified email
(isOwnerUser in src/lib/auth/authorize.ts).
Owner-only: cloud and history sync, the agent's server path, MCP,
personal access tokens, the kudos/squads/sessions APIs and realtime
multiplayer./api/* route answers JSON 401 unauthenticated,
403 not_authorized | wrong_provider | email_unverified or
503 auth_unavailable | auth_unreachable (with retry-after) — never a
redirect. The pages in OWNER_ONLY_PAGES
(src/lib/auth/owner-routes.ts:
/settings/access-tokens, /settings/squads) redirect to sign-in or
/not-authorized. A non-owner's session cookies are expired, so they
carry on as a visitor.GET /api/auth/owner
(200 {owner:true}, else 401/403/503 JSON) confirms the owner before
anything owner-only starts. RLS on every user table is
auth.uid() = user_id.Cross-device cloud sync (owner) — Local-first. Every Zustand store and every
workspace entity (sprints, stories, whiteboard objects, etc.) writes to
localStorage first; a debounced pusher mirrors to Supabase. Realtime
subscriptions fan remote writes back to other open tabs. LWW on
updated_at for conflicts. Soft-deletes via deleted=true tombstones
for concurrent-device reconciliation.
See src/lib/sync/engine.ts.
Tool action registry — A typed action surface where every tool
exposes read/write/intent verbs through a singleton registry. The
registry produces tool schemas for both Claude tool-use and MCP
tools/list. ~102 actions wired today, growing.
See src/lib/actions/registry.ts.
In-app chat agent (owner) — A right-side sheet (Cmd/Ctrl+J) powered by GLM
(Zhipu) via OpenAI-compatible chat completions. Server proxy at
/api/agent/stream or browser-direct BYOK using the per-tool key in
the LLM settings store. Write actions pause for inline approval;
"approve all this session" opt-in available.
See src/app/api/agent/stream/route.ts.
MCP server (owner) — HTTP/SSE transport at /api/mcp for remote agents
(Claude Desktop, Claude Code, OpenClaw), plus a thin stdio relay
package (mcp-server/) that forwards to the deployed app. PAT auth
with scrypt-hashed bearer tokens. Per-token rate-limit bucket.
See src/app/api/mcp/route.ts.
npm install
cp .env.example .env.local # fill in the values listed below
npm run dev # http://localhost:3000
Required environment variables (.env.local):
NEXT_PUBLIC_SUPABASE_URL=https://<project>.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_ROLE_KEY=eyJ... # server-only, for PAT resolution
[email protected] # comma-separated, lowercased
ANTHROPIC_API_KEY=sk-ant-... # optional; falls back to per-tool BYOK
The Supabase project needs migrations 0001–0006 applied:
npx supabase db push
| Command | Purpose |
|---|---|
npm run dev | Next.js dev server with HMR. |
npm run build | Production build. |
npm run start | Run the production build locally. |
npm run lint | ESLint over the project. |
npm run test | Vitest in watch mode. |
npm run test:run | Vitest one-shot (CI uses this). |
npm run pdf:worker | Copy the pdf.js worker to public/ (after bumping pdfjs-dist). |
Vercel-native. Auto-deploys from master to production.
Environment variables for production (set in the Vercel dashboard):
.env.local vars above.SUPABASE_SERVICE_ROLE_KEY is sensitive — store it as an Encrypted
Environment Variable.fra1 to keep the Edge middleware close to
the Supabase project (see vercel.json).Vercel Authentication ("Require Log In" under Deployment Protection)
must be off for the production domain — the site is public and the
owner-only surface is enforced by the in-app middleware. Keep it on for
Preview deployments (see the checklist below). Only master and preview/*
branches deploy at all (git.deploymentEnabled in vercel.json); see
RUNBOOK.md, "Vercel builds and cost".
The public "Owner sign in" button lets anyone start a Google sign-in, so:
signup_disabled instead of an
account. Confirm anonymous sign-ins are off.The comics live at /comics, and every story is /comics?ep=NN. See
RUNBOOK.md, "The Agile at Work comics".
After bumping pdfjs-dist, run npm run pdf:worker so the public worker the
whiteboard's PDF import loads matches the library version.
Mint a Personal Access Token at /settings/access-tokens, then either:
Claude Desktop (stdio relay):
{
"mcpServers": {
"agile-toolkit": {
"command": "agile-toolkit-mcp",
"env": {
"AGILE_TOOLKIT_PAT": "pat_...",
"AGILE_TOOLKIT_URL": "https://your-deployment.vercel.app"
}
}
}
}
Any HTTP/SSE MCP client:
curl -X POST https://your-deployment.vercel.app/api/mcp \
-H "Authorization: Bearer pat_..." \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
Rate limit: 120 requests/minute per PAT.
/api/* route and the
OWNER_ONLY_PAGES require the owner (allowlisted Google account with a
verified email). API failures are JSON 401/403/503, never redirects.auth.uid() = user_id via RLS./.well-known/security.txt; /robots.txt keeps /api/,
/auth/, /settings/, /guest/ and /not-authorized out of the index.