System definition

The rhodd.yaml shape — version, project, backend, modules and services with a kind. Plus the multi-repo rhodd.system.yaml.


A single repo is declared in rhodd.yaml. The definition is the source of truth — Rhodd compiles from it, and re-derives the whole baseline whenever it changes.

Shape

yaml
version: "0.1"
project:
  name: fullstack-saas
  description: Frontend, backend, worker, database, Docker, and Kubernetes.
backend:
  language: typescript
  framework: nest
  transport: rest
  orm: prisma
modules:
  - name: postgres
  - name: redis
services:
  - name: web
    kind: app
    runtime: react-ts-zod
    language: typescript
    port: 5173
    dependencies: [api]
  - name: api
    kind: app
    runtime: node-nest
    language: typescript
    port: 3000
    replicas: 2
infrastructure:
  compose: true

Services and kind

Every service declares a kind. The kind selects how the service is modelled and what gets generated. Real kinds include:

  • app, http-api, worker
  • frontend-next, frontend-react
  • backend-go-rest, backend-go-grpc, backend-node-nest, backend-graphql, api-graphql
  • database, db-sqlite, object-storage, prisma-db
  • generic-file, markdown-doc

A service may declare a runtime, language, port, replicas, and dependencies on other services.

Modules

modules are the shared pieces a system uses — for example postgres and redis. Services own or depend on modules; those relationships become edges in the graph.

Multi-repo: rhodd.system.yaml

A single repo is rhodd.yaml. Many repositories are coordinated with a separate file, rhodd.system.yaml. It links the repositories, declares typed cross-repo contracts (for example an OpenAPI producer → consumer), the runtime dependencies bound to those contracts, the environments they deploy to, and release channels and sets:

yaml
apiVersion: rhodd.dev/v1alpha1
kind: System
metadata:
  name: example-system
  version: 0.1.0
spec:
  repositories:
    - name: web-platform
      path: repos/web-platform
      spec: rhodd.yaml
      role: web-platform
      defaultBranch: main
      managedByRhodd: true
    - name: processing-platform
      path: repos/processing-platform
      spec: rhodd.yaml
      role: backend-processing
      defaultBranch: main
      managedByRhodd: true
    - name: deploy
      path: repos/deploy
      spec: rhodd.deploy.yaml
      role: deployment
      managedByRhodd: false
  contracts:
    - name: processing-api
      kind: openapi
      producer: { repo: processing-platform, service: api }
      consumers:
        - { repo: web-platform, app: web }
      schema: { path: repos/processing-platform/contracts/processing-api.openapi.yaml }
  dependencies:
    - from: { repo: web-platform, app: web }
      to: { repo: processing-platform, service: api }
      kind: runtime-http
      contract: processing-api
  environments:
    - { name: local, kind: local-dev, deployRepo: deploy }
    - { name: staging, kind: kubernetes, deployRepo: deploy }
    - { name: production, kind: kubernetes, deployRepo: deploy }
  releaseChannels:
    - { name: stable }
    - { name: canary }
    - { name: ab-test }
  releaseSets: { path: releases }

A repository with managedByRhodd: true carries its own rhodd.yaml; contracts are typed and versioned, and a dependency is bound to the contract that satisfies it — so a breaking change on the producer is visible to its consumers before it ships.