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 GitHub

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

From this repository
Web appThe editor, sign-in and the APIpnpm start · port 3000
WorkerRuns queued workflows and fires schedulespnpm worker
MCP serverLets your AI apps use your workflowspnpm mcp:http · port 3001
You provide
Postgres 16 or later, with pgvectorWorkflows, runs, records and search
Redis 7The run queue, and live updates between open editors

Run it with Docker

The quickest way to try it on one machine. This starts all five pieces and creates the tables.

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

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

Email needs a mail providerTutti emails a link to confirm each new account, so set 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.

.env
# 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
DATABASE_URLPostgres with the vector extension.
REDIS_URLQueues runs for the worker and keeps open editors in step.
BETTER_AUTH_SECRETSigns sign-in sessions. Changing it signs everyone out.
INTEGRATION_ENCRYPTION_KEYEncrypts saved connections. Keep it safe: without it they can't be read.
BETTER_AUTH_URL · NEXT_PUBLIC_APP_URLThe address people open.
NEXT_PUBLIC_MCP_SERVER_URLYour MCP server's address, shown in Settings › AI apps. The MCP server itself needs WORKFLOW_API_URL, the app's address.

Optional settings

Turn on what you need. Everything else in .env.example can stay empty.

AI steps and AskAI_GATEWAY_API_KEY or ANTHROPIC_API_KEY
Record searchOPENAI_API_KEY, for embeddings
EmailRESEND_SYSTEM_API_KEY, RESEND_SYSTEM_FROM_EMAIL: confirmations, password resets and invites
Sign in with GoogleGOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET
Gmail, Drive, SlackYour own OAuth apps: SYSTEM_GOOGLE_*, SLACK_CLIENT_*
The workerWORKER_CONCURRENCY 20, EXECUTION_TIMEOUT_MS 300000, MAX_RETRIES 3
Every variable →

Deploy it somewhere else

Upgrade

Back up firstAn upgrade can change your tables. Take a Postgres backup before you start.
With Docker
$ git pull$ docker compose up -d  # rebuilds, updates the tables and restarts
From source
$ 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

Analytics consent

We use Google Analytics and Hotjar to understand conversion and product usage. Accept to enable measurement. Decline to keep them disabled.

Privacy policy