Skip to main content
Blueprints package multiple services together as a reusable deployment unit with configurable inputs. They enable you to create templates for common deployment patterns and allow customization at install time.

Blueprint functions

Blueprints support special functions for accessing user inputs and environment properties during configuration.
For generic template functions like toYaml, lower, join, etc., see Template Functions.

input

Access user-provided blueprint input values.

Environment functions

These functions provide information about the target environment during blueprint installation:

EnvironmentName

Returns the name of the environment where the blueprint is being installed.

EnvironmentProviderType

Returns the cloud provider type: "aws", "gcp", or "azure".

EnvironmentOrgId

Returns the organization ID.

EnvironmentNamespace

Returns the default namespace for the environment, which is named after the environment. Use it inside config and other templated fields. The installations[].namespace field itself is a literal and is not templated; omit it to install into the default namespace.

EnvironmentReleaseChannel

Returns the release channel (e.g., “stable”, “beta”).

Conditionals

Blueprints support conditionals for dynamic configuration based on user inputs and environment properties.
Important: Blueprint functions (input, Environment*) are evaluated when blueprint is installed or when blueprint inputs are changed, while .ryvn references are evaluated at deploy-time. You cannot mix blueprint functions and .ryvn syntax in the same conditional statement.

Conditional installations

Control which services are installed based on inputs or environment:

Conditional configuration

Use conditionals within configuration blocks:

Conditional inputs

Show inputs based on other input values:

Branch deployments

Add a branches list to give each git branch its own release line. A push to a listed branch produces a release on the auto-created branch:{name} channel; pushes to unlisted branches don’t produce a release.
Each branch’s releases are versioned independently (e.g. 1.0.0-main, 1.0.0-develop). To install, set the BlueprintInstallation’s branch to the branch you want to track.

Release versions

By default Ryvn numbers blueprint releases automatically: every sync that changes the blueprint definition bumps the version according to the detected change class, and a sync that leaves the definition unchanged produces no release. Set spec.version to publish a release under an exact version you choose instead:
  • The value is an exact SemVer version X.Y.Z with an optional pre-release suffix such as 1.4.0-rc.1. A v prefix, ranges, partial versions like 1.4, build metadata (+...) and preview.* pre-releases are rejected.
  • Omit spec.version to keep automatic numbering. ryvn get blueprint <name> -o yaml returns the stored source, so spec.version in that output tells you whether a blueprint uses an exact version; ryvn describe blueprint and the blueprint definition page show the version of the latest release.
  • Publishing identical content under a version that already exists reuses that release (unchanged). Publishing different content under an existing version is refused as a conflict, and a version that has been retired is refused as retired. Neither falls back to an automatic number: fix or change spec.version and sync again.
  • ryvn plan lists the release as a BlueprintRelease entry named by the requested version under the blueprint: create when the version is free, unchanged when an identical release already holds it, or blocked with the reason when it cannot be published as-is (a different definition holds the version, or the version is retired). Changing spec.version without changing the definition is still shown as a change. After a sync, the published release appears the same way under the blueprint in CLI output and on the Git Sync pages, with its version, action and release ID.
  • Pull request previews keep their generated -preview.* identity and never consume the stable version; spec.version is published only when the pull request merges to the source branch.
  • Maintenance versions are allowed: publishing 1.4.3 after 2.0.0 exists creates the release, but it does not become the head of a channel that already carries a higher version.
  • Git sync converges on the current commit: when several commits land before a pull sync runs, intermediate commits may be skipped and only the resulting spec.version is published.
  • Any service, release channel, promotion pipeline or blueprint referenced by the source must already exist. A blueprint that first appears in a pull request has no existing blueprint to preview against, so the pull request check reports it as skipped and its first release is published when the pull request merges.

Publishing from source versus importing a release

Setting spec.version publishes from the synced source. To bring an existing release to another hub without a source repository, export it and import the document as-is:
The document names the blueprint and the exact version and carries the full definition:
The import follows the same rules as source publishing: identical content is unchanged, different content under the same version is a conflict. It never activates a channel or installation; promote the release afterwards with ryvn promote release --blueprint=redis --version=1.4.0 --target=<channel>. A blueprint whose releases are created or imported this way must stay outside the paths that git sync manages, because a synced source would otherwise republish and overwrite the manual definition.

Composing blueprints

