---
title: blossom app_plan:create
url: "/docs/reference/cli/app_plan/create/"
canonical_url: https://docs.blossom88.com/docs/reference/cli/app_plan/create/
markdown_url: https://docs.blossom88.com/docs/reference/cli/app_plan/create.md
summary: Save an App Plan and show its resources and capacity
categories:
- cli
- reference
---

# blossom app_plan:create

Save an App Plan and show its resources and capacity

## Usage

    blossom app_plan:create [--location LOCATION] [--data DATA] [--note NOTE] [--prepared-by PREPARED_BY]

## Flags

| Flag | Description |
| --- | --- |
| `--location` | Location id (defaults to profile or Account default) |
| `--data, -d` | YAML or JSON data, a path to a data file, or an HTTP(S) URL |
| `--note` | A note for whoever reviews the plan: why it exists, what to check, what an agent decided |
| `--prepared-by` | The tool or agent that prepared the plan, shown beside your name, such as "Claude Code" |

Examples:

    cd path/to/the/app
    blossom app_plan:create
    blossom app_plan:init
    blossom app_plan:create --data app_plan.yml
    blossom app_plan:create --note "Derived from the Procfile; check the port" --prepared-by "Claude Code"
    blossom app_plan:create -d '{"app_plan":{"quickstart":"ruby-sinatra"}}'
    blossom app_plan:create -d '{"app_plan":{"app_name":"demo","environment_name":"production","clone_url":"https://github.com/blossom-examples/ruby-sinatra","services":[{"name":"web","command":"web","port":3000}]}}'

Without `--data`, reads the intent from the repository in the working
directory, so `cd` into the repository first; there is no path or
directory flag. It takes the source from the origin remote, the App name
from the repository, and the Services from the Procfile, with `web` public
on port 3000 and release hooks left out. A buildpack repository without a Procfile
gets the bare `web` command, which runs the image's default web process.

Saves the App Plan and prints what deploying it will create: the App (new or
existing), the Environment, each Service with its command, port, whether
it is public or private, and allocation, the region, and the capacity the
region will need. Nothing is created until you deploy it, from the terminal
or from the Web UI:

    blossom app_plan:deploy --id app_plan-100

A plan is a reusable starter, not a managed resource: each deploy creates
one more Environment and the plan stays for the next one. `--note` leaves a
line for whoever reviews the plan, and `--prepared-by` names the tool or
agent that prepared it beside your name.

app_plan.yml:

```yaml
app_plan:
  app_name: demo
  environment_name: production
  repository_type: public
  clone_url: https://github.com/blossom-examples/ruby-sinatra
  services:
    - name: web
      command: web # or the exact command, e.g. bundle exec puma -C config/puma.rb
      port: 3000
      publicly_exposed: true
  # quickstart: ruby-sinatra   # prefill from the catalog instead
  location_id: location-100
```

A `quickstart` key from `blossom quickstart:list` prefills the source, the
App name, and the Service command of that example App; anything you set
alongside it wins.

Blossom detects how to build the source but never how to run it: every
Service needs a command. With a buildpack build the bare word `web` runs the
image's Procfile `web` process. Select a saved Location with `--location` or
`app_plan.location_id`; otherwise the profile or Account default applies.
Use `blossom location:list` for Blossom Cloud and Blossom BYOC destinations. Prices vary by
Location. Environments inherit their App's Location.

Local files and inline data support `$VAR` and `${VAR}` substitution from
`.env`, `BLOSSOM_VARS_FILE`, and the process environment, so write a Service
command that needs a literal `$PORT` as `$$PORT`. See `blossom help:data`.

After the first deploy, push variables and deploy again when they change:

    blossom env_var:push --environment environment-100
    blossom environment:deploy --id environment-100 --follow
