Overview#
Midnight is an open-source, self-hosted platform-as-a-service control plane written in Go. It is designed for a single trusted VM first: install it on a server you control, deploy an app, get it routed, and keep it running.
When something breaks, deployment records, logs, failure states and rollback are meant to make recovery understandable rather than mysterious. An embedded agent can drive deploys, roll back services, and diagnose failures.
Who it is for#
An operator running their own infrastructure who wants deployment workflow without handing the workload to a hosted provider. You need a Linux VM, Docker, Postgres and Traefik, and you are willing to operate them.
The target shape#
The single-server deployment assumes one disposable Linux VM running:
| Component | Role |
|---|---|
| Docker Engine | Runtime scheduling and local image operations |
| Postgres | Storage for the server and worker |
| Traefik | Public HTTP or HTTPS routing through the file provider |
| Midnight package | Six systemd units — server, worker, agent, buildkit, buildkit-worker, registry |
What you actually do#
Three commands, run from inside your project directory:
midnight login
midnight link
midnight up
link writes .midnight/project.json, which travels with the repository, so
the binding between a directory and a project, environment and service is
shared rather than personal.
Status: MVP acceptance#
Midnight is in MVP acceptance. The control plane, package, migrations, dashboard, CLI and runtime wiring exist and can run the acceptance checklist, but Midnight is not MVP-complete until that checklist passes end to end on a fresh single trusted VM.
Read the boundaries below before deciding what to run on it. They are current, deliberate, and stated by the project itself.
Boundaries#
| Boundary | What it means |
|---|---|
| Single trusted VM first | The multihost scheduler is stubbed. Plan for one server |
| The reconciler is diff-only | It computes differences; it does not act on everything it observes |
| Some endpoints return planning artefacts | Certain demo and enterprise plan endpoints return a plan rather than performing a live action |
| Public HTTPS is not automatic | Certificate issuance exists, but installed and public HTTPS still requires your Traefik state path and external DNS and ingress proof |
| No Cloudflare DNS connector | Cloudflare is the planned first delegated-DNS provider. The general record connector is not implemented |
| No SLSA Build Level claimed | The build pipeline produces SBOM and provenance artefacts. Midnight does not claim a SLSA Build Level or automatic publication of signed attestations |
| Releases are checksum-protected, not signed | Standalone archives carry no detached signature. A checksum from the same location detects corruption, not a compromised release location |
| No Homebrew or Scoop | Not configured; brew install and scoop install are not supported paths |
| Saving a variable does not deploy | Desired state is stored; the workload is not restarted |
Where to go next#
- Install the CLI — get the binary.
- Install the server — prepare the VM.
- Your first deploy — login, link, up.
- Troubleshooting.