A Clojure micro-framework for building applications with data-driven architecture using configuration maps.
Integrant is a micro-framework for Clojure and ClojureScript that facilitates data-driven application architecture. It allows developers to define and manage system components through configuration maps (typically in EDN format), enabling declarative dependency resolution and lifecycle management. The framework addresses the need for a flexible, reproducible way to compose applications without hardcoding component relationships.
Clojure and ClojureScript developers building medium to large applications who need a structured approach to managing component lifecycles, dependencies, and configuration across different environments (e.g., development, production).
Developers choose Integrant for its data-centric design, which separates configuration from implementation, making systems easier to reason about and modify. Its support for hot-reloading via suspend/resume, reusable expansions, and environment profiles provides a robust development workflow, especially when compared to more rigid alternatives like Component or Mount.
Micro-framework for data-driven architecture
Systems are defined via EDN data structures, separating architecture from implementation, which makes configurations reproducible and easy to reason about, as highlighted in the Rationale section.
Uses `ref` and `refset` to automatically resolve and inject dependencies during initialization, simplifying component wiring without manual assembly.
Suspend and resume functions allow updating systems without restarting long-lived resources like servers, though implementing this requires custom multimethods per key.
`expand-key` enables creating configuration modules that can be overridden and merged, promoting code reuse and environment-specific customization via profiles.
Customizing suspend and resume requires implementing `suspend-key!` and `resume-key` multimethods for each key, which can be intricate and error-prone, as the Jetty example shows with atoms and promises.
Integrant focuses on core lifecycle management, so features like REPL integration require external libraries like Integrant-REPL, adding to setup complexity.
Configuration is inherently tied to EDN format, which might not integrate seamlessly with teams using JSON, YAML, or other config systems without additional parsing layers.
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.