An installations entry is either a service (service:) or another blueprint (blueprint:). A blueprint: entry installs the named blueprint as a child, so you can assemble a bundle from smaller reusable blueprints instead of re-declaring their services. Consumers install the parent like any other blueprint (see BlueprintInstallation); the children come with it.

Passing inputs down

Each entry in a child’s inputs list sets one of the child blueprint’s inputs, using either a literal value or valueFromInput to forward one of the parent’s inputs. Forwarded secret inputs stay in the secrets system end to end; a secret parent input cannot feed a non-secret child input. valueFromOutput is not supported as a child input source. If a child needs a value produced by another installation, re-expose that value through the producing blueprint’s outputs and consume it from there.

Consuming child outputs

Sibling installations read a child’s outputs with valueFromOutput and blueprintInstallation: <alias>, as in the example above. Non-secret outputs are also available in templates as {{ (blueprintInstallation "db").outputs.<name> }}. The parent can re-expose a child output in its own outputs:

Release selection

A child follows the head of a release channel. The channel is resolved in order: the child entry’s releaseChannel (or branch), then the channel the parent installation is on, then the environment’s default channel. Blueprints from the marketplace or another organization’s catalog follow that organization’s stable channel, and a private blueprint owned by another organization requires an accepted share.

Naming

The child installation gets the name you set (default: the blueprint’s name), with no automatic prefix. All service installations in an environment share one name namespace and a collision fails the install, so template child names with {{ ParentInstallationName }} to keep each parent’s children unique.

Lifecycle

Children install, upgrade, and uninstall with the parent. Each child is its own blueprint installation, linked to its parent in the dashboard and in ryvn describe blueprint-installation. Editing a child installation directly excludes it from future parent updates; it shows as “excluded from blueprint updates”.
Blueprints can nest up to 3 levels deep, and cycles are rejected. On a child entry, releaseChannel and branch are mutually exclusive.

Properties

name

string — required Unique identifier for this blueprint. Used to reference the blueprint from environments.

description

string — required Detailed description of what this blueprint provides and its purpose.

displayName

string — optional Human-readable name displayed in the UI. If not provided, the name is used.

distribution

string — optional, default private How the blueprint is published. One of:
  • private: visible only to the owning organization. Share it with other organizations through a resource share; consumers install it on the release channel the share names.
  • marketplace-unmanaged: listed in the Blueprint Marketplace without Ryvn maintenance guarantees.
  • marketplace-managed: listed in the marketplace and maintained by Ryvn.

version

string — optional Exact SemVer version (X.Y.Z with an optional pre-release suffix) to publish the next release under. Omit to number releases automatically. See Release versions.

promotionPipeline

string — optional Name of the promotion pipeline to apply to this blueprint. All releases of this blueprint will follow the pipeline’s promotion paths.

branches

array — optional Configures per-branch release lines. See Branch deployments.

branches[].name

string — required Name of the git branch. Each entry auto-creates a corresponding branch:{name} release channel; subscribe a BlueprintInstallation via its branch field.

installations

array — required List of installations included in this blueprint. Each entry installs either a service (service) or a nested blueprint (blueprint). See Composing blueprints.

installations[].service

string — required for service entries Name of the service to include in this blueprint.

installations[].blueprint

string — required for blueprint children Name of the blueprint to install as a nested child. See Composing blueprints.

installations[].releaseChannel

string — optional, blueprint children only Release channel the child follows. If not set, the child uses the parent installation’s channel, then the environment’s default channel. Mutually exclusive with branch.

installations[].branch

string — optional, blueprint children only Branch release line the child follows (see Branch deployments). Mutually exclusive with releaseChannel.

installations[].inputs

array — optional, blueprint children only Values for the child blueprint’s inputs. Each entry has a name and exactly one of value (a literal) or valueFromInput (forward a parent input).

installations[].excludedInstallations

array — optional, blueprint children only Names of installations inside the child blueprint to skip, like excludedInstallations on a BlueprintInstallation.

installations[].name

string — optional Custom name for this installation. If not provided, the service or blueprint name is used.

installations[].alias

