# Architecture: how dau-build composes work from Hydra config This page explains why dau-build is built from declarative specs, typed `ccflow` models and a Hydra config tree, and what that structure gives you. It is background reading. For the commands themselves, see the [command reference](../reference/commands.md); for step-by-step goals, the [how-to guides](../how-to/run-a-build.md). ## The shape of the tool dau-build turns a declarative description of an FPGA build into concrete artifacts: generated SystemVerilog, artifact bundles, backend handoff manifests, Tcl scripts and command plans. Everything the tool does is a typed `ccflow.CallableModel` (a `SimulateTask`, a `SynthesizeTask`, a `BuildVivadoArtifactsTask`, and so on), and the models a user runs are composed from configuration rather than constructed by hand in Python. That configuration is a Hydra config tree under `dau_build/config`. Running the tool is always the same two-phase act: compose a config from groups and overrides, then instantiate and run the model it describes. The CLI is a thin front end over that one idea. The reason is that an FPGA build has many axes that vary independently (which task, which board, which backend, which spec), and those axes recur across dozens of operations. Encoding each axis as a Hydra config group lets any combination compose without a separate argument parser per command, and lets a downstream package add new options without editing dau-build. ## Config groups are directories Each subdirectory of `dau_build/config` is a Hydra config group: `task`, `step`, `spec`, `board`, `backend`, `platform`, `design`. Selecting an option is an override `=