# container.yaml
# use yaml (bundles down to json)
callable: "./main"
- "@app.service"
class: "./Service"
- "Hello World"
// container.js
// use javascript
module.exports = function()
return {
"app.main": {
"callable": "./main.js",
"app.service": {
"class": "./Service.js",
"arguments": [
"Hello World"
  • Asynchronous Dependency Injection for Javascript

    Decouple your app with @gardenhq/willow. A browser and Node.js compatible, flexible dependency injection container. Configuration is 'unobtrusive', done outside of your modules, meaning no lock-in within your modules.

  • Dynamic in-browser loader and bundler

    Bundling should be a final step, not the first. Start coding javascript straight away without fighting a toolchain. All development can be done without bundling or installing anything. Only bundle when you want/have to. o also supports hot/live reloading, 'transpiling', and dynamic requiring (myVariable + '/file.js'). o only reloads the file you changed, not your entire codebase.

  • Built for HTTP/2

    Specify what gets bundled and what is loaded on demand. Load polyfills only for people that need them, use keep rarely used modules out of your bundle. bundle: false will exclude your file from the bundle a load it on demand. More options coming.

  • Write Pure CommonJS modules

    Supports 'pure' CommonJS modules as default, but if you have modules with a synchronous require o loads those aswell (currently with the odd caveat)

  • Declarative plumbing

    Define your dependency injection container with declarative json or yaml, or a simple javascript module. Concentrate on your specific app logic with imperative, pure, CommonJS modules.

  • Batteries included but swappable

    Batteries included but swappable. Everything is configurable.