To ensure that the documentation for Home Assistant is consistent and easy to follow for both novice and expert users, we ask that you follow a very strict set of standards for developing the documentation.

General Documentation

  • The language of the documentation should be American-English.
  • Don't put two spaces after a period and avoid the "Oxford comma".
  • There is no limit for the line length. You are allowed to write in a flowing text style. This will make it easier to use the GitHub online editor in the future.
  • Be objective and not gender favoring, polarizing, race related or religion inconsiderate.
  • The case of brand names, services, protocols, integrations and platforms must match its respective counterpart. e.g., "Z-Wave" not "Zwave", "Z-wave", "Z Wave" or "ZWave". Also, "Input Select" not "input select" or "Input select".
  • Do not use ALL CAPITALS for emphasis - use italics instead.

Integration and Platform Pages

  • The Configuration Variables section must use the {% configuration %} tag.
  • The Configuration Variables section is only used for YAML configuration.
  • Configuration variables must document the requirement status (false or true).
  • Configuration variables must document the default value, if any.
  • Configuration variables must document the accepted value types (see Configuration variables details).
    • For configuration variables that accept multiple types, separate the types with a comma (i.e. string, int).
  • Use YAML sequence syntax in the sample code if it is supported.
  • All examples should be formatted to be included in configuration.yaml unless explicitly stated.
    • Use capital letters and _ to indicate that the value needs to be replaced. E.g., api_key: YOUR_API_KEY or api_key: REPLACE_ME.
    • If you know that the API key or value contains control characters, e.g., #, [, ?, etc., wrap it in quotes and add a note.
  • Integration and platform names should be a link to their respective documentation pages.

Example configuration block

{% configuration %}
description: This is a description of what this key is for.
required: false
type: string
default: Optional default value - leave out if there isn't one
{% endconfiguration %}


  • All examples containing Jinja2 templates should be wrapped outside of the code markdown with the {% raw %} tag.
  • Do not use states.switch.source.state in templates. Instead use states() and is_state().
  • Use double quotes (") for (more information):
    • friendly_name
    • Single-line templates:
      • value_template
      • level_template
      • icon_template
      • Children of data_template
  • Use single quotes (') for (more information:
    • Strings inside of templates:
      • States
      • Entity IDs
    • unit_of_measurement
  • No whitespace around pipe character (|) for Jinja2 filters.
  • Single whitespace after Jinja2 opening delimiters ({% raw %}{{{% endraw %}).
  • Single whitespace before Jinja2 closing delimiters ({% raw %}}}{% endraw %}).
  • Do not quote values for:
    • device_class
    • platform
    • condition
    • service

Renaming Pages

It can happen that an integration or platform is renamed, in this case the documentation needs to be updated as well. If you rename a page, add redirect_from: to the file header and let it point to the old location/name of the page. Please consider to add details, like release number or old integration/platform name, to the page in a note.

redirect_from: /getting-started/android/

Adding a redirect also applies if you move content around in the documentation.

Single vs. Double Quotation Marks

Use single quotes (') for strings inside of a template. It is more obvious to escape a single quote when necessary (i.e. name is a possessive noun), because the single quotes that wrap the string are closer in position to the apostrophe inside the string. Use double quotes (") outside of a template (unless it is a multi-line template, in which case outside quotes are not required).


Double Quotes Outside, Single Quotes Inside (Valid)

message: "{% if == 'Dale\'s Bedroom' %}Someone's in your base, killing your noobs!{% else %}It's just another door.{% endif %}"

Single Quotes Outside, Double Quotes Inside (Invalid)

message: '{% if == "Dale's Bedroom" %}Someone's in your base, killing your noobs!{% else %}It's just another door.{% endif %}'

Multi-Line Template (Valid)

message: >-
{% if == 'Dale\'s Bedroom' %}
Someone's in your base, killing your noobs!
{% else %}
It's just another door.
{% endif %}
Last updated on