Skip to content

Manifest

Boilerplate can produce a manifest file that records every file it generated during a run, along with SHA256 checksums for each file. This is useful for:

  • Auditing: knowing exactly which files were created by a template
  • Drift detection: comparing checksums to see if generated files were modified after the fact
  • CI/CD pipelines: programmatically consuming the list of generated files in downstream steps

Use the --manifest flag to write a manifest to the output directory:

Terminal window
boilerplate \
--template-url ./templates/service \
--output-folder ./output \
--non-interactive \
--manifest

This creates boilerplate-manifest.yaml inside the output folder.

To write the manifest to a custom path, use --manifest-file:

Terminal window
boilerplate \
--template-url ./templates/service \
--output-folder ./output \
--non-interactive \
--manifest-file ./reports/manifest.yaml

--manifest-file implies --manifest, so you don’t need to pass both.

The manifest format is determined by the file extension:

ExtensionFormat
.jsonJSON
.yaml, .yml (or anything else)YAML

The manifest contains the following fields:

FieldDescription
SchemaVersionURL pointing to the Manifest Schema for the manifest format
TimestampUTC timestamp of the generation run (RFC 3339)
TemplateURLThe --template-url value used for this run
BoilerplateVersionVersion of boilerplate that produced the output
SourceChecksumChecksum of the template source. For git sources: git-sha1:<commit> or git-sha256:<commit>. For local sources: sha256:<hex>
OutputDirThe --output-folder value used for this run
VariablesUser-defined template variables used during generation (builtin variables are excluded)
DependenciesArray of dependencies that were processed (or skipped) during the run
Dependencies[].NameName of the dependency
Dependencies[].TemplateURLResolved template URL for the dependency
Dependencies[].OutputFolderResolved output folder for the dependency
Dependencies[].SourceChecksumChecksum of the dependency’s template source
Dependencies[].SkipRendered skip expression (present even for skipped dependencies)
Dependencies[].ForEachList of for_each values used for this entry
Dependencies[].ForEachReferenceThe for_each_reference variable name, if set
Dependencies[].VarFilesVariable files specified on the dependency
Dependencies[].VariablesResolved variable values passed to the dependency
Dependencies[].FilesArray of files generated by this dependency (with checksums)
Dependencies[].Files[].PathPath of the generated file, relative to the dependency’s output directory
Dependencies[].Files[].ChecksumChecksum of the file contents, prefixed with the hash algorithm (e.g. sha256:a1b2c3…)
Dependencies[].DontInheritVariablesWhether the dependency opted out of inheriting parent variables
FilesArray of generated files
Files[].PathPath of the generated file, relative to the output directory
Files[].ChecksumChecksum of the file contents, prefixed with the hash algorithm (e.g. sha256:a1b2c3…)
SchemaVersion: "https://boilerplate.gruntwork.io/schemas/manifest/v1/schema.json"
Timestamp: "2026-02-24T12:00:00Z"
TemplateURL: ./templates/service
BoilerplateVersion: v0.6.0
SourceChecksum: "sha256:a1b2c3d4e5f6..."
OutputDir: ./output
Variables:
ServiceName: my-service
Port: 8080
Dependencies:
- Name: vpc
TemplateURL: ./modules/vpc
OutputFolder: ./output/vpc
Variables:
cidr: "10.0.0.0/16"
Files:
- Path: main.tf
Checksum: "sha256:b2c3d4e5f6a1..."
- Name: logging
TemplateURL: ./modules/logging
OutputFolder: ./output/logging
Skip: "true"
Files:
- Path: main.go
Checksum: "sha256:a1b2c3d4e5f6..."
- Path: README.md
Checksum: "sha256:f6e5d4c3b2a1..."
{
"SchemaVersion": "https://boilerplate.gruntwork.io/schemas/manifest/v1/schema.json",
"Timestamp": "2026-02-24T12:00:00Z",
"TemplateURL": "./templates/service",
"BoilerplateVersion": "v0.6.0",
"SourceChecksum": "sha256:a1b2c3d4e5f6...",
"OutputDir": "./output",
"Variables": {
"ServiceName": "my-service",
"Port": 8080
},
"Dependencies": [
{
"Name": "vpc",
"TemplateURL": "./modules/vpc",
"OutputFolder": "./output/vpc",
"Variables": {
"cidr": "10.0.0.0/16"
},
"Files": [
{
"Path": "main.tf",
"Checksum": "sha256:b2c3d4e5f6a1..."
}
]
},
{
"Name": "logging",
"TemplateURL": "./modules/logging",
"OutputFolder": "./output/logging",
"Skip": "true"
}
],
"Files": [
{
"Path": "main.go",
"Checksum": "sha256:a1b2c3d4e5f6..."
},
{
"Path": "README.md",
"Checksum": "sha256:f6e5d4c3b2a1..."
}
]
}

