# spring-io/initializr architecture

> Architecture diagram of the GitHub repository spring-io/initializr, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/spring-io/initializr
- Repository: https://github.com/spring-io/initializr

## Overview

Spring Initializr is a configurable JVM project-generation service. A client requests metadata or submits project options; web endpoints expose metadata and route generation requests into project creation, returning build files or a downloadable archive. The generator supports Java, Kotlin, and Groovy; Maven and Gradle; and extensible conventions including Spring Boot configuration, properties, Git files, and Docker Compose. Optional actuator endpoints report generation statistics and version ranges. The tree and excerpts establish the web and generator responsibilities, but do not expose every runtime connection, so uncertain links are omitted.

Main entry points: [`initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildSystem.java`](https://github.com/spring-io/initializr/blob/main/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildSystem.java) (Build model), [`initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectGenerationController.java`](https://github.com/spring-io/initializr/blob/main/initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectGenerationController.java) (Generation API), [`initializr-metadata/src/main/java/io/spring/initializr/metadata/ServiceCapability.java`](https://github.com/spring-io/initializr/blob/main/initializr-metadata/src/main/java/io/spring/initializr/metadata/ServiceCapability.java) (Metadata capabilities), [`initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectMetadataController.java`](https://github.com/spring-io/initializr/blob/main/initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectMetadataController.java) (Metadata API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web API"]
  node_generation_api["Generation API"]
  node_default_request["Request binding"]
  node_metadata_api["Metadata API"]
  node_cli_api["CLI help"]
end

subgraph group_metadata["Metadata"]
  node_metadata_model["Metadata capabilities"]
  node_repository["Repository metadata<br/>[Repository.java]"]
end

subgraph group_generation["Project generation"]
  node_build_model["Build model<br/>[BuildSystem.java]"]
  node_language_model["Language model"]
  node_spring_code["Spring source"]
  node_spring_properties["App properties"]
  node_git_files["Git files"]
  node_compose["Compose files"]
  node_build_writer["Build writers<br/>[BuildWriter.java]"]
end

subgraph group_operations["Operations"]
  node_stats_config["Stats configuration"]
  node_stats_publisher["Generation stats"]
  node_request_document["Stats document"]
  node_dependency_ranges["Dependency ranges"]
  node_bom_ranges["BOM ranges"]
end

node_client(("Client"))

node_client -->|"submits options"| node_generation_api
node_generation_api -->|"binds request"| node_default_request
node_generation_api -->|"invokes build generation"| node_build_writer
node_generation_api -.->|"requests metadata"| node_metadata_api
node_client -->|"requests capabilities"| node_metadata_api
node_client -->|"requests CLI help"| node_cli_api
node_metadata_api -->|"serializes capabilities"| node_metadata_model
node_cli_api -->|"renders help from"| node_metadata_model
node_build_writer -->|"writes build model"| node_build_model
node_build_model -->|"represents repositories"| node_repository
node_build_model -->|"selects language"| node_language_model
node_spring_code -->|"customizes source"| node_language_model
node_spring_properties -->|"contributes settings"| node_build_model
node_git_files -->|"contributes project files"| node_build_model
node_compose -->|"contributes compose file"| node_build_model
node_stats_config -->|"configures publisher"| node_stats_publisher
node_stats_publisher -->|"creates document"| node_request_document
node_dependency_ranges -.->|"reports ranges"| node_metadata_model
node_bom_ranges -.->|"reports ranges"| node_metadata_model

click node_generation_api "https://github.com/spring-io/initializr/blob/main/initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectGenerationController.java"
click node_default_request "https://github.com/spring-io/initializr/blob/main/initializr-web/src/main/java/io/spring/initializr/web/controller/DefaultProjectGenerationController.java"
click node_metadata_api "https://github.com/spring-io/initializr/blob/main/initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectMetadataController.java"
click node_cli_api "https://github.com/spring-io/initializr/blob/main/initializr-web/src/main/java/io/spring/initializr/web/controller/CommandLineMetadataController.java"
click node_metadata_model "https://github.com/spring-io/initializr/blob/main/initializr-metadata/src/main/java/io/spring/initializr/metadata/ServiceCapability.java"
click node_repository "https://github.com/spring-io/initializr/blob/main/initializr-metadata/src/main/java/io/spring/initializr/metadata/Repository.java"
click node_build_model "https://github.com/spring-io/initializr/blob/main/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildSystem.java"
click node_language_model "https://github.com/spring-io/initializr/blob/main/initializr-generator/src/main/java/io/spring/initializr/generator/language/LanguageFactory.java"
click node_spring_code "https://github.com/spring-io/initializr/blob/main/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/SourceCodeProjectGenerationConfiguration.java"
click node_spring_properties "https://github.com/spring-io/initializr/blob/main/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/properties/ApplicationPropertiesProjectGenerationConfiguration.java"
click node_git_files "https://github.com/spring-io/initializr/blob/main/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/scm/git/GitProjectGenerationConfiguration.java"
click node_compose "https://github.com/spring-io/initializr/blob/main/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/container/docker/compose/ComposeProjectContributor.java"
click node_build_writer "https://github.com/spring-io/initializr/blob/main/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildWriter.java"
click node_stats_config "https://github.com/spring-io/initializr/blob/main/initializr-actuator/src/main/java/io/spring/initializr/actuate/autoconfigure/InitializrStatsAutoConfiguration.java"
click node_stats_publisher "https://github.com/spring-io/initializr/blob/main/initializr-actuator/src/main/java/io/spring/initializr/actuate/stat/ProjectGenerationStatPublisher.java"
click node_request_document "https://github.com/spring-io/initializr/blob/main/initializr-actuator/src/main/java/io/spring/initializr/actuate/stat/ProjectRequestDocumentFactory.java"
click node_dependency_ranges "https://github.com/spring-io/initializr/blob/main/initializr-actuator/src/main/java/io/spring/initializr/actuate/info/DependencyRangesInfoContributor.java"
click node_bom_ranges "https://github.com/spring-io/initializr/blob/main/initializr-actuator/src/main/java/io/spring/initializr/actuate/info/BomRangesInfoContributor.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_generation_api,node_default_request,node_metadata_api,node_cli_api,node_client toneBlue
class node_metadata_model,node_repository toneAmber
class node_build_model,node_language_model,node_spring_code,node_spring_properties,node_git_files,node_compose,node_build_writer toneMint
class node_stats_config,node_stats_publisher,node_request_document,node_dependency_ranges,node_bom_ranges toneRose
```

## Components

### Web API

- [Generation API](https://github.com/spring-io/initializr/blob/main/initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectGenerationController.java): `initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectGenerationController.java`
- [Request binding](https://github.com/spring-io/initializr/blob/main/initializr-web/src/main/java/io/spring/initializr/web/controller/DefaultProjectGenerationController.java): `initializr-web/src/main/java/io/spring/initializr/web/controller/DefaultProjectGenerationController.java`
- [Metadata API](https://github.com/spring-io/initializr/blob/main/initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectMetadataController.java): `initializr-web/src/main/java/io/spring/initializr/web/controller/ProjectMetadataController.java`
- [CLI help](https://github.com/spring-io/initializr/blob/main/initializr-web/src/main/java/io/spring/initializr/web/controller/CommandLineMetadataController.java): `initializr-web/src/main/java/io/spring/initializr/web/controller/CommandLineMetadataController.java`

### Metadata

- [Metadata capabilities](https://github.com/spring-io/initializr/blob/main/initializr-metadata/src/main/java/io/spring/initializr/metadata/ServiceCapability.java): `initializr-metadata/src/main/java/io/spring/initializr/metadata/ServiceCapability.java`
- [Repository metadata](https://github.com/spring-io/initializr/blob/main/initializr-metadata/src/main/java/io/spring/initializr/metadata/Repository.java): `initializr-metadata/src/main/java/io/spring/initializr/metadata/Repository.java`

### Project generation

- [Build model](https://github.com/spring-io/initializr/blob/main/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildSystem.java): `initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildSystem.java`
- [Language model](https://github.com/spring-io/initializr/blob/main/initializr-generator/src/main/java/io/spring/initializr/generator/language/LanguageFactory.java): `initializr-generator/src/main/java/io/spring/initializr/generator/language/LanguageFactory.java`
- [Spring source](https://github.com/spring-io/initializr/blob/main/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/SourceCodeProjectGenerationConfiguration.java): `initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/code/SourceCodeProjectGenerationConfiguration.java`
- [App properties](https://github.com/spring-io/initializr/blob/main/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/properties/ApplicationPropertiesProjectGenerationConfiguration.java): `initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/properties/ApplicationPropertiesProjectGenerationConfiguration.java`
- [Git files](https://github.com/spring-io/initializr/blob/main/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/scm/git/GitProjectGenerationConfiguration.java): `initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/scm/git/GitProjectGenerationConfiguration.java`
- [Compose files](https://github.com/spring-io/initializr/blob/main/initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/container/docker/compose/ComposeProjectContributor.java): `initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/container/docker/compose/ComposeProjectContributor.java`
- [Build writers](https://github.com/spring-io/initializr/blob/main/initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildWriter.java): `initializr-generator/src/main/java/io/spring/initializr/generator/buildsystem/BuildWriter.java`

### Operations

- [Stats configuration](https://github.com/spring-io/initializr/blob/main/initializr-actuator/src/main/java/io/spring/initializr/actuate/autoconfigure/InitializrStatsAutoConfiguration.java): `initializr-actuator/src/main/java/io/spring/initializr/actuate/autoconfigure/InitializrStatsAutoConfiguration.java`
- [Generation stats](https://github.com/spring-io/initializr/blob/main/initializr-actuator/src/main/java/io/spring/initializr/actuate/stat/ProjectGenerationStatPublisher.java): `initializr-actuator/src/main/java/io/spring/initializr/actuate/stat/ProjectGenerationStatPublisher.java`
- [Stats document](https://github.com/spring-io/initializr/blob/main/initializr-actuator/src/main/java/io/spring/initializr/actuate/stat/ProjectRequestDocumentFactory.java): `initializr-actuator/src/main/java/io/spring/initializr/actuate/stat/ProjectRequestDocumentFactory.java`
- [Dependency ranges](https://github.com/spring-io/initializr/blob/main/initializr-actuator/src/main/java/io/spring/initializr/actuate/info/DependencyRangesInfoContributor.java): `initializr-actuator/src/main/java/io/spring/initializr/actuate/info/DependencyRangesInfoContributor.java`
- [BOM ranges](https://github.com/spring-io/initializr/blob/main/initializr-actuator/src/main/java/io/spring/initializr/actuate/info/BomRangesInfoContributor.java): `initializr-actuator/src/main/java/io/spring/initializr/actuate/info/BomRangesInfoContributor.java`

### Other components

- **Client**

## Connections

- Client → Generation API: submits options
- Generation API → Request binding: binds request
- Generation API → Build writers: invokes build generation
- Generation API → Metadata API: requests metadata
- Client → Metadata API: requests capabilities
- Client → CLI help: requests CLI help
- Metadata API → Metadata capabilities: serializes capabilities
- CLI help → Metadata capabilities: renders help from
- Build writers → Build model: writes build model
- Build model → Repository metadata: represents repositories
- Build model → Language model: selects language
- Spring source → Language model: customizes source
- App properties → Build model: contributes settings
- Git files → Build model: contributes project files
- Compose files → Build model: contributes compose file
- Stats configuration → Generation stats: configures publisher
- Generation stats → Stats document: creates document
- Dependency ranges → Metadata capabilities: reports ranges
- BOM ranges → Metadata capabilities: reports ranges
