Open-Awesome
CategoriesAlternativesStacksSelf-HostedExplore
Open-Awesome

© 2026 Open-Awesome. Curated for the developer elite.

TermsPrivacyAboutGitHubRSS
  1. Home
  2. Clojure
  3. Integrant

Integrant

MITClojure

A Clojure micro-framework for building applications with data-driven architecture using configuration maps.

GitHubGitHub
1.3k stars63 forks0 contributors

What is Integrant?

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.

Target Audience

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).

Value Proposition

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.

Overview

Micro-framework for data-driven architecture

Use Cases

Best For

  • Building Clojure web applications with managed server and handler lifecycles
  • Developing data-driven microservices where configuration varies by environment
  • Implementing hot-reloadable systems during development without restarting servers
  • Managing complex dependency graphs between application components
  • Creating reusable configuration modules for common application patterns
  • Transitioning from Component or Mount to a more declarative architecture

Not Ideal For

  • Projects that prefer imperative, code-first system assembly over declarative configuration
  • Teams needing out-of-the-box REPL tools or monitoring without integrating additional libraries
  • Applications with highly dynamic, runtime-generated components that don't fit static EDN maps
  • Environments where EDN parsing and multimethod dispatch overhead impacts startup performance

Pros & Cons

Pros

Declarative Configuration

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.

Automatic Dependency Resolution

Uses `ref` and `refset` to automatically resolve and inject dependencies during initialization, simplifying component wiring without manual assembly.

Development Hot-Reloading

Suspend and resume functions allow updating systems without restarting long-lived resources like servers, though implementing this requires custom multimethods per key.

Reusable Expansions

`expand-key` enables creating configuration modules that can be overridden and merged, promoting code reuse and environment-specific customization via profiles.

Cons

Complex Suspend/Resume Logic

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.

Minimal Built-in Tooling

Integrant focuses on core lifecycle management, so features like REPL integration require external libraries like Integrant-REPL, adding to setup complexity.

EDN-Locked Configuration

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.

Frequently Asked Questions

Quick Stats

Stars1,348
Forks63
Contributors0
Open Issues12
Last commit3 months ago
CreatedSince 2016

Tags

#micro-framework#clojurescript#dependency-injection#data-driven#clojure#configuration-management#lifecycle-management

Built With

C
Clojure
C
ClojureScript

Included in

Clojure2.8k
Auto-fetched 48 minutes ago

Related Projects

componentcomponent

Managed lifecycle of stateful objects in Clojure

Stars2,156
Forks94
Last commit6 months ago
mountmount

managing Clojure and ClojureScript app state since (reset)

Stars1,259
Forks86
Last commit3 months ago
Community-curated · Updated weekly · 100% open source

Found a gem we're missing?

Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.

Submit a projectStar on GitHub