Guide
The contract
What your repository has to provide
THE CONTRACT A Saasie is a Git repository. Push to main and it is built and deployed. Four things are required of it; everything else is yours. 1. A blueprint at saasie.yaml in the root. It declares your services and databases. See: saasie docs blueprint 2. A Dockerfile per service, at the path the blueprint names. Any base image, any language. It must produce an image that starts a long-running process. Nothing is injected into your build. 3. Each service listens on the port its blueprint entry declares. Nothing is injected into that environment — the blueprint's env block is the whole of it, so $PORT is unset unless you declare it. If your framework reads $PORT and falls back to a default when it is missing, it will listen somewhere else and never become ready. Declare it without repeating the number: env: PORT: { service: <this service>, property: port } Bind 0.0.0.0, not 127.0.0.1 — a loopback bind is unreachable from outside the container and reads as a dead service. 4. Each service answers its declared health path with 2xx once, and only once, it can serve real traffic. This is polled from the moment the container starts. It is the only signal the platform has, and it decides everything: a service that never answers it never receives traffic, and a rollout that never sees it never completes. If your process does work before it listens — migrations, warming a cache — the health path stays unanswered for that whole time, which is correct, but see: saasie docs deploy Not required, and not provided: a framework, a directory layout, a build tool, a migration runner, a test setup. Saasie has no opinion and ships no code into your repository. Check your repo against this before pushing: saasie validate
The same text, on your machine:
saasie docs contract