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
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: trueServices 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,workerfrontend-next,frontend-reactbackend-go-rest,backend-go-grpc,backend-node-nest,backend-graphql,api-graphqldatabase,db-sqlite,object-storage,prisma-dbgeneric-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:
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.