A project descriptor allows users to detail configuration for apps, services, functions and buildpacks. It should, by default, be named project.toml, though users can name it differently, and pass the filename to pack by calling

$ pack build --descriptor <project-descriptor path>

The schema for the project descriptor is:

  • project (table, optional)

    A configuration table for a project.

    • id (string, optional)
      A machine readable identifier for the project. For example, com.example.myservice.

    • name (string, optional)
      A human readable identifier for the project. For example, My Example Service.

    • version (string, optional)
      The version of the project.

    • authors (string list, optional)
      The names and/or email addresses of the project authors.

    • documentation-url (string, optional)
      A link to the documentation for the project.

    • source-url (string, optional)
      A link to the source code of the project.

    • licenses (list, optional)
      A list of project licenses. Each must contain at least one of the following fields:

      • type (string, optional)
        The type of license.

      • uri (string, optional)
        If the project uses a nonstandard license, you may use uri to point to the license.

  • build (table, optional)

    A list of specifications for build-time configuration of the project.

    • env (list, optional) You can set environment variables at build time, by defining each with the following fields:

      • name (string, optional)
        The name of the environment variable

      • value (string, optional, default: latest)
        The assigned version of the environment variable

    • include (string list, optional)
      A list of files to include in the build, while excluding everything else.


    • exclude (string list, optional)
      A list of files to exclude from the build, while including everything else.

    If include and exclude are both present, the lifecycle will error out.

    • buildpacks (list, optional) A list of buildpacks. Either a version, uri, or script table must be included, but it must not include any combination of these elements.

      • id (string, optional)
        An identifier for the buildpack. Must match ID specified in buildpack’s buildpack.toml file.

      • version (string, optional, default: latest)
        The version of the buildpack. Must match version specified in buildpack’s buildpack.toml file.

      • uri (string, default=urn:buildpack:<id>)
        A URL or path to an archive, a packaged buildpack (saved as a .cnb file), or a directory. If path is relative, it must be relative to the project.toml.

      • script (list, optional) Defines an inline buildpack.

        • api (string, required, current: 0.5)
          The Buildpack API version the buildpack adheres to. Used to ensure compatibility against the lifecycle.

        • inline (string, required)
          The build script contents.

        • shell (string, optional, default=/bin/sh)
          The shell used to execute the inline script.

  • metadata (table, optional)

    Buildpacks and specific platforms are free to define additional arbitrary key-value pairs in the metadata table.


An example project.toml is:

id = ""
version = "0.1"

include = [

name = "JAVA_OPTS"
value = "-Xmx1g"

id = "io.buildpacks/java"
version = "1.0"

id = "io.buildpacks/nodejs"
version = "1.0"

foo = "bar"

buzz = ["a", "b", "c"]


For more detail, you can check out the project.toml specification