> ## 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.

# Making .upsun/config.yaml easier to edit with IDE autocomplete and validation

> Boost your productivity and eliminate configuration errors with real-time autocompletion and validation for your .upsun/config.yaml — discover how to enhance your IDE experience in just a few simple steps!  
  


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: ["flovntp"], date: "2025-05-06T09:04:20+01:00", image: "/images/posts/how-tos/validate-yaml-config/logo-yaml.webp" }} />

Working with `.upsun/config.yaml` files can be tedious if your editor doesn’t help you catch errors early or suggest valid keys as you type.
Fortunately, you can get schema-based validation and autocompletion in popular editors like VSCode and PhpStorm — making your configuration faster, safer, and less error-prone.

In this article, we’ll show you how to set up this support using the official Upsun schema from [SchemaStore.org](https://www.schemastore.org/),
which IDEs like PhpStorm can automatically detect: [upsun.json](https://raw.githubusercontent.com/platformsh/platformify/refs/heads/main/validator/schema/upsun.json) schema

With just a few steps, you’ll get autocomplete for YAML config keys, inline documentation, and real-time error highlighting — all from your editor.

Let’s dive in! 🛠️

## Schema Available on SchemaStore

The [validation schema for `.upsun/config.yaml`](https://raw.githubusercontent.com/platformsh/platformify/refs/heads/main/validator/schema/upsun.json) is published on [SchemaStore](https://www.schemastore.org/), a centralized catalog of widely used JSON and YAML schemas.

Because it’s listed on SchemaStore:

* most IDEs, like [**VSCode**](https://code.visualstudio.com/), [**PhpStorm**](https://www.jetbrains.com/phpstorm/), [**WebStorm**](https://www.jetbrains.com/webstorm/), and [**IntelliJ IDEA**](https://www.jetbrains.com/idea/) (complete list [here](https://www.schemastore.org/#editors)), automatically detect and apply the schema when you open a `.upsun/config.yaml`.
* You benefit from autocompletion, inline errors, and context-aware editing — out of the box.

## Result with VSCode

<Info>
  If you're using Visual Studio Code, consider installing the [**Upsun VSCode extension**](https://marketplace.visualstudio.com/items?itemName=Upsun.upsun).
  It brings powerful features, including:

  * Schema-based autocompletion
  * Real-time configuration validation
  * Helpful inline documentation on hover
  * Project-aware interactions (more on this in an [upcoming blog post](/posts/releases/vscode-extension))

  Just install it from the [Marketplace](https://marketplace.visualstudio.com/items?itemName=Upsun.upsun) and start editing your `.upsun/config.yaml` — no extra setup required.
</Info>

### Autocomplete

If you’re unsure which settings are available at any level, just start typing — or press Ctrl+Space (or Cmd+Space on macOS) — to see a list of available parameters.

<img src="https://mintcdn.com/upsun-c9761871/eXV27YLeu5lESGxN/images/posts/how-tos/validate-yaml-config/vscode-autocomplete.webp?fit=max&auto=format&n=eXV27YLeu5lESGxN&q=85&s=e2772d26543116a63ea559fa7c3d3a38" alt="Type less, discover more: Autocomplete every valid setting" width="1102" height="626" data-path="images/posts/how-tos/validate-yaml-config/vscode-autocomplete.webp" />

And see possible values instantly:

<img src="https://mintcdn.com/upsun-c9761871/eXV27YLeu5lESGxN/images/posts/how-tos/validate-yaml-config/vscode-autocomplete-values.webp?fit=max&auto=format&n=eXV27YLeu5lESGxN&q=85&s=77ee085ac7abe47d197acd8e9d37c4e5" alt="Let your IDE guide you: Autocomplete for fixed values" width="1374" height="552" data-path="images/posts/how-tos/validate-yaml-config/vscode-autocomplete-values.webp" />

### Info on settings

When you hover your mouse over any YAML setting, helpful information and documentation links are displayed.

<img src="https://mintcdn.com/upsun-c9761871/eXV27YLeu5lESGxN/images/posts/how-tos/validate-yaml-config/vscode-info.webp?fit=max&auto=format&n=eXV27YLeu5lESGxN&q=85&s=fc4f77d0c1fcc3719b2f49d0e8c6c51c" alt="Get instant info and documentation on any Upsun YAML setting" width="1950" height="668" data-path="images/posts/how-tos/validate-yaml-config/vscode-info.webp" />

### Deprecated settings

As our product evolves, some settings have been deprecated and are now marked with an orange underline.
Hover your mouse over the setting to see a tooltip with helpful information about the deprecation and suggested alternatives.

<img src="https://mintcdn.com/upsun-c9761871/eXV27YLeu5lESGxN/images/posts/how-tos/validate-yaml-config/vscode-deprecated.webp?fit=max&auto=format&n=eXV27YLeu5lESGxN&q=85&s=d169824e3c378468fd55e8aa1b1794c1" alt="Deprecated settings are clearly marked" width="1518" height="268" data-path="images/posts/how-tos/validate-yaml-config/vscode-deprecated.webp" />

## Result with PhpStorm

<Info>
  Using PhpStorm, to ensure you're always using the latest version of the configuration schema,
  enable the **Always download the most recent versions of schemas** option under
  `Settings > Languages & Frameworks > Schemas and DTDs > Remote JSON Schemas`:

  <img src="https://mintcdn.com/upsun-c9761871/eXV27YLeu5lESGxN/images/posts/how-tos/validate-yaml-config/phpstorm-settings.webp?fit=max&auto=format&n=eXV27YLeu5lESGxN&q=85&s=111cbabe9bff0d2ac660775c65189038" alt="" width="1630" height="452" data-path="images/posts/how-tos/validate-yaml-config/phpstorm-settings.webp" />

  After enabling this option, restart your IDE to refresh all cached schemas.
</Info>

### Autocomplete

If you’re unsure which settings are available at any level, just start typing — or press Ctrl+Space (or Cmd+Space on macOS) — to see a list of available parameters.

<img src="https://mintcdn.com/upsun-c9761871/eXV27YLeu5lESGxN/images/posts/how-tos/validate-yaml-config/phpstorm-autocomplete.webp?fit=max&auto=format&n=eXV27YLeu5lESGxN&q=85&s=5b1efb6477a908d1a0209a3e97334f6e" alt="Type less, discover more: Autocomplete every valid setting" width="1488" height="646" data-path="images/posts/how-tos/validate-yaml-config/phpstorm-autocomplete.webp" />

And see possible values instantly:

<img src="https://mintcdn.com/upsun-c9761871/eXV27YLeu5lESGxN/images/posts/how-tos/validate-yaml-config/phpstorm-autocomplete-values.webp?fit=max&auto=format&n=eXV27YLeu5lESGxN&q=85&s=6808f71eacedb18149d4d6368842a636" alt="Let your IDE guide you: Autocomplete for fixed values" width="1100" height="542" data-path="images/posts/how-tos/validate-yaml-config/phpstorm-autocomplete-values.webp" />

### Info on settings

When you hover your mouse over any YAML setting, helpful information and documentation links are displayed.

<img src="https://mintcdn.com/upsun-c9761871/eXV27YLeu5lESGxN/images/posts/how-tos/validate-yaml-config/phpstorm-info.webp?fit=max&auto=format&n=eXV27YLeu5lESGxN&q=85&s=f7d5427bd16e8994e7715fc793bc4599" alt="Get instant info and documentation on any Upsun YAML setting" width="896" height="594" data-path="images/posts/how-tos/validate-yaml-config/phpstorm-info.webp" />

### Deprecated settings

As our product evolves, some settings have been deprecated and are now marked with an orange underline.
Hover your mouse over the setting to see a tooltip with helpful information about the deprecation and suggested alternatives.

<img src="https://mintcdn.com/upsun-c9761871/eXV27YLeu5lESGxN/images/posts/how-tos/validate-yaml-config/phpstorm-deprecated.webp?fit=max&auto=format&n=eXV27YLeu5lESGxN&q=85&s=fd333bca267270f206d5284be9abf53a" alt="Deprecated settings are clearly marked" width="1198" height="398" data-path="images/posts/how-tos/validate-yaml-config/phpstorm-deprecated.webp" />

## Best practices

* Always validate your config before committing or deploying.
* If you're using CI/CD, consider adding schema validation as a pre-check.
* Keep your IDE schema mappings up to date — most modern IDEs do this automatically.

With the right tools in place, validating `.upsun/config.yaml` becomes seamless — and ensures your configuration is always predictable, stable, and ready for production.

**Happy deploying!** 🚀

If you need assistance with setting up validation in your specific IDE or integrating it into your CI/CD pipeline, feel free to contact us on our [Discord](https://discord.gg/upsun).
