Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions docs/deployment/manifest-format.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,8 @@ Publishing the manifest from the default starter template for Aspire produces th
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
"ConnectionStrings__cache": "{cache.connectionString}",
"services__apiservice__0": "{apiservice.bindings.http.url}",
"services__apiservice__1": "{apiservice.bindings.https.url}"
"services__apiservice__http__0": "{apiservice.bindings.http.url}",
"services__apiservice__https__0": "{apiservice.bindings.https.url}"
},
"bindings": {
"http": {
Expand Down Expand Up @@ -142,8 +142,8 @@ This dependency is known because the environment variables for the _webfrontend_
"env": {
// ... other environment variables omitted for clarity
"ConnectionStrings__cache": "{cache.connectionString}",
"services__apiservice__0": "{apiservice.bindings.http.url}",
"services__apiservice__1": "{apiservice.bindings.https.url}"
"services__apiservice__http__0": "{apiservice.bindings.http.url}",
"services__apiservice__https__0": "{apiservice.bindings.https.url}"
},
```

Expand Down Expand Up @@ -228,6 +228,25 @@ The connection string placeholder references the `password` input parameter from

The preceding JSON snippet shows the `inputs` field for a resource that has a `connectionString` field. The `password` input parameter is a string type and is marked as a secret. The `default` field is used to specify a default value for the input parameter. In this case, the default value is generated using the `generate` field, with random string of a minimum length.

When a parameter is using a filter (for example `uri`), the manifest contains an additional resource that represents the filtered projection.

- The resource type is `"annotated.string"`.
- `value` references the raw parameter value (`{parameter-name.value}`).
- `filter` names the formatter (e.g., `"uri"`, ...).
- The resource name is derived from the parameter name and format (`{parameter}-{format}-encoded`). Names are deduplicated if multiple projections share the same base.

Copy link

Copilot AI Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation states that names are deduplicated but doesn't explain how deduplication works or what the resulting names would look like. Consider adding an example or brief explanation of the deduplication strategy.

Suggested change
For example, if multiple projections would result in the same base name, a numeric suffix is appended to ensure uniqueness (for example, `redis-password-uri-encoded`, `redis-password-uri-encoded-1`, `redis-password-uri-encoded-2`, etc.).

Copilot uses AI. Check for mistakes.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot update to mention it's using {format} to deduplicate

Example projection generated for a URI-encoded password:

```json
"redis-password-uri-encoded": {
"type": "annotated.string",
"value": "{redis-password.value}",
"filter": "uri"
}
```

The original parameter remains in the manifest, preserving its secret metadata. Tools should apply the indicated `filter` when materializing the value.

## Built-in resources

The following table is a list of resource types that are explicitly generated by Aspire and
Expand Down
Loading