string — optional A stable reference handle for this installation within the blueprint, used by sibling valueFromOutput references and serviceInstallation / blueprintInstallation template functions. Defaults to name (or the service name when name is not set). Use alias when the installation name is dynamic (contains template expressions) or when conditional installations (e.g. different Terraform modules per cloud provider) should be referenced the same way by siblings:
Without alias, each conditional installation would have a different reference handle, forcing consumers to duplicate the provider condition in every reference.

installations[].namespace

string — optional Kubernetes namespace to install the service into. If not provided, uses the environment’s default namespace, which has the same name as the environment. Cannot be changed after install. See Namespaces.

installations[].condition

string — optional Condition expression that determines whether this installation should be created. Supports template syntax with comparison operators.

installations[].config

string or array — optional Configuration for the service installation. Can be a YAML string or array of config items. Supports templating with blueprint inputs.

installations[].lifecycle

object — optional Lifecycle hooks for an installation declared inside this blueprint. See Job installation › lifecycle for the full field reference.
Lifecycle hook targets must be job installations in the same environment, and only one hook is allowed per phase.

installations[].dependencies

array — optional Installation dependencies for a service child. The child’s first install waits until each entry is ready. Entries use the same serviceInstallation and service keys as a standalone installation (see server › dependencies); a serviceInstallation value may be a sibling child’s alias or name, which resolves to that child’s installation name. Values support blueprint templating. Not supported on nested blueprint: children. See Installation Dependencies.

installations[].secrets

array — optional List of secrets for the service installation. Secrets can be generated or populated from blueprint inputs.
For server and job service types, prefer using secret environment variables via the env property instead of secrets, as they may conflict.

installations[].secrets[].name

string — required The name of the Kubernetes secret to create.

installations[].secrets[].generated

object — optional Configuration for auto-generating secret values. Cannot be used with values.
Available generation types:
  • random-string — Generate a random alphanumeric string
  • random-bytes — Generate random bytes (base64 encoded)
  • rsa-key — Generate an RSA key pair
  • ec-key — Generate an EC key pair
The length property is only applicable for random-string and random-bytes types.

installations[].secrets[].values

array — optional List of individual secret key-value pairs. Each value can reference a blueprint input or generated input.

installations[].secrets[].valueFromInput

string or object — optional Reference the entire secret value from a blueprint input. The input must be of type map and marked with isSecret: true. For generated string inputs, use values instead.

installations[].env

array — optional List of environment variables to pass to the service at runtime.

installations[].env[].key

string — required The name of the environment variable.

installations[].env[].value

string — optional The static value of the environment variable.

installations[].env[].valueFromInput

string or object — optional Reference the value from a blueprint input.

installations[].env[].valueFromOutput

object — optional Reference an output value from a sibling service installation or blueprint installation within the same blueprint. Use the sibling’s alias (or name) as the reference handle.
Exactly one of serviceInstallation or blueprintInstallation must be specified.

inputs

array — optional List of input parameters that can be configured when installing the blueprint.

inputs[].name

string — required Unique identifier for this input parameter.

inputs[].type

string — required Type of the input parameter. Valid values: string, number, boolean, array, map

inputs[].isSecret

boolean — optional (default: false) Whether this input contains sensitive data.

inputs[].displayName

string — optional Human-readable name displayed in the UI. If not provided, the name is used.

inputs[].description

string — optional Detailed description of what this input is for.

inputs[].default

any — optional Default value for the input. If not provided, the input is required at install time.

inputs[].group

string — optional Name of the input group this input belongs to. Inputs in the same group are displayed together.

inputs[].condition

string — optional Condition expression that determines whether this input should be displayed. Supports template syntax.

inputs[].hidden

boolean — optional (default: false) Hides this input from the Dashboard installation form. Useful for internal configuration values like system defaults or automation-managed settings.
Hidden inputs can still be set when installing a blueprint via the API or IaC (Resources as Code).

inputs[].generated

object — optional Configuration for auto-generating input values. Generated inputs are automatically populated when the blueprint is installed. Useful for credentials, API keys, or unique identifiers.
Available generation types:
  • random-string — Generate a random alphanumeric string
  • random-bytes — Generate random bytes (base64 encoded)
  • rsa-key — Generate an RSA key pair
  • ec-key — Generate an EC key pair
The length property is only applicable for random-string and random-bytes types.
Generated values are preserved across blueprint updates. Users can force regeneration from the Dashboard if needed.

inputs[].defaultFrom

