Tool

Deploy multiplayer AI agents across Slack and web workspaces

Multiplayer agent harness for startups in Slack and on the web, with isolated per-person workspaces, shared rooms, skills and admin security postures.

Works with slackpostgresgithubfastifybolt

88
Spark score
out of 100
Updated last month
Source checked Oct 9, 2026
Version 0.1.14
Models
claude

Add to Favorites

Why it matters

Organizations hire this to run collaborative AI agents that give each employee isolated workspaces with personal memory, files, credentials, and sandboxes while enabling team collaboration in Slack channels and web projects, all with admin-controlled security and model flexibility.

Outcomes

What it gets done

01

Provision per-user sandboxes with durable files, tools, and authenticated services that persist across sessions

02

Manage scoped memory, keychains, and permissions so employees work independently without affecting each other

03

Run background crons and watches that execute scheduled tasks and monitor repositories or systems

04

Deploy custom internal web apps with controlled access and share skills across teams with admin-gated promotion

Source

Get it from source

Spark does not host a copy of it.

Open source

Reports

Agent outcome reports

No reports yet

Overview

A multiplayer agent harness for work in Slack and on the web. Each person and room gets an isolated scope with its own memory, files, permissions and durable sandbox, under admin-chosen security and sharing postures. Use it when a startup wants one shared agent across Slack and web with per-person isolation, admin control and audited actions.

What it does

QM is a multiplayer agent harness for work, available in Slack and on the web. Most agents are designed like personal assistants and get complex when you make one work for a whole company. QM is designed for startups: each employee gets their own isolated workspace and works independently without affecting others, 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 is built with open source in mind, and Pi, OpenCode, Codex and Claude Code all drive the same core, so a deployment is not tied to one vendor.

Features:

  • Personal and shared scopes, so people customize the agent to be theirs and still work with it in Slack channels and projects.
  • Slack and web, with the same identity and configuration carried between them.
  • Admin control over org-level configuration, security and sharing postures, and which harnesses and models are available.
  • Web apps: custom internal apps published to the right people.
  • Shared skills, scope-owned and shareable by grant, with admin-gated promotion to the whole org and skill packs imported from git repositories.
  • Background work through crons, watches and inbound webhooks.

Things you can do with it: search internal notes, email, documents, databases and the web together, build and publish internal apps, learn your writing voice from past sends and triage your inbox on a schedule with labels and reply drafts, work in an existing repository (run tests, open PRs, monitor CI, check system logs), and track a project in a shared channel with updates and follow-ups.

When to use - and when NOT to

Use it when a startup wants a shared agent with per-person isolation and admin control across Slack and web. Its security follows local coding agents: the agent acts as the person it works for, with their credentials and permissions, and everything is audited. An org picks one security posture that narrower scopes can only tighten: Strict pauses every harness tool call for human approval except the two no-effect turn enders, Auto (the default) blocks private-network access and uses a content screener when configured, and Dangerous applies no content screening and no pauses. A command policy with approval rules and hard denials for things like recursive deletes or destructive SQL applies in every posture, including Dangerous. Sharing posture is independent: Isolated (the default) keeps resources in their scope unless explicitly shared, while Open lets a speaker's opted-in personal files, artifacts, skills and memory be read in an opted-in shared room, with cross-context reads provenance-labelled and audited. Open does not mount a personal workspace into a room, carry credentials, widen writes, or weaken screening, approvals or egress, and it can still reveal private information in a shared reply. It has no production deployment workflow in its repository, and each deployment runs in the operator's own cloud account.

Inputs and outputs

Every turn runs through a central core that can use a variety of models and harnesses. A Postgres layer holds user data, session history and durable state. Set DATABASE_URL and SESSION_STORE=postgres for durability, because otherwise sessions live in process memory and vanish on restart. The agent has a small, fixed tool surface, including execute, which runs commands in the scope's own isolated, durable sandbox where installed tools stay installed. The core runs TypeScript directly on Node with Fastify, the Slack plugin uses Bolt, and the web UI builds with Vite and Lit. Everything specific to one company lives in a deployment directory that the qm CLI validates and deploys, and memory can be routed by scope to external providers while keeping the built-in notebook.

How to install

Tell your coding agent of choice to deploy the repository and it follows the deployment guide, or try a third-party hosted version. Alternatively create an organization-owned deployment repository that depends on @yc-software/qm, initialize it for a fly or aws target, and walk through infrastructure, web sign-in, connector credentials, optional Slack access, deployment and live verification.

node cli/bin/qm.ts check --config <deployment-dir>/qm.config.jsonc

