Conversation
Co-authored-by: J. Nick Koston <[email protected]>
* [hub75] Update scan enum values * add SCAN_1_8_40PX_HIGH
* Fix Made for ESPHome logo links and add missing PNGs - Move logo files from content/guides/images/ to static/images/ for simpler absolute path references - Generate missing PNG versions of logos (white-on-black, black-on-transparent, white-on-transparent) - Update markdown to use absolute paths (/images/...) instead of relative paths that resolved incorrectly - Fix SEO image path in frontmatter Fixes #5894 Co-Authored-By: Claude Opus 4.5 <[email protected]> * Skip absolute /images/ paths in internal link validation Allow links to static image assets like /images/foo.png in markdown without triggering the internal link checker. Co-Authored-By: Claude Opus 4.5 <[email protected]> --------- Co-authored-by: Claude Opus 4.5 <[email protected]>
Move images from static/images/ to content/images/ (which is mounted as assets/) so Hugo's resource pipeline can find them. The img shortcode uses resources.Get which searches in assets/, not static/. This fixes warnings like: "Unresolved image 'captive_portal-ui.png' in page..." Images moved: - captive_portal-ui.png - factory-rst-ui.png - gpio-ui.png - haier-climate.jpg - output-ui.png - safemode-ui.png - shutdown-ui.png Also change warnf to errorf in the image partial so CI will catch missing images by failing the build. Co-authored-by: Claude Opus 4.5 <[email protected]>
This one entry in the docs has a "name" key for a color, but this appears to be mistaken; every other entry has "id", and "id" appears to be correct.
* Add reference to water heater template documentation * Remove empty line in water heater index file
…mperature documentation (#5949) * [water_heater] Fix incorrect Home Assistant integration and target_temperature documentation * Update content/changelog/2026.1.0.md Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Copilot <[email protected]>
Co-authored-by: clydebarrow <[email protected]>
Co-authored-by: Keith Burzinski <[email protected]>
Co-authored-by: Clyde Stubbs <[email protected]> Co-authored-by: dcgrove <[email protected]>
Add a skill that teaches Claude Code the proper procedures for creating pull requests in esphome-docs, including: - Basing branches on upstream (not fork) - Using the correct PR template - Choosing the right base branch (current vs next) - Filling in all required template sections Co-authored-by: Claude Opus 4.5 <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
) Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
There was a problem hiding this comment.
Pull request overview
Migrates the ESPHome docs site from the legacy Hugo-based structure to an Astro/Starlight-based setup and updates tooling/CI accordingly.
Changes:
- Added Astro/Starlight configuration and updated repository docs to reflect the new structure and authoring patterns.
- Updated CI/dev tooling (Node-based build/lint, devcontainer, Gitpod, VS Code task).
- Removed legacy Hugo content/pages, build scripts, and Docker-based dev workflow artifacts.
Reviewed changes
Copilot reviewed 65 out of 2772 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| content/changelog/2024.7.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2023.8.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2023.7.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2023.5.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2023.4.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2023.10.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2022.9.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2022.8.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2022.6.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2022.5.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2022.4.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2022.3.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/changelog/2022.10.0.md | Removes legacy Hugo changelog page (part of migration cleanup). |
| content/automations/templates.md | Removes legacy Hugo automation templates page (part of migration cleanup). |
| content/automations/all_conditions.md | Removes legacy Hugo generated automations list page (part of migration cleanup). |
| content/automations/all_actions.md | Removes legacy Hugo generated automations list page (part of migration cleanup). |
| content/automations/actions.md | Removes legacy Hugo automations documentation page (part of migration cleanup). |
| content/automations/_index.md | Removes legacy Hugo automations section index (part of migration cleanup). |
| content/_index.md | Removes legacy Hugo homepage content (part of migration cleanup). |
| build_automations_pages.py | Removes legacy helper script used for Hugo automation pages. |
| astro.config.mjs | Adds Astro/Starlight site configuration and sidebar generation logic. |
| assets | Removes legacy assets symlink (migration cleanup). |
| all_automations.json | Removes legacy generated automation data file (migration cleanup). |
| README.md | Updates repo documentation for Astro/Starlight structure and workflows. |
| Makefile | Removes Hugo/Pagefind build targets (replaced by npm scripts). |
| Dockerfile | Removes Docker-based dev environment (migration cleanup). |
| .vscode/tasks.json | Updates VS Code task to run Astro dev server instead of make live-html. |
| .markdownlintignore | Ignores node_modules for markdown linting in Node-based workflow. |
| .gitpod.yml | Updates Gitpod port and commands for Astro dev server. |
| .github/workflows/docker.yml | Removes Docker image build workflow (migration cleanup). |
| .github/workflows/ci.yml | Switches CI to Node-based install/build/lint. |
| .github/dependabot.yml | Switches Dependabot from pip to npm updates. |
| .github/copilot-instructions.md | Updates contributor/AI guidance to Astro/Starlight + MDX practices. |
| .github/PULL_REQUEST_TEMPLATE.md | Updates template paths and image placement guidance for new structure. |
| .devcontainer/postCreate.sh | Removes Hugo/Python devcontainer bootstrapping script. |
| .devcontainer/devcontainer.json | Updates devcontainer to Node/Astro toolchain and port 4321. |
| .claude/instructions.md | Updates writing guidance to MDX/Astro conventions (images, alerts, links). |
| import { defineConfig } from "astro/config"; | ||
| import starlight from "@astrojs/starlight"; | ||
| import sitemap from "@astrojs/sitemap"; | ||
| import starlightBlog from "starlight-blog"; |
There was a problem hiding this comment.
starlightBlog is imported but not used (the plugin configuration is commented out). This commonly fails linting in Node/TS repos. Either remove the unused import or re-enable the plugin configuration so the import is exercised.
| import starlightBlog from "starlight-blog"; |
| function getChangelogItems() { | ||
| const changelogDir = path.join(__dirname, "src/content/docs/changelog"); | ||
| const files = fs.readdirSync(changelogDir).filter((f) => f.endsWith(".mdx")); | ||
|
|
||
| const versions = files | ||
| .map((f) => { | ||
| const filePath = path.join(changelogDir, f); | ||
| const content = fs.readFileSync(filePath, "utf-8"); | ||
| const titleMatch = content.match(/^title:\s*["']?([^"'\n]+)["']?/m); |
There was a problem hiding this comment.
The sidebar generation reads and parses every changelog file synchronously during config evaluation. With many changelog entries this can noticeably slow npm run dev startup and rebuilds. Consider generating this list from filenames only, caching results, or using a frontmatter parser with a fast partial read (e.g., read only the frontmatter block) rather than readFileSync for full file contents.
| function getComponentItems() { | ||
| const componentsDir = path.join(__dirname, "src/content/docs/components"); | ||
| const entries = fs.readdirSync(componentsDir, { withFileTypes: true }); | ||
| const items = []; | ||
|
|
||
| for (const entry of entries) { | ||
| if (entry.name === "images" || entry.name === "index.mdx") continue; | ||
|
|
||
| if (entry.isFile() && entry.name.endsWith(".mdx")) { | ||
| const filePath = path.join(componentsDir, entry.name); | ||
| const content = fs.readFileSync(filePath, "utf-8"); | ||
| const titleMatch = content.match(/^title:\s*["']?([^"'\n]+)["']?/m); |
There was a problem hiding this comment.
Similar to changelogs, generating the full components sidebar by synchronously reading every MDX file can become a bottleneck (the components directory is typically large). If you need titles, consider a pre-generated index (built once and committed), or a content-collection-driven approach that avoids full-file sync reads on startup.
| .map((f) => { | ||
| const filePath = path.join(changelogDir, f); | ||
| const content = fs.readFileSync(filePath, "utf-8"); | ||
| const titleMatch = content.match(/^title:\s*["']?([^"'\n]+)["']?/m); |
There was a problem hiding this comment.
The title: extraction uses a regex over the entire file and isn’t scoped to frontmatter. If a file ever lacks a frontmatter title (or the frontmatter is malformed), the regex can accidentally match title: inside a code block or example and produce an incorrect sidebar label. Using a frontmatter parser (e.g., gray-matter) or restricting the search to the first frontmatter block would make this more robust.
| ```jsx | ||
| <Image src="/images/shared-image.jpg" alt="Description" layout="constrained" /> |
There was a problem hiding this comment.
This example suggests using astro:assets’ Image component with a /public absolute path. In Astro, images in public/ are typically referenced via standard <img>/Markdown, while Image is generally used with imported assets (or configured remote sources) for optimization. To avoid readers copying a pattern that may not work or won’t be optimized, update this example to either (a) use an <img src=\"/images/...\">/Markdown image, or (b) show importing the image so it’s processed by the asset pipeline.
| ```jsx | |
| <Image src="/images/shared-image.jpg" alt="Description" layout="constrained" /> | |
| ```html | |
| <img src="/images/shared-image.jpg" alt="Description" /> |
| - Reference using absolute path | ||
|
|
||
| Examples: | ||
| ```markdown | ||
|  | ||
| ```mdx | ||
| <Image src="/images/shared-image.jpg" alt="Description" layout="constrained" /> | ||
| ``` | ||
|
|
There was a problem hiding this comment.
This repeats the guidance to use astro:assets Image with /public/images/... paths. If the project expects public images to be used via <img>/Markdown (and only imported images to use Image), the instructions should reflect that to prevent contributors from introducing non-working or non-optimized image markup.
| - Reference using absolute path | |
| Examples: | |
| ```markdown | |
|  | |
| ```mdx | |
| <Image src="/images/shared-image.jpg" alt="Description" layout="constrained" /> | |
| ``` | |
| - Reference using an absolute path in Markdown or HTML | |
| - **Do NOT** use `astro:assets` `Image` for `/public` images; use standard Markdown or `<img>` instead | |
| ```markdown | |
|  |
or, if you need HTML:
<img src="/images/shared-image.jpg" alt="Description">| - name: Set up Node.js | ||
| uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 |
There was a problem hiding this comment.
The inline version comment # v6.2.0 appears incorrect for actions/setup-node (and can cause confusion during dependency/security audits). Since the action is pinned by SHA, consider either updating the comment to the correct tag version for that SHA or removing the tag comment entirely.
✅ Deploy Preview for esphome ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Do not merge, release script will automatically merge
select.iscondition docs#5928esp-idfis now the default framework for all variants docs#5960mqtt_use_json_payloadoption tocover. docs#5817Metadata
@coderabbitai ignore