object — optional Pull the default value from an environment-scoped variable group when the blueprint is installed and no explicit value is provided. Only valid for map type inputs with isSecret: true. Mutually exclusive with default and generated.
When a blueprint with defaultFrom is installed into an environment, the system looks up the named variable group in that environment and uses its key-value pairs as the input value. If no variable group with that name exists, the input remains unset and must be provided explicitly.

inputs[].defaultFrom.variableGroup

string — required Name of the variable group in the target environment. The group must exist when the blueprint is installed.

outputs

array — optional List of outputs exposed by this blueprint. Outputs let blueprint consumers reference values produced by the blueprint’s underlying service installations (e.g., terraform outputs like database endpoints or connection strings). Non-secret outputs are available via template syntax: {{ (blueprintInstallation "name").outputs.<outputName> }}. All outputs (including secrets) can be consumed via valueFromOutput.

outputs[].name

string — required Unique identifier for this output within the blueprint.

outputs[].type

string — required Type of the output value. Valid values: string, number, boolean.

outputs[].from

string — required Template expression that resolves the output value from installation outputs. Uses the serviceInstallation function to reference outputs: (serviceInstallation "name").outputs.<key>.

outputs[].description

string — optional Detailed description of what this output represents.

outputs[].displayName

string — optional Human-readable name displayed in the UI.

outputs[].isSecret

boolean — optional (default: false) If true, this output contains sensitive data. Secret outputs are routed through the secrets system — they are encrypted at rest, masked in the UI, and never rendered into plaintext manifests or resource reports. Secret outputs are not available via template syntax. They must be consumed via valueFromOutput in env vars or secrets definitions.

outputs[].condition

string — optional Condition expression that determines whether this output is available. Uses template syntax with blueprint functions.
If the condition evaluates to false, the output is not produced and its status will show as skipped.

inputGroups

array — optional Groups for organizing inputs in the UI.

inputGroups[].name

string — required Unique identifier for this input group.

inputGroups[].displayName

string — required Display name shown in the UI.

inputGroups[].description

string — optional Description for the group.

inputGroups[].condition

string — optional Condition expression that determines whether this group should be displayed. If false, all inputs in the group are hidden.

Blueprint installation inputs

When installing a blueprint, you provide values for the blueprint’s defined inputs. Each input value can be set using one of the following options:

inputs[].value

any — optional A literal value for the input.

inputs[].valueFromVariableGroup

object — optional Reference an environment-scoped variable group by name. Only valid for map type inputs with isSecret: true.
This is useful when different environments have the same set of credentials stored in a variable group with a consistent name. The variable group must exist in the target environment.
valueFromVariableGroup is the explicit installation-time equivalent of defaultFrom on the blueprint input definition. Use defaultFrom when you want the variable group to be the fallback when no value is provided, and use valueFromVariableGroup when you want to explicitly bind the input to a variable group.

inputs[].valueFromVariableGroup.name

string — required Name of the variable group in the target environment.

inputs[].valueFromVariableGroup.key

string — optional The specific key to get from the variable group. If not specified, the entire variable group key-value map is used. When a key is specified, only that key’s value is used as the input value.

Examples

Basic blueprint

Package multiple services together:

Blueprint with inputs

Allow configuration at install time:

Blueprint with conditional inputs

Show inputs based on other input values:

Blueprint with generated inputs

Auto-generate credentials and tokens:

Blueprint with variable group defaults

Use environment-scoped variable groups as default values for secret map inputs. This allows each environment to provide its own credentials through a variable group with a consistent name:
When installed, the system looks up the db-credentials variable group in the target environment and uses its key-value pairs. You can override this at install time:

Provider-specific configuration

Configure services differently based on cloud provider:

Multi-tier application

Complex blueprint with multiple conditional features:

Blueprint with outputs

Expose values from underlying installations for other services to consume:
Consuming services can reference blueprint outputs via valueFromOutput:
Or reference non-secret outputs in config templates:
Secret outputs (isSecret: true) are not available via template syntax. They must be consumed via valueFromOutput in env vars or secrets definitions to ensure they flow through the secrets system.

Storage configuration by provider

Demonstrate provider-specific storage configurations:

Branch-based deployments

Maintain main and develop release lines side by side:
Pushes to main produce releases on the branch:main channel; pushes to develop produce releases on branch:develop. Each environment subscribes to whichever branch it should track.