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