Condotto - Team coding with AI in Slack
Condotto gives any Slack thread its own persistent Claude Code session, running on your own computer against your real repository and your real toolchain. You describe what you want in the thread. The agent writes the code and runs the tests. When it reaches for something consequential, an engineer clicks Approve. It's a single daemon, licensed under the AGPL.
I built it for a bottleneck on my own team. At The Lobby we're small, remote first, and productive. Several people there know our product and our customers better than I do. They would want a change made, anything from a styling fix to a report to a critical bug, and then they would wait for me to make it. As CTO my job includes keeping the site running, so the obvious fix of handing everyone a development environment and a deploy button isn't a fix at all. What I wanted was to stop being the middle man between my team and Claude Code, and go back to being a leader who guides the work.
The project was born in Lucca, Italy. My wife had spent a long time planning a month abroad, which is a hard thing to do when you help run a startup. I needed a way for the rest of the team to keep building while I was away from the computer. It was originally called Conduit. I renamed it Condotto, the Italian word, out of respect for the town where it was written. I'm still on the trip, and we're using it now.
Before any of this I ran a prototype: a set of Claude Code skills and scripts that polled specific Slack threads for input. It worked well enough to justify the real thing, and it taught me three concrete lessons. The first is that starting a session has to be automatic. In the prototype I opened tmux, started a copy of Claude Code by hand, pointed it at a thread, and told the team it was ready. The second is that each thread needs its own git worktree, or concurrent threads clobber each other's work. The third came from a hole in the prototype itself. Authority ran on a written protocol saying only my verified Slack ID could approve a build, and a message body could forge a header attributing a command to me. That's why Condotto checks approvals server side against a verified user ID, and why every tool call is sorted before it runs rather than after. By the time a command shows up in a transcript it has already run, so watching output is not enforcement.
My co-founder Abigail Holtz is the reason this exists in its current shape. She's an excellent product manager and an AI first CEO. She writes specs, builds features, improves our UI and pulls reports from production, and she's good enough with these tools to catch Claude's mistakes and push back on them. Slack is what makes that work. She can do all of it in the open while I follow along and add my two cents where it's useful, and when she asks me a question directly in the thread, Claude sees my answer too.
What I left out. Condotto is meant to be a simple, self contained tool that does one thing well. Almost all of the management tooling I can imagine has been left out on purpose. Standardized development environments, a Dev Container per thread, policy dashboards, fleet management across several daemons, a read only audit channel in Slack. There's a long list of things worth building for both startups and enterprises, and they belong on top of Condotto rather than inside it. I also cut per session process isolation, because its only real justification was containing a hostile session, and that isn't a boundary that exists inside a team that already trusts each other.
That trust assumption is the part I most want people to get right. Condotto is built for a small team whose members trust one another and whose architect self hosts it. The skill levels on that team can vary widely, and helping with exactly that is the point. It is not a multi-tenant product and it is not hardened against a hostile insider. Don't put it in a public Slack and let strangers drive your instance.
TypeScript, Bun, and the Agent SDK. The biggest surprise in this project was learning that the Agent SDK exists at all. I had assumed everything I wanted was welded into the Claude Code command line app. It isn't. Anthropic structured it so the agent can be embedded in other products, and that is what made Condotto practical. I wrote it in TypeScript on Bun because that's what Anthropic used for Claude Code, and there was no reason to reinvent the wheel or give up the benefit of their work. Condotto is fully AI coded with me as the architect, which is the same arrangement it gives everyone else.
The hardest part was integrating a closed source application. Claude Code has a real API, but it also has a large surface of built in commands and features, and not all of them are exposed through Condotto yet. I'll keep exposing more as we hit the need for them. If I run into a wall I can move to headless mode or drive the real application through a terminal emulator, but neither has been necessary.
Slack and Claude Code are the current integrations, not the only possible ones. The core is written against two interfaces, one for the chat surface and one for the coding agent, so Teams, Discord, Codex or OpenCode can be added without touching it.