For changes to QM itself, keep your own source fork (a private one outside GitHub's fork network), build with --build-from ., and use update-qm to merge upstream changes. Contributions are accepted as human-written text described in an adrs/ file and not as code, and vulnerabilities are reported privately. A managed Slack installation is supported for hosting providers through QM_SLACK_SERVICE_URL and a per-deployment token.

QM is available under the MIT License except where otherwise noted.

Who it's for

Startup teams and infrastructure providers who want a shared, self-hosted agent workspace in Slack and on the web with per-person isolation, admin control and auditable actions.

Source README
QM

A multiplayer agent harness for work. In Slack and on the web. Run it in your own cloud, with your own models and keys.

CI license node npm

Deploy · How it works · Security model · Customize · Contribute · Documentation

Overview

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 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.

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.

Features

  • Personal and shared scopes. People customize the agent to be theirs, and still work with it collaboratively in Slack channels and projects.
  • Slack and web. The same identity and configuration carries between Slack and the web app.
  • Admin control. Set org-level configuration, security and sharing postures. Choose which harnesses and models are available.
  • Web apps. Spin up custom internal apps and publish them to the right people.
  • Shared skills. Skills are scope-owned and shareable by grant, with admin-gated promotion to the whole org and skill packs imported from git repositories.
  • Background work. Crons, watches, and inbound webhooks work while you're away.

What you can do with it

  • Search internal notes, email, documents, databases, and the web together
  • Build internal apps, publish them to the right people, and keep their data current
  • Learn your writing voice from past sends, then triage your inbox on a schedule - labels and reply drafts included
  • Work in an existing repository: run tests, open PRs, monitor CI, check system logs
  • Track a project in a shared channel and post updates and follow-ups

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 against a real model and real Postgres, run npm run dev-instance:web for web/admin or npm run dev-instance:slack for Slack. Use npm run dev-instance:both when testing both surfaces together. Bare npm run dev-instance defaults to web for new instances and preserves the surface on reload. Switch an existing instance with an explicit surface command.

How it works

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 and admin panel share one service; the portal and optional built-in auth broker share another. These modules communicate with core over its HTTP API. See combined services for configuration and migration; 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:

  • Strict - every harness tool call pauses for human approval, except the two no-effect turn enders.
  • Auto (default) - blocks private-network access.
  • Dangerous - no tool approval gates, and content screening only observes.

Content screening is a deployment setting, securityScreen.mode: off (default), observe, or enforce, with securityScreen.classifier choosing the built-in model or an external proxy. When on, it classifies external content under every posture. observe only records verdicts in the audit log. enforce quarantines flagged content pending release approval, except under Dangerous, which caps screening at observe.

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

Sharing posture is independent:

  • Isolated (default) - resources stay in their scope unless explicitly shared.
  • Open - on a live authenticated internal human turn, the speaker's opted-in personal files, artifacts, skills, and memory may be read in an opted-in shared room.

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.

Customize your instance

Choose how you want to customize QM:

  • Config, tools, skills, and services: use the deployment repository above. It pins @yc-software/qm and uses that release's runtime images; no source copy is needed.
  • Changes to QM itself: keep your own source fork, public or private. You may modify any part of core, including the runtime, plugins, CLI, docs, and CI. Contributing those changes upstream is optional.
Create a source fork

For a private source fork, create a standalone private repository, outside GitHub's fork network. Seed only main and explicitly set it as the default branch:

gh repo create <org>/qm-private --private
git clone --single-branch --branch main --no-tags git@github.com:yc-software/qm qm-private
git -C qm-private remote rename origin upstream
git -C qm-private remote add origin git@github.com:<org>/qm-private
git -C qm-private push -u origin main
gh repo edit <org>/qm-private --default-branch main

Do not seed with git push --mirror: it copies unrelated upstream branches and tags, leaves default-branch selection implicit, and can delete destination-only refs on later pushes. The upstream remote supplies source updates without copying those refs to your repository. For a public source fork, GitHub's Fork button is also an option. A GitHub fork of a public repository cannot be private; keep private work outside that network.

Review inherited workflows before enabling Actions or adding credentials. Choose the CI checks you want, and disable or adapt upstream release and publishing workflows for your own package and image registries. Copying the source does not configure production deployment CI.

Customize and run your source

Keep deployment configuration, tools, skills, plugin images, and infrastructure in deploy/layers/<org>/ in a private source fork, or in a separate private deployment repository when your source is public. Never commit secrets. See deploy/layers/README.md for initialization and layout. Keep deployment data separate from core code, but change core wherever your desired behavior requires it.

From the source checkout, install dependencies with npm ci and use the in-tree CLI. After completing the provider setup in deployment.md, build and deploy your modified services explicitly:

node cli/bin/qm.ts check --config <deployment-dir>/qm.config.jsonc
node cli/bin/qm.ts plan --config <deployment-dir>/qm.config.jsonc --build-from .
node cli/bin/qm.ts up --config <deployment-dir>/qm.config.jsonc --build-from .
node cli/bin/qm.ts check --config <deployment-dir>/qm.config.jsonc --live

Use this checkout's CLI when changing the CLI itself. Without --build-from, the normal deployment path selects published images, so editing source alone does not change the deployed runtime. If you publish custom images instead, configure their immutable references through imageOverrides. Follow the provider guide for sandbox image builds; service builds do not replace that step.

Keep it current

For a source fork, update-qm merges upstream changes while preserving intentional local behavior. Land sync PRs with their merge ancestry intact, never squash or rebase them. Conflicts are expected maintenance work, not a requirement to discard customizations. Use upstream-pr only when you want to contribute a generic change; it prepares a clean upstream branch without private deployment data or history.

For a package deployment, upgrade the exact @yc-software/qm dependency and lockfile, review contract changes and generated assets, then validate and deploy. There is no upstream source history to merge.

Going deeper

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.