Build AI agents that watch your product, report what matters and suggest what to do —
and nothing happens until you say yes.
Quick start · The guide · Connect your product · How it works · Docs
The live office of Epliv, a company run with Control Tower: each agent at its own desk, grouped by department, working, waiting or off.
You built a product. Now you also run it — the numbers, the customers, the failures at 3 a.m., the marketing, the follow-ups. Control Tower gives you a team for that, without handing your business to a black box.
| 🧑💼 Your agents, your design | Create as many agents as you need, each with one job — from a blank page or a starter template (Marketing Lead, Product Analyst, Researcher, Engineer on Duty, Revenue Watcher …). Nia, your chief of staff, is there from day one. |
| ✋ You stay in charge | Agents only suggest. Every suggestion waits in Clearance for your yes or no; money, deleting and settings always need you. Budgets per agent and for the team, one switch stops everything, and everything is logged. |
| 🔌 Your product, connected | Agents see your real numbers, lists and events — from any app or website, in any language. Stripe and a read-only database connection are ready to use. Your coding agent can build the connection for you. |
| 🏠 Yours, end to end | Self-hosted with Docker: your data and keys stay on your server. Bring your own AI — Gemini, Claude or OpenAI. Open source (AGPL-3.0). |
Also inside: Nia by text or voice, team chat with any agent, a mail client for the agents' mailboxes, a marketing studio (pictures and short videos), Trust reviews of the agents' work, and a gateway (MCP) so outside agents like Claude Code or ChatGPT can join your team under the same rules.
flowchart LR
P["🛍️ Your product"] -- "numbers · lists · events" --> A["🤖 Agents<br/>one job each"]
A -- "suggest" --> C["📥 Clearance"]
C -- "👤 you approve" --> X["✅ Done in your product<br/>once, and logged"]
- Connect your product. A small, signed connection lets agents read what you choose — sign-ups, orders, failed payments — and lets your product tell them when something happens.
- Make agents. Give each a job, the tools it may use, a budget and a schedule. It starts switched off.
- Clear what they suggest. Approve, reject (they learn why) or edit. After enough approvals in a row, an agent may offer to handle a kind of task alone, within a daily limit you set.
Personal data your product marks as personal — e-mail addresses, names, phone numbers — never reaches an agent.
You need a Linux server with Docker and Compose v2 (about 300 MB of memory when idle; 2 GB free to build).
git clone https://github.com/CrowPus/control-tower.git
cd control-tower
./install.shThe installer asks five questions, sets everything up with strong secrets, and prints a link to set your password and authenticator app. Then Getting started walks you through it:
- Your company — what it does and for whom; every agent reads this first.
- Your AI — Gemini, Claude or OpenAI, with your own key; press Test.
- Your team — switch it on and set a daily budget.
Then connect your product and make your first agent. New to all this? The guide explains every step in plain words.
Open it from anywhere: your domain, an SSH tunnel, or your own computer
Control Tower listens only on its own machine (127.0.0.1:8000; another port with APP_PORT in .env).
-
Trying it on your own computer: install with
--address http://localhost:8000and open that address. -
On a server, only for you: an SSH tunnel —
ssh -L 8000:127.0.0.1:8000 you@your-server— then openhttp://localhost:8000(install with that address). -
On a server, at your own domain: a reverse proxy with HTTPS in front of it. With Caddy, which gets the certificate by itself, the whole configuration is:
tower.example.com { reverse_proxy 127.0.0.1:8000 }Install with
--address https://tower.example.com. To let only your own addresses open the admin, setADMIN_IP_ALLOWLISTin.env(the agent gateway and the links projects use stay reachable).
The installer can run without questions:
./install.sh --email you@example.com --name "Your Name" --address https://tower.example.com --time-zone Europe/Berlin --yes.
Run it again at any time: it keeps your secrets and data. Lost the sign-in link?
docker compose exec app /app/backend/.venv/bin/python -m app.admin_cli invite-again --email you@example.com.
E-mail (admin invitations, alerts, the Monday report) uses the SMTP settings in .env; without them, alerts appear in
the admin's bell.
In the admin: Plugins → Connect your project. It asks what your product is and shows the way that fits:
| Your product | The way | Who does the work |
|---|---|---|
| Payments on Stripe | The ready Stripe plugin, with a read-only key | You — 5 minutes |
| Numbers from your database (PostgreSQL, MySQL) | The ready Database plugin: you write the questions, agents can only ask those | You or a developer — 30 minutes |
| An app or website, any language | A small signed connection added to your product | Your coding agent (Claude Code, Cursor, Copilot, Lovable …) or a developer |
| Python, on the same server | A Python plugin | A developer |
For an app or website, Control Tower hands you the exact message for your coding agent and a complete brief to save in your project — then Check the connection tells you, in plain words, whether it works or what to fix. Developers and coding agents: the brief, the reference, and a complete example in examples/plugins/hello_shop.
- Agents propose, code acts. Nothing an AI writes is carried out without a check and, where you set it, your clearance — and each cleared action runs once.
- Hard limits. Budgets per agent, for the team and for the whole install; a daily cap on what an agent may do alone; a stop switch for everything.
- Private by default. Personal fields are hidden from agents; keys are stored encrypted; the admin needs a password and an authenticator; every request between Control Tower and your product is signed.
- Accountable. Every proposal, decision and change is in the Admin log.
Choose Google Gemini, Anthropic Claude or OpenAI — or any service that speaks OpenAI's API (OpenRouter, a model on your own machine) — in Platform → AI, with your own key, models and prices, and a test button. Pictures, videos, Nia's voice, Nia's browser and web search use Gemini, whichever provider thinks.
Backups, updates and optional parts
./scripts/backup.sh # database, files and settings into backups/ (add --media for the studio's videos)
./scripts/restore.sh backups/ct-20261020-030000
./scripts/update.sh # backs up first; goes back by itself if the new version does not startThe installer shows the line that makes a backup every night. Backups are kept 14 days (BACKUP_KEEP_DAYS);
BACKUP_COPY_COMMAND in .env copies each one elsewhere (for example with rclone). A backup holds a copy of .env,
so keep backups as safe as .env itself.
- Nia's browser (Nia browses the web for you, live-watched):
docker compose --profile browser up -d. - Virus scanning of files attached in chats and mail:
docker compose --profile clamav up -d, thenCLAMD_HOST=clamavin.env(needs about 1.5 GB of memory).
Develop
cd backend && uv sync --all-extras && cd ..
npm install
cp .env.example .env # EXECUTION_MODE=development, DATABASE_ENGINE=sqlite; set ENCRYPTION_SECRET
cd backend && uv run python -m app.prestart
uv run python -m app.admin_cli create-owner --email you@example.com --name "Your Name"
uv run uvicorn app.main:app --port 8000 &
cd .. && npm run dev # the admin on http://127.0.0.1:5174Tests: cd backend && uv run pytest. Notes for contributors and coding agents: AGENTS.md. The plan and
what was built: docs/PLAN.md, docs/BUILD_LOG.md.
| The guide | Control Tower in plain words: your first hour, the words it uses, what to do when something is wrong. |
| Connect a project | The brief for your coding agent or developer, with ready code for Node and Python. |
| Plugins | The full reference: tools, actions, numbers, events, signing. |
| In the admin | Docs explains every page — and Nia answers questions about any of it. |
Contributions are welcome — bug fixes, plugins for the services you use, docs, translations. Start with CONTRIBUTING.md; questions and ideas go to Discussions, vulnerabilities to SECURITY.md. Everyone taking part follows the Code of Conduct.
Open source under the GNU AGPL-3.0. Run it for yourself and your business; if you offer a modified version to others over a network, share your source — or ask for a commercial license: support@dee-empire.com. Plain-language summary: LICENSING.md. Contributions are accepted under the CLA.
Made by Dee Empire.



