core concepts

Blueprints (blueprint.yaml)

Describing how to run your Software, with Source Code.

Specification

The Noop blueprint.yaml file defines your application’s components, routes, resources, and lifecycle events.

components

The blueprint.yaml must declare a components root element as a list of objects containing configuration for each component in your application. At least one component object must be defined.

components:
  - name: webserver
  # ...
  - name: api
  # ...

name

Defines the name of the component. Each component name must be unique. Required.

type

Specifies the type of the component; must be one of service, task, or static. Required.

image

Sets the base image from which the component is built. Required.

port

The container port to expose.

root

Establishes the build context, setting the host working directory for copy and run build step commands.

build

Defined configuration to be used during the build time of a component instance.

cpu

Used to specify the maximum number of CPU cores available to a component instance at build time. Default: 1.

memory

Used to specify the maximum memory (in MB) available to a component instance at build time. Default: 1024.

variables

Defines variables to be accessible at build time. Each variable is a mapping object, where the object key is the variable name and the object value is the variable value. Variables can make use of Noop Logic to dynamically resolve values at build time. The scopes available at build time include $org, $app, $build, $source, and $execution.

components:
  # ...
  - build:
      # ...
      variables:
        NODE_ENV: production
        APP_ID:
          $app: id
        LOG_LEVEL: info

steps

Defines a series of steps to be executed in creating the component image. Steps are defined as an array of mappings, where the mapping key is the step instruction and the mapping value is the argument for that instruction.

directory

Sets the working directory of the image for build step commands that follow.

copy

Copies files from the host to the image. The copy step can take both string and array types as arguments. Strings can use the wildcard symbol ’*’ to pattern match files. Arrays must have at least one element, where elements represent individual files to be copied from host to image. The copy step object can be used in conjunction with the optional destination key to specify the image directory in which files are to be copied.

components:
  # ...
  - build:
      steps:
        - directory: /express
        - copy: package*.json
          destination: ./
        - copy: [index.js, dynamodb.js, s3.js]
          destination: ./
    # ...
run

Executes a command in the current working directory. If no directory step precedes the run step, the command will execute in the base image’s working directory.

image

Specifies an image to be used for multi-stage builds. The optional stage key can be used to name the build stage. The build stage should be a string value and cannot equal main, which is the name of the primary build stage.

components:
  # ...
  - build:
      steps:
        # ...
        - image: node:24
          stage: server-build
    # ...

runtime

runtime defines properties associated with a component instance. runtime properties affect build Deployments, specifying container execution commands, instance memory, component resources, and component variables.

resources

Resources that a component will use must be defined in the resources property of a component’s runtime section. Resources are an array of strings, where the string value corresponds to the name of the resource as defined in the Blueprint Manifest resources section.

components:
  # ...
  - runtime:
      resources:
        - DynamoDBTable
        - S3Bucket
    # ...
resources:
  - name: DynamoDBTable
    type: dynamodb
    hashKeyName: id
    hashKeyType: S
  - name: S3Bucket
    type: s3

entrypoint

Defines a container ENTRYPOINT instruction used to specify a command that will be executed when the container starts.

command

Defines a container CMD instruction used to specify a command that will be executed when the container starts. If used in conjunction with entrypoint, the value of command specifies arguments that will be passed to the entrypoint command.

cpu

Used to specify the maximum number of CPU cores available to a component instance at runtime. Default: 1.

memory

Used to specify the maximum memory (in MB) available to a component instance at runtime. Default: 1024.

variables

Defines variables to be accessible at runtime. Each variable is a mapping object, where the object key is the variable name and the object value is the variable value. Variables can make use of Noop Logic to dynamically resolve values at runtime. The scopes available at runtime include $org, $app, $env, $build, $source, $resources, and $stack. A common pattern to assign a variable the value of a resource property is to use the $resources scope object with the corresponding resource object and property.

components:
  # ...
  - runtime:
      # ...
      variables:
        S3_BUCKET:
          $resources: ImagesBucket.bucket
        S3_ENDPOINT:
          $resources: ImagesBucket.endpoint
        LOG_LEVEL: info

resources

