qm README

The project's README from github.com/yc-software/qm. As one markdown file: README.md.

qm

A multiplayer agent harness for work. In Slack and on the web.

The QM web UI: two concurrent sessions, a sidebar of personal files, crons, keychain, deploys, memory, and skills

Setup

Tell your coding agent of choice Let's deploy https://github.com/yc-software/qm. From here, it should follow the deployment guide in this repo.

You can also try out a 3rd-party hosted version of QM here.

If you're an infra provider interested in offering a hosted version of QM, feel free to reach out.

What is QM?

Most agents are designed like personal assistants. You can make one work for a whole company, but it quickly gets complex. QM is designed for startups. Employees each get their own isolated workspace and work independently without affecting each other, and they can also collaborate with the agent in channels, group messages, and projects.

Each person and each room has its own scoped memory, files, keychain view, permissions, crons, web apps, and durable sandbox.

It's built with open source in mind. Pick your own harness and model and switch between them — Pi, OpenCode, Codex, and Claude Code all drive the same core, so a deployment isn't tied to any single vendor.

Features

What you can do with it

Architecture

flowchart LR
  DB[("Postgres<br/>sessions · memory · queue")]

  subgraph CORE["Headless core"]
    API["API · identity · policy · scheduler"]
    LOOP["Agent loop<br/>(Pi, OpenCode, Claude Code)"]
    API <--> LOOP
  end

  SBX["Per-scope sandbox<br/>files · tools · logged-in services"]

  DB <--> API
  LOOP <--> SBX

For durability, set DATABASE_URL and SESSION_STORE=postgres — without it, sessions live in process memory and vanish on restart. To exercise a branch end to end — core, Slack, web, admin, portal, against a real model and real Postgres — run npm run dev-instance.

Architecture

Every turn runs through a central core, which can use a variety of models and harnesses to generate the response. A Postgres persistence layer holds user data, session history, and other durable state. The agent has a small, fixed tool surface; one of those tools is execute, which runs commands in the scope's own isolated sandbox — its durable computer, where installed tools stay installed. The web UI, the admin panel, and the public portal are optional plugins over the core's HTTP API; Slack is an optional in-process plugin that core starts and supervises through a direct service client.

The core runs TypeScript directly on Node and uses Fastify for HTTP. The Slack plugin uses Bolt; the web UI builds with Vite and renders with Lit.

The core itself is generic. Everything specific to one company — org config, custom tools and skills, sandbox image, infrastructure — lives in a deployment directory that the qm CLI validates and deploys. Every substrate (harness, session store, sandbox, memory) sits behind an interface. Memory can also be routed by scope to external providers while retaining the built-in notebook.

Security and secrets

QM's approach follows local coding agents like OpenCode, Codex, and Claude Code: the agent acts as the person it's working for, with their credentials and permissions, and everything it does is audited. An org picks one security posture, which narrower scopes can only tighten:

The predeclared command policy — approval rules and hard denials for things like recursive deletes or destructive SQL — applies in every posture, Dangerous included.

SECURITY.md has the threat model, the operator assumptions, and the known limitations.

Deploy it for your org

Create an organization-owned deployment repository that depends on @yc-software/qm:

npm exec --yes --package=@yc-software/qm@latest -- \
  qm init . --org <slug> --target <fly-or-aws>
npm install

Initialization materializes a deployment skill for an agent and walks through infrastructure, web sign-in, connector credentials, optional Slack access, deployment, and live verification — no source checkout required. Each deployment runs in the operator's own cloud account; initialization does not generate or enable deployment CI, and this repository has no production deployment workflow. See deployment.md for the details.

Contributing

We take contributions as human-written text, not code — see CONTRIBUTING.md. Describe the change you'd like informally in a .txt or .md file in adrs/, and if we're aligned we'll handle the implementation. Report vulnerabilities privately — see SECURITY.md, not a public issue.

Customize your instance

The deployment repository above carries config and a sandbox layer, and never needs a source checkout. Some organizations want the opposite trade: the whole codebase in one place, so engineers and coding agents read core and customizations together, while the customizations themselves stay private. For that, keep a private fork: a standalone private repository whose history begins as a clone of qm and whose core stays identical to upstream.

Populate it once, then clone it to work in:

gh repo create <org>/qm-private --private

git clone --bare [email protected]:yc-software/qm qm-seed.git
git -C qm-seed.git push --mirror [email protected]:<org>/qm-private
rm -rf qm-seed.git

git clone [email protected]:<org>/qm-private
git -C qm-private remote add upstream [email protected]:yc-software/qm

