One control plane. Your machines.
You declare the state your fleet should be in. On each machine, an agent installs the operating system, applies the configuration, and builds the network to match.
Capabilities
Machines, from bare hardware
A machine installs itself and can be rebuilt at any time without losing what makes it that machine.
- Zero-touch install over network boot, a bootable ISO, or one command on a running Linux host
- OCI images as the OS, streamed from any registry straight to disk
- Reprovision in place: identity, keys, roles, and mesh membership survive a full OS reinstall
Configuration as reusable units
Roles are defined once and combined per machine, and templates can see the rest of the fleet.
- Machine roles: reusable units, assigned in any combination
- Templates rendered with the machine's mesh peers in scope, which is how clustered services template their own membership
- Secrets and variables per account, available to templates, with secrets encrypted and write-only
A private network that builds and repairs itself
Every machine joins a full mesh with no tunnel configuration, and every machine is a router. This is the part teams normally build as a second project after provisioning.
- Full-mesh WireGuard with no peer lists to maintain, connecting straight through NAT and firewalls
- Continuous path measurement, moving traffic to a better path (or relaying through a healthy machine) when a link degrades
- Embedded BGP on every machine: within a mesh, between meshes, and out to your own switches and routers
- Health-checked virtual IPs, and isolated networks per team or environment
Clusters from one recipe
The pieces a cluster needs (nodes, a flat network, a service address) are platform primitives, so a recipe can compose them.
- The Cluster Wizard composes node roles, a network, a virtual IP, and the secrets a cluster needs
- Start from a shipped recipe or write your own; you provision the nodes and the cluster assembles itself
- Declare the same cluster in Terraform, so growing or rebuilding it is a pull request
- One cluster can span providers and your own hardware
Day-to-day access and visibility
Everything reaches a machine over the connection it already holds, so there is nothing to expose and no keys to distribute.
- Browser terminal and remote command execution, including to machines with no public address
- Live health per machine: hardware, link counters, and mesh path state
- Agent updates over the air, with a health check and automatic rollback
Choose the interface that fits the task
A cloud-like dashboard, and code for everything you would rather automate.
- REST API across the whole product surface
- Terraform provider on the public registry
- MCP server for AI agents, with confirmation gates and a log of every tool call
Minimal trust by design
A platform that installs operating systems should require as little trust as possible.
- A certificate authority per account; every agent authenticates with mutual TLS
- Private keys are generated on the machine and never transmitted
- Sensitive operations, such as opening a remote terminal, require an additional authentication step
- Data traffic flows machine to machine; the control plane never carries it, so an outage on our side cannot take your network down
- No lock-in: remove the agent and the machine and its workload keep running
Machines that live in a repository.
A machine enrolls once. From then on its roles, network, and routing are declared, reviewed, and applied like any other resource.
Roles, mesh networks, routes, route policies, virtual IPs, secrets, and registry credentials are ordinary resources. Changing the roles on a machine triggers a real reprovision, and the apply blocks until it reaches a terminal state, so a plan that says the fleet changed means the fleet changed.
Every object in the product, with a published OpenAPI schema and bearer tokens. Bulk endpoints exist for the operations you would otherwise loop over.
Connect Claude or ChatGPT and it can inspect machines and their rendered configuration, write roles, run commands, provision, and bring up a multi-node cluster: provision the first node, take the join token, bring up the rest. Destructive steps need explicit confirmation and a machine that has checked in recently, and every call is logged.
resource "durantic_mesh_network" "prod" { name = "prod" network_cidr = "10.42.0.0/16" is_default = true } resource "durantic_machine_role" "pg" { name = "postgres-primary" image_uuid = data.durantic_image.base.uuid template_data = file("roles/pg.yaml") merge_priority = 200 requires_mesh = true } resource "durantic_vip" "db" { name = "postgres" address = "10.42.0.10" health_check_type = "tcp" health_check_target = ":5432" } resource "durantic_machine_deployment" "db01" { machine_uuid = data.durantic_machine.db01.uuid role_names = ["postgres-primary"] # changing roles reprovisions, and apply waits }