One loop from docs to deploy, on servers you own.
Documentation, tickets, CI runners, and deployment to your own machines in one self-hosted platform, with an MCP server over the whole domain.
git clone https://github.com/otal-labs/nexul.git && cd nexul && ./install.sh
Docs as source of truth
Tickets come from documents, and deploys link back to both.
Documents are versioned and are where work starts: a doc spawns scoped tickets, each ticket links to its branch, pull request, and deploy, and all of it is indexed so the next piece of work starts with the full trail instead of a blank page.
MCP server
Every use case is an MCP tool, because the web app calls the same layer.
The domain layer is the single source of behavior. The HTTP gateway for the web app and the MCP server are two thin adapters over it, so an LLM agent gets doc search, ticket creation, topology, deploys, run logs, and dead-letter replay by construction. There is no shadow API to keep in sync.
Ordinary servers
SSH, Docker, and a runner binary. No Kubernetes.
The server stack is one docker compose file. Runners are Go host binaries that connect out to the server over a WebSocket, mount the Docker socket, and build and deploy on the machine they run on: a VPS, bare metal, or the same host as the server. SQLite is the only database, and it lives on the data volume.
How it fits together
docs→tickets→code + pull requests→review→deploy→index everything→next loop
Install
The script installs Docker if it is missing, asks for a logs password, starts the stack with one runner on the same host, and prints the setup wizard URL. Installation guide
Open core, one repository, two licenses. Everything outside ee/ is AGPL-3.0-or-later: run it, modify it, and self-host it at any company size.
Everything inside ee/ is under a commercial license; the code is public to read and patch, running it in production needs a subscription. Licensing