跳到正文
DEV Community· Vishwas V Pandey·· 5 小時前AI 評分52

作者打造開源團隊聊天工具 Forma Chat,支援每日站會草稿及連接 Claude Code

I built an open-source team chat that writes your daily standup (and lets you bring your own Claude)

AI 導讀

作者開發的 Forma Chat 是一款可自行部署的開源團隊聊天工具,會根據用戶當日的任務事件草擬每日站會。站會草稿提交前只對作者可見,私人任務及頻道內容不會自動加入團隊摘要;AI 智能體可使用自備 Anthropic API key,或透過 MCP 連接 Claude Code。工具以 Go 單一執行檔和 SQLite 運行,搜尋及智能體回覆均按用戶對話讀取權限限制可見內容。

正文

Most teams pay per seat for chat. Then they pay again for a standup bot. Then again for an AI add-on.

I wanted one thing I could run myself that did all three, so I built Forma Chat: open-source (Apache-2.0) team chat that runs on your own server, as one Go binary with a SQLite file.

📺 Watch the 74-second video · 💻 Code on GitHub

Forma Chat: a channel with a thread, reactions and code

What works today

  • Public and private channels, DMs and group DMs, threads, reactions, edits with history, pins, mentions, drafts that follow you across devices
  • Full-text search (SQLite FTS5), filtered by what you can read before any result, snippet or count exists
  • Turn any message into a task; My work ranks your own tasks and shows why each one is near the top
  • Daily standups that draft themselves
  • Optional AI agents with your own key, or your own Claude Code connected over MCP

It's an early release. Files, huddles and mobile apps aren't there yet, and the repo keeps a feature status page that says exactly what works.

Standups that write themselves, without an AI bill

Every task change is recorded as an event: created, started, finished, blocked, commented. At the time you choose, Forma builds each person's draft from their own events that day:

  • Done: what they finished, started or worked on
  • Next: their top open tasks by priority and due date
  • Blockers: blocked tasks, with the reason they wrote

A standup draft built from the day's tasks

No model is involved, so it's free, fast and explainable. The privacy rules mattered more to me than the drafting:

  • A draft is visible only to its author until they submit it.
  • Work in personal tasks or private channels the team channel can't see shows up only as a private suggestion ("Only you can see this"). It is never put in the summary automatically.
  • One summary posts per day. People who didn't submit are listed as "No update yet", never guessed at.
  • No keystrokes, no screenshots, no activity scores, no ranking of people.

AI agents: your key, or your own Claude

An admin creates an agent, gives it the workspace's own Anthropic API key (or any OpenAI-compatible key) and adds it to channels. Mention it and it answers live in a thread, streaming, with a Stop button. It can search messages and create or list tasks, always with the asking person's permissions.

The rule I spent the most time on: an answer may only use what the channel it's answering in can already see. If you ask in #general, it won't quote a private channel you happen to be in.

Or skip the API key and connect the Claude you already use. Create an external agent, add it to channels, make a token, then:

claude mcp add --transport http forma \
  https://chat.example.com/api/v1/mcp \
  --header "Authorization: Bearer fma_..."

Claude Code can then list its channels, read and post messages, search, and list or create tasks, only where that agent was added.

Claude Code, connected over MCP, replying in a thread

How it's built

  • Go modular monolith + SQLite in WAL mode, with embedded migrations. The React/TypeScript client is built by Vite and embedded in the binary, so deploying is copying one file.
  • One read policy. A single Authorize function decides whether a person can read a conversation. Search, threads, realtime and agents all go through it, or through its SQL set form, and a test checks the two always agree. Denied and missing look the same (404).
  • Messages are never silently lost. A message is stored before it is acknowledged. A transactional outbox feeds realtime, and WebSocket events are only wake-ups. Clients catch up from a per-conversation change counter, so a reconnect replays what was missed and retries never duplicate.
  • Agent keys are sealed with AES-256-GCM, bound to the agent, and never shown again. Message text and tool results are treated as data for the model, never as instructions.

Try it

You need Go 1.26+ and Node.js 22+:

git clone https://github.com/pandeyvishwas51-oss/forma-chat && cd forma-chat
make setup build
./bin/forma serve

The server prints a one-time link to create the owner account. For a populated demo workspace, run node scripts/demo.mjs.

I'd love feedback, especially on the standup privacy model and the agent audience rule. Issues and PRs are welcome: https://github.com/pandeyvishwas51-oss/forma-chat

來源:DEV Community · dev.to