Rebuild as a dependency-free static installer - #85
Conversation
Replaces the static per-release bin/ manifest tree with live GitHub Releases API fetching (app.js), consolidating script.js/releases.js into one module. Adds: - Flash size selection (1/2/4/8/16MB) per chip, with unavailable sizes hidden automatically. - HUB75 Matrix variant with a board/layout picker (ESP32 default and forum pinouts, HD-WF2, Adafruit MatrixPortal S3, MOONHUB/LilyGO T7-S3, Waveshare RGB-Matrix), each showing its required chip and flash size. - New pre-patched + re-signed bootloaders and partition tables for ESP32-S3 at 4/16/32MB, generated with esptool's own header-patch algorithm and verified via `esptool image-info`. - A CORS-proxy health check that disables Install until real firmware bytes are confirmed reachable, instead of silently flashing an error page as firmware. - Dynamic i18n: languages load from lang/*.json + lang/languages.json at runtime, so adding a language needs no code changes. Added German, Spanish, Portuguese, Dutch and French alongside the existing English/Chinese. Removes installer/ (unused bundled esp-web-tools, superseded by the CDN build already in index.html), the legacy auto.htm/v2.htm pages, and the disabled nightly-download workflow.
Listed openly in the language picker (☠️ Pirate), same pattern as well-known "pirate mode" easter eggs elsewhere. Full translation of every string, no code changes required - just lang/pirate.json plus one line in lang/languages.json.
Mentioned by : wled#84
|
Warning Review limit reached
Next review available in: 52 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Repository UI (base), Organization UI (inherited) Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (72)
📒 Files selected for processing (69)
WalkthroughThe WLED Web Installer is rebuilt around a dynamic ChangesWLED installer application
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant Browser
participant app_js
participant GitHub_Releases_API
participant CORS_Proxy
participant esp_web_tools
Browser->>app_js: Initialize installer
app_js->>GitHub_Releases_API: Fetch releases
GitHub_Releases_API-->>app_js: Return release assets
app_js->>CORS_Proxy: Validate firmware access
CORS_Proxy-->>app_js: Return proxy response
app_js->>esp_web_tools: Set generated manifest
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (4)
index.html (1)
11-14: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick winPin esp-web-tools with SRI (
integrity/crossorigin).The script is loaded from unpkg with a pinned version but no
integrityhash orcrossoriginattribute. This page has direct Web Serial device-flashing capability, so a compromised/tampered CDN asset would run with full page privileges. Since the version is already pinned, adding SRI is low effort.🔒 Example fix
<script type="module" src="https://unpkg.com/esp-web-tools@10.4.0/dist/web/install-button.js?module" + integrity="sha384-<hash-for-10.4.0>" + crossorigin="anonymous" ></script>🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@index.html` around lines 11 - 14, Add Subresource Integrity protection to the external esp-web-tools module script: add the verified hash for the exact pinned 10.4.0 asset and set the required crossorigin attribute. Keep the existing module type and URL unchanged.app.js (3)
17-17: 🧹 Nitpick | 🔵 TrivialUnauthenticated GitHub API calls share a 60 req/hr rate limit per IP.
Every visitor behind the same NAT/corporate egress IP shares GitHub's unauthenticated rate limit; the 5-minute
sessionStoragecache is per-browser-session, not shared across users, so a moderately busy shared IP could exhaust the quota and start showingloadErrorto everyone behind it. Since this is a "no server component" static app, worth considering a lightweight edge cache/proxy in front of the GitHub API call (e.g., a small Cloudflare Worker with its own cache) if this becomes an issue in practice.Also applies to: 699-723
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app.js` at line 17, Address the GitHub API rate-limit risk in the release-fetching flow using the existing GITHUB_RELEASES_URL call and related logic around lines 699-723: route requests through a shared edge-cache/proxy endpoint, such as a Cloudflare Worker, rather than calling the unauthenticated GitHub API directly. Preserve the current release data handling and sessionStorage caching behavior while configuring the proxy to cache responses for multiple visitors.
533-542: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoffDynamically-generated radio labels bypass the i18n system.
fs.label + ' (' + chips.join(', ') + ')'andlayout.label + ' (' + layout.chip + ', ' + layout.flashSizeLabel + ')'are written directly astextContent, always in English, regardless of the selected language — unlike the rest of the UI which goes throughdata-i18n/i18n_apply(). Board/chip names are arguably fine to leave untranslated, but descriptive bits ("default pinout", "forum pinout") won't be localized either.Also applies to: 558-566
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app.js` around lines 533 - 542, Update the dynamic label rendering in the FLASH_SIZES loop and the corresponding layout-label block to use the existing i18n mechanism for descriptive text, including the parenthesized chip/pinout wording, while preserving board and chip names as values. Ensure the generated labels are localized according to the selected language rather than assigning fully composed English strings directly to textContent.
682-682: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winAdd a timeout to the
fetchcalls.Neither the GitHub releases fetch nor the proxy health-check fetch has a timeout (
AbortController/AbortSignal.timeout). A hung connection leaves the page stuck on "Loading versions..." or "Checking firmware download availability..." indefinitely instead of falling back to the error UI.♻️ Example fix
- fetch(GITHUB_RELEASES_URL + '?per_page=30') + fetch(GITHUB_RELEASES_URL + '?per_page=30', { signal: AbortSignal.timeout(15000) })Also applies to: 708-712
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app.js` at line 682, Update both fetch calls in the GitHub releases and proxy health-check flows, including the call near the HEAD request, to use an AbortController or AbortSignal.timeout with a finite timeout. Ensure timed-out requests follow the existing error-handling paths so the UI falls back from “Loading versions...” or “Checking firmware download availability...” instead of remaining stuck.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app.js`:
- Around line 653-692: The checkProxyHealth function currently enables Install
based only on HEAD res.ok, without confirming the proxy returns firmware bytes.
Replace or supplement the HEAD request with a ranged GET and validate the
response body contains actual firmware data, or validate reliable Content-Type
and Content-Length headers before enabling installBtn; keep the failure path
through showProxyBlocked.
- Around line 39-47: Update the Classic ESP32 entry in CHIP_CONFIG so its
bootParts layout matches the actual format of esp32_bootloader_v4.bin: if it is
a bare second-stage bootloader, use offset 4096 and include
partitions_esp32_4m.bin at offset 32768; if it is a factory-merged image, keep
it alone at offset 0. Ensure the selected layout does not flash the bootloader
incorrectly or omit the partition table.
In `@index.html`:
- Around line 63-64: Make `#showSerialHelp` keyboard-operable by replacing the
href-less anchor with a button using the existing link styling, or by adding
appropriate focusability and keyboard activation handling alongside its click
behavior in app.js. Ensure Enter and Space reveal `#serialHelp` with the same
behavior as mouse activation.
In `@README.md`:
- Around line 22-24: Update the fenced command block containing `npx serve .` to
specify the `console` or `bash` language on its opening fence, preserving the
command and surrounding README content.
---
Nitpick comments:
In `@app.js`:
- Line 17: Address the GitHub API rate-limit risk in the release-fetching flow
using the existing GITHUB_RELEASES_URL call and related logic around lines
699-723: route requests through a shared edge-cache/proxy endpoint, such as a
Cloudflare Worker, rather than calling the unauthenticated GitHub API directly.
Preserve the current release data handling and sessionStorage caching behavior
while configuring the proxy to cache responses for multiple visitors.
- Around line 533-542: Update the dynamic label rendering in the FLASH_SIZES
loop and the corresponding layout-label block to use the existing i18n mechanism
for descriptive text, including the parenthesized chip/pinout wording, while
preserving board and chip names as values. Ensure the generated labels are
localized according to the selected language rather than assigning fully
composed English strings directly to textContent.
- Line 682: Update both fetch calls in the GitHub releases and proxy
health-check flows, including the call near the HEAD request, to use an
AbortController or AbortSignal.timeout with a finite timeout. Ensure timed-out
requests follow the existing error-handling paths so the UI falls back from
“Loading versions...” or “Checking firmware download availability...” instead of
remaining stuck.
In `@index.html`:
- Around line 11-14: Add Subresource Integrity protection to the external
esp-web-tools module script: add the verified hash for the exact pinned 10.4.0
asset and set the required crossorigin attribute. Keep the existing module type
and URL unchanged.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: CHILL
Plan: Pro Plus
Run ID: 313d7bf3-cd91-4c5e-98a4-5d44c95cc055
⛔ Files ignored due to path filters (72)
bin/Beta/beta_0_15_1-b1/boot_app0.binis excluded by!**/*.binbin/Beta/beta_0_15_1-b1/bootloader_s2.binis excluded by!**/*.binbin/Beta/beta_0_15_1-b1/esp32-c3_bootloader_v2.binis excluded by!**/*.binbin/Beta/beta_0_15_1-b1/esp32_bootloader_v4.binis excluded by!**/*.binbin/Beta/beta_0_15_1-b2/boot_app0.binis excluded by!**/*.binbin/Beta/beta_0_15_1-b2/bootloader_s2.binis excluded by!**/*.binbin/Beta/beta_0_15_1-b2/bootloader_s3.binis excluded by!**/*.binbin/Beta/beta_0_15_1-b2/esp32-c3_bootloader_v2.binis excluded by!**/*.binbin/Beta/beta_0_15_1-b2/esp32_bootloader_v4.binis excluded by!**/*.binbin/Beta/beta_0_15_1-b2/partitions_s2_4m.binis excluded by!**/*.binbin/Beta/beta_0_15_1-b2/partitions_s3_8m.binis excluded by!**/*.binbin/Beta/beta_0_15_2-b1/boot_app0.binis excluded by!**/*.binbin/Beta/beta_0_15_2-b1/bootloader_s2.binis excluded by!**/*.binbin/Beta/beta_0_15_2-b1/esp32-c3_bootloader_v2.binis excluded by!**/*.binbin/Beta/beta_0_15_2-b1/esp32_bootloader_v4.binis excluded by!**/*.binbin/Beta/beta_0_15_2-b1/partitions_c3_4m.binis excluded by!**/*.binbin/Beta/beta_0_15_2-b1/partitions_s2_4m.binis excluded by!**/*.binbin/Beta/beta_0_15_2-b1/partitions_s3_8m.binis excluded by!**/*.binbin/Release/release_0_14_3/bootloader_s2.binis excluded by!**/*.binbin/Release/release_0_14_3/bootloader_s3.binis excluded by!**/*.binbin/Release/release_0_14_3/esp32-c3_bootloader_v2.binis excluded by!**/*.binbin/Release/release_0_14_3/esp32_bootloader_v4.binis excluded by!**/*.binbin/Release/release_0_14_3/partitions_c3_4m.binis excluded by!**/*.binbin/Release/release_0_14_3/partitions_s2_4m.binis excluded by!**/*.binbin/Release/release_0_14_3/partitions_s3_8m.binis excluded by!**/*.binbin/Release/release_0_14_4/bootloader_s2.binis excluded by!**/*.binbin/Release/release_0_14_4/bootloader_s3.binis excluded by!**/*.binbin/Release/release_0_14_4/esp32-c3_bootloader_v2.binis excluded by!**/*.binbin/Release/release_0_14_4/esp32_bootloader_v4.binis excluded by!**/*.binbin/Release/release_0_14_4/partitions_c3_4m.binis excluded by!**/*.binbin/Release/release_0_14_4/partitions_s2_4m.binis excluded by!**/*.binbin/Release/release_0_14_4/partitions_s3_8m.binis excluded by!**/*.binbin/Release/release_0_15_1/boot_app0.binis excluded by!**/*.binbin/Release/release_0_15_1/bootloader_s2.binis excluded by!**/*.binbin/Release/release_0_15_1/bootloader_s3.binis excluded by!**/*.binbin/Release/release_0_15_1/esp32-c3_bootloader_v2.binis excluded by!**/*.binbin/Release/release_0_15_1/esp32_bootloader_v4.binis excluded by!**/*.binbin/Release/release_0_15_1/partitions_c3_4m.binis excluded by!**/*.binbin/Release/release_0_15_1/partitions_s2_4m.binis excluded by!**/*.binbin/Release/release_0_15_1/partitions_s3_8m.binis excluded by!**/*.binbin/Release/release_0_15_2/boot_app0.binis excluded by!**/*.binbin/Release/release_0_15_2/bootloader_s2.binis excluded by!**/*.binbin/Release/release_0_15_2/bootloader_s3.binis excluded by!**/*.binbin/Release/release_0_15_2/esp32-c3_bootloader_v2.binis excluded by!**/*.binbin/Release/release_0_15_2/esp32_bootloader_v4.binis excluded by!**/*.binbin/Release/release_0_15_2/partitions_c3_4m.binis excluded by!**/*.binbin/Release/release_0_15_2/partitions_s2_4m.binis excluded by!**/*.binbin/Release/release_0_15_2/partitions_s3_8m.binis excluded by!**/*.binbin/Release/release_0_15_3/boot_app0.binis excluded by!**/*.binbin/Release/release_0_15_3/bootloader_s2.binis excluded by!**/*.binbin/Release/release_0_15_3/bootloader_s3.binis excluded by!**/*.binbin/Release/release_0_15_3/esp32-c3_bootloader_v2.binis excluded by!**/*.binbin/Release/release_0_15_3/esp32_bootloader_v4.binis excluded by!**/*.binbin/Release/release_0_15_3/partitions_c3_4m.binis excluded by!**/*.binbin/Release/release_0_15_3/partitions_s2_4m.binis excluded by!**/*.binbin/Release/release_0_15_3/partitions_s3_8m.binis excluded by!**/*.binbin/boot/bootloader_s3_16m.binis excluded by!**/*.binbin/boot/bootloader_s3_32m.binis excluded by!**/*.binbin/boot/bootloader_s3_4m.binis excluded by!**/*.binbin/boot/partitions_s3_16m.binis excluded by!**/*.binbin/boot/partitions_s3_32m.binis excluded by!**/*.binbin/boot/partitions_s3_4m.binis excluded by!**/*.binbin/boot/partitions_s3_hdwf2.binis excluded by!**/*.binbin/nightly/boot_app0.binis excluded by!**/*.binbin/nightly/boot_app0_v2022.binis excluded by!**/*.binbin/nightly/bootloader_s2.binis excluded by!**/*.binbin/nightly/bootloader_s3.binis excluded by!**/*.binbin/nightly/esp32-c3_bootloader_v2.binis excluded by!**/*.binbin/nightly/esp32_bootloader_v4.binis excluded by!**/*.binbin/nightly/partitions_c3.binis excluded by!**/*.binbin/nightly/partitions_s2_4m.binis excluded by!**/*.binbin/nightly/partitions_s3_8m.binis excluded by!**/*.bin
📒 Files selected for processing (70)
.github/ISSUE_TEMPLATE/bug_report.yml.github/ISSUE_TEMPLATE/config.yml.github/ISSUE_TEMPLATE/feature_request.yml.github/workflows/nightly.yamlCNAMEREADME.mdapp.jsauto.htmbin/Beta/beta_0_15_1-b1/manifest.jsonbin/Beta/beta_0_15_1-b1/manifest_e.jsonbin/Beta/beta_0_15_1-b1/manifest_t.jsonbin/Beta/beta_0_15_1-b2/manifest.jsonbin/Beta/beta_0_15_1-b2/manifest_e.jsonbin/Beta/beta_0_15_1-b2/manifest_t.jsonbin/Beta/beta_0_15_2-b1/manifest.jsonbin/Beta/beta_0_15_2-b1/manifest_e.jsonbin/Beta/beta_0_15_2-b1/manifest_t.jsonbin/Beta/beta_0_15_2-b1/manifest_v4.jsonbin/Release/release_0_14_3/manifest.jsonbin/Release/release_0_14_3/manifest_a.jsonbin/Release/release_0_14_3/manifest_e.jsonbin/Release/release_0_14_3/manifest_t.jsonbin/Release/release_0_14_4/manifest.jsonbin/Release/release_0_14_4/manifest_a.jsonbin/Release/release_0_14_4/manifest_e.jsonbin/Release/release_0_14_4/manifest_t.jsonbin/Release/release_0_15_1/manifest.jsonbin/Release/release_0_15_1/manifest_e.jsonbin/Release/release_0_15_1/manifest_t.jsonbin/Release/release_0_15_1/manifest_v4.jsonbin/Release/release_0_15_2/manifest.jsonbin/Release/release_0_15_2/manifest_e.jsonbin/Release/release_0_15_2/manifest_t.jsonbin/Release/release_0_15_2/manifest_v4.jsonbin/Release/release_0_15_3/manifest.jsonbin/Release/release_0_15_3/manifest_e.jsonbin/Release/release_0_15_3/manifest_t.jsonbin/Release/release_0_15_3/manifest_v4.jsonbin/nightly/manifest.jsonbin/nightly/manifest_debug.jsonbin/nightly/manifest_e.jsonbin/nightly/manifest_t.jsoncheckhtml.shi18n.jsindex.htmindex.htmlinstaller/esp32-76e55e75.jsinstaller/esp32c3-47b374e0.jsinstaller/esp32c6-6da0b175.jsinstaller/esp32s2-0d35c7ed.jsinstaller/esp32s3-69876819.jsinstaller/esp8266-00e25dbe.jsinstaller/index-54fb20b9.jsinstaller/install-button.jsinstaller/install-dialog-19322187.jsinstaller/rom-7e8b4fbe.jsinstaller/styles-fa761598.jslang/de.jsonlang/en.jsonlang/es.jsonlang/fr.jsonlang/languages.jsonlang/nl.jsonlang/pirate.jsonlang/pt.jsonlang/zh-CN.jsonreleases.jsscript.jsstyle.cssv2.htm
💤 Files with no reviewable changes (51)
- CNAME
- bin/Release/release_0_15_1/manifest_t.json
- bin/Release/release_0_14_4/manifest_e.json
- bin/Beta/beta_0_15_1-b1/manifest_t.json
- bin/Beta/beta_0_15_2-b1/manifest.json
- bin/Release/release_0_14_3/manifest_e.json
- bin/Beta/beta_0_15_2-b1/manifest_v4.json
- bin/Release/release_0_15_2/manifest_e.json
- bin/Release/release_0_14_4/manifest_a.json
- bin/Beta/beta_0_15_1-b1/manifest_e.json
- installer/rom-7e8b4fbe.js
- bin/nightly/manifest_debug.json
- bin/Release/release_0_15_2/manifest_v4.json
- bin/Release/release_0_14_3/manifest_t.json
- bin/nightly/manifest.json
- bin/Beta/beta_0_15_1-b2/manifest_e.json
- installer/esp32c6-6da0b175.js
- bin/Release/release_0_15_3/manifest_e.json
- bin/Release/release_0_15_1/manifest_v4.json
- bin/Beta/beta_0_15_1-b2/manifest_t.json
- bin/Release/release_0_15_3/manifest_v4.json
- bin/Release/release_0_14_3/manifest.json
- bin/Beta/beta_0_15_2-b1/manifest_t.json
- bin/Release/release_0_14_3/manifest_a.json
- bin/Release/release_0_15_3/manifest.json
- bin/Release/release_0_15_2/manifest_t.json
- bin/Beta/beta_0_15_1-b2/manifest.json
- bin/Release/release_0_14_4/manifest_t.json
- bin/Release/release_0_15_3/manifest_t.json
- bin/Release/release_0_14_4/manifest.json
- .github/workflows/nightly.yaml
- installer/esp32s2-0d35c7ed.js
- bin/nightly/manifest_t.json
- v2.htm
- bin/Release/release_0_15_1/manifest.json
- installer/index-54fb20b9.js
- releases.js
- bin/Release/release_0_15_1/manifest_e.json
- bin/nightly/manifest_e.json
- script.js
- installer/esp32s3-69876819.js
- installer/install-button.js
- bin/Beta/beta_0_15_1-b1/manifest.json
- installer/esp32c3-47b374e0.js
- installer/esp32-76e55e75.js
- auto.htm
- checkhtml.sh
- bin/Release/release_0_15_2/manifest.json
- installer/esp8266-00e25dbe.js
- index.htm
- bin/Beta/beta_0_15_2-b1/manifest_e.json
📜 Review details
🧰 Additional context used
🪛 ast-grep (0.45.0)
app.js
[error] 646-646: React's useState should not be directly called
Context: setManifest()
Note: [CWE-710] Improper Adherence to Coding Standards. Security best practice.
(usestate-direct-usage)
🪛 markdownlint-cli2 (0.23.1)
README.md
[warning] 22-22: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🔇 Additional comments (17)
.github/ISSUE_TEMPLATE/bug_report.yml (1)
1-97: LGTM!.github/ISSUE_TEMPLATE/config.yml (1)
1-8: LGTM!.github/ISSUE_TEMPLATE/feature_request.yml (1)
1-30: LGTM!README.md (1)
1-21: LGTM!Also applies to: 25-57
index.html (1)
1-10: LGTM!Also applies to: 15-62, 65-161
style.css (1)
49-51: LGTM!Also applies to: 81-87, 112-143, 195-200
app.js (1)
1-38: LGTM!Also applies to: 48-652, 693-707, 713-747
i18n.js (1)
2-96: LGTM!lang/pirate.json (1)
1-40: LGTM!lang/pt.json (1)
1-40: LGTM!lang/zh-CN.json (1)
1-40: LGTM!lang/de.json (1)
1-40: LGTM!lang/en.json (1)
1-40: LGTM!lang/es.json (1)
1-40: LGTM!lang/fr.json (1)
1-40: LGTM!lang/languages.json (1)
1-10: LGTM!lang/nl.json (1)
1-40: LGTM!
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@style.css`:
- Around line 170-173: In the `#showSerialHelp` style rule, remove the duplicate
padding: 0 declaration and retain a single padding declaration.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: CHILL
Plan: Pro Plus
Run ID: 777c77af-fa39-4af7-81b3-c5c8d74b68c2
📒 Files selected for processing (4)
README.mdapp.jsindex.htmlstyle.css
🚧 Files skipped from review as they are similar to previous changes (3)
- README.md
- index.html
- app.js
📜 Review details
🧰 Additional context used
🪛 Stylelint (17.14.1)
style.css
[error] 170-170: Duplicate property "padding" (declaration-block-no-duplicate-properties)
(declaration-block-no-duplicate-properties)
|
@coderabbitai review |
✅ Action performedReview finished.
|
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
|
@coderabbitai full review |
✅ Action performedFull review finished. Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 52 minutes. |
Replaces the static per-release bin/ manifest tree with live GitHub
Releases API fetching (app.js), consolidating script.js/releases.js
into one module.
New Features:
sizes hidden automatically.
forum pinouts, HD-WF2, Adafruit MatrixPortal S3, MOONHUB/LilyGO
T7-S3, Waveshare RGB-Matrix), each showing its required chip and
flash size.
ESP32-S3 at 4/16/32MB, generated with esptool's own header-patch
algorithm and verified via
esptool image-info.firmware bytes are confirmed reachable, instead of silently
flashing an error page as firmware.
at runtime, so adding a language needs no code changes. Added
German, Spanish, Portuguese, Dutch and French alongside the
existing English/Chinese.
Cleanup
Removes installer/ (unused bundled esp-web-tools, superseded by the
CDN build already in index.html), the legacy auto.htm/v2.htm pages,
and the disabled nightly-download workflow.
Changes
Changed version to 10.4.0 as reported by https://github.com/balloob in #84
Summary by CodeRabbit
New Features
Documentation
Chores