Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A shared task board for the God's Chai team. Everyone signs in with their own email and password. Owners have full access. Staff see unassigned tasks and the tasks other staff are on, but not the tasks owners are working on (unless they're on them too), and can change only the tasks they're working on.
The board has three columns: To do → In progress → Done. Drag a card to move it. Each card shows who is working on it, plus its labels, priority, due date, checklist progress and comment count. Click a card to open it. From there you can edit it, assign people, tick off checklist items, leave comments and see its history.
This app is separate from God's Chai Operations. It has its own repository, its own database, its own logins and its own deployment.
| Owner | Staff | |
|---|---|---|
| See and open tasks | ✓ every task | unassigned tasks, tasks other staff are on, and any task they're on — not tasks an owner is on, unless they're on them too |
| Comment on any task they can see | ✓ | ✓ |
| Edit or delete their own comments | ✓ | ✓ |
| Pick up an unclaimed task ("I'll take this") | ✓ | ✓ (only if it isn't done yet) |
| Move a task between columns | ✓ any task | only tasks they're on |
| Tick off, add and edit checklist items | ✓ any task | only tasks they're on |
| Create tasks; edit title, description, priority, due date, labels and assignees | ✓ | — |
| Archive, restore and delete tasks; delete anyone's comment | ✓ | — |
| Manage labels | ✓ | — |
| Add teammates, change roles, reset passwords, deactivate accounts | ✓ | — |
| Open and close sign-ups (who may create their own account) | ✓ | — |
| Ideas: share an idea, reply anywhere in a thread, upvote other people's posts (once each, not your own) | ✓ | ✓ |
| Ideas: edit or delete their own ideas and replies | ✓ | ✓ |
| Ideas: delete anyone's idea or reply | ✓ | — |
These rules live in one place, src/lib/permissions.ts. The server enforces them on every read and every change: a task hidden from a staff member is left off their board, archive and notifications, and opening or changing it answers as if it didn't exist. Who counts as an owner is their role right now, so promoting or demoting someone changes what staff see straight away. The browser uses the same rules to hide buttons a staff member can't use.
n for a new task and / to search.gohil1128/GC-Tasks). The board has its own Vercel project, separate from God's Chai Operations.main.AUTH_SECRET: any random string of 32 or more characters.AUTH_TRUST_HOST: trueNEXT_PUBLIC_VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, and VAPID_SUBJECT (a mailto: contact URI). The in-app bell works without them.RESEND_API_KEY and EMAIL_FROM (see Password reset by email). Without them, owners reset passwords and add people from the Team page.DATABASE_URL, the pooled connection the app uses, and DATABASE_URL_UNPOOLED, the direct connection the build uses for migrations. (Migrations through the pooler leave a lock behind that can fail a later build; without DATABASE_URL_UNPOOLED, as locally and in CI, the build migrates over DATABASE_URL.) Then use Deployments → ⋯ → Redeploy. Each build applies the database migrations automatically.With email set up, the sign-in page shows Forgot password?. People enter their email, get a 6-digit code (valid for 10 minutes, 5 tries, one use), and choose a new password with it. They're signed in straight away, and anyone signed in as them elsewhere is signed out. Without email set up, the link is hidden, /forgot-password doesn't exist, and the sign-in page says to ask an owner, as before.
Anyone can change their own email from Settings → Email. They enter the new address and their current password, and a 6-digit code goes to the new address. The email (the one they sign in with) changes only once that code is entered, and the old address gets a note that it changed. Same code rules as above. Without email set up, Settings says to ask an owner.
godschai.com) and add the DNS records Resend shows you at your DNS provider. Wait until the domain shows as Verified.re_.RESEND_API_KEY: the key from step 2.EMAIL_FROM: the sender, on the verified domain, for example GC Tasks <[email protected]>.The form gives the same answer whether or not an email has an account, and deactivated accounts get no email. Code requests and attempts count against limits like sign-in does. If an email can't be sent, the error is in the Vercel logs (Logs, search for "Password reset email"); the code itself is never logged or stored, only a keyed hash of it.
EMAIL_DEV_LOG_DIR is for local browser tests only: when set, emails are written as JSON files to that folder instead of being sent. It's ignored on Vercel; never set it there.
With email set up (the same Resend setup as password reset: RESEND_API_KEY and EMAIL_FROM), the sign-in page shows New to the team? Create an account. Anyone with any email address can use it:
The page answers the same way whether or not an email already has an account. An email that does gets a short note by email instead of a code ("You already have one: sign in, or use Forgot password"), and nothing is created. Requests and code attempts count against limits like sign-in does. Until the code comes back there is no account, only a pending sign-up holding a bcrypt hash of the chosen password and a keyed hash of the code.
Turning it off. Staff can see every task on the board, so an open sign-up means anyone who finds the link can read the board. Owners switch Allow sign-ups on the Team page. It's on by default. When it's off, the link is hidden, /signup and /signup/verify don't exist, and sign-ups still waiting for their code are thrown away. If someone you don't know signs up, deactivate them from the Team page; they're signed out at once. Without email set up, sign-up is off whatever the switch says.
If nobody can sign in, so nobody can reset a password from the Team page, use the recovery key:
RECOVERY_KEY: a random string of 24 or more characters (for example the output of openssl rand -hex 24). Then redeploy.RECOVERY_KEY again and redeploy. Without it, /recover does not exist.This is not a master password: it only sets a new password on one account. Wrong keys count against the same lockout as sign-in (5 tries, from all addresses together), and every use is logged.
cp .env.example .env # point DATABASE_URL at a Postgres you can use
pnpm install
pnpm db:migrate
pnpm dev # http://localhost:3200 → /setup on first run
To create or reset an account from the command line, run this. Leave out --password to have one generated; the person will then be asked to choose their own the first time they sign in.
pnpm create-user --email [email protected] --name "Your Name" [--role owner|staff] [--password "…"] [--reset]
pnpm typecheck && pnpm lint
pnpm test # unit tests; integration tests need a test database (below)
DATABASE_URL="postgresql://…/gctasks_test" pnpm test
pnpm build && pnpm start -p 3211 &
E2E_EMAIL=… E2E_PASSWORD=… pnpm test:e2e
The integration tests empty every table between tests. To protect real data, they only run when DATABASE_URL contains test.
src/modules/tasks: task logic. Every change to the board runs in a single database transaction that also increments a board revision counter. Open boards poll that counter, which is cheap, and fetch the board again only when it changes.src/modules/ideas: the Ideas page. An idea and all its replies live in one table (each reply points at its parent and at the idea it sits under, so a whole thread is one query). Upvotes are counted, not stored, with one row per person per post. Ideas writes run in their own transactions with a lock per thread, never the board's lock, so a busy thread doesn't make open boards refetch.