[
  {
    "path": ".devcontainer/Dockerfile",
    "content": "FROM ghcr.io/home-assistant/devcontainer:apps\n\nRUN \\\n  apt-get update \\\n  && apt-get install -y --no-install-recommends \\\n    python3-pip \\\n    python3-venv\n\nENV VIRTUAL_ENV=/opt/venv\nRUN python3 -m venv $VIRTUAL_ENV\nENV PATH=\"$VIRTUAL_ENV/bin:$PATH\"\n\nCOPY script/requirements.txt /\n\nRUN pip install -r /requirements.txt\n"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "content": "{\n  \"name\": \"ESPHome Home Assistant App devcontainer\",\n  \"image\": \"ghcr.io/esphome/devcontainer:addons\",\n  \"appPort\": [\n    \"7123:8123\",\n    \"7357:4357\"\n  ],\n  \"postStartCommand\": \"bash devcontainer_bootstrap\",\n  \"runArgs\": [\n    \"-e\",\n    \"GIT_EDITOR=code --wait\",\n    \"--privileged\"\n  ],\n  \"containerEnv\": {\n    \"WORKSPACE_DIRECTORY\": \"${containerWorkspaceFolder}\"\n  },\n  \"customizations\": {\n    \"vscode\": {\n      \"extensions\": [\n        \"timonwong.shellcheck\",\n        \"esbenp.prettier-vscode\",\n        \"ms-python.python\"\n      ],\n      \"mounts\": [\n        \"type=volume,target=/var/lib/docker\"\n      ],\n      \"settings\": {\n        \"terminal.integrated.profiles.linux\": {\n          \"zsh\": {\n            \"path\": \"/usr/bin/zsh\"\n          }\n        },\n        \"terminal.integrated.defaultProfile.linux\": \"zsh\",\n        \"editor.formatOnPaste\": false,\n        \"editor.formatOnSave\": true,\n        \"editor.formatOnType\": true,\n        \"files.trimTrailingWhitespace\": true\n      }\n    }\n  }\n}\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Report an issue with ESPHome\n    url: https://github.com/esphome/esphome/issues/new/choose\n    about: Report an issue with ESPHome.\n  - name: Report an issue with the ESPHome documentation\n    url: https://github.com/esphome/esphome-docs/issues/new/choose\n    about: Report an issue with the ESPHome documentation.\n  - name: Report an issue with the ESPHome web server\n    url: https://github.com/esphome/esphome-webserver/issues/new/choose\n    about: Report an issue with the ESPHome web server.\n  - name: Report an issue with the ESPHome Builder / Dashboard\n    url: https://github.com/esphome/dashboard/issues/new/choose\n    about: Report an issue with the ESPHome Builder / Dashboard.\n  - name: Report an issue with the ESPHome API client\n    url: https://github.com/esphome/aioesphomeapi/issues/new/choose\n    about: Report an issue with the ESPHome API client.\n  - name: Make a Feature Request\n    url: https://github.com/orgs/esphome/discussions\n    about: Please create feature requests in the dedicated feature request tracker.\n  - name: Frequently Asked Question\n    url: https://esphome.io/guides/faq.html\n    about: Please view the FAQ for common questions and what to include in a bug report.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: daily\n    open-pull-requests-limit: 10\n"
  },
  {
    "path": ".github/workflows/bump-version.yml",
    "content": "name: Publish Release\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: The version to release\n        required: true\n\npermissions:\n  contents: read  # actions/checkout only; commits + release writes use the App token\n\njobs:\n  create-release:\n    name: Create release\n    runs-on: ubuntu-latest\n    continue-on-error: true\n    steps:\n      - name: Generate a token\n        id: generate-token\n        uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0\n        with:\n          client-id: ${{ vars.ESPHOME_GITHUB_APP_CLIENT_ID }}\n          private-key: ${{ secrets.ESPHOME_GITHUB_APP_PRIVATE_KEY }}\n          # contents: write covers both GraphQL createCommitOnBranch and\n          # ``gh release create`` (which creates the release + lightweight tag).\n          permission-contents: write\n\n      - name: Checkout\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n\n      - name: Set up Python\n        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0\n        with:\n          python-version: \"3.11\"\n\n      - name: Install Python dependencies\n        run: pip install -r script/requirements.txt\n\n      - name: Bump version\n        run: script/bump-version.py ${{ github.event.inputs.version }}\n\n      - name: Extract major version\n        id: extract_version\n        run: |\n          # Extract major version (e.g., 2025.6.0 from 2025.6.2 or 2025.6.0b3)\n          MAJOR_VERSION=$(echo \"${{ github.event.inputs.version }}\" | sed -E 's/^([0-9]+\\.[0-9]+)\\.[0-9]+.*/\\1.0/')\n          echo \"major_version=${MAJOR_VERSION}\" >> $GITHUB_OUTPUT\n\n      - name: Fetch release body\n        # Stored in $RUNNER_TEMP so ``git status --porcelain`` in the commit\n        # step doesn't pick it up. Consumed by the changelog writes and the\n        # ``Create a Release`` step.\n        if: ${{ !contains(github.event.inputs.version, 'dev') }}\n        env:\n          GH_TOKEN: ${{ steps.generate-token.outputs.token }}\n          VERSION: ${{ github.event.inputs.version }}\n        run: |\n          gh release view \"$VERSION\" \\\n            --repo esphome/esphome \\\n            --json body \\\n            --jq .body \\\n            > \"$RUNNER_TEMP/release_body.md\"\n\n      - name: Write Beta changelog\n        if: ${{ !contains(github.event.inputs.version, 'dev') }}\n        env:\n          VERSION: ${{ github.event.inputs.version }}\n          MAJOR: ${{ steps.extract_version.outputs.major_version }}\n        run: |\n          {\n            printf '## %s\\n\\n[**Read release announcement**](https://beta.esphome.io/changelog/%s)\\n\\n' \"$VERSION\" \"$MAJOR\"\n            cat \"$RUNNER_TEMP/release_body.md\"\n          } > esphome-beta/CHANGELOG.md\n\n      - name: Write Stable changelog\n        if: ${{ !contains(github.event.inputs.version, 'b') && !contains(github.event.inputs.version, 'dev')  }}\n        env:\n          VERSION: ${{ github.event.inputs.version }}\n          MAJOR: ${{ steps.extract_version.outputs.major_version }}\n        run: |\n          {\n            printf '## %s\\n\\n[**Read release announcement**](https://esphome.io/changelog/%s)\\n\\n' \"$VERSION\" \"$MAJOR\"\n            cat \"$RUNNER_TEMP/release_body.md\"\n          } > esphome/CHANGELOG.md\n\n      - name: Commit version bump\n        id: commit\n        uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0\n        env:\n          VERSION: ${{ github.event.inputs.version }}\n        with:\n          github-token: ${{ steps.generate-token.outputs.token }}\n          script: |\n            const fs = require('fs');\n            const { execSync } = require('child_process');\n\n            // bump-version.py + the changelog writes only touch files with\n            // simple ASCII names, so the default porcelain format (no -z)\n            // is sufficient.\n            const lines = execSync('git status --porcelain', { encoding: 'utf8' })\n              .split('\\n')\n              .filter(line => line.length > 0);\n\n            const additions = [];\n            const deletions = [];\n            for (const line of lines) {\n              const status = line.substring(0, 2);\n              const path = line.substring(3);\n              if (status.includes('D')) {\n                deletions.push({ path });\n              } else {\n                additions.push({\n                  path,\n                  contents: fs.readFileSync(path).toString('base64'),\n                });\n              }\n            }\n\n            if (additions.length === 0 && deletions.length === 0) {\n              core.setFailed('No file changes to commit');\n              return;\n            }\n\n            const headOid = execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim();\n            const repo = context.payload.repository;\n\n            const result = await github.graphql(\n              `mutation($input: CreateCommitOnBranchInput!) {\n                createCommitOnBranch(input: $input) {\n                  commit { oid }\n                }\n              }`,\n              {\n                input: {\n                  branch: {\n                    repositoryNameWithOwner: repo.full_name,\n                    branchName: repo.default_branch,\n                  },\n                  message: { headline: `Bump version to ${process.env.VERSION}` },\n                  fileChanges: { additions, deletions },\n                  expectedHeadOid: headOid,\n                },\n              }\n            );\n\n            core.setOutput('sha', result.createCommitOnBranch.commit.oid);\n\n      - name: Create a Release\n        continue-on-error: true\n        if: ${{ !contains(github.event.inputs.version, 'dev') }}\n        env:\n          GH_TOKEN: ${{ steps.generate-token.outputs.token }}\n          VERSION: ${{ github.event.inputs.version }}\n          TARGET_SHA: ${{ steps.commit.outputs.sha }}\n        run: |\n          flags=()\n          if [[ \"$VERSION\" == *b* ]]; then\n            flags+=(--prerelease)\n          fi\n\n          gh release create \"$VERSION\" \\\n            --title \"$VERSION\" \\\n            --notes-file \"$RUNNER_TEMP/release_body.md\" \\\n            --target \"$TARGET_SHA\" \\\n            \"${flags[@]}\"\n"
  },
  {
    "path": ".github/workflows/devcontainer-build.yaml",
    "content": "name: Build devcontainer image\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n    paths:\n      - .devcontainer/**\n      - script/requirements.txt\n      - .github/workflows/devcontainer-build.yaml\n  schedule:\n    - cron: '0 0 1 * *'\n  pull_request:\n    branches:\n      - main\n    paths:\n      - .devcontainer/**\n      - script/requirements.txt\n      - .github/workflows/devcontainer-build.yaml\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n      - name: Log in to the GitHub container registry\n        uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0\n        if: github.event_name != 'pull_request'\n        with:\n            registry: ghcr.io\n            username: ${{ github.repository_owner }}\n            password: ${{ secrets.GITHUB_TOKEN }}\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0\n      - name: Set up Docker Buildx\n        uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0\n      - name: Build and Push\n        uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0\n        with:\n          context: .\n          file: .devcontainer/Dockerfile\n          tags: ghcr.io/${{ github.repository_owner }}/devcontainer:addons\n          push: ${{ github.event_name != 'pull_request' }}\n          platforms: linux/amd64,linux/arm64\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "content": "name: Lint\non:\n  push:\n    branches:\n      - main\n  pull_request:\njobs:\n  build:\n    name: App configuration\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        channels:\n          - folder: esphome\n            channel: stable\n          - folder: esphome-beta\n            channel: beta\n          - folder: esphome-dev\n            channel: dev\n    steps:\n      - name: ⤵️ Check out code from GitHub\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n      - name: 🛠 Setup Python\n        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0\n        with:\n          python-version: '3.11'\n      - name: 🛠 Install dependencies\n        run: pip install -r script/requirements.txt\n      - name: 🛠 Generate files from template\n        run: python script/generate.py ${{ matrix.channels.channel }}\n      - name: 🚀 Run Home Assistant App Lint on ${{ matrix.channels.channel }}\n        uses: frenck/action-addon-linter@f995494fd84fae6310d23617e66d0e37de4f14eb # v2.21.0\n        with:\n          path: \"./${{ matrix.channels.folder }}\"\n"
  },
  {
    "path": ".gitignore",
    "content": "__pycache__/\n*.py[cod]\n*$py.class\nvenv/\n"
  },
  {
    "path": ".vscode/tasks.json",
    "content": "{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"Start Home Assistant\",\n      \"type\": \"shell\",\n      \"command\": \"supervisor_run\",\n      \"group\": {\n        \"kind\": \"test\",\n        \"isDefault\": true\n      },\n      \"presentation\": {\n        \"reveal\": \"always\",\n        \"panel\": \"new\"\n      },\n      \"problemMatcher\": []\n    }\n  ]\n}\n"
  },
  {
    "path": "README.md",
    "content": "# ESPHome [![Discord Chat](https://img.shields.io/discord/429907082951524364.svg)](https://discord.gg/KhAMKrd) [![GitHub release](https://img.shields.io/github/release/esphome/esphome.svg)](https://GitHub.com/esphome/esphome/releases/)\n\n<a href=\"https://esphome.io/\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://media.esphome.io/logo/logo-text-on-dark.svg\", alt=\"ESPHome Logo\">\n    <img src=\"https://media.esphome.io/logo/logo-text-on-light.svg\" alt=\"ESPHome Logo\">\n  </picture>\n</a>\n\nThis is the Home Assistant App repository for ESPHome. For the ESPHome source please go to [esphome](https://github.com/esphome/esphome).\n\n**Documentation:** https://esphome.io/\n\nFor issues, please go to [the issue tracker](https://github.com/esphome/esphome/issues).\n\nFor feature requests, please see [feature requests](https://github.com/orgs/esphome/discussions).\n"
  },
  {
    "path": "esphome/CHANGELOG.md",
    "content": "## 2026.5.0\n\n[**Read release announcement**](https://esphome.io/changelog/2026.5.0)\n\nhttps://esphome.io/changelog/2026.5.0.html\n"
  },
  {
    "path": "esphome/DOCS.md",
    "content": "# ESPHome App\n## Installation\n\nThe installation of this App is pretty straightforward and not different in comparison to installing any other Home Assistant App.\n\n1. Search for the \"ESPHome\" App in the Supervisor App store.\n2. Press install to download the App and unpack it on your machine. This can take some time.\n3. Optional: If you're using SSL/TLS certificates and want to encrypt your communication to this App, please enter `true` into the `ssl` field and set the `fullchain` and `certfile` options accordingly.\n4. Start the App, check the logs of the App to see if everything went well.\n5. Click \"OPEN WEB UI\" to open the ESPHome dashboard. You will be asked for your Home Assistant credentials - ESPHome uses Home Assistant's authentication system to log you in.\n\nYou can view the ESPHome documentation at https://esphome.io/\n\n## Configuration\n\n**Note**: _Remember to restart the App when the configuration is changed._\n\nExample App configuration:\n\n```json\n{\n  \"ssl\": false,\n  \"certfile\": \"fullchain.pem\",\n  \"keyfile\": \"privkey.pem\"\n}\n```\n\n### Option: `ssl`\n\nEnables or disables encrypted SSL/TLS (HTTPS) connections to the web server of this App.\nSet it to `true` to encrypt communications, `false` otherwise.\nPlease note that if you set this to `true` you must also generate the key and certificate\nfiles for encryption. For example using [Let's Encrypt](https://www.home-assistant.io/addons/lets_encrypt/)\nor [Self-signed certificates](https://www.home-assistant.io/docs/ecosystem/certificates/tls_self_signed_certificate/).\n\n### Option: `certfile`\n\nThe certificate file to use for SSL. If this file doesn't exist, the App start will fail.\n\n**Note**: The file MUST be stored in `/ssl/`, which is the default for Home Assistant\n\n### Option: `keyfile`\n\nThe private key file to use for SSL. If this file doesn't exist, the App start will fail.\n\n**Note**: The file MUST be stored in `/ssl/`, which is the default for Home Assistant\n\n### Option: `leave_front_door_open`\n\nAdding this option to the App configuration allows you to disable\nauthentication by setting it to `true`.\n\n### Option: `relative_url`\n\nHost the ESPHome dashboard under a relative URL, so that it can be integrated\ninto existing web proxies like NGINX under a relative URL. Defaults to `/`.\n\n### Option: `status_use_ping`\n\nBy default the dashboard uses mDNS to check if nodes are online. This does\nnot work across subnets unless your router supports mDNS forwarding or avahi.\n\nSetting this to `true` will make ESPHome use ICMP ping requests to get the node status. Use this if all nodes always have offline status even when they're connected.\n\n### Option: `streamer_mode`\n\nIf set to `true`, this will enable streamer mode, which makes ESPHome hide all\npotentially private information. So for example WiFi (B)SSIDs (which could be\nused to find your location), usernames, etc. Please note that you need to use\nthe `!secret` tag in your YAML file to also prevent these from showing up\nwhile editing and validating.\n"
  },
  {
    "path": "esphome/FILES ARE GENERATED DO NOT EDIT",
    "content": "Any edits should be made to the files in the 'template' directory"
  },
  {
    "path": "esphome/README.md",
    "content": "# ESPHome Device Builder\n\n[![ESPHome logo][logo]][website]\n\n[![GitHub stars][github-stars-shield]][repository]\n[![Discord][discord-shield]][discord]\n\n## About\n\nThis App allows you to write configurations and turn your microcontrollers\ninto smart home devices directly through Home Assistant **with no programming experience required**.\nAll you need to do is write YAML configuration files; the rest (over-the-air updates, compiling) is all\nhandled by ESPHome.\n\n<p align=\"center\">\n<img title=\"ESPHome Device Builder screenshot\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome/images/screenshot.png\" width=\"700px\"></img>\n</p>\n\n[View the ESPHome documentation][website]\n\n## Example\n\nWith ESPHome, you can go from a few lines of YAML straight to a custom-made\nfirmware. For example, to include a [DHT22][dht22]\ntemperature and humidity sensor, you just need to include 8 lines of YAML\nin your configuration file:\n\n<img title=\"ESPHome DHT configuration example\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome/images/dht-example.png\" width=\"500px\"></img>\n\nThen just click UPLOAD and the sensor will magically appear in Home Assistant:\n\n<img title=\"ESPHome Home Assistant discovery\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome/images/temperature-humidity.png\" width=\"600px\"></img>\n\n[discord]: https://discord.gg/KhAMKrd\n[repository]: https://github.com/esphome/esphome\n[discord-shield]: https://img.shields.io/discord/429907082951524364.svg\n[github-stars-shield]: https://img.shields.io/github/stars/esphome/esphome.svg?style=social&label=Star&maxAge=2592000\n[dht22]: https://esphome.io/components/sensor/dht/\n[releases]: https://esphome.io/changelog/\n[logo]: https://github.com/esphome/home-assistant-addon/raw/main/esphome/logo.png\n[website]: https://esphome.io/\n"
  },
  {
    "path": "esphome/config.yaml",
    "content": "---\nurl: https://esphome.io/\narch:\n- amd64\n- aarch64\nhassio_api: true\nauth_api: true\nhost_network: true\ningress: true\ningress_port: 0\npanel_icon: mdi:esphome\nuart: true\nports:\n  6052/tcp: null\nmap:\n- ssl:ro\n- config:rw\ndiscovery:\n- esphome\nschema:\n  status_use_ping: bool?\n  streamer_mode: bool?\n  home_assistant_dashboard_integration: bool?\n  default_compile_process_limit: int(1,)?\n  ssl: bool?\n  certfile: str?\n  keyfile: str?\n  leave_front_door_open: bool?\n  use_new_device_builder: bool?\nbackup_exclude:\n- '*/*/'\ninit: false\nstartup: services\noptions:\n  use_new_device_builder: false\nname: ESPHome Device Builder\npanel_title: ESPHome Builder\nversion: 2026.5.0\nslug: esphome\ndescription: Build your own smart home devices using ESPHome, no programming experience\n  required\nimage: ghcr.io/esphome/esphome-hassio\n"
  },
  {
    "path": "esphome/translations/en.yaml",
    "content": "---\nconfiguration:\n  certfile:\n    name: Certificate file\n    description: >-\n      The certificate file to use for SSL. Note that this file must\n      exist in the /ssl/ folder.\n  default_compile_process_limit:\n    name: Default compile process limit\n    description: >-\n      The default compile process limit. This is the maximum number of\n      simultaneous compile processes that ESPHome will run.\n  esphome_fork:\n    name: Install ESPHome from a fork or branch\n    description: >-\n      For example to test a pull request, use `pull/XXXX/head` where `XXXX` is\n      the PR number, or you can specify the username of the fork owner and\n      branch `username:branch` which assumes the repository is named `esphome`\n      still.\n\n      If you need to test the latest commit on dev branch before the image is\n      updated you can enter `dev` here.\n\n      Please note that the fork or branch you are using **must** be up to\n      date with ESPHome dev or the App **will not start**.\n  home_assistant_dashboard_integration:\n    name: Home Assistant Dashboard Integration\n    description: >-\n      Enables/Disables the ESPHome dashboard integrating with Home Assistant\n      for automatic configuration of devices and device updates. If you use\n      multiple version of the ESPHome App, make sure it is enabled on a\n      single App only.\n  keyfile:\n    name: Private key file\n    description: >-\n      The private key file to use for SSL. Note that this file must\n      exist in the /ssl/ folder.\n  leave_front_door_open:\n    name: Disable external authentication\n    description: >-\n      Disables external authentication when having opened the App\n      on an external port. **WARNING**: This is a security risk!\n  relative_url:\n    name: Relative URL\n    description: >-\n      Host the ESPHome dashboard under a relative URL, so that it can be\n      integrated into existing web proxies like NGINX under a relative URL.\n      Defaults to `/`.\n  ssl:\n    name: SSL\n    description: >-\n      Enables/Disables SSL (HTTPS) on the web interface.\n  status_use_ping:\n    name: Use ping for status\n    description: >-\n      By default the dashboard uses mDNS to check if nodes are online. This does\n      not work across subnets unless your router supports mDNS forwarding\n      or avahi. Enabling this option will use ICMP ping to check if nodes are\n      online.\n  streamer_mode:\n    name: Streamer mode\n    description: >-\n      Enables/Disables streamer mode, which makes ESPHome hide all\n      potentially private information. So for example WiFi (B)SSIDs (which could\n      be used to find your location), usernames, etc.\n  use_new_device_builder:\n    name: Use new Device Builder Preview\n    description: >-\n      Use the new ESPHome Device Builder instead of the classic ESPHome\n      dashboard. When enabled, the latest prerelease of `esphome-device-builder`\n      is installed on container start. **This is experimental and may not yet\n      have all the features of the classic dashboard.**\nnetwork:\n  6052/tcp: Web interface (to use without Home Assistant)\n"
  },
  {
    "path": "esphome-beta/CHANGELOG.md",
    "content": "## 2026.5.0\n\n[**Read release announcement**](https://beta.esphome.io/changelog/2026.5.0)\n\nhttps://esphome.io/changelog/2026.5.0.html\n"
  },
  {
    "path": "esphome-beta/DOCS.md",
    "content": "# ESPHome App\n## Installation\n\nThe installation of this App is pretty straightforward and not different in comparison to installing any other Home Assistant App.\n\n1. Search for the \"ESPHome\" App in the Supervisor App store.\n2. Press install to download the App and unpack it on your machine. This can take some time.\n3. Optional: If you're using SSL/TLS certificates and want to encrypt your communication to this App, please enter `true` into the `ssl` field and set the `fullchain` and `certfile` options accordingly.\n4. Start the App, check the logs of the App to see if everything went well.\n5. Click \"OPEN WEB UI\" to open the ESPHome dashboard. You will be asked for your Home Assistant credentials - ESPHome uses Home Assistant's authentication system to log you in.\n\nYou can view the ESPHome documentation at https://esphome.io/\n\n## Configuration\n\n**Note**: _Remember to restart the App when the configuration is changed._\n\nExample App configuration:\n\n```json\n{\n  \"ssl\": false,\n  \"certfile\": \"fullchain.pem\",\n  \"keyfile\": \"privkey.pem\"\n}\n```\n\n### Option: `ssl`\n\nEnables or disables encrypted SSL/TLS (HTTPS) connections to the web server of this App.\nSet it to `true` to encrypt communications, `false` otherwise.\nPlease note that if you set this to `true` you must also generate the key and certificate\nfiles for encryption. For example using [Let's Encrypt](https://www.home-assistant.io/addons/lets_encrypt/)\nor [Self-signed certificates](https://www.home-assistant.io/docs/ecosystem/certificates/tls_self_signed_certificate/).\n\n### Option: `certfile`\n\nThe certificate file to use for SSL. If this file doesn't exist, the App start will fail.\n\n**Note**: The file MUST be stored in `/ssl/`, which is the default for Home Assistant\n\n### Option: `keyfile`\n\nThe private key file to use for SSL. If this file doesn't exist, the App start will fail.\n\n**Note**: The file MUST be stored in `/ssl/`, which is the default for Home Assistant\n\n### Option: `leave_front_door_open`\n\nAdding this option to the App configuration allows you to disable\nauthentication by setting it to `true`.\n\n### Option: `relative_url`\n\nHost the ESPHome dashboard under a relative URL, so that it can be integrated\ninto existing web proxies like NGINX under a relative URL. Defaults to `/`.\n\n### Option: `status_use_ping`\n\nBy default the dashboard uses mDNS to check if nodes are online. This does\nnot work across subnets unless your router supports mDNS forwarding or avahi.\n\nSetting this to `true` will make ESPHome use ICMP ping requests to get the node status. Use this if all nodes always have offline status even when they're connected.\n\n### Option: `streamer_mode`\n\nIf set to `true`, this will enable streamer mode, which makes ESPHome hide all\npotentially private information. So for example WiFi (B)SSIDs (which could be\nused to find your location), usernames, etc. Please note that you need to use\nthe `!secret` tag in your YAML file to also prevent these from showing up\nwhile editing and validating.\n"
  },
  {
    "path": "esphome-beta/FILES ARE GENERATED DO NOT EDIT",
    "content": "Any edits should be made to the files in the 'template' directory"
  },
  {
    "path": "esphome-beta/README.md",
    "content": "# ESPHome Device Builder Beta\n\n[![ESPHome logo][logo]][website]\n\n[![GitHub stars][github-stars-shield]][repository]\n[![Discord][discord-shield]][discord]\n\n## About\n\nThis App allows you to write configurations and turn your microcontrollers\ninto smart home devices directly through Home Assistant **with no programming experience required**.\nAll you need to do is write YAML configuration files; the rest (over-the-air updates, compiling) is all\nhandled by ESPHome.\n\n<p align=\"center\">\n<img title=\"ESPHome Device Builder screenshot\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-beta/images/screenshot.png\" width=\"700px\"></img>\n</p>\n\n[View the ESPHome documentation][website]\n\n## Example\n\nWith ESPHome, you can go from a few lines of YAML straight to a custom-made\nfirmware. For example, to include a [DHT22][dht22]\ntemperature and humidity sensor, you just need to include 8 lines of YAML\nin your configuration file:\n\n<img title=\"ESPHome DHT configuration example\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-beta/images/dht-example.png\" width=\"500px\"></img>\n\nThen just click UPLOAD and the sensor will magically appear in Home Assistant:\n\n<img title=\"ESPHome Home Assistant discovery\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-beta/images/temperature-humidity.png\" width=\"600px\"></img>\n\n[discord]: https://discord.gg/KhAMKrd\n[repository]: https://github.com/esphome/esphome\n[discord-shield]: https://img.shields.io/discord/429907082951524364.svg\n[github-stars-shield]: https://img.shields.io/github/stars/esphome/esphome.svg?style=social&label=Star&maxAge=2592000\n[dht22]: https://beta.esphome.io/components/sensor/dht/\n[releases]: https://beta.esphome.io/changelog/\n[logo]: https://github.com/esphome/home-assistant-addon/raw/main/esphome-beta/logo.png\n[website]: https://beta.esphome.io/\n"
  },
  {
    "path": "esphome-beta/config.yaml",
    "content": "---\nurl: https://beta.esphome.io/\narch:\n- amd64\n- aarch64\nhassio_api: true\nauth_api: true\nhost_network: true\ningress: true\ningress_port: 0\npanel_icon: mdi:esphome\nuart: true\nports:\n  6052/tcp: null\nmap:\n- ssl:ro\n- config:rw\ndiscovery:\n- esphome\nschema:\n  status_use_ping: bool?\n  streamer_mode: bool?\n  home_assistant_dashboard_integration: bool?\n  default_compile_process_limit: int(1,)?\n  ssl: bool?\n  certfile: str?\n  keyfile: str?\n  leave_front_door_open: bool?\n  use_new_device_builder: bool?\nbackup_exclude:\n- '*/*/'\ninit: false\nstartup: services\noptions:\n  home_assistant_dashboard_integration: false\n  use_new_device_builder: true\nname: ESPHome Device Builder (beta)\npanel_title: ESPHome Builder (beta)\nversion: 2026.5.0\nslug: esphome-beta\ndescription: Beta version of ESPHome Device Builder\nimage: ghcr.io/esphome/esphome-hassio\nstage: experimental\n"
  },
  {
    "path": "esphome-beta/translations/en.yaml",
    "content": "---\nconfiguration:\n  certfile:\n    name: Certificate file\n    description: >-\n      The certificate file to use for SSL. Note that this file must\n      exist in the /ssl/ folder.\n  default_compile_process_limit:\n    name: Default compile process limit\n    description: >-\n      The default compile process limit. This is the maximum number of\n      simultaneous compile processes that ESPHome will run.\n  esphome_fork:\n    name: Install ESPHome from a fork or branch\n    description: >-\n      For example to test a pull request, use `pull/XXXX/head` where `XXXX` is\n      the PR number, or you can specify the username of the fork owner and\n      branch `username:branch` which assumes the repository is named `esphome`\n      still.\n\n      If you need to test the latest commit on dev branch before the image is\n      updated you can enter `dev` here.\n\n      Please note that the fork or branch you are using **must** be up to\n      date with ESPHome dev or the App **will not start**.\n  home_assistant_dashboard_integration:\n    name: Home Assistant Dashboard Integration\n    description: >-\n      Enables/Disables the ESPHome dashboard integrating with Home Assistant\n      for automatic configuration of devices and device updates. If you use\n      multiple version of the ESPHome App, make sure it is enabled on a\n      single App only.\n  keyfile:\n    name: Private key file\n    description: >-\n      The private key file to use for SSL. Note that this file must\n      exist in the /ssl/ folder.\n  leave_front_door_open:\n    name: Disable external authentication\n    description: >-\n      Disables external authentication when having opened the App\n      on an external port. **WARNING**: This is a security risk!\n  relative_url:\n    name: Relative URL\n    description: >-\n      Host the ESPHome dashboard under a relative URL, so that it can be\n      integrated into existing web proxies like NGINX under a relative URL.\n      Defaults to `/`.\n  ssl:\n    name: SSL\n    description: >-\n      Enables/Disables SSL (HTTPS) on the web interface.\n  status_use_ping:\n    name: Use ping for status\n    description: >-\n      By default the dashboard uses mDNS to check if nodes are online. This does\n      not work across subnets unless your router supports mDNS forwarding\n      or avahi. Enabling this option will use ICMP ping to check if nodes are\n      online.\n  streamer_mode:\n    name: Streamer mode\n    description: >-\n      Enables/Disables streamer mode, which makes ESPHome hide all\n      potentially private information. So for example WiFi (B)SSIDs (which could\n      be used to find your location), usernames, etc.\n  use_new_device_builder:\n    name: Use new Device Builder Preview\n    description: >-\n      Use the new ESPHome Device Builder instead of the classic ESPHome\n      dashboard. When enabled, the latest prerelease of `esphome-device-builder`\n      is installed on container start. **This is experimental and may not yet\n      have all the features of the classic dashboard.**\nnetwork:\n  6052/tcp: Web interface (to use without Home Assistant)\n"
  },
  {
    "path": "esphome-dev/CHANGELOG.md",
    "content": "See https://github.com/esphome/esphome/commits/dev\n"
  },
  {
    "path": "esphome-dev/DOCS.md",
    "content": "# ESPHome DEV App\n\nThis is **development** version of the ESPHome App.\n\nTo deploy production nodes please use mainstream release App.\n\nThe App uses a version of ESPHome built automatically every day at 02:00 UTC. and is used to test components in development. See the `esphome_fork` configuration below to properly configure the App. Once you update the configuration make sure to rebuild the image.\n\n## Configuration\n\n**Note**: _Remember to restart the App when the configuration is changed._\n\n### Option: `esphome_fork`\n\nInstall ESPHome from a fork or branch.\nFor example to test a pull request, use `pull/XXXX/head` where `XXXX` is the PR number,\nor you can specify the username of the fork owner and branch `username:branch` which\nassumes the repository is named `esphome` still.\n\nIf you need to test the latest commit on dev branch before the image is updated you can enter `dev` here.\n\nPlease note that the fork or branch you are using **must** be up to date with ESPHome dev\nor the App **will not start**.\n\n\n## General ESPHome App configurations\n\nGeneral options also available in other versions.\n\n### Option: `ssl`\n\nEnables or disables encrypted SSL/TLS (HTTPS) connections to the web server of this App.\nSet it to `true` to encrypt communications, `false` otherwise.\nPlease note that if you set this to `true` you must also generate the key and certificate\nfiles for encryption. For example using [Let's Encrypt](https://www.home-assistant.io/addons/lets_encrypt/)\nor [Self-signed certificates](https://www.home-assistant.io/docs/ecosystem/certificates/tls_self_signed_certificate/).\n\n### Option: `certfile`\n\nThe certificate file to use for SSL. If this file doesn't exist, the App start will fail.\n\n**Note**: The file MUST be stored in `/ssl/`, which is the default for Home Assistant\n\n### Option: `keyfile`\n\nThe private key file to use for SSL. If this file doesn't exist, the App start will fail.\n\n**Note**: The file MUST be stored in `/ssl/`, which is the default for Home Assistant\n\n### Option: `leave_front_door_open`\n\nAdding this option to the App configuration allows you to disable\nauthentication by setting it to `true`.\n\n### Option: `relative_url`\n\nHost the ESPHome dashboard under a relative URL, so that it can be integrated\ninto existing web proxies like NGINX under a relative URL. Defaults to `/`.\n\n### Option: `status_use_ping`\n\nBy default the dashboard uses mDNS to check if nodes are online. This does\nnot work across subnets unless your router supports mDNS forwarding or avahi.\n\nSetting this to `true` will make ESPHome use ICMP ping requests to get the node status. Use this if all nodes always have offline status even when they're connected.\n\n### Option: `streamer_mode`\n\nIf set to `true`, this will enable streamer mode, which makes ESPHome hide all\npotentially private information. So for example WiFi (B)SSIDs (which could be\nused to find your location), usernames, etc. Please note that you need to use\nthe `!secret` tag in your YAML file to also prevent these from showing up\nwhile editing and validating.\n"
  },
  {
    "path": "esphome-dev/FILES ARE GENERATED DO NOT EDIT",
    "content": "Any edits should be made to the files in the 'template' directory"
  },
  {
    "path": "esphome-dev/README.md",
    "content": "# ESPHome Device Builder (Development branch)\n\n[![ESPHome logo][logo]][website]\n\n[![GitHub stars][github-stars-shield]][repository]\n[![Discord][discord-shield]][discord]\n\n## About\n\nThis App allows you to write configurations and turn your microcontrollers\ninto smart home devices directly through Home Assistant **with no programming experience required**.\nAll you need to do is write YAML configuration files; the rest (over-the-air updates, compiling) is all\nhandled by ESPHome.\n\n<p align=\"center\">\n<img title=\"ESPHome Device Builder screenshot\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-dev/images/screenshot.png\" width=\"700px\"></img>\n</p>\n\n[View the ESPHome documentation][website]\n\n## Example\n\nWith ESPHome, you can go from a few lines of YAML straight to a custom-made\nfirmware. For example, to include a [DHT22][dht22]\ntemperature and humidity sensor, you just need to include 8 lines of YAML\nin your configuration file:\n\n<img title=\"ESPHome DHT configuration example\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-dev/images/dht-example.png\" width=\"500px\"></img>\n\nThen just click UPLOAD and the sensor will magically appear in Home Assistant:\n\n<img title=\"ESPHome Home Assistant discovery\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-dev/images/temperature-humidity.png\" width=\"600px\"></img>\n\n[discord]: https://discord.gg/KhAMKrd\n[repository]: https://github.com/esphome/esphome\n[discord-shield]: https://img.shields.io/discord/429907082951524364.svg\n[github-stars-shield]: https://img.shields.io/github/stars/esphome/esphome.svg?style=social&label=Star&maxAge=2592000\n[dht22]: https://next.esphome.io/components/sensor/dht/\n[releases]: https://next.esphome.io/changelog/\n[logo]: https://github.com/esphome/home-assistant-addon/raw/main/esphome-dev/logo.png\n[website]: https://next.esphome.io/\n"
  },
  {
    "path": "esphome-dev/config.yaml",
    "content": "---\nurl: https://next.esphome.io/\narch:\n- amd64\n- aarch64\nhassio_api: true\nauth_api: true\nhost_network: true\ningress: true\ningress_port: 0\npanel_icon: mdi:esphome\nuart: true\nports:\n  6052/tcp: null\nmap:\n- ssl:ro\n- config:rw\ndiscovery:\n- esphome\nschema:\n  status_use_ping: bool?\n  streamer_mode: bool?\n  home_assistant_dashboard_integration: bool?\n  default_compile_process_limit: int(1,)?\n  esphome_fork: str?\n  ssl: bool?\n  certfile: str?\n  keyfile: str?\n  leave_front_door_open: bool?\n  use_new_device_builder: bool?\nbackup_exclude:\n- '*/*/'\ninit: false\nstartup: services\noptions:\n  home_assistant_dashboard_integration: false\n  use_new_device_builder: true\nname: ESPHome Device Builder (dev)\npanel_title: ESPHome Builder (dev)\nversion: 2026.6.0-dev20260521\nslug: esphome-dev\ndescription: Development version of ESPHome Device Builder\nimage: ghcr.io/esphome/esphome-hassio\nstage: experimental\n"
  },
  {
    "path": "esphome-dev/translations/en.yaml",
    "content": "---\nconfiguration:\n  certfile:\n    name: Certificate file\n    description: >-\n      The certificate file to use for SSL. Note that this file must\n      exist in the /ssl/ folder.\n  default_compile_process_limit:\n    name: Default compile process limit\n    description: >-\n      The default compile process limit. This is the maximum number of\n      simultaneous compile processes that ESPHome will run.\n  esphome_fork:\n    name: Install ESPHome from a fork or branch\n    description: >-\n      For example to test a pull request, use `pull/XXXX/head` where `XXXX` is\n      the PR number, or you can specify the username of the fork owner and\n      branch `username:branch` which assumes the repository is named `esphome`\n      still.\n\n      If you need to test the latest commit on dev branch before the image is\n      updated you can enter `dev` here.\n\n      Please note that the fork or branch you are using **must** be up to\n      date with ESPHome dev or the App **will not start**.\n  home_assistant_dashboard_integration:\n    name: Home Assistant Dashboard Integration\n    description: >-\n      Enables/Disables the ESPHome dashboard integrating with Home Assistant\n      for automatic configuration of devices and device updates. If you use\n      multiple version of the ESPHome App, make sure it is enabled on a\n      single App only.\n  keyfile:\n    name: Private key file\n    description: >-\n      The private key file to use for SSL. Note that this file must\n      exist in the /ssl/ folder.\n  leave_front_door_open:\n    name: Disable external authentication\n    description: >-\n      Disables external authentication when having opened the App\n      on an external port. **WARNING**: This is a security risk!\n  relative_url:\n    name: Relative URL\n    description: >-\n      Host the ESPHome dashboard under a relative URL, so that it can be\n      integrated into existing web proxies like NGINX under a relative URL.\n      Defaults to `/`.\n  ssl:\n    name: SSL\n    description: >-\n      Enables/Disables SSL (HTTPS) on the web interface.\n  status_use_ping:\n    name: Use ping for status\n    description: >-\n      By default the dashboard uses mDNS to check if nodes are online. This does\n      not work across subnets unless your router supports mDNS forwarding\n      or avahi. Enabling this option will use ICMP ping to check if nodes are\n      online.\n  streamer_mode:\n    name: Streamer mode\n    description: >-\n      Enables/Disables streamer mode, which makes ESPHome hide all\n      potentially private information. So for example WiFi (B)SSIDs (which could\n      be used to find your location), usernames, etc.\n  use_new_device_builder:\n    name: Use new Device Builder Preview\n    description: >-\n      Use the new ESPHome Device Builder instead of the classic ESPHome\n      dashboard. When enabled, the latest prerelease of `esphome-device-builder`\n      is installed on container start. **This is experimental and may not yet\n      have all the features of the classic dashboard.**\nnetwork:\n  6052/tcp: Web interface (to use without Home Assistant)\n"
  },
  {
    "path": "repository.json",
    "content": "{\n  \"name\": \"ESPHome\",\n  \"url\": \"https://esphome.io\",\n  \"maintainer\": \"ESPHome <esphome@nabucasa.com>\"\n}\n"
  },
  {
    "path": "script/NOTES.md",
    "content": "# Maintainer notes\n\nThis repository is pulled by all Hassio installs and contains\nthe Hassio config for each type of install: latest, beta and dev.\n\n- `latest` always points to the most recent full release.\n- `beta` points to the most recent full release or beta release (whichever is newer). This is so that beta image users automatically get upgraded to the stable install once it gets released.\n- `dev` is an image that Hassio builds itself and contains the latest ESPHome version straigt from dev branch.\n\nThe config.json files are all automatically written with the script in this directory and the `template/addon_config.yaml` file.\n\nTo update one of the images: use\n\n```bash\n$ pip3 install -r script/requirements.txt\n$ python3 script/generate.py [dev|beta|latest]\n```\n\nThe `esphome-dev/rootfs` folder is shared with the `docker/rootfs` folder in the esphome repo.\nThis could be solved better, but currently `rsync` is used to copy the files over:\n\n```bash\nrsync -av ../esphome/docker/rootfs esphome-dev/\n```\n"
  },
  {
    "path": "script/bump-version.py",
    "content": "#!/usr/bin/env python3\n\nimport argparse\nimport re\nfrom dataclasses import dataclass\nimport sys\nimport os\n\nsys.path.append(os.path.dirname(__file__))\nimport generate\n\n\n@dataclass\nclass Version:\n    major: int\n    minor: int\n    patch: int\n    beta: int = 0\n    dev: str = \"\"\n\n    def __str__(self):\n        return f\"{self.major}.{self.minor}.{self.full_patch}\"\n\n    @property\n    def full_patch(self):\n        res = f\"{self.patch}\"\n        if self.beta > 0:\n            res += f\"b{self.beta}\"\n        if self.dev:\n            res += f\"-dev{self.dev}\"\n        return res\n\n    @classmethod\n    def parse(cls, value):\n        match = re.match(r\"(\\d+).(\\d+).(\\d+)(b\\d+)?(-dev\\d+)?\", value)\n        assert match is not None\n        major = int(match[1])\n        minor = int(match[2])\n        patch = int(match[3])\n        beta = int(match[4][1:]) if match[4] else 0\n        dev = str(match[5][4:]) if match[5] else \"\"\n        return Version(major=major, minor=minor, patch=patch, beta=beta, dev=dev)\n\n\ndef _sub(path, pattern, repl, expected_count=1):\n    with open(path, encoding=\"utf-8\") as fh:\n        content = fh.read()\n    content, count = re.subn(pattern, repl, content, flags=re.NOFLAG)\n    if expected_count is not None:\n        assert count == expected_count, f\"Pattern {pattern} replacement failed!\"\n    with open(path, \"wt\", encoding=\"utf-8\") as fh:\n        fh.write(content)\n\n\ndef _write_version(target: str, version: Version):\n    #  version: \"2024.5.0-dev20240412\"  # DEV\n    #  version: \"1.14.5\"  # BETA\n    #  version: \"1.14.5\"  # STABLE\n    _sub(\n        \"template/addon_config.yaml\",\n        f'  version: \"[^\"]+\"  # {target.upper()}',\n        f'  version: \"{version}\"  # {target.upper()}',\n    )\n\n\ndef main():\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"new_version\", type=str)\n    args = parser.parse_args()\n\n    version = Version.parse(args.new_version)\n\n    print(f\"Bumping to {version}\")\n    if version.dev:\n        _write_version(\"dev\", version)\n        generate.main([\"dev\"])\n    elif version.beta:\n        _write_version(\"beta\", version)\n        generate.main([\"beta\"])\n    else:\n        _write_version(\"stable\", version)\n        _write_version(\"beta\", version)\n        generate.main([\"stable\", \"beta\"])\n    return 0\n\n\nif __name__ == \"__main__\":\n    sys.exit(main() or 0)\n"
  },
  {
    "path": "script/generate.py",
    "content": "#!/usr/bin/env python3\n\nimport argparse\nfrom pathlib import Path\nfrom enum import Enum\nfrom shutil import copyfile\nimport sys\nimport os\n\nimport yaml\n\n\nclass Channel(Enum):\n    stable = \"stable\"\n    beta = \"beta\"\n    dev = \"dev\"\n\n\ndef deep_merge(base, override):\n    result = dict(override)\n    for key, base_value in base.items():\n        if key not in override:\n            result[key] = base_value\n        elif isinstance(base_value, dict) and isinstance(override[key], dict):\n            result[key] = deep_merge(base_value, override[key])\n    return result\n\n\ndef main(args):\n    parser = argparse.ArgumentParser(\n        description=\"Generate ESPHome Home Assistant config.json\"\n    )\n    parser.add_argument(\"channels\", nargs=\"+\", type=Channel, choices=list(Channel))\n    args = parser.parse_args(args)\n\n    root = Path(__file__).parent.parent\n    templ = root / \"template\"\n\n    with open(templ / \"addon_config.yaml\", \"r\", encoding=\"utf-8\") as f:\n        config = yaml.safe_load(f)\n\n    copyf = config[\"copy_files\"]\n    base = config.get(\"base\") or {}\n\n    for channel in args.channels:\n        conf = deep_merge(base, config[f\"esphome-{channel.value}\"])\n        dir_ = root / conf.pop(\"directory\")\n        path = dir_ / \"config.yaml\"\n        with open(path, \"w\", encoding=\"utf-8\") as f:\n            yaml.dump(conf, f, indent=2, sort_keys=False, explicit_start=True)\n\n        for file_ in copyf:\n            os.makedirs(dir_ / Path(file_).parent, exist_ok=True)\n            if Path.exists(templ / channel.value / file_):\n                copyfile(templ / channel.value / file_, dir_ / file_)\n            else:\n                copyfile(templ / file_, dir_ / file_)\n\n        path = dir_ / \"FILES ARE GENERATED DO NOT EDIT\"\n        with open(path, \"w\", encoding=\"utf-8\") as f:\n            f.write(\"Any edits should be made to the files in the 'template' directory\")\n\n\nif __name__ == \"__main__\":\n    main(sys.argv[1:])\n"
  },
  {
    "path": "script/requirements.txt",
    "content": "PyYAML==6.0.3\n"
  },
  {
    "path": "template/DOCS.md",
    "content": "# ESPHome App\n## Installation\n\nThe installation of this App is pretty straightforward and not different in comparison to installing any other Home Assistant App.\n\n1. Search for the \"ESPHome\" App in the Supervisor App store.\n2. Press install to download the App and unpack it on your machine. This can take some time.\n3. Optional: If you're using SSL/TLS certificates and want to encrypt your communication to this App, please enter `true` into the `ssl` field and set the `fullchain` and `certfile` options accordingly.\n4. Start the App, check the logs of the App to see if everything went well.\n5. Click \"OPEN WEB UI\" to open the ESPHome dashboard. You will be asked for your Home Assistant credentials - ESPHome uses Home Assistant's authentication system to log you in.\n\nYou can view the ESPHome documentation at https://esphome.io/\n\n## Configuration\n\n**Note**: _Remember to restart the App when the configuration is changed._\n\nExample App configuration:\n\n```json\n{\n  \"ssl\": false,\n  \"certfile\": \"fullchain.pem\",\n  \"keyfile\": \"privkey.pem\"\n}\n```\n\n### Option: `ssl`\n\nEnables or disables encrypted SSL/TLS (HTTPS) connections to the web server of this App.\nSet it to `true` to encrypt communications, `false` otherwise.\nPlease note that if you set this to `true` you must also generate the key and certificate\nfiles for encryption. For example using [Let's Encrypt](https://www.home-assistant.io/addons/lets_encrypt/)\nor [Self-signed certificates](https://www.home-assistant.io/docs/ecosystem/certificates/tls_self_signed_certificate/).\n\n### Option: `certfile`\n\nThe certificate file to use for SSL. If this file doesn't exist, the App start will fail.\n\n**Note**: The file MUST be stored in `/ssl/`, which is the default for Home Assistant\n\n### Option: `keyfile`\n\nThe private key file to use for SSL. If this file doesn't exist, the App start will fail.\n\n**Note**: The file MUST be stored in `/ssl/`, which is the default for Home Assistant\n\n### Option: `leave_front_door_open`\n\nAdding this option to the App configuration allows you to disable\nauthentication by setting it to `true`.\n\n### Option: `relative_url`\n\nHost the ESPHome dashboard under a relative URL, so that it can be integrated\ninto existing web proxies like NGINX under a relative URL. Defaults to `/`.\n\n### Option: `status_use_ping`\n\nBy default the dashboard uses mDNS to check if nodes are online. This does\nnot work across subnets unless your router supports mDNS forwarding or avahi.\n\nSetting this to `true` will make ESPHome use ICMP ping requests to get the node status. Use this if all nodes always have offline status even when they're connected.\n\n### Option: `streamer_mode`\n\nIf set to `true`, this will enable streamer mode, which makes ESPHome hide all\npotentially private information. So for example WiFi (B)SSIDs (which could be\nused to find your location), usernames, etc. Please note that you need to use\nthe `!secret` tag in your YAML file to also prevent these from showing up\nwhile editing and validating.\n"
  },
  {
    "path": "template/README.md",
    "content": "# ESPHome Device Builder\n\n[![ESPHome logo][logo]][website]\n\n[![GitHub stars][github-stars-shield]][repository]\n[![Discord][discord-shield]][discord]\n\n## About\n\nThis App allows you to write configurations and turn your microcontrollers\ninto smart home devices directly through Home Assistant **with no programming experience required**.\nAll you need to do is write YAML configuration files; the rest (over-the-air updates, compiling) is all\nhandled by ESPHome.\n\n<p align=\"center\">\n<img title=\"ESPHome Device Builder screenshot\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome/images/screenshot.png\" width=\"700px\"></img>\n</p>\n\n[View the ESPHome documentation][website]\n\n## Example\n\nWith ESPHome, you can go from a few lines of YAML straight to a custom-made\nfirmware. For example, to include a [DHT22][dht22]\ntemperature and humidity sensor, you just need to include 8 lines of YAML\nin your configuration file:\n\n<img title=\"ESPHome DHT configuration example\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome/images/dht-example.png\" width=\"500px\"></img>\n\nThen just click UPLOAD and the sensor will magically appear in Home Assistant:\n\n<img title=\"ESPHome Home Assistant discovery\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome/images/temperature-humidity.png\" width=\"600px\"></img>\n\n[discord]: https://discord.gg/KhAMKrd\n[repository]: https://github.com/esphome/esphome\n[discord-shield]: https://img.shields.io/discord/429907082951524364.svg\n[github-stars-shield]: https://img.shields.io/github/stars/esphome/esphome.svg?style=social&label=Star&maxAge=2592000\n[dht22]: https://esphome.io/components/sensor/dht/\n[releases]: https://esphome.io/changelog/\n[logo]: https://github.com/esphome/home-assistant-addon/raw/main/esphome/logo.png\n[website]: https://esphome.io/\n"
  },
  {
    "path": "template/addon_config.yaml",
    "content": "---\n# When changing options in this file, please also run:\n#    python3 script/generate.py dev\n# to update the dev app config (beta/stable configs will be updated on next release by release script)\nbase: &base\n  url: https://esphome.io/\n  arch:\n    - amd64\n    - aarch64\n  # Uses Home Assistant Supervisor API (auth)\n  hassio_api: true\n  auth_api: true\n  # Host network mode for mDNS\n  host_network: true\n  # Ingress settings\n  ingress: true\n  ingress_port: 0\n  panel_icon: \"mdi:esphome\"\n  # Automatically add UART devices to App\n  uart: true\n  ports:\n    \"6052/tcp\": null\n  map:\n    - ssl:ro\n    - config:rw\n  discovery:\n    - esphome\n  schema:\n    status_use_ping: bool?\n    streamer_mode: bool?\n    home_assistant_dashboard_integration: bool?\n    default_compile_process_limit: int(1,)?\n    ssl: bool?\n    certfile: str?\n    keyfile: str?\n    leave_front_door_open: bool?\n    use_new_device_builder: bool?\n  backup_exclude:\n    - \"*/*/\"\n  # Disable docker init for s6\n  init: false\n  # Make sure dashboard is available for core\n  startup: services\n  options:\n    use_new_device_builder: false\n\nesphome-dev:\n  <<: *base\n  directory: esphome-dev\n  name: ESPHome Device Builder (dev)\n  panel_title: ESPHome Builder (dev)\n  version: \"2026.6.0-dev20260521\"  # DEV\n  slug: esphome-dev\n  description: \"Development version of ESPHome Device Builder\"\n  url: https://next.esphome.io/\n  image: ghcr.io/esphome/esphome-hassio\n  stage: experimental\n  schema:\n    status_use_ping: bool?\n    streamer_mode: bool?\n    home_assistant_dashboard_integration: bool?\n    default_compile_process_limit: int(1,)?\n    esphome_fork: str?\n    ssl: bool?\n    certfile: str?\n    keyfile: str?\n    leave_front_door_open: bool?\n  options:\n    home_assistant_dashboard_integration: false\n    use_new_device_builder: true\n\nesphome-beta:\n  <<: *base\n  directory: esphome-beta\n  name: ESPHome Device Builder (beta)\n  panel_title: ESPHome Builder (beta)\n  version: \"2026.5.0\"  # BETA\n  slug: esphome-beta\n  description: \"Beta version of ESPHome Device Builder\"\n  url: https://beta.esphome.io/\n  image: ghcr.io/esphome/esphome-hassio\n  stage: experimental\n  options:\n    home_assistant_dashboard_integration: false\n    use_new_device_builder: true\n\nesphome-stable:\n  <<: *base\n  directory: esphome\n  name: ESPHome Device Builder\n  panel_title: ESPHome Builder\n  version: \"2026.5.0\"  # STABLE\n  slug: esphome\n  description: \"Build your own smart home devices using ESPHome, no programming experience required\"\n  image: ghcr.io/esphome/esphome-hassio\n\ncopy_files:\n  - DOCS.md\n  - icon.png\n  - logo.png\n  - README.md\n  - translations/en.yaml\n  - images/dht-example.png\n  - images/screenshot.png\n  - images/temperature-humidity.png\n"
  },
  {
    "path": "template/beta/README.md",
    "content": "# ESPHome Device Builder Beta\n\n[![ESPHome logo][logo]][website]\n\n[![GitHub stars][github-stars-shield]][repository]\n[![Discord][discord-shield]][discord]\n\n## About\n\nThis App allows you to write configurations and turn your microcontrollers\ninto smart home devices directly through Home Assistant **with no programming experience required**.\nAll you need to do is write YAML configuration files; the rest (over-the-air updates, compiling) is all\nhandled by ESPHome.\n\n<p align=\"center\">\n<img title=\"ESPHome Device Builder screenshot\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-beta/images/screenshot.png\" width=\"700px\"></img>\n</p>\n\n[View the ESPHome documentation][website]\n\n## Example\n\nWith ESPHome, you can go from a few lines of YAML straight to a custom-made\nfirmware. For example, to include a [DHT22][dht22]\ntemperature and humidity sensor, you just need to include 8 lines of YAML\nin your configuration file:\n\n<img title=\"ESPHome DHT configuration example\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-beta/images/dht-example.png\" width=\"500px\"></img>\n\nThen just click UPLOAD and the sensor will magically appear in Home Assistant:\n\n<img title=\"ESPHome Home Assistant discovery\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-beta/images/temperature-humidity.png\" width=\"600px\"></img>\n\n[discord]: https://discord.gg/KhAMKrd\n[repository]: https://github.com/esphome/esphome\n[discord-shield]: https://img.shields.io/discord/429907082951524364.svg\n[github-stars-shield]: https://img.shields.io/github/stars/esphome/esphome.svg?style=social&label=Star&maxAge=2592000\n[dht22]: https://beta.esphome.io/components/sensor/dht/\n[releases]: https://beta.esphome.io/changelog/\n[logo]: https://github.com/esphome/home-assistant-addon/raw/main/esphome-beta/logo.png\n[website]: https://beta.esphome.io/\n"
  },
  {
    "path": "template/dev/DOCS.md",
    "content": "# ESPHome DEV App\n\nThis is **development** version of the ESPHome App.\n\nTo deploy production nodes please use mainstream release App.\n\nThe App uses a version of ESPHome built automatically every day at 02:00 UTC. and is used to test components in development. See the `esphome_fork` configuration below to properly configure the App. Once you update the configuration make sure to rebuild the image.\n\n## Configuration\n\n**Note**: _Remember to restart the App when the configuration is changed._\n\n### Option: `esphome_fork`\n\nInstall ESPHome from a fork or branch.\nFor example to test a pull request, use `pull/XXXX/head` where `XXXX` is the PR number,\nor you can specify the username of the fork owner and branch `username:branch` which\nassumes the repository is named `esphome` still.\n\nIf you need to test the latest commit on dev branch before the image is updated you can enter `dev` here.\n\nPlease note that the fork or branch you are using **must** be up to date with ESPHome dev\nor the App **will not start**.\n\n\n## General ESPHome App configurations\n\nGeneral options also available in other versions.\n\n### Option: `ssl`\n\nEnables or disables encrypted SSL/TLS (HTTPS) connections to the web server of this App.\nSet it to `true` to encrypt communications, `false` otherwise.\nPlease note that if you set this to `true` you must also generate the key and certificate\nfiles for encryption. For example using [Let's Encrypt](https://www.home-assistant.io/addons/lets_encrypt/)\nor [Self-signed certificates](https://www.home-assistant.io/docs/ecosystem/certificates/tls_self_signed_certificate/).\n\n### Option: `certfile`\n\nThe certificate file to use for SSL. If this file doesn't exist, the App start will fail.\n\n**Note**: The file MUST be stored in `/ssl/`, which is the default for Home Assistant\n\n### Option: `keyfile`\n\nThe private key file to use for SSL. If this file doesn't exist, the App start will fail.\n\n**Note**: The file MUST be stored in `/ssl/`, which is the default for Home Assistant\n\n### Option: `leave_front_door_open`\n\nAdding this option to the App configuration allows you to disable\nauthentication by setting it to `true`.\n\n### Option: `relative_url`\n\nHost the ESPHome dashboard under a relative URL, so that it can be integrated\ninto existing web proxies like NGINX under a relative URL. Defaults to `/`.\n\n### Option: `status_use_ping`\n\nBy default the dashboard uses mDNS to check if nodes are online. This does\nnot work across subnets unless your router supports mDNS forwarding or avahi.\n\nSetting this to `true` will make ESPHome use ICMP ping requests to get the node status. Use this if all nodes always have offline status even when they're connected.\n\n### Option: `streamer_mode`\n\nIf set to `true`, this will enable streamer mode, which makes ESPHome hide all\npotentially private information. So for example WiFi (B)SSIDs (which could be\nused to find your location), usernames, etc. Please note that you need to use\nthe `!secret` tag in your YAML file to also prevent these from showing up\nwhile editing and validating.\n"
  },
  {
    "path": "template/dev/README.md",
    "content": "# ESPHome Device Builder (Development branch)\n\n[![ESPHome logo][logo]][website]\n\n[![GitHub stars][github-stars-shield]][repository]\n[![Discord][discord-shield]][discord]\n\n## About\n\nThis App allows you to write configurations and turn your microcontrollers\ninto smart home devices directly through Home Assistant **with no programming experience required**.\nAll you need to do is write YAML configuration files; the rest (over-the-air updates, compiling) is all\nhandled by ESPHome.\n\n<p align=\"center\">\n<img title=\"ESPHome Device Builder screenshot\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-dev/images/screenshot.png\" width=\"700px\"></img>\n</p>\n\n[View the ESPHome documentation][website]\n\n## Example\n\nWith ESPHome, you can go from a few lines of YAML straight to a custom-made\nfirmware. For example, to include a [DHT22][dht22]\ntemperature and humidity sensor, you just need to include 8 lines of YAML\nin your configuration file:\n\n<img title=\"ESPHome DHT configuration example\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-dev/images/dht-example.png\" width=\"500px\"></img>\n\nThen just click UPLOAD and the sensor will magically appear in Home Assistant:\n\n<img title=\"ESPHome Home Assistant discovery\" src=\"https://github.com/esphome/home-assistant-addon/raw/main/esphome-dev/images/temperature-humidity.png\" width=\"600px\"></img>\n\n[discord]: https://discord.gg/KhAMKrd\n[repository]: https://github.com/esphome/esphome\n[discord-shield]: https://img.shields.io/discord/429907082951524364.svg\n[github-stars-shield]: https://img.shields.io/github/stars/esphome/esphome.svg?style=social&label=Star&maxAge=2592000\n[dht22]: https://next.esphome.io/components/sensor/dht/\n[releases]: https://next.esphome.io/changelog/\n[logo]: https://github.com/esphome/home-assistant-addon/raw/main/esphome-dev/logo.png\n[website]: https://next.esphome.io/\n"
  },
  {
    "path": "template/translations/en.yaml",
    "content": "---\nconfiguration:\n  certfile:\n    name: Certificate file\n    description: >-\n      The certificate file to use for SSL. Note that this file must\n      exist in the /ssl/ folder.\n  default_compile_process_limit:\n    name: Default compile process limit\n    description: >-\n      The default compile process limit. This is the maximum number of\n      simultaneous compile processes that ESPHome will run.\n  esphome_fork:\n    name: Install ESPHome from a fork or branch\n    description: >-\n      For example to test a pull request, use `pull/XXXX/head` where `XXXX` is\n      the PR number, or you can specify the username of the fork owner and\n      branch `username:branch` which assumes the repository is named `esphome`\n      still.\n\n      If you need to test the latest commit on dev branch before the image is\n      updated you can enter `dev` here.\n\n      Please note that the fork or branch you are using **must** be up to\n      date with ESPHome dev or the App **will not start**.\n  home_assistant_dashboard_integration:\n    name: Home Assistant Dashboard Integration\n    description: >-\n      Enables/Disables the ESPHome dashboard integrating with Home Assistant\n      for automatic configuration of devices and device updates. If you use\n      multiple version of the ESPHome App, make sure it is enabled on a\n      single App only.\n  keyfile:\n    name: Private key file\n    description: >-\n      The private key file to use for SSL. Note that this file must\n      exist in the /ssl/ folder.\n  leave_front_door_open:\n    name: Disable external authentication\n    description: >-\n      Disables external authentication when having opened the App\n      on an external port. **WARNING**: This is a security risk!\n  relative_url:\n    name: Relative URL\n    description: >-\n      Host the ESPHome dashboard under a relative URL, so that it can be\n      integrated into existing web proxies like NGINX under a relative URL.\n      Defaults to `/`.\n  ssl:\n    name: SSL\n    description: >-\n      Enables/Disables SSL (HTTPS) on the web interface.\n  status_use_ping:\n    name: Use ping for status\n    description: >-\n      By default the dashboard uses mDNS to check if nodes are online. This does\n      not work across subnets unless your router supports mDNS forwarding\n      or avahi. Enabling this option will use ICMP ping to check if nodes are\n      online.\n  streamer_mode:\n    name: Streamer mode\n    description: >-\n      Enables/Disables streamer mode, which makes ESPHome hide all\n      potentially private information. So for example WiFi (B)SSIDs (which could\n      be used to find your location), usernames, etc.\n  use_new_device_builder:\n    name: Use new Device Builder Preview\n    description: >-\n      Use the new ESPHome Device Builder instead of the classic ESPHome\n      dashboard. When enabled, the latest prerelease of `esphome-device-builder`\n      is installed on container start. **This is experimental and may not yet\n      have all the features of the classic dashboard.**\nnetwork:\n  6052/tcp: Web interface (to use without Home Assistant)\n"
  }
]