> ## Documentation Index
> Fetch the complete documentation index at: https://developer.upsun.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Creating Custom Reports using the Upsun CLI

export const PostMeta = ({data = {}}) => {
  const {author, date, image} = data;
  const authors = Array.isArray(author) ? author : author ? [author] : [];
  const resolveAuthor = slug => {
    const entry = AUTHOR_MAP[slug] || ({});
    const name = entry.name || slug;
    const github = entry.github || null;
    const linkedin = entry.linkedin || null;
    const url = github ? `https://github.com/${github}` : linkedin || null;
    const avatarUrl = github ? `https://github.com/${github}.png?size=64` : null;
    return {
      name,
      url,
      avatarUrl
    };
  };
  const formattedDate = date ? new Date(date).toLocaleDateString('en-US', {
    year: 'numeric',
    month: 'long',
    day: 'numeric'
  }) : null;
  if (!image && authors.length === 0 && !formattedDate) return null;
  const AUTHOR_MAP = {
    "aaron-collier": {
      "name": "Aaron Collier"
    },
    "aaron-dudenhofer": {
      "name": "Aaron Dudenhofer"
    },
    "aaron-porter": {
      "name": "Aaron Porter"
    },
    "adriaan-odendaal": {
      "name": "Adriaan Odendaal"
    },
    "ajmal": {
      "name": "Ajmal Siddiqui"
    },
    "akalipetis": {
      "name": "Antonis Kalipetis"
    },
    "alexander-varwijk": {
      "name": "Alexander Varwijk"
    },
    "alicia-bevilacqua": {
      "name": "Alicia Bevilacqua"
    },
    "amelie-deguerry": {
      "name": "Amelie Deguerry"
    },
    "anacidre": {
      "name": "Ana Cidre",
      "linkedin": "https://www.linkedin.com/in/ana-cidre"
    },
    "andoni": {
      "name": "Andoni Auzmendi"
    },
    "andrei-taranu": {
      "name": "Andrei (Alex) Taranu",
      "linkedin": "https://www.linkedin.com/in/andrei-alex-taranu/"
    },
    "andrew-baxter": {
      "name": "Andrew Baxter"
    },
    "andrew-melck": {
      "name": "Andrew Melck"
    },
    "antoine-crochet-damais": {
      "name": "Antoine Crochet Damais"
    },
    "augustin-delaporte": {
      "name": "Augustin Delaporte",
      "linkedin": "https://www.linkedin.com/in/augustindelaporte/"
    },
    "branislav-bujisic": {
      "name": "Branislav Bujisic"
    },
    "carl-smith": {
      "name": "Carl Smith"
    },
    "caroline-leroy": {
      "name": "Caroline Leroy"
    },
    "cati-mayer": {
      "name": "Cati Mayer"
    },
    "catplat": {
      "name": "C Trinkwon"
    },
    "ceelolulu": {
      "name": "Celeste van der Watt"
    },
    "chadwcarlson": {
      "name": "Chad Carlson",
      "github": "chadwcarlson",
      "linkedin": "https://www.linkedin.com/in/chadwcarlson"
    },
    "chris-ward": {
      "name": "Chris Ward"
    },
    "chris-yates": {
      "name": "Chris Yates"
    },
    "christian-sieber": {
      "name": "Christian Sieber"
    },
    "christopher-lockheardt": {
      "name": "Christopher Lockheardt"
    },
    "christopher-skene": {
      "name": "Christopher Skene"
    },
    "chuck-morgan": {
      "name": "Chuck Morgan"
    },
    "corey-dockendorf": {
      "name": "Corey Dockendorf"
    },
    "crell": {
      "name": "Crell"
    },
    "damz": {
      "name": "Damz"
    },
    "dan-morrison": {
      "name": "Dan Morrison"
    },
    "davidbonachera": {
      "name": "David Bonachera",
      "github": "davidbonachera",
      "linkedin": "https://www.linkedin.com/in/davidbonachera"
    },
    "dereliahmet1": {
      "name": "Ahmet Faruk Dereli"
    },
    "devicezero": {
      "name": "Jonas Kröger",
      "github": "devicezero",
      "linkedin": "https://www.linkedin.com/in/jonaskroeger/"
    },
    "doug-goldberg": {
      "name": "Doug Goldberg"
    },
    "duncan-naves": {
      "name": "Duncan Naves",
      "github": "duncannaves",
      "linkedin": "https://www.linkedin.com/in/duncan-naves-a94423aa"
    },
    "erika-bustamante": {
      "name": "Erika Bustamante"
    },
    "fabpot": {
      "name": "Fabien Potencier"
    },
    "flovntp": {
      "name": "Florent Huck",
      "github": "flovntp",
      "linkedin": "https://www.linkedin.com/in/florenthuck"
    },
    "fred-plais": {
      "name": "Fred Plais"
    },
    "gauthier-garnier": {
      "name": "Gauthier Garnier"
    },
    "gilzow": {
      "name": "Paul Gilzow"
    },
    "gmoigneu": {
      "name": "Guillaume Moigneu",
      "github": "gmoigneu",
      "linkedin": "https://www.linkedin.com/in/guillaumemoigneu/"
    },
    "gregqualls": {
      "name": "Greg Qualls"
    },
    "guguss": {
      "name": "Augustin Delaporte"
    },
    "haylee-millar": {
      "name": "Haylee Millar"
    },
    "ivana-kotur": {
      "name": "Ivana Kotur"
    },
    "jackrabbithanna": {
      "name": "Mark Hanna"
    },
    "jared-wright": {
      "name": "Jared Wright",
      "github": "jww-sh",
      "linkedin": "https://www.linkedin.com/in/jaredwaynewright"
    },
    "jessica-orozco": {
      "name": "Jessica Orozco"
    },
    "joey-stanford": {
      "name": "Joey Stanford"
    },
    "john-grubb": {
      "name": "John Grubb"
    },
    "jonas-kruger": {
      "name": "Jonas Kruger"
    },
    "kathryn-frazer": {
      "name": "Kathryn Frazer"
    },
    "kemiojo": {
      "name": "Kemi Elizabeth Ojogbede"
    },
    "kieronsambrook-smith": {
      "name": "Kieronsambrook Smith"
    },
    "laurent-arnoud": {
      "name": "Laurent Arnoud"
    },
    "letoya-boyne": {
      "name": "Letoya Boyne"
    },
    "lolautruche": {
      "name": "Jérôme Vieilledent"
    },
    "lyly-lepinay": {
      "name": "Lyly Lepinay"
    },
    "manauwar-alam": {
      "name": "Manauwar Alam"
    },
    "marc-antoine-porri": {
      "name": "Marc Antoine Porri"
    },
    "maria-antinkaapo": {
      "name": "Maria Antinkaapo"
    },
    "maria-de-anton": {
      "name": "Maria De Anton"
    },
    "mark-dorison": {
      "name": "Mark Dorison"
    },
    "markus-hausammann": {
      "name": "Markus Hausammann"
    },
    "mary-thomas": {
      "name": "Mary Thomas"
    },
    "mathias-bolt-lesniak": {
      "name": "Mathias Bolt Lesniak"
    },
    "mathieu-strauch": {
      "name": "Mathieu Strauch"
    },
    "matthias-van-woensel": {
      "name": "Matthias Van Woensel",
      "linkedin": "https://www.linkedin.com/in/matthias-van-woensel-267a069"
    },
    "michael-sharp": {
      "name": "Michael Sharp"
    },
    "mupsi": {
      "name": "Marine Gandy"
    },
    "natalie-harper": {
      "name": "Natalie Harper"
    },
    "ngommenginger": {
      "name": "Nicolas Gommenginger",
      "linkedin": "https://www.linkedin.com/in/nicolas-gommenginger"
    },
    "nicholas-bennison": {
      "name": "Nicholas Bennison"
    },
    "nicholas-vahalik": {
      "name": "Nicholas Vahalik"
    },
    "nick-hardiman": {
      "name": "Nick Hardiman"
    },
    "nickanderegg": {
      "name": "Nickanderegg"
    },
    "nicolas-grekas": {
      "name": "Nicolas Grekas",
      "github": "nicolas-grekas",
      "linkedin": "https://www.linkedin.com/in/nicolasgrekas/"
    },
    "niti-malwade": {
      "name": "Niti Malwade"
    },
    "opensocialteam": {
      "name": "Opensocialteam"
    },
    "ori-pekelman": {
      "name": "Ori Pekelman"
    },
    "otavio-santana": {
      "name": "Otavio Santana"
    },
    "palwandi": {
      "name": "Pawan Alwandi",
      "github": "pawpy",
      "linkedin": "https://www.linkedin.com/in/pawanalwandi"
    },
    "patrick-boest": {
      "name": "Patrick Boest"
    },
    "patrick-dawkins": {
      "name": "Patrick Dawkins",
      "github": "pjcdawkins",
      "linkedin": "https://www.linkedin.com/in/patrickdawkins"
    },
    "patrick-klima": {
      "name": "Patrick Klima"
    },
    "pjcdawkins": {
      "name": "Pjcdawkins"
    },
    "prineet-kaurbhurji": {
      "name": "Prineet Kaurbhurji"
    },
    "quentin-sinig": {
      "name": "Quentin Sinig"
    },
    "ralt": {
      "name": "Florian Margaine",
      "github": "ralt",
      "linkedin": "https://www.linkedin.com/in/florian-margaine-43971136"
    },
    "ramanathanramakrishnamurthy": {
      "name": "Ramanathanramakrishnamurthy"
    },
    "remi-lejeune": {
      "name": "Rémi Lejeune"
    },
    "ribel": {
      "name": "Taras Kruts"
    },
    "robert-douglass": {
      "name": "Robert Douglass"
    },
    "rudy-weber": {
      "name": "Rudy Weber"
    },
    "ryan-hicks": {
      "name": "Ryan Hicks"
    },
    "sabri-helal": {
      "name": "Sabri Helal"
    },
    "savannah-bergeron": {
      "name": "Savannah Bergeron"
    },
    "shannon-vettes": {
      "name": "Shannon Vettes"
    },
    "shawn-ogasawara": {
      "name": "Shawn Ogasawara",
      "linkedin": "https://www.linkedin.com/in/shawn-ogasawara-83a9a0/"
    },
    "shawna-spoor": {
      "name": "Shawna Spoor"
    },
    "shedrack-akintayo": {
      "name": "Shedrack Akintayo"
    },
    "simon-ruggier": {
      "name": "Simon Ruggier"
    },
    "sophie-van-der-kindere": {
      "name": "Sophie Van Der Kindere"
    },
    "stefanos-thampis": {
      "name": "Stefanos Thampis"
    },
    "stephen-weinberg": {
      "name": "Stephen Weinberg"
    },
    "sukhman-virk": {
      "name": "Sukhman Virk"
    },
    "sumaira-nazir": {
      "name": "Sumaira Nazir"
    },
    "sumer": {
      "name": "Sümer Cip"
    },
    "syed-raza": {
      "name": "Syed Raza"
    },
    "tamara-bacchia": {
      "name": "Tamara Bacchia"
    },
    "tara-arnold": {
      "name": "Tara Arnold"
    },
    "theosakamg": {
      "name": "Mickael Gaillard",
      "github": "theosakamg"
    },
    "thomasdiluccio": {
      "name": "Thomas di Luccio"
    },
    "tim-anderson": {
      "name": "Tim Anderson"
    },
    "tom-helmer-hansen": {
      "name": "Tom Helmer Hansen"
    },
    "tylermills": {
      "name": "Tyler Mills"
    },
    "upsun": {
      "name": "Upsun"
    },
    "veronika-tolkachova": {
      "name": "Veronika Tolkachova",
      "linkedin": "https://www.linkedin.com/in/veronika-tolkachova-169167a2"
    },
    "vince-parker": {
      "name": "Vince Parker"
    },
    "vinnie-russo": {
      "name": "Vincenzo Russo"
    },
    "vrobert78": {
      "name": "Vincent Robert",
      "github": "vrobert78",
      "linkedin": "https://www.linkedin.com/in/vincent-robert-498a883"
    },
    "yuriy-babenko": {
      "name": "Yuriy Babenko"
    },
    "yuriy-gerasimov": {
      "name": "Yuriy Gerasimov"
    }
  };
  return <div className="post-meta">
      {(authors.length > 0 || formattedDate) && <div className="post-meta-info">
          {authors.length > 0 && <div className="post-meta-authors">
              {authors.map(slug => {
    const {name, url, avatarUrl} = resolveAuthor(slug);
    const inner = <>
                    {avatarUrl && <img src={avatarUrl} alt={name} className="post-meta-avatar" />}
                    <span className="post-meta-author-name">{name}</span>
                  </>;
    return url ? <a key={slug} href={url} target="_blank" rel="noopener noreferrer" className="post-meta-author">
                    {inner}
                  </a> : <span key={slug} className="post-meta-author">{inner}</span>;
  })}
            </div>}
          {authors.length > 0 && formattedDate && <span className="post-meta-separator" aria-hidden="true">·</span>}
          {formattedDate && <span className="post-meta-date">{formattedDate}</span>}
        </div>}
      {image && <img src={image} alt="" className="post-meta-image" aria-hidden="true" />}
    </div>;
};

<PostMeta data={{ author: ["gilzow"], date: "2025-11-12T10:00:00+00:00", image: "/images/posts/how-tos/creating-custom-reports-using-cli/creating-custom-reports-using-cli.webp" }} />

# Creating Custom Reports using the Upsun CLI

## *Does X exist?*

Someone recently asked me

> Does a tool / report exist for the last deployment date for production sites - this will help find out if our sites are… out of date?

There isn't a single pane in the console that list all the sites in your organization with the last date of a push to
the production branch. **But**, one of the amazing things about Upsun is that our product is API-first. Whether you are
performing an action in the [Console](https://console.upsun.com/), or using the [CLI](https://docs.upsun.com/anchors/cli/),
they're both just calling the API for you. The [Upsun API](https://docs.upsun.com/api/) itself is extensive and
gives you everything you need in order to build just about anything you can imagine.  And a report showing this
information is entirely achievable!

The [Upsun CLI](https://docs.upsun.com/administration/cli.html) is really just a convenient wrapper for you to access
the API from the command line, so for this example, I'll use the CLI, but you can accomplish the exact same task using
the API directly (or the recent [Upsun PHP SDK](/posts/releases/upsun-php-sdk-announcement)).

The other nice thing about the CLI is that it has a built-in
[`multi` command](https://docs.upsun.com/administration/cli/reference.html#multi) that allows you to perform the same
command against multiple projects at once. To use it, you hand it a comma separated list of project IDs and then the
command you want to perform on each one.

## First we need IDs

For this example, I want the date of the last deployment
(or [`push` activity event](https://docs.upsun.com/integrations/activity/reference.html#environment-activity-types))
for my projects that start with the title “Template | ”.  Since I know `multi` needs a list of project IDs, I'll need to
get those first. To grab a list of projects by their title, I can use the
[`project:list` command](https://docs.upsun.com/administration/cli/reference.html#projectlist) with the `--title`
parameter to filter on the project title.

```{filename="Terminal"} theme={null}
❯ upsun project:list --title="Template |"
```

This will produce something like

```{filename="Terminal"} theme={null}
+---------------+--------------------------------------+------------------+-----------------+----------+
| ID            | Title                                | Region           | Org name        | Org type |
+---------------+--------------------------------------+------------------+-----------------+----------+
| qcelmtcwrzasy | Template | Akeneo                    | eu-3.platform.sh | devrel-projects | flex     |
| rmsh4dvlxfzoq | Template | Apache TomEE MicroProfile | eu-3.platform.sh | devrel-projects | flex     |
| 2kykonmslzfw2 | Template | ASP.NET Core              | eu-3.platform.sh | devrel-projects | flex     |
| bf6tpupauqym2 | Template | Backdrop                  | eu-3.platform.sh | devrel-projects | flex     |
<snip>
+---------------+--------------------------------------+------------------+-----------------+----------+
```

I don't need anything besides the IDs, so I'll adjust the command to only include the ID column, no header and a plain output:

```{filename="Terminal"} theme={null}
❯ upsun project:list --title="Template |" --columns=id --format=plain --no-header
qcelmtcwrzasy
rmsh4dvlxfzoq
2kykonmslzfw2
bf6tpupauqym2
<snip>
```

I need to convert this into a comma separated list to use with the `multi` so I'll pipe the output from this command to
[`tr` (translate)](https://man7.org/linux/man-pages/man1/tr.1.html) to transform newlines to commas.

**Note**: I'm going to limit the number of projects to 5 using the `--count` parameter just to make this easier to show.

```{filename="Terminal"} theme={null}
❯ upsun project:list --title="Template |" --count=5 --columns=id --format=plain --no-header | tr '\n' ','
qcelmtcwrzasy,rmsh4dvlxfzoq,2kykonmslzfw2,bf6tpupauqym2,cpxnqz5mjulbe,
```

## Finding the date of the last deploy

Now that we have the list of project IDs, we can pass this information to the `multi` command. But before we do that, we
need to know how to get the date of the last deployment of a project. Every time you push a change to an active
environment, Upsun will deploy that change, rebuilding the containers if necessary. With that in mind, we need to find
when the last `push` occurred to project's default environment. For purposes of this example, we're going to assume that
all of our projects are using the same production branch name of `main`.

One of the things the API exposes about your project is every
[activity](https://docs.upsun.com/increase-observability/logs/access-logs.html#activity-logs) that occurs to the
project. In the CLI, we can use the
[`activity:list` command](https://docs.upsun.com/administration/cli/reference.html#activitylist) to retrieve all
activities in a project.

```{filename="Terminal"} theme={null}
❯ upsun activity:list --project bf6tpupauqym2 --environment main
Activities on the project Template | Backdrop (bf6tpupauqym2), environment main (type: production):
+---------------+---------------------------+-----------------------------------------------------------------+----------+----------+---------+
| ID            | Created                   | Description                                                     | Progress | State    | Result  |
+---------------+---------------------------+-----------------------------------------------------------------+----------+----------+---------+
| gth4nqryisjmu | 2025-11-12T04:19:54+00:00 | Platform.sh Bot deleted backup o5bcracgspyejya6k6k7udtb6y       | 100%     | complete | success |
| i22xaywuudqmw | 2025-11-12T04:19:45+00:00 | Platform.sh Bot created a backup of Main                        | 100%     | complete | success |
| 5qbh7ajrtrmxw | 2025-11-11T04:19:54+00:00 | Platform.sh Bot deleted backup wwgnegtoybnkxho4re5lckqsm4       | 100%     | complete | success |
| vnzlijtgdycqa | 2025-11-11T04:19:45+00:00 | Platform.sh Bot created a backup of Main                        | 100%     | complete | success |<snip>
<snip>
+---------------+---------------------------+-----------------------------------------------------------------+----------+----------+---------+
```

We're only interested in `push` activities so let's add the `--type` parameter to limit the returned activities to only
`push` events.

```{filename="Terminal"} theme={null}
❯ upsun activity:list --project bf6tpupauqym2 --environment main --type=push
Activities on the project Template | Backdrop (bf6tpupauqym2), environment main (type: production):
+---------------+---------------------------+-------------------------------------+----------+----------+---------+
| ID            | Created                   | Description                         | Progress | State    | Result  |
+---------------+---------------------------+-------------------------------------+----------+----------+---------+
| xohtyme4hdcvc | 2025-10-24T19:14:01+00:00 | GitHub integration pushed to Main   | 100%     | complete | success |
| zzt2ri5gzccx6 | 2025-10-23T14:30:56+00:00 | GitHub integration pushed to Main   | 100%     | complete | success |
+---------------+---------------------------+-------------------------------------+----------+----------+---------+
```

<Note>
  **Note**: The actual activity type name for a push activity event is
  [`environment.push`](https://docs.upsun.com/integrations/activity/reference.html#environment-activity-types). However,
  the CLI allows us to
  [omit the first part of an activity's name](https://docs.upsun.com/administration/cli/reference.html#options-9) for
  convenience.
</Note>

We only want the most recent `push` event AND we only want the date, so let's add in a `--limit` of `1` (the default is to
sort by activity date - `Created` - descending) and select only the `Created` column. We also don't need the table
format or header, so let's use `--format=plain` and `--no-header` to remove those.

```{filename="Terminal"} theme={null}
❯ upsun activity:list --project bf6tpupauqym2 --environment main --type=push --columns=created --limit=1 --format=plain --no-header
2025-10-24T19:14:01+00:00
```

Perfect! We now have the exact command we need to retrieve the last `push` activity to hand to the `multi` command!

## Combing the commands to generate our report

Let's combine this command with the `multi` command and use the command to retrieve our project IDs from earlier to get
a complete report on the last time each project had a push event!

```{filename="Terminal"} theme={null}
❯ upsun multi --projects=$(upsun project:list --title="Template |" --count=5 --columns=id --format=plain --no-header | tr '\n' ',') -- activity:list --environment main --type=push --columns=created --limit=1 --format=plain --no-header
Running command on 5 projects:  'activity:list' '--environment' 'main' '--type=push' '--columns=created' '--limit=1' '--format=plain' '--no-header'
# Project: Template | Akeneo (qcelmtcwrzasy)
2025-10-27T13:26:28+00:00
# Project: Template | Apache TomEE MicroProfile (rmsh4dvlxfzoq)
No activities found
# Project: Template | ASP.NET Core (2kykonmslzfw2)
No activities found
# Project: Template | Backdrop (bf6tpupauqym2)
2025-10-23T14:30:56+00:00
# Project: Template | Beego (cpxnqz5mjulbe)
2025-11-11T19:31:12+00:00
```

I now have a report where I can see the last time each of my projects were pushed to, and surprise: I now see that for
at least two projects, it has been long enough since they received a push that the push event activity
log has expired!

## Go forth and report

I hope this has given you some ideas on the flexibility and power the Upsun API possesses and how you can utilize this
to create your own reports catered to your unique business needs, even when what you need doesn't already exist.

## Bonus items

### Date Format

It's possible you'll need that activity date in a different format. Don't worry: we've got you covered. The
`activity:list` command accepts a `--date-fmt`
[parameter](https://docs.upsun.com/administration/cli/reference.html#options-9) allowing you to alter the date format
using a [PHP date format string](https://www.php.net/manual/en/datetime.format.php#refsect1-datetime.format-parameters).

### Limit to successful pushes

In the example above, the person asking for the report wanted *any* push events to the project. It's possible though
in your situation that you only want those where the push (and build) was successful. To filter to those events where
the result of a push was successful, we can add the `--result` parameter with a value of `success` to our `activity:list`
command.

### Simplified command option if you want everything

In the example I used, I needed to limit the number of IDs returned from the `project:list` command to just 5 to make
the example easier to read.  If you don't need to limit the number of projects to a smaller amount than what matches,
you can simplify the `project:list` command by using the
[`--pipe` parameter](https://docs.upsun.com/administration/cli/reference.html#options-101), which returns a simple list
of project IDs, disabling any pagination in the returned results. In our example, adding the `--pipe` parameter would
result in a much more succinct command:

```{filename="Terminal"} theme={null}
❯ upsun project:list --title="Template |" --pipe
qcelmtcwrzasy
rmsh4dvlxfzoq
2kykonmslzfw2
bf6tpupauqym2
<snip>
```

### My projects don't all use the same production branch name

While standardization is great and should be the ideal, reality isn't always so cooperative. Perhaps you inherited a
project, or some projects were set up before you standardized on the production name. In order to accomplish the example
above, we need some ability to retrieve the production branch name in order to pass that to the `upsun multi` command.
We could perform a preliminary `upsun multi` command that retrieves each project's `default_branch` using the
`upsun project:info` command. However, this adds significant complexity to what we're trying to achieve. Our CLI
attempts to be very accommodating and make things easier on our users. That includes the ability to use a period (`.`)
to represent a project's default environment!  This allows us to update our previous command to work with all our
projects even if they do not use the same `default_branch` name!

```{filename="Terminal"} theme={null}
❯ upsun multi --projects=$(upsun project:list --title="Template |" --count=5 --columns=id --format=plain --no-header | tr '\n' ',') -- activity:list --environment . --type=push --columns=created --limit=1 --format=plain --no-header
Running command on 5 projects:  'activity:list' '--environment' '.' '--type=push' '--columns=created' '--limit=1' '--format=plain' '--no-header'

# Project: Template | Akeneo (qcelmtcwrzasy)
Selecting default environment (indicated by .)
Selected environment: main (type: production)
2025-10-27T13:26:28+00:00

# Project: Template | Apache TomEE MicroProfile (rmsh4dvlxfzoq)
Selecting default environment (indicated by .)
Selected environment: main (type: production)
No activities found

# Project: Template | ASP.NET Core (2kykonmslzfw2)
Selecting default environment (indicated by .)
Selected environment: main (type: production)
No activities found

# Project: Template | Backdrop (bf6tpupauqym2)
Selecting default environment (indicated by .)
Selected environment: main (type: production)
2025-10-23T14:30:56+00:00

# Project: Template | Beego (cpxnqz5mjulbe)
Selecting default environment (indicated by .)
Selected environment: main (type: production)
2025-11-11T19:31:12+00:00
```
