Multi-repo: repository & path

Schema v0.7.0 lets one manifest describe services that live in different repositories. Two per-service fields control this — repository and path — and the CLI's convention engine resolves paths differently depending on them.

The two fields

FieldMeaning
repositoryThe GitHub owner/repo the service lives in. Omit for a service in the same repo as the manifest (monorepo).
pathThe service's path within its repository. . or omitted = repo root; a subdir (e.g. app) = service lives in a subdirectory.

Resolution matrix

repositorypathResult
omittedomittedMonorepo — service at the convention path apps/{type}/{name} (or packages/{name})
omittedsubdirMonorepo with an explicit subdirectory layout
owner/repo. / omittedMulti-repo — service is the whole repo (paths are repo-root-relative)
owner/reposubdirMulti-repo — service is a subdirectory of that repo

How paths are resolved

When a service is multi-repo (has a repository) or declares a path, the convention engine switches to repo-relative mode: the Dockerfile, build context, and CI change-detection watch paths are computed relative to the service's location in its own repo, rather than the monorepo's apps/{type}/{name} convention. A service at the repo root (path: ".") watches the whole repo; a subdir service watches just that subdir.

Per-service environment overrides

Repos can use different branch models. A multi-repo service may override the platform-wide ci.environments with its own per-environment branch mapping via a service-level environments block; omitted environments fall back to ci.environments. See Environments & Branches.

Example

"services": {
  "web": {
    "repository": "FoundryMedia/foundry-app",
    "path": "app",
    "environments": { "prod": { "branch": "main" } },
    "stack": { "type": "frontend", "framework": "vite" },
    "deploy": { "strategy": "static" }
  },
  "launcher": {
    "repository": "FoundryMedia/foundry-app",
    "stack": { "type": "frontend", "framework": "vite" },
    "deploy": { "strategy": "desktop" }
  }
}

Here web lives in the app/ subdir of foundry-app and deploys from main; launcher is the root of the same repo. A full worked example is the central foundry-ops/platform.json.