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.