Self-host the app
Run the whole of Tutti on your own servers: the web app, a worker that runs workflows in the background, and an MCP server for your AI apps. You bring Postgres and Redis.
Edit this page on GitHubWhat you run
Three processes from this repository, and two services you provide. AI apps reach Tutti through the MCP server; the app and the worker share Postgres and Redis.
Run it with Docker
The quickest way to try it on one machine. This starts all five pieces and creates the tables.
$ git clone https://github.com/Darkmatter-AI/tutti.git$ cd tutti$ cp .env.example .env # then fill in the required settings below$ docker compose up -d
When it is up, open http://localhost:3000.
Run it from source
For working on Tutti, or running each piece yourself. You need Node 24 and pnpm 9; Docker here only starts Postgres and Redis.
$ pnpm install$ docker compose up -d postgres redis$ pnpm db:push # creates the tables in an empty database$ pnpm build && pnpm start# in a second terminal$ pnpm worker# in a third, for AI apps$ pnpm mcp:http
The first account
Open the app and sign up. The first account owns the workspace; invite everyone else from Settings › Members.
RESEND_SYSTEM_API_KEY and RESEND_SYSTEM_FROM_EMAIL before you sign up.Required settings
Seven settings, read from .env. Make each secret with openssl rand -hex 32.
# Where the data lives. With Docker, Compose points these at its own servicesDATABASE_URL=postgresql://tutti:change-me@localhost:5432/tuttiREDIS_URL=redis://localhost:6379# Secrets: openssl rand -hex 32, one eachBETTER_AUTH_SECRET=INTEGRATION_ENCRYPTION_KEY=# The addresses people and AI apps useBETTER_AUTH_URL=https://tutti.example.comNEXT_PUBLIC_APP_URL=https://tutti.example.comNEXT_PUBLIC_MCP_SERVER_URL=https://mcp.tutti.example.com
Optional settings
Turn on what you need. Everything else in .env.example can stay empty.
AI_GATEWAY_API_KEY or ANTHROPIC_API_KEYOPENAI_API_KEY, for embeddingsRESEND_SYSTEM_API_KEY, RESEND_SYSTEM_FROM_EMAIL: confirmations, password resets and invitesGOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRETSYSTEM_GOOGLE_*, SLACK_CLIENT_*WORKER_CONCURRENCY 20, EXECUTION_TIMEOUT_MS 300000, MAX_RETRIES 3Deploy it somewhere else
Upgrade
$ git pull$ docker compose up -d # rebuilds, updates the tables and restarts
$ git pull$ pnpm install$ pnpm db:push # brings the tables up to the new schema$ pnpm build # then restart the app, the worker and the MCP server