Create the private fork with a plain clone, as shown above, and never with GitHub's fork feature. The word "fork" here names the concept — a downstream copy that diverges deliberately and merges from upstream — not GitHub's Fork button. A GitHub fork inherits the visibility of the repository it came from, so a fork of a public repository cannot be made private. A GitHub fork also shares one object network with the repository it came from, so commits pushed to the fork stay fetchable by SHA from the public side. Many organizations disallow forking private repositories as well. A plain clone has none of these problems, and it costs one thing: the clone is an ordinary repository, so upstream's CI workflows run live in your own account. Expect to supply the secrets those workflows need, or disable the ones you do not want running.

Everything specific to your organization goes in deploy/layers/<org>/ — config, sandbox tools and skills, plugin images, infrastructure — in the same shape qm init produces. See deploy/layers/README.md. Core stays byte-identical to upstream, which is what keeps merges small.

Two skills maintain the boundary in both directions. update-qm merges upstream qm into the private fork and opens the sync PR; upstream-pr sends an organization-agnostic fix back to qm, cutting the branch from upstream/main and checking the outgoing diff, commit messages, and screenshots for organization identifiers before it pushes. Nothing under deploy/layers/ ever travels upstream.

Going deeper

License

Except where otherwise noted, QM is available under the MIT License.

qm (yc-software/qm)

Searching Database…

15.4K ·GitHub
这是什么?一个开源的多用户共享 AI 代理运行框架,面向工作场景:公司里所有人共用一个 AI 代理,可以通过 Slack 和网页应用访问。它是为团队协作使用代理而设计的,不是给个人单独用的。
是我们自己部署运行,还是有托管版本?需要自己部署:你们的组织创建一个依赖 @yc-software/qm 包的部署仓库,每个部署都运行在你们自己的云账号里。另外有一个第三方托管版本,可以用来试用。
具体要怎么部署?告诉你选的编程代理 'Let's deploy',它就会按照部署指南操作。初始化过程会带你完成基础设施配置、网页登录、连接器凭据、可选的 Slack 接入以及实际运行验证——不需要检出源代码。
我们会被绑定在某一个 AI 模型或编程代理上吗?不会——你可以自己选择运行框架和模型,并且可以随时切换。Pi、OpenCode、Codex 和 Claude Code 都能驱动同一个核心,所以部署不会依赖任何单一厂商。
如果漏掉某个配置步骤,会出什么问题?如果没有设置 DATABASEURL 和 SESSIONSTORE=postgres,会话数据只存在进程内存里,重启就会丢失,所以为了数据持久化一定要设置它们。另外,核心服务直接运行在 Node 上,版本必须是 24.15 或更高。
它是个人助理,还是给整个团队用的?它是为创业公司设计的:每位员工都有自己独立的工作区,各自独立工作;大家也可以在 Slack 频道、群消息和项目里和代理一起协作。
代理和我们公司的数据会留在我们自己的基础设施里吗?会——每个部署都运行在运营方自己的云账号里,用户数据、会话历史和其他持久化数据都保存在 Postgres 持久层中。如果你们愿意,还可以按范围把记忆路由到外部服务。
这个代理日常到底能为团队做些什么?它可以同时搜索内部笔记、邮件、文档、数据库和互联网;搭建并发布内部网页应用;按计划整理你的收件箱,打标签并起草回复;在现有代码仓库里工作——跑测试、开 PR、盯 CI、查日志;还可以在共享频道里跟进项目。
代理工作的那个沙盒是什么?每个人和每个房间都有自己独立的、可持久化的沙盒——相当于代理自己的电脑。代理的 execute 工具在那里执行命令,而且装好的工具在不同会话之间会保留。
代理用的是我们的凭据,怎么防止它执行破坏性操作?你们组织要选定一种安全策略:Strict 模式下,运行框架的每一次工具调用都要暂停等待人工批准;Auto 模式(默认)会在外部内容送达模型之前用分类器进行筛查;Dangerous 模式则关闭筛查。无论哪种策略,递归删除、破坏性 SQL 之类的操作都会被硬性拒绝。
没人在 online 的时候,它也能继续干活吗?能——定时任务(crons)、监控(watches)和入站 webhook 会在没人盯着的时候在后台运行,比如按计划整理收件箱、打标签并起草回复。
What are similar projects?moyai, deer-flow, Choruz, trueforge, Raven, open-swe, agor, brigade
Size
88.6 MB
Stars
15.4K
Age
2mo
Commits · 90 Days