Boilerplate publishes a formal JSON Schema for the manifest format. The SchemaVersion field in every generated manifest contains the schema URL, making it easy to identify which schema version was used and to fetch the schema for validation.

manifest/v1/schema.json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://boilerplate.gruntwork.io/schemas/manifest/v1/schema.json",
"properties": {
"Variables": {
"type": "object",
"description": "User-defined template variables used during generation"
},
"SchemaVersion": {
"type": "string"
},
"Timestamp": {
"type": "string"
},
"TemplateURL": {
"type": "string"
},
"BoilerplateVersion": {
"type": "string"
},
"SourceChecksum": {
"type": "string",
"pattern": "^(git-sha1|git-sha256|sha256):.+$",
"description": "Checksum of the template source. For git sources: git-sha1:{commit} or git-sha256:{commit}. For local sources: sha256:{hex}."
},
"OutputDir": {
"type": "string"
},
"Dependencies": {
"items": {
"properties": {
"Variables": {
"type": "object"
},
"Name": {
"type": "string"
},
"TemplateURL": {
"type": "string"
},
"OutputFolder": {
"type": "string"
},
"SourceChecksum": {
"type": "string"
},
"Skip": {
"type": "string"
},
"ForEachReference": {
"type": "string"
},
"Files": {
"items": {
"properties": {
"Path": {
"type": "string"
},
"Checksum": {
"type": "string",
"pattern": "^[a-z0-9]+:.+$",
"description": "Hash of the file contents, prefixed with the algorithm (e.g. sha256:abcdef…)"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"Path",
"Checksum"
]
},
"type": "array"
},
"VarFiles": {
"items": {
"type": "string"
},
"type": "array"
},
"ForEach": {
"items": {
"type": "string"
},
"type": "array"
},
"DontInheritVariables": {
"type": "boolean"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"Name",
"TemplateURL",
"OutputFolder"
]
},
"type": "array"
},
"Files": {
"items": {
"properties": {
"Path": {
"type": "string"
},
"Checksum": {
"type": "string",
"pattern": "^[a-z0-9]+:.+$",
"description": "Hash of the file contents, prefixed with the algorithm (e.g. sha256:abcdef…)"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"Path",
"Checksum"
]
},
"type": "array"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"Variables",
"SchemaVersion",
"Timestamp",
"TemplateURL",
"BoilerplateVersion",
"SourceChecksum",
"OutputDir",
"Dependencies",
"Files"
],
"title": "Boilerplate Manifest Schema",
"description": "Schema for boilerplate generation manifest"
}

Each run overwrites the previous manifest, so it always reflects the most recent generation. If you need to preserve history across runs, track the manifest in version control (e.g. Git).

The manifest schema is versioned via the URL path (e.g. .../v1/schema.json). Every generated manifest records the schema version it conforms to in the SchemaVersion field, so consumers can detect which version they are working with.

A new schema version is published whenever the schema changes. Breaking changes (removing fields, changing types, etc.) are avoided when possible, but when necessary they will accompany a breaking release of Boilerplate itself: minor releases before 1.0, and major releases afterwards.