Resources include Postgres, MySQL, Redis, Amazon DynamoDB, and Amazon S3. To create a resource in your Application, specify the name, type, and optional configuration parameters.

Here is a minimal definition of each resource type:

resources:
  - name: DynamoDBTable
    type: dynamodb
    hashKeyName: id
    hashKeyType: S
  - name: S3Bucket
    type: s3
  - name: EphemeralCache
    type: redis
  - name: RecordsDB
    type: postgresql
  - name: OtherDB
    type: mysql

name

Defines the name of the resource. Required.

type

One of dynamodb, postgresql, mysql, s3, or redis. Required.

How to reference a resource from Application components

To associate the resources with your Application components (Services and Tasks), define them on the components.[n].runtime.resources property.

components:
  # ...
  - runtime:
      resources:
        - DynamoDBTable
        - S3Bucket
    # ...
resources:
  - name: DynamoDBTable
    type: dynamodb
    hashKeyName: id
    hashKeyType: S
  - name: S3Bucket
    type: s3

When specifying a Dynamo table, there are a couple of other required and optional properties.

hashKeyName (Dynamo-specific)

Alphanumeric name; hyphens and underscores are allowed. Required.

hashKeyType (Dynamo-specific)

One of S, N, or B. Required.

rangeKeyName (Dynamo-specific)

Alphanumeric name; hyphens and underscores are allowed.

rangeKeyType (Dynamo-specific)

One of S, N, or B.

routes

Routes get internet traffic to your Application. Specifically, Routes connect your Application’s Service and Static Components to the internet.

target

The name of the static or service Component to send traffic to. Required

pattern

String representing the URL path portion to match when forwarding traffic. Accepts /* and /** notation.

internal

Boolean. Determines whether the route is publicly accessible.

methods

Array of HTTP methods: GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS.

condition

Uses Noop Logic. Other conditional rules determine if traffic should resolve to the target.

lifecycles

Lifecycle events allow your Application to run a task or group of tasks when the specified event is triggered.

event

One of BeforeServices, BeforeTraffic, or AfterTraffic. Required

components

Array of task Components. Components are executed in series. Required

Complete blueprint.yaml Example

Expressed in Source Code at .noop/blueprint.yaml

# Sample Blueprint Manifest
components:
  - name: ApiService
    type: service
    image: node:24-alpine
    port: 8080
    health:
      checker: tcp # cmd [command], http [path, port]
      interval: 10
      retries: 5
      port: 80
    build: # $org $app $build $source $execution
      cpu: 2
      memory: 512
      variables:
        NODE_ENV: production
      steps:
        - directory: /server
        - copy: package*.json
          destination: package*.json
        - run: npm ci --ignore-scripts
    runtime: # $org $app $env $build $source $resources $stack
      resources:
        - ItemsDatabase
        - ImagesBucket
      command: npm start
      cpu: 1
      memory: 256
      variables:
        S3_BUCKET:
          $resources: ImagesBucket.bucket
        S3_ENDPOINT:
          $resources: ImagesBucket.endpoint
        MYSQL_URL:
          $resources: ItemsDatabase.url
        LOG_LEVEL: info
  - name: MaintenanceJob
    type: task
    image: node:24-alpine
    root: cron_task/
    cron: '*/5 * * * *'
    build:
      steps:
        - directory: /cron
        - image: foo
          stage: bar
        - copy: [package-lock.json, package.json]
          destination: /app/src
          from: main
        - copy: lib/
        - run: npm ci
        - copy: cron_task.js
    runtime:
      command: node cron_task.js
      entrypoint: /bin/bash
      resources:
        - ItemsDatabase
      variables:
        MYSQL_URL:
          $resources: ItemsDatabase.url
lifecycles:
  - event: BeforeServices
    components:
      - MaintenanceJob
routes:
  - pattern: /api/*
    methods: [GET, POST]
    target:
      component: ApiService
  - pattern: /system/*
    internal: true
    target:
      component: ApiService
    condition:
      $request:
        not:
          cidr: [var: x-forwarded-for, 50.16.0.0/15]
resources:
  - name: MySQLDatabase
    type: mysql
  - name: S3Bucket
    type: s3