Compile-time dependency injection
for Go
Declare services in YAML, get a type-checked container in Go
with zero runtime reflection.
No hand-written wiring
The service graph lives in configuration, so main stops growing with every new service and the diff for a feature contains the feature, not the plumbing.
Libraries can ship their wiring
A package publishes its own gendi.yaml and consumers import it by module path. It travels as data: no container types in the library’s API, nothing added to anyone else’s dependency graph.
A container you can just read
One build function per service, direct calls, concrete types, no reflection. What is injected where is written out rather than inferred — legible in a diff and in a stack trace.
Written as easily by tools as by hand
A small declarative surface with a published JSON schema, where a wrong guess fails at generation with the offending line instead of compiling into something subtly wrong.
Fails before the build
Missing dependencies, type mismatches, circular references and unconvertible parameter defaults are all generation errors, each with a caret under the offending token.
Composable configuration
Imports with overrides, tagged collections, decorators with priorities, and custom compiler passes for project-wide conventions.