# JavaScript/Node.js


p:last-child]:mb-0 [&>h3]:mt-0 rounded-lg" >

### Note
You can now use composable image to install runtimes and tools in your application container. To find out more, see the [Composable image](https://fixed.docs.upsun.com/create-apps/app-reference/composable-image.md) topic.

Node.js is a popular asynchronous JavaScript runtime.
Deploy scalable Node.js apps of all sizes on Upsun Fixed.
You can also develop a microservice architecture mixing JavaScript and other apps with [multi-app projects](https://fixed.docs.upsun.com/create-apps/multi-app.md).

## Supported versions

You can select the major version. But the latest compatible minor version is applied automatically and can’t be overridden.

Patch versions are applied periodically for bug fixes and the like.
When you deploy your app, you always get the latest available patches.

| Grid | Dedicated Gen 2 |
| 

   - 24

   - 22

   - 20

   - 22

   - 20

   - 19

### Specify the language

To use Node.js, specify `nodejs` as your [app's `type`](https://fixed.docs.upsun.com/create-apps/app-reference/single-runtime-image.md#types):

```yaml  {location=".platform.app.yaml"}
type: 'nodejs:<VERSION_NUMBER>'
```

For example:

```yaml  {location=".platform.app.yaml"}
type: 'nodejs:24'
```

To use a specific version in a container with a different language, [use a version manager](node-version.md).

### Deprecated versions

The following versions are [deprecated](https://fixed.docs.upsun.com/glossary.md#deprecated-versions).
They're available, but they don't receive security updates from upstream and aren't guaranteed to work.
They'll be removed in the future – consider migrating to a [supported version](#supported-versions).

| Grid | Dedicated Gen 2 |
| 

   - 18

   - 16

   - 8.9

   - 6.10

   - 6.9

   - 6.8

   - 6.6

   - 6.3

   - 6.2

   - 4.7

   - 4.6

   - 4.5

   - 4.4

   - 4.3

   - 4.2

   - 18

   - 16

   - 14

   - 12

   - 10

   - 9.8

## Usage example

To use JavaScript with Node.js on Upsun Fixed, configure your [app configuration](https://fixed.docs.upsun.com/create-apps.md)
(a complete example is included at the end).

### 1. Specify the version

Choose a version from the [list of supported versions](#supported-versions)
and add it to your app configuration:

```yaml  {location=".platform.app.yaml"}
type: 'nodejs:24'
```

### 2. Specify any global dependencies

Add the following to your app configuration:

```yaml  {location=".platform.app.yaml"}
type: 'nodejs:24'
dependencies:
  nodejs:
    sharp: "*"
```

These are now available as commands, the same as installing with `npm install -g`.

### 3. Build your app

Include any commands needed to build and setup your app in the `hooks`, as in the following example:

```yaml  {location=".platform.app.yaml"}
type: 'nodejs:24'
dependencies:
  nodejs:
    sharp: "*"
hooks:
  build: |
    npm run setup-assets
    npm run build
```

### 4. Start your app

Specify a command to start serving your app (it must be a process running in the foreground):

```yaml  {location=".platform.app.yaml"}
type: 'nodejs:24'
dependencies:
  nodejs:
    sharp: "*"
hooks:
  build: |
    npm run setup-assets
    npm run build
web:
  commands:
    start: node index.js
```

### 5. Listen on the right port

Make sure your Node.js application is configured to listen over the port given by the environment.
The following example uses the [`platformsh-config` helper](#configuration-reader):

```js
// Load the http module to create an http server.
const http = require('http');

// Load the Upsun Fixed configuration
const config = require('platformsh-config').config();

const server = http.createServer(function (request, response) {
    response.writeHead(200, {"Content-Type": "application/json"});
    response.end("Hello world!");
});

// Listen on the port from the Upsun Fixed configuration
server.listen(config.port);
```
### Complete example

A complete basic app configuration looks like the following:

```yaml  {location=".platform.app.yaml"}
name: node-app

type: 'nodejs:24'

disk: 512

dependencies:
  nodejs:
    sharp: "*"

hooks:
  build: |
    npm run setup-assets
    npm run build

web:
  commands:
    start: "node index.js"
```

## Dependencies

By default, Upsun Fixed assumes you're using npm as a package manager.
If your code has a `package.json`, the following command is run as part of the default [build flavor](https://fixed.docs.upsun.com/create-apps/app-reference/single-runtime-image.md#build):

```bash
npm prune --userconfig .npmrc && npm install --userconfig .npmrc
```

This means you can specify configuration in a `.npmrc` file in [your app root](https://fixed.docs.upsun.com/create-apps/app-reference/single-runtime-image.md#root-directory).

### Use Yarn as a package manager

To switch to Yarn to manage dependencies, follow these steps:

1. Turn off the default use of npm:

```yaml  {location=".platform.app.yaml"}
build:
   flavor: none
```

2. Specify the version of Yarn you want:

   ```json  {location="package.json"}
   {
     ...
     "packageManager": "yarn@3.2.1"
   }
   ```

What you do next depends on the versions of Yarn and Node.js you want.

```yaml {}
type: 'nodejs:24'
hooks:
  build: |
    corepack yarn install    
```

 - Enable Corepack (which is opt-in):

    .platform.app.yaml

```yaml {}
type: 'nodejs:24'
dependencies:
  nodejs:
    corepack: "*"
```

 - Use Corepack to run Yarn in your build hook:

    .platform.app.yaml

```yaml {}
type: 'nodejs:24'
hooks:
  build: |
    corepack yarn install    
```

 - Add Yarn as a global dependency:

    .platform.app.yaml

```yaml {}
type: 'nodejs:24'
dependencies:
  nodejs:
    yarn: "1.22.19"
```

 - Install dependencies in the ``build`` hook:

    .platform.app.yaml

```yaml {}
type: 'nodejs:24'
hooks:
  build: |
    yarn --frozen-lockfile    
```

### Use Bun as a package manager

  **Availability**

  [Bun is available as a runtime and package manager](https://devcenter.upsun.com/posts/bun-support-is-here/) for Node.js **versions 20 or above**.

To switch to Bun to manage dependencies,
use the following configuration:

```yaml  {location=".platform.app.yaml"}
# The name of your app.
name: myapp
# Choose Node.js version 20 or above.
type: 'nodejs:20'
# Override the default Node.js build flavor.
build:
  flavor: none
# Use Bun to install the dependencies.
hooks:
  build: bun install
```

#### Use Bun as a runtime

You can even [use Bun as a runtime](https://devcenter.upsun.com/posts/bun-support-is-here/) by adjusting the `start` command as follows:

```yaml  {location=".platform.app.yaml"}
# The name of your app.
name: myapp
# Choose Node.js version 20 or above.
type: 'nodejs:20'
# Override the default Node.js build flavor.
build:
  flavor: none
# Use Bun to install the dependencies.
hooks:
  build: bun install
# In the start command replace node with Bun.
web:
  commands:
    start: 'bun app.js'
```

## Connecting to services

The following examples show how to use Node.js to access various [services](https://fixed.docs.upsun.com/add-services.md).
To configure a given service, see the page dedicated to that service.

```js {}
const Memcached = require('memcached');
const config = require("platformsh-config").config();
const { promisify } = require('util');

exports.usageExample = async function() {
    const credentials = config.credentials('memcached');
    const client = new Memcached(`${credentials.host}:${credentials.port}`);

    // The MemcacheD client is not Promise-aware, so make it so.
    const memcachedGet = promisify(client.get).bind(client);
    const memcachedSet = promisify(client.set).bind(client);

    const key = 'Deploy-day';
    const value = 'Friday';

    // Set a value.
    await memcachedSet(key, value, 10);

    // Read it back.
    const test = await memcachedGet(key);

    return `Found value <strong>${test}</strong> for key <strong>${key}</strong>.`;
};

```
```js {}
const mongodb = require("mongodb");
const config = require("platformsh-config").config();

exports.usageExample = async function () {
    const credentials = config.credentials("mongodb");
    const MongoClient = mongodb.MongoClient;

    const client = await MongoClient.connect(
        config.formattedCredentials("mongodb", "mongodb")
    );

    const db = client.db(credentials["path"]);

    const collection = db.collection("startrek");

    const documents = [
        { name: "James Kirk", rank: "Admiral" },
        { name: "Jean-Luc Picard", rank: "Captain" },
        { name: "Benjamin Sisko", rank: "Prophet" },
        { name: "Katheryn Janeway", rank: "Captain" },
    ];

    await collection.insertMany(documents, { w: 1 });

    const result = await collection.find({ rank: "Captain" }).toArray();

    const outputRows = Object.values(result)
        .map(({ name, rank }) => `<tr><td>${name}</td><td>${rank}</td></tr>\n`)
        .join("\n");

    // Clean up after ourselves.
    collection.deleteMany();

    return `
    <table>
        <thead>
            <tr>
                <th>Name</th><th>Rank</th>
            </tr>
        </thhead>
        <tbody>
            ${outputRows}
        </tbody>
    </table>
    `;
};

```
```js {}
const mysql = require("mysql2/promise");
const config = require("platformsh-config").config();

exports.usageExample = async function () {
    const credentials = config.credentials("database");

    const connection = await mysql.createConnection({
        host: credentials.host,
        port: credentials.port,
        user: credentials.username,
        password: credentials.password,
        database: credentials.path,
    });

    // Creating a table.
    await connection.query(
        `CREATE TABLE IF NOT EXISTS People (
            id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(30) NOT NULL,
            city VARCHAR(30) NOT NULL
        )`
    );

    // Insert data.
    await connection.query(
        `INSERT INTO People (name, city)
        VALUES
            ('Neil Armstrong', 'Moon'),
            ('Buzz Aldrin', 'Glen Ridge'),
            ('Sally Ride', 'La Jolla');`
    );

    // Show table.
    const [rows] = await connection.query("SELECT * FROM People");

    // Drop table.
    await connection.query("DROP TABLE People");

    const outputRows = rows
        .map(({ name, city }) => `<tr><td>${name}</td><td>${city}</td></tr>\n`)
        .join("\n");

    return `
    <table>
        <thead>
            <tr>
                <th>Name</th><th>City</th>
            </tr>
        </thhead>
        <tbody>
            ${outputRows}
        </tbody>
    </table>
    `;
};

```
```js {}
const pg = require("pg");
const config = require("platformsh-config").config();

exports.usageExample = async function () {
    const credentials = config.credentials("postgresql");

    const client = new pg.Client({
        host: credentials.host,
        port: credentials.port,
        user: credentials.username,
        password: credentials.password,
        database: credentials.path,
    });

    client.connect();

    // Creating a table.
    await client.query(
        `CREATE TABLE IF NOT EXISTS People (
            id SERIAL PRIMARY KEY,
            name VARCHAR(30) NOT NULL,
            city VARCHAR(30) NOT NULL
        )`
    );

    // Insert data.
    await client.query(
        `INSERT INTO People (name, city)
        VALUES
            ('Neil Armstrong', 'Moon'),
            ('Buzz Aldrin', 'Glen Ridge'),
            ('Sally Ride', 'La Jolla');`
    );

    // Show table.
    const result = await client.query("SELECT * FROM People");

    // Drop table.
    await client.query("DROP TABLE People");

    const outputRows = result.rows
        .map(({ name, city }) => `<tr><td>${name}</td><td>${city}</td></tr>\n`)
        .join("\n");

    return `
    <table>
        <thead>
            <tr>
                <th>Name</th><th>City</th>
            </tr>
        </thhead>
        <tbody>
            ${outputRows}
        </tbody>
    </table>
    `;
};

```
```js {}
const redis = require('redis');
const config = require("platformsh-config").config();
const { promisify } = require('util');

exports.usageExample = async function() {
    const credentials = config.credentials('redis');
    const client = redis.createClient(credentials.port, credentials.host);

    // The Redis client is not Promise-aware, so make it so.
    const redisGet = promisify(client.get).bind(client);
    const redisSet = promisify(client.set).bind(client);

    const key = 'Deploy day';
    const value = 'Friday';

    // Set a value.
    await redisSet(key, value);

    // Read it back.
    const test = await redisGet(key);

    return `Found value <strong>${test}</strong> for key <strong>${key}</strong>.`;
};

```
```js {}
const solr = require("solr-node");
const config = require("platformsh-config").config();

exports.usageExample = async function () {
    const client = new solr(config.formattedCredentials("solr", "solr-node"));

    // Add a document.
    const addResult = await client.update({
        id: 123,
        name: "Valentina Tereshkova",
    });

    // Flush writes so that we can query against them.
    await client.softCommit();

    // Select one document:
    const strQuery = client.query().q();
    const writeResult = await client.search(strQuery);

    // Delete one document.
    const deleteResult = await client.delete({ id: 123 });

    return `
    Adding one document. Status (0 is success): ${addResult.responseHeader.status}<br />
    Selecting documents (1 expected): ${writeResult.response.numFound}<br />
    Deleting one document. Status (0 is success): ${deleteResult.responseHeader.status}<br />
    `;
};

```

### Configuration reader

While you can read the environment directly from your app,
you might want to use the[Node.js configuration reader library](https://github.com/platformsh/config-reader-nodejs).
It decodes service credentials, the correct port, and other information for you.

## Project templates

  The following list shows templates available for Node.js apps.

A template is a starting point for building your project.
It should help you get a project ready for production.

  Express

    ![Express](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuNDQzNjggMTQuMzU1NlY5LjEwNDc3SDcuNzI4NDlWOS45MzA3M0M3Ljc2MjEzIDkuODk0MSA3Ljc5MzE5IDkuODU1MiA3LjgyMTQ2IDkuODE0M0M4LjA1OTMzIDkuMzIwNzcgOC41NjEwNiA5LjAwOTMgOS4xMDg4MiA5LjAxNTQ1QzkuNzU4MTkgOC45OTYwOCAxMC4yODU5IDkuMjM2NDYgMTAuNTk2IDkuODE0M0MxMC43OTMzIDEwLjE3MzMgMTAuOTAxOSAxMC41NzQyIDEwLjkxMjcgMTAuOTgzN0MxMC45MjM1IDExLjM5MzIgMTAuODM2MiAxMS43OTk0IDEwLjY1OCAxMi4xNjgyQzEwLjM2OTEgMTIuODE1OCA5LjY1NTQzIDEzLjEzNzcgOC44OTE0NSAxMy4wMTk1QzguNjUzNjkgMTIuOTk5MyA4LjQyNDc4IDEyLjkxOTggOC4yMjU2MSAxMi43ODg0QzguMDI2NDUgMTIuNjU3IDcuODYzMzcgMTIuNDc3OCA3Ljc1MTI4IDEyLjI2NzFWMTQuMzU1NEw3LjQ0MzY4IDE0LjM1NTZaTTcuNzI4NDkgMTAuOTYyMkw3Ljc5MjI5IDExLjU3ODhDNy45MDQ4NSAxMi4yODA2IDguMzE5NzcgMTIuNjk1MiA4Ljk3MTIgMTIuNzczMkM5LjI3NzExIDEyLjgyMzUgOS41OTEgMTIuNzY2MSA5Ljg1OTM3IDEyLjYxMDlDMTAuMTI3NyAxMi40NTU3IDEwLjMzNCAxMi4yMTIyIDEwLjQ0MjkgMTEuOTIxOUMxMC42OTYzIDExLjMxODEgMTAuNjc3NiAxMC42MzQ2IDEwLjM5MjggMTAuMDQ0OUMxMC4yNzY1IDkuNzg0NjkgMTAuMDc4NyA5LjU2OTQyIDkuODI5MjcgOS40MzE1OUM5LjU3OTg0IDkuMjkzNzYgOS4yOTIzMSA5LjI0MDg2IDkuMDEwMTYgOS4yODA4OUM4Ljc0NTMxIDkuMzAwMTYgOC40OTMwNCA5LjQwMTQzIDguMjg4MzkgOS41NzA2NUM4LjA4MzczIDkuNzM5ODYgNy45MzY4NiA5Ljk2ODYgNy44NjgxNyAxMC4yMjUxQzcuODA3NTEgMTAuNDY3OSA3Ljc2MDg4IDEwLjcxMzkgNy43Mjg0OSAxMC45NjJWMTAuOTYyMlpNMTYuNzI4MiAxMS42NzU4QzE2LjY4NSAxMi4wNDU1IDE2LjUwOSAxMi4zODcgMTYuMjMyOSAxMi42MzY3QzE1Ljk1NjggMTIuODg2MyAxNS41OTk1IDEzLjAyNzIgMTUuMjI3MyAxMy4wMzMyQzE0LjAzMjkgMTMuMDkzMyAxMy40NzI0IDEyLjMwMDIgMTMuMzgzMyAxMS4zODQ5QzEzLjMyMTQgMTAuODg3OCAxMy40MDIgMTAuMzgzNCAxMy42MTU5IDkuOTMwNUMxMy43NjQ4IDkuNjE5OCAxNC4wMDg4IDkuMzY0NTYgMTQuMzEyNCA5LjIwMTc2QzE0LjYxNiA5LjAzODk3IDE0Ljk2MzYgOC45NzcwNiAxNS4zMDQ4IDkuMDI1MDJDMTUuNjI5MSA5LjA1MjU5IDE1LjkzNjYgOS4xODE0NiAxNi4xODM2IDkuMzkzNEMxNi40MzA3IDkuNjA1MzMgMTYuNjA0OSA5Ljg4OTYgMTYuNjgxNSAxMC4yMDZDMTYuNzQyMSAxMC40OTQyIDE2Ljc4NjggMTAuNzg1NSAxNi44MTUyIDExLjA3ODZIMTMuNjc4NEMxMy42MjAzIDExLjkwODUgMTQuMDY2MiAxMi41NzU2IDE0LjY5ODIgMTIuNzM2NUMxNS40ODU1IDEyLjkzMDIgMTYuMTU4MyAxMi41ODkxIDE2LjQwMjYgMTEuODQwNkMxNi40NTY4IDExLjY0ODUgMTYuNTU1NyAxMS42MjE0IDE2LjczMDIgMTEuNjc1OEgxNi43MjgyWk0xMy42NzYxIDEwLjgxM0gxNi40ODE5QzE2LjQ2NDMgOS45Mjg5IDE1LjkxMzggOS4yODYzNiAxNS4xNjcyIDkuMjc5MDdDMTQuMzI0MSA5LjI2NTQgMTMuNzEyOCA5Ljg4MjE5IDEzLjY3NjEgMTAuODEzVjEwLjgxM1pNMTcuMzA4MSAxMS42OTUySDE3LjU4MzFDMTcuNTkzMiAxMS44OTc4IDE3LjY1OSAxMi4wOTM3IDE3Ljc3MzIgMTIuMjYxNEMxNy44ODc1IDEyLjQyOSAxOC4wNDU3IDEyLjU2MTkgMTguMjMwNiAxMi42NDU0QzE4LjQ2MjggMTIuNzQ5OCAxOC43MTU1IDEyLjgwMDYgMTguOTcgMTIuNzkzOUMxOS4yMjQ1IDEyLjc4NzIgMTkuNDc0MiAxMi43MjMyIDE5LjcwMDUgMTIuNjA2NkMxOS44MjM5IDEyLjU1MTEgMTkuOTI3MiAxMi40NTkgMTkuOTk2NiAxMi4zNDI4QzIwLjA2NTkgMTIuMjI2NiAyMC4wOTc5IDEyLjA5MiAyMC4wODgzIDExLjk1N0MyMC4wOTU0IDExLjgyNjkgMjAuMDU5OSAxMS42OTc5IDE5Ljk4NzEgMTEuNTg5OEMxOS45MTQzIDExLjQ4MTcgMTkuODA4MyAxMS40MDAyIDE5LjY4NSAxMS4zNTc4QzE5LjM4MjQgMTEuMjQ1MiAxOS4wNjA3IDExLjE4MzIgMTguNzUyNCAxMS4wODQzQzE4LjQzMTYgMTAuOTkzIDE4LjExNzkgMTAuODc4MyAxNy44MTM5IDEwLjc0MTJDMTcuMzE3MiAxMC40OTg4IDE3LjI4NjQgOS41NTQ1NCAxNy44NDg3IDkuMjU1NkMxOC4xMzY3IDkuMDkzMTIgMTguNDYwNyA5LjAwNTMzIDE4Ljc5MTMgOS4wMDAyNEMxOS4xMjE5IDguOTk1MTQgMTkuNDQ4NSA5LjA3MjkxIDE5Ljc0MTMgOS4yMjY0NEMyMC4xMDQ1IDkuNDI2OTUgMjAuMzA1MiA5LjgzMTg0IDIwLjI0NTUgMTAuMjQyN0gyMC4wMDk3QzIwLjAwOTcgMTAuMjMxMyAxOS45ODgzIDEwLjIyMTIgMTkuOTg4MyAxMC4yMDk2QzE5Ljk1OTEgOS40NTc3MSAxOS4zMjcgOS4yMjI1NiAxOC42NDg1IDkuMjg4NjRDMTguNDQzNCA5LjMxMTQzIDE4LjI0OTEgOS4zNzM0IDE4LjA2NjggOS40NjVDMTcuOTU3MiA5LjUxNTA0IDE3Ljg2NTkgOS41OTc5IDE3LjgwNTUgOS43MDIxMkMxNy43NDUxIDkuODA2MzMgMTcuNzE4NiA5LjkyNjc1IDE3LjcyOTYgMTAuMDQ2N0MxNy43Mjk4IDEwLjE2NjcgMTcuNzY3MiAxMC4yODM4IDE3LjgzNjcgMTAuMzgxN0MxNy45MDYxIDEwLjQ3OTYgMTguMDA0MiAxMC41NTM2IDE4LjExNzQgMTAuNTkzNUMxOC40MTM2IDEwLjcwMjIgMTguNzI4IDEwLjc3MiAxOS4wMzQ1IDEwLjg1NzJMMTkuNzc1IDExLjA1MDhDMTkuOTQzMyAxMS4xMDYxIDIwLjA5MDkgMTEuMjExMSAyMC4xOTgyIDExLjM1MjFDMjAuMzA1NSAxMS40OTMgMjAuMzY3NiAxMS42NjMyIDIwLjM3NjEgMTEuODQwMUMyMC40MzUzIDEyLjIzNzcgMjAuMjMyNSAxMi42Mjg1IDE5Ljg3MzkgMTIuODA5NkMxOS4yMjYzIDEzLjE3NiAxOC4xNTk4IDEzLjA3OTIgMTcuNjg0NyAxMi42MTZDMTcuNDQxNiAxMi4zNzE1IDE3LjMwNiAxMi4wMzk1IDE3LjMwODcgMTEuNjk1TDE3LjMwODEgMTEuNjk1MlpNMjMuODY1NiAxMC4yNDI5SDIzLjYwNzdDMjMuNjA3NyAxMC4yMDggMjMuNTk0IDEwLjE3NDUgMjMuNTkwMSAxMC4xNDc5QzIzLjU4NiA5Ljk1NDUzIDIzLjUxNTYgOS43Njg0OSAyMy4zOTA2IDkuNjIwOTNDMjMuMjY1NiA5LjQ3MzM3IDIzLjA5MzcgOS4zNzMyNiAyMi45MDM2IDkuMzM3NEMyMi41NDUyIDkuMjM0NTkgMjIuMTYyOCA5LjI1MzAxIDIxLjgxNTkgOS4zODk4MUMyMS42Nzg3IDkuNDI5MDcgMjEuNTU3OSA5LjUxMTY3IDIxLjQ3MTYgOS42MjUyN0MyMS4zODUyIDkuNzM4ODcgMjEuMzM4IDkuODc3MzcgMjEuMzM2OSAxMC4wMkMyMS4zMzIgMTAuMTYwMSAyMS4zNzU2IDEwLjI5NzYgMjEuNDYwNCAxMC40MDkzQzIxLjU0NTIgMTAuNTIwOSAyMS42NjU5IDEwLjU5OTkgMjEuODAyMiAxMC42MzI3TDIyLjk4MTEgMTAuOTM1M0MyMy4xMDg2IDEwLjk2NTkgMjMuMjM0MSAxMS4wMDQxIDIzLjM1NzEgMTEuMDQ5N0MyMy43MzMgMTEuMTg2NCAyMy45ODgyIDExLjUzNTUgMjMuOTk5NiAxMS45MzQ1QzI0LjAwNTIgMTIuMTI5NyAyMy45NTE3IDEyLjMyMjIgMjMuODQ1OSAxMi40ODY1QzIzLjc0MDIgMTIuNjUwNyAyMy41ODczIDEyLjc3OTIgMjMuNDA3MiAxMi44NTVDMjMuMTMzNiAxMi45NzkzIDIyLjgzNyAxMy4wNDUgMjIuNTM2NSAxMy4wNDgxQzIyLjIzNiAxMy4wNTExIDIxLjkzODEgMTIuOTkxMyAyMS42NjIxIDEyLjg3MjVDMjEuNDM1IDEyLjc3NDYgMjEuMjQzNCAxMi42MDk1IDIxLjExMzEgMTIuMzk5NEMyMC45ODI3IDEyLjE4OTQgMjAuOTE5OSAxMS45NDQ0IDIwLjkzMjkgMTEuNjk3NUgyMS4xODQ5QzIxLjI3OTcgMTIuMTU0MyAyMS41OTM1IDEyLjUzNDggMjIuMDIzOSAxMi43MTQ4QzIyLjQ1NDMgMTIuODk0OCAyMi45NDU4IDEyLjg1MDYgMjMuMzM3MiAxMi41OTczQzIzLjQ1NDcgMTIuNTM2MiAyMy41NTIyIDEyLjQ0MjcgMjMuNjE4MiAxMi4zMjhDMjMuNjg0MSAxMi4yMTMyIDIzLjcxNTkgMTIuMDgxOSAyMy43MDk1IDExLjk0OTdDMjMuNzE1NCAxMS44MTk1IDIzLjY3ODYgMTEuNjkwOSAyMy42MDQ3IDExLjU4MzRDMjMuNTMwOSAxMS40NzYgMjMuNDI0IDExLjM5NTYgMjMuMzAwMyAxMS4zNTQzQzIyLjk5NzcgMTEuMjQxOCAyMi42NzYgMTEuMTgxOSAyMi4zNjc3IDExLjA4MDlDMjIuMDQ1MSAxMC45OTEgMjEuNzI5NiAxMC44Nzc2IDIxLjQyMzUgMTAuNzQxN0MyMC45Mzg2IDEwLjUwMzEgMjAuODk5OSA5LjU2NjYyIDIxLjQ1MjcgOS4yNjc5MUMyMS43NDQyIDkuMDk4NjEgMjIuMDc0NSA5LjAwNzY2IDIyLjQxMTYgOS4wMDM5MUMyMi43NDg3IDkuMDAwMTUgMjMuMDgxIDkuMDgzNzIgMjMuMzc2MiA5LjI0NjQ5QzIzLjU0NSA5LjM0NzI2IDIzLjY4MDkgOS40OTQ5NSAyMy43Njc0IDkuNjcxNTdDMjMuODUzOCA5Ljg0ODIgMjMuODg3IDEwLjA0NjEgMjMuODYyOSAxMC4yNDEzTDIzLjg2NTYgMTAuMjQyOVpNNi45NzQ5OSAxMi45Mzg0QzYuODczNDYgMTIuOTc2OCA2Ljc2MTM5IDEyLjk3NjcgNi42NTk5MyAxMi45MzgxQzYuNTU4NDcgMTIuODk5NSA2LjQ3NDY1IDEyLjgyNTEgNi40MjQyNyAxMi43MjlMNS40MjE3MyAxMS4zNDI1TDUuMjc2MzYgMTEuMTQ4OEw0LjExMjk1IDEyLjczMUM0LjA2NTUzIDEyLjgyMyAzLjk4NjI0IDEyLjg5NDYgMy44ODk4OCAxMi45MzI1QzMuNzkzNTIgMTIuOTcwMyAzLjY4NjY5IDEyLjk3MTcgMy41ODkzNCAxMi45MzY1TDUuMDg4MTUgMTAuOTI1OEwzLjY5MzcgOS4xMDg4N0MzLjkwMDU5IDkuMDM0MTMgNC4xMzExOCA5LjExNTI1IDQuMjQ2MjQgOS4zMDI1NEw1LjI4NTI0IDEwLjcwNjFMNi4zMzA0IDkuMzA4MDFDNi4zNzgxNyA5LjIxNzU3IDYuNDU3NTEgOS4xNDc4NSA2LjU1MzM0IDkuMTEyMDlDNi42NDkxNyA5LjA3NjM0IDYuNzU0NzkgOS4wNzcwNiA2Ljg1MDEzIDkuMTE0MTFMNi4zMDg5OCA5LjgzMjA3TDUuNTc1OTggMTAuNzg2MUM1LjU1NTY0IDEwLjgwNDIgNS41MzkzNiAxMC44MjY1IDUuNTI4MjIgMTAuODUxNEM1LjUxNzA3IDEwLjg3NjMgNS41MTEzMSAxMC45MDMzIDUuNTExMzEgMTAuOTMwNUM1LjUxMTMxIDEwLjk1NzggNS41MTcwNyAxMC45ODQ4IDUuNTI4MjIgMTEuMDA5N0M1LjUzOTM2IDExLjAzNDYgNS41NTU2NCAxMS4wNTY4IDUuNTc1OTggMTEuMDc1TDYuOTcyMDMgMTIuOTM4NEg2Ljk3NDk5Wk0xMy4zMzg5IDkuMDg5NVY5LjM2MjkyQzEzLjE0MjggOS4zNTAwNiAxMi45NDYxIDkuMzc4NDYgMTIuNzYxNyA5LjQ0NjI5QzEyLjU3NzIgOS41MTQxMiAxMi40MDkgOS42MTk4OCAxMi4yNjggOS43NTY3M0MxMi4xMjY5IDkuODkzNTkgMTIuMDE2MSAxMC4wNTg1IDExLjk0MjcgMTAuMjQwOEMxMS44NjkzIDEwLjQyMzEgMTEuODM1IDEwLjYxODggMTEuODQxOSAxMC44MTUyQzExLjg0MTkgMTEuNDUzOCAxMS44NDE5IDEyLjA5MjQgMTEuODQxOSAxMi43MzFWMTIuOTQ4MkgxMS41NjQ2VjkuMTA2NTlIMTEuODM4VjkuODkzODJDMTIuMTczNCA5LjMxOTYzIDEyLjY5MTEgOS4xMDY1OSAxMy4zNDA3IDkuMDkxMDlMMTMuMzM4OSA5LjA4OTVaTTAuMDAwNDU1Nzc5IDEwLjkwMDdMMC4xMjI1ODQgMTAuMjk3NkMwLjQ1Nzk4MiA5LjEwNDk5IDEuODI1MDkgOC42MDg3MyAyLjc2NTY2IDkuMzQ3NDNDMy4zMTYzOCA5Ljc3OTg5IDMuNDUzNzcgMTAuMzkyNiAzLjQyNjg5IDExLjA4M0gwLjMyNDIzM0MwLjI3NDEwNSAxMi4zMTYxIDEuMTYzODcgMTMuMDYwNyAyLjMwMTk4IDEyLjY4MDdDMi42NzcwMyAxMi41NDQgMi45NTkzNCAxMi4yMzIzIDMuMDUyMyAxMS44NDQ5QzMuMTEyNDUgMTEuNjUxMiAzLjIxMTc5IDExLjYxOCAzLjM5MzYyIDExLjY3NEMzLjM2MzMgMTEuOTEwMSAzLjI3OTg0IDEyLjEzNjIgMy4xNDk1MiAxMi4zMzU0QzMuMDE5MjEgMTIuNTM0NiAyLjg0NTQzIDEyLjcwMTYgMi42NDEyNSAxMi44MjRDMi4zMDM5MyAxMy4wMDg1IDEuOTE2OTIgMTMuMDgxNiAxLjUzNTU1IDEzLjAzMjhDMS4xNTQxOCAxMi45ODQxIDAuNzk3OTkgMTIuODE2IDAuNTE3OTA2IDEyLjU1MjZDMC4yNDA4MzkgMTIuMjQxMSAwLjA3MzU5NjEgMTEuODQ3NCAwLjA0MTAxMzMgMTEuNDMxNkMwLjA0MTAxMzMgMTEuMzYzMiAwLjAxODIyODIgMTEuMjk5NCAwLjAwMjI3ODU3IDExLjIzNzlDMC4wMDA3NTk1NTcgMTEuMTIyOSAwIDExLjAxMDUgMCAxMC45MDA3SDAuMDAwNDU1Nzc5Wk0wLjMyODEwNiAxMC44MTczSDMuMTMzODdDMy4xMTYzMiA5LjkyMzQ0IDIuNTUyMTYgOS4yODkzMyAxLjc5OTggOS4yODM0QzAuOTYyMjE3IDkuMjcyMDEgMC4zNjI5NjcgOS44OTIyMiAwLjMyNjA1NiAxMC44MTM0TDAuMzI4MTA2IDEwLjgxNzNaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K)
    Express
    This template demonstrates building the Express framework for Upsun Fixed.  It includes a minimalist application skeleton that demonstrates how to connect to a MariaDB server.  It is intended for you to use as a starting point and modify for your own needs.
Express is a minimalist web framework written in Node.js.

### Features:

 - Node.js 14

 - MariaDB 10.4

 - Automatic TLS certificates

 - npm-based build

    View the [repository on GitHub](https://github.com/platformsh-templates/express).

        ![Deploy on  ](https://platform.sh/images/deploy/lg-blue.svg)

  Gatsby

    ![Gatsby](data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='225' height='225'%3E%3Cg %3E%3Cpath d='M112.5 0A112.5 112.5 0 1 0 225 112.5 112.5 112.5 0 0 0 112.5 0zM24.17 113.67l87.16 87.16a88.35 88.35 0 0 1-87.16-87.16zm108.1 85L26.38 92.73a88.35 88.35 0 0 1 157.54-32.22L171.69 71.3a72.13 72.13 0 0 0-127 16.64l92.38 92.38a72.26 72.26 0 0 0 45.46-50.51h-38.3V112.5h56.61a88.38 88.38 0 0 1-68.57 86.12z' style='fill:%23744c9e' /%3E%3C/g%3E%3C/svg%3E)
    Gatsby
    This template builds a simple application using Gatsby.  Gatsby is a free and open source framework based on React that helps developers build blazing fast websites and apps.  The website is statically generated by a Node.js application during the build step, and then served statically at runtime.
Gatsby is a free and open source framework based on React that helps developers build blazing fast websites and apps.

### Features:

 - Node.js 16

 - Automatic TLS certificates

 - yarn-based build

    View the [repository on GitHub](https://github.com/platformsh-templates/gatsby).

        ![Deploy on  ](https://platform.sh/images/deploy/lg-blue.svg)

  Koa

    ![Koa](data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='105.6' height='225'%3E%3Cg %3E%3Cpath d='M21 0v149.43L87 75h3l-48.89 55.23L105.6 225h-21L29 143.31l-8.1 9.32V225H0V0z' style='fill:%2316111c' /%3E%3C/g%3E%3C/svg%3E)
    Koa
    This template demonstrates building the Koa framework for Upsun Fixed.  It includes a minimalist application skeleton that demonstrates how to connect to a MariaDB server for data storage.  It is intended for you to use as a starting point and modify for your own needs.
Koa is a lightweight web microframework for Node.js.

### Features:

 - Node.js 10

 - MariaDB 10.2

 - Automatic TLS certificates

 - npm-based build

    View the [repository on GitHub](https://github.com/platformsh-templates/koa).

        ![Deploy on  ](https://platform.sh/images/deploy/lg-blue.svg)

  Next.js

    ![Next.js](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTUuNjYyOTkgOC43ODE4SDEwLjE4OTZWOS4xNDIxMUg2LjA3NzkzVjExLjg1MzlIOS45NDQ0MlYxMi4yMTQySDYuMDc3OTNWMTUuMTkxNEgxMC4yMzY4VjE1LjU1MThINS42NjI5OVY4Ljc4MThaTTEwLjU5NTEgOC43ODE4SDExLjA3NjFMMTMuMjA3NCAxMS43NTkxTDE1LjM4NTggOC43ODE4TDE4LjM0ODggNUwxMy40ODA4IDEyLjA3MkwxNS45ODkzIDE1LjU1MThIMTUuNDg5NUwxMy4yMDc0IDEyLjM4NDlMMTAuOTE1OCAxNS41NTE4SDEwLjQyNTRMMTIuOTUyNyAxMi4wNzJMMTAuNTk1MSA4Ljc4MThaTTE2LjE2ODUgOS4xNDIxMVY4Ljc4MThIMjEuMzI3VjkuMTQyMTFIMTguOTUwNVYxNS41NTE4SDE4LjUzNTZWOS4xNDIxMUgxNi4xNjg1Wk0wIDguNzgxOEgwLjUxODY3NUw3LjY3MDkgMTkuNUw0LjcxNTIzIDE1LjU1MThMMC40MzM4MDEgOS4yOTM4MkwwLjQxNDk0IDE1LjU1MThIMFY4Ljc4MThaTTIxLjI4NTIgMTUuMDgyN0MyMS4yMDA0IDE1LjA4MjcgMjEuMTM2OCAxNS4wMTY5IDIxLjEzNjggMTQuOTMxOUMyMS4xMzY4IDE0Ljg0NjkgMjEuMjAwNCAxNC43ODExIDIxLjI4NTIgMTQuNzgxMUMyMS4zNzEgMTQuNzgxMSAyMS40MzM1IDE0Ljg0NjkgMjEuNDMzNSAxNC45MzE5QzIxLjQzMzUgMTUuMDE2OSAyMS4zNzEgMTUuMDgyNyAyMS4yODUyIDE1LjA4MjdaTTIxLjY5MjkgMTQuNjg2SDIxLjkxNDlDMjEuOTE4IDE0LjgwNjQgMjIuMDA1OCAxNC44ODc0IDIyLjEzNDkgMTQuODg3NEMyMi4yNzkzIDE0Ljg4NzQgMjIuMzYxIDE0LjgwMDQgMjIuMzYxIDE0LjYzNzRWMTMuNjA1MkgyMi41ODcxVjE0LjYzODRDMjIuNTg3MSAxNC45MzE5IDIyLjQxNzUgMTUuMTAwOSAyMi4xMzcgMTUuMTAwOUMyMS44NzM2IDE1LjEwMDkgMjEuNjkyOSAxNC45MzcgMjEuNjkyOSAxNC42ODZaTTIyLjg4MjggMTQuNjcyOEgyMy4xMDY4QzIzLjEyNiAxNC44MTE1IDIzLjI2MTIgMTQuODk5NSAyMy40NTYgMTQuODk5NUMyMy42Mzc3IDE0Ljg5OTUgMjMuNzcwOSAxNC44MDU0IDIzLjc3MDkgMTQuNjc1OUMyMy43NzA5IDE0LjU2NDYgMjMuNjg2MSAxNC40OTc4IDIzLjQ5MzQgMTQuNDUyMkwyMy4zMDU2IDE0LjQwNjdDMjMuMDQyMiAxNC4zNDUgMjIuOTIyMSAxNC4yMTc0IDIyLjkyMjEgMTQuMDAyOUMyMi45MjIxIDEzLjc0MjggMjMuMTM0MSAxMy41Njk4IDIzLjQ1MiAxMy41Njk4QzIzLjc0NzcgMTMuNTY5OCAyMy45NjM3IDEzLjc0MjggMjMuOTc2OCAxMy45ODg3SDIzLjc1NjhDMjMuNzM1NiAxMy44NTQxIDIzLjYxODUgMTMuNzcwMSAyMy40NDkgMTMuNzcwMUMyMy4yNzAzIDEzLjc3MDEgMjMuMTUxMiAxMy44NTYyIDIzLjE1MTIgMTMuOTg3N0MyMy4xNTEyIDE0LjA5MiAyMy4yMjc5IDE0LjE1MTcgMjMuNDE3NyAxNC4xOTYyTDIzLjU3ODEgMTQuMjM1N0MyMy44NzY5IDE0LjMwNTUgMjQgMTQuNDI2OSAyNCAxNC42NDY1QzI0IDE0LjkyNTkgMjMuNzg0IDE1LjEwMDkgMjMuNDM4OSAxNS4xMDA5QzIzLjExNTkgMTUuMTAwOSAyMi44OTg5IDE0LjkzMzkgMjIuODgyOCAxNC42NzI4WiIgZmlsbD0iYmxhY2siLz4KPC9zdmc+Cg==)
    Next.js
    This template builds a simple application using the Next.js web framework. It includes a minimal application skeleton that demonstrates how to set up an optimized build using Next.js and Yarn, as well as how to begin defining individual pages (such as the ``/api/hello``) endpoint that comes pre-defined with this template.
Next.js is an open-source web framework written for Javascript.

### Features:

 - Node.js 14

 - Automatic TLS certificates

 - yarn-based build

    View the [repository on GitHub](https://github.com/platformsh-templates/nextjs).

        ![Deploy on  ](https://platform.sh/images/deploy/lg-blue.svg)

  NuxtJS

    ![NuxtJS](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzY2NzRfMTU0NjApIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03LjMwNDIxIDIwLjM4OUM3LjI4NjQzIDIwLjM1NzEgNy4yNzA3NSAyMC4zMjM5IDcuMjU3MjcgMjAuMjg5OUM3LjE2MTExIDIwLjA2NjMgNy4xMzE0NiAxOS44MTkyIDcuMTcxOTQgMTkuNTc4OUgxLjUwMDQ3TDkuOTI3MTQgNC41OTc2N0wxMi42OTQxIDkuNTEwMjRMMTMuNDk2MiA4LjA3NjMzTDExLjA4NjYgMy43ODUzN0MxMS4wMTgzIDMuNjYxNDcgMTAuNjEwOSAzIDkuOTA5MDEgM0M5LjU4OTAxIDMgOS4xMzY3NCAzLjEzODk3IDguNzY2NjEgMy43OTUwNkwwLjIyNzk0IDE4Ljk1NzNDMC4xNTU0MDcgMTkuMDg4NyAtMC4xOTg3MjcgMTkuNzc4MiAwLjE1MzI3MyAyMC4zODlDMC4zMTMyNzMgMjAuNjY3IDAuNjUzNTQgMjAuOTk3NyAxLjQwMzQxIDIwLjk5NzdIOC41NTAwN0M3LjgwODc0IDIwLjk5NzcgNy40Njc0MSAyMC42NjggNy4zMDQyMSAyMC4zODlaIiBmaWxsPSIjMDBDNThFIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjMuNzQ3IDE4Ljk1NzNMMTYuNzMwNCA2LjQ3MzI5QzE2LjY1NzkgNi4zNDI5MyAxNi4yNTI2IDUuNjc4MjIgMTUuNTQ3NSA1LjY3ODIyQzE1LjIyNzUgNS42NzgyMiAxNC43NzUyIDUuODE1MDQgMTQuNDA2MiA2LjQ3MTEzTDEzLjQ5ODQgOC4wNzYzNEwxNC4zMDU5IDkuNTEwMjVMMTUuNTU1IDcuMjc2OTdMMjIuNDk2OCAxOS41Nzg5SDE5Ljg1NjhDMTkuODkwNyAxOS43ODIxIDE5Ljg3MiAxOS45OTA2IDE5LjgwMjQgMjAuMTg0M0MxOS43ODc3IDIwLjIyNzIgMTkuNzY5MSAyMC4yNjg3IDE5Ljc0NyAyMC4zMDgyTDE5LjcyNDYgMjAuMzUzNUMxOS4zNjk0IDIwLjk2NDMgMTguNjAyNCAyMC45OTk5IDE4LjQ1MiAyMC45OTk5SDIyLjU4MjJDMjIuNzM0NyAyMC45OTk5IDIzLjQ5OTUgMjAuOTY2NSAyMy44NTM2IDIwLjM1MzVDMjQuMDExNSAyMC4wNzU1IDI0LjEyMzUgMTkuNjA5MSAyMy43NDcgMTguOTU3M1oiIGZpbGw9IiMxMDg3NzUiLz4KPHBhdGggZD0iTTE5LjcyNDYgMjAuMzUzOEwxOS43NDcgMjAuMzA4NkMxOS43NjkxIDIwLjI2OSAxOS43ODc3IDIwLjIyNzYgMTkuODAyNCAyMC4xODQ3QzE5Ljg3MiAxOS45OTEgMTkuODkwNyAxOS43ODI0IDE5Ljg1NjggMTkuNTc5MkMxOS44MTgzIDE5LjM1OTcgMTkuNzQwNiAxOS4xNDkgMTkuNjI3NSAxOC45NTc2TDE0LjMxMDIgOS41MTA1N0wxMy40OTg0IDguMDc2NjZMMTIuNjk0MiA5LjUxMDU3TDcuMzc2ODMgMTguOTU3NkM3LjI3MzM5IDE5LjE1MTIgNy4yMDQwOSAxOS4zNjE2IDcuMTcyMDMgMTkuNTc5MkM3LjEyOTIxIDE5LjgxODggNy4xNTYyNiAyMC4wNjU5IDcuMjQ5OSAyMC4yOTAyQzcuMjYzMzcgMjAuMzI0MyA3LjI3OTA1IDIwLjM1NzQgNy4yOTY4MyAyMC4zODk0QzcuNDU2ODMgMjAuNjY3MyA3Ljc5NzEgMjAuOTk4IDguNTQ2OTcgMjAuOTk4SDE4LjQ0NDZDMTguNjAyNCAyMC45OTggMTkuMzY5NCAyMC45NjQ2IDE5LjcyNDYgMjAuMzUzOFpNMTMuNDk4NCAxMC45NDQ1TDE4LjM1NzEgMTkuNTc5Mkg4LjY0MDgzTDEzLjQ5ODQgMTAuOTQ0NVoiIGZpbGw9ImJsYWNrIi8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDBfNjY3NF8xNTQ2MCI+CjxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K)
    NuxtJS
    This template builds a simple application using the NuxtJS web framework that can be used as a starting point.
NuxtJS is an open-source web framework based on Vue.js.

### Features:

 - Node.js 18

 - Automatic TLS certificates

 - yarn-based build

    View the [repository on GitHub](https://github.com/platformsh-templates/nuxtjs).

        ![Deploy on  ](https://platform.sh/images/deploy/lg-blue.svg)

  strapi4

    ![strapi4](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjQ0cHgiIGhlaWdodD0iMjQ0cHgiIHZpZXdCb3g9IjAgMCAyNDQgMjQ0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA1NS4yICg3ODE4MSkgLSBodHRwczovL3NrZXRjaGFwcC5jb20gLS0+CiAgICA8dGl0bGU+TG9nbzwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJTb2NpYWwtQ292ZXIiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJNb25vZ3JhbS1XaGl0ZS1CYWNrZ3JvdW5kIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTY3LjAwMDAwMCwgLTM1Ny4wMDAwMDApIiBmaWxsPSIjOEU3NUZGIj4KICAgICAgICAgICAgPGcgaWQ9IkxvZ28iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU2NC4wMDAwMDAsIDM1Ny4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSJNb25vZ3JhbSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDAuNzYwMzA1KSI+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2NC44OTI2NjIsMTY1LjA3MjQ4IEwxNjQuODkyNjYyLDg2LjM0MzU2NSBDMTY0Ljg5MjY2Miw4My41Mzk1NTI3IDE2Mi42MTk1NjEsODEuMjY2NDUxNiAxNTkuODE1NTQ5LDgxLjI2NjQ1MTYgTDgxLjE3NzkyNiw4MS4yNjY0NTE2IEw4MS4xNzc5MjYsMCBMMjQwLjk5MzQ3NSwwIEMyNDMuNzk3NDg3LC0xLjU0NTc4NjhlLTE0IDI0Ni4wNzA1ODgsMi4yNzMxMDExIDI0Ni4wNzA1ODgsNS4wNzcxMTM0IEwyNDYuMDcwNTg4LDE2NS4wNzI0OCBMMTY0Ljg5MjY2MiwxNjUuMDcyNDggWiIgaWQ9IkNvbWJpbmVkLVNoYXBlLUNvcHkiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNODEuMTc3OTI2LDAgTDgxLjE3NzkyNiw4MS4yNjY0NTE2IEw2LjEyMzg5Nzg3LDgxLjI2NjQ1MTYgQzQuNzIxODkxNzEsODEuMjY2NDUxNiAzLjU4NTM0MTE2LDgwLjEyOTkwMSAzLjU4NTM0MTE2LDc4LjcyNzg5NDkgQzMuNTg1MzQxMTYsNzguMDU1MTA3MSAzLjg1MjQxNTgyLDc3LjQwOTgzNDYgNC4zMjc4ODkyNiw3Ni45MzM4NDI3IEw4MS4xNzc5MjYsMCBaIiBpZD0iUmVjdGFuZ2xlLUNvcHktNiIgb3BhY2l0eT0iMC40MDQ5ODkiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjQ2LjA3MDU4OCwxNzEuMjA1ODI0IEwyNDYuMDcwNTg4LDI0Ni4zMzg5MzEgTDE2NC44OTI2NjIsMjQ2LjMzODkzMSBMMjQxLjczNjAyMywxNjkuNDExNzcyIEMyNDIuNzI2ODUxLDE2OC40MTk4NjQgMjQ0LjMzNDE3NiwxNjguNDE4OTg4IDI0NS4zMjYwODQsMTY5LjQwOTgxNiBDMjQ1LjgwMjc1NCwxNjkuODg1OTY3IDI0Ni4wNzA1ODgsMTcwLjUzMjA3OCAyNDYuMDcwNTg4LDE3MS4yMDU4MjQgWiIgaWQ9IlJlY3RhbmdsZS1Db3B5LTciIG9wYWNpdHk9IjAuNDA0OTg5IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMDUuNDgxNjI1LCAyMDUuNzA1NzA2KSBzY2FsZSgtMSwgLTEpIHRyYW5zbGF0ZSgtMjA1LjQ4MTYyNSwgLTIwNS43MDU3MDYpICI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik04MS4xNzc5MjYsODEuMjY2NDUxNiBMMTYyLjM1NDEwNiw4MS4yNjY0NTE2IEMxNjMuNzU2MTEyLDgxLjI2NjQ1MTYgMTY0Ljg5MjY2Miw4Mi40MDMwMDIxIDE2NC44OTI2NjIsODMuODA1MDA4MyBMMTY0Ljg5MjY2MiwxNjUuMDcyNDggTDg2LjI1NTAzOTQsMTY1LjA3MjQ4IEM4My40NTEwMjcxLDE2NS4wNzI0OCA4MS4xNzc5MjYsMTYyLjc5OTM3OSA4MS4xNzc5MjYsMTU5Ljk5NTM2NiBMODEuMTc3OTI2LDgxLjI2NjQ1MTYgWiIgaWQ9IlJlY3RhbmdsZS1Db3B5LTgiIG9wYWNpdHk9IjAuNDA0OTg5Ij48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==)
    strapi4
    This template builds a Strapi version 4 backend for Upsun Fixed, which can be used to quickly create an API that can be served by itself or as a Headless CMS data source for another frontend application in the same project. This repository does not include a frontend application, but you can add one of your choice and access Strapi by defining it in a relationship in your frontend's ``.platform.app.yaml`` file.
Strapi is a Headless CMS framework written in Node.js.

### Features:

 - Node.js 12

 - PostgreSQL 12

 - Automatic TLS certificates

 - yarn-based build

    View the [repository on GitHub](https://github.com/platformsh-templates/strapi4).

        ![Deploy on  ](https://platform.sh/images/deploy/lg-blue.svg)


