LumaSync-Site
releasev1.1.35Marketing site, docs, and blog for LumaSync — the tray-first open-source ambilight + Philips Hue desktop app.
README Snapshot
LumaSync-Site
Marketing site, docs, and blog for LumaSync — the tray-first open-source ambilight + Philips Hue desktop app.
- Site: https://lumasync.app
- App repo: https://github.com/voyvodka/LumaSync
Stack
- Astro 6 + MDX content collections (
docs,compare,legal,blog) - Pagefind for offline in-browser search; Umami for cookie-free analytics
- Cloudflare Pages (direct-upload via
wrangler) + Cloudflare DNS - IBM Plex Sans / Mono (self-hosted WOFF2, preloaded)
- No secrets bundled; the site never talks to the desktop app
Develop
Requires Node 22.12+ and pnpm (pinned via packageManager in package.json).
pnpm install
pnpm dev # http://localhost:4321
pnpm lint # prettier --check
pnpm check # astro check (type-check + content schema)
pnpm build # astro build + pagefind index
Deploy
Every push to main triggers .github/workflows/deploy.yml, which lint- and type-checks, builds, and ships dist/ to Cloudflare Pages.
Required repo secrets for CI: CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID.
License
- Code (Astro components, layouts, CI, styling) — MIT
- Content (MDX under
src/content/, docs, comparisons, blog) — CC BY 4.0
See /license for the public-facing summary and LICENSE for the full text.
Contributing
Issues and PRs welcome — see CONTRIBUTING.md for scope, local preview, and commit conventions. For app-level bugs (firmware, USB pipeline, Hue streaming), file against the LumaSync app repo instead.
Security
Report vulnerabilities through GitHub's Private Vulnerability Reporting — see SECURITY.md or /.well-known/security.txt.
Changelog
Changelog — lumasync-site
This is the changelog for the marketing/docs site at lumasync.app. The LumaSync app's own release notes live in the app repo and surface on /changelog — site versions track independently from app versions.
The site follows Semantic Versioning at its own cadence; bumping the LumaSync app submodule does not require bumping the site version.
[1.1.35] — 2026-07-29
Security
- Four high-severity CVEs in the shipped dependency tree are closed.
js-yaml(GHSA-52cp-r559-cp3m),svgo(GHSA-2p49-hgcm-8545),sharp(GHSA-f88m-g3jw-g9cj) andpostcss(GHSA-r28c-9q8g-f849) all picked up advisories after v1.1.34. None is a direct dependency — they arrive transitively throughastro,@astrojs/mdxand@tailwindcss/vite— so each is pinned to its patched range viapnpm.overrides, alongside the existingfast-uri/esbuild/yamlentries. Thepnpm audit --prod --audit-level=highgate had been failing onmainand passes again.
Fixed
- TV sizes in the hardware checklist use a real prime mark. The measurements were authored with a straight
", an unpaired quote the Markdown typographer had to guess at. Astro 7's typographer reads it as an opening quote, so the sizes now carryU+2033(double prime) — the correct character for inches, and unambiguous under any typographer. The same upgrade also corrects the opening quote on the USB controllers page heading, which had been rendering as a closing quote.
Dependencies
- Astro 6.4.8 → 7.1.5 and
@astrojs/mdx6.0.3 → 7.0.5, which also moves vite from 7 to 8. The two majors travel together —@astrojs/mdx6.x peers against Astro 6. Verified against a baseline build of the previousmain: the output tree is identical (272 files, 54 HTML pages, 34 byte-identical OG images) and scoped-style hashes still resolve. The only deltas are the generator meta tag, regenerateddata-astro-cidhashes, and tighter whitespace / CSS-declaration minification from the newer pipeline. - TypeScript deliberately held at 6.0.3. The 7.x native compiler does not ship the programmatic Language Service API that
astro checkis built on, and@astrojs/checkdeclares a^5 || ^6peer range — soastro checkfails outright on TypeScript 7. Tracked upstream in withastro/roadmap#1321. - Minor/patch group bump across 11 packages —
satori0.26 → 0.29,tailwindcssand@tailwindcss/vite4.3.2 → 4.3.3, the three@fontsourcefamilies 5.2.x → 5.3.0,marked18.0.6 → 18.0.7,isomorphic-dompurify3.18 → 3.19,prettier3.9.5 → 3.9.6,prettier-plugin-tailwindcss0.8.0 → 0.8.1,@astrojs/check0.9.9 → 0.9.10. Manifest + lockfile only.
CI
actions/setup-nodepinned forward from v6 to v7 in both the CI and deploy workflows.
[1.1.34] — 2026-07-14
Fixed
- Press-state feedback on inline links now actually renders. The 404 page's
.home-ctaand the/download/version pill both declared aprefers-reduced-motion-gatedtransform: scale(0.96)on:activeand listedtransformin their transition — but both are anchors laid out as non-replaced inline boxes, and CSStransformdoes not apply to those. The press animation was silently dead CSS. Both now setdisplay: inline-block, so the tactile:activetreatment shipped for the version pill in v1.1.31 finally takes effect.
Accessibility
- The landing page's
.inline-ctalinks press like the site's other CTAs. They gaineddisplay: inline-block, atransformentry in their transition list, and aprefers-reduced-motion-gatedscale(0.96)on:active— matching the interaction treatment already carried by the primary/secondary CTAs and the compare cards.
Dependencies
- Minor/patch group bumps across two batches —
tailwindcssand@tailwindcss/vite4.3.0 → 4.3.2,marked18.0.5 → 18.0.6,dompurify3.4.11 → 3.4.12,prettier3.9.1 → 3.9.5. Manifest + lockfile only, no source change; the prettier-check, type-check, build, and Lighthouse-CI gates pass unchanged.
[1.1.33] — 2026-06-29
Added
Content-UsageAI-preference signal inrobots.txt. Alongside the existing CloudflareContent-Signal, the site now also emits the IETF AIPREF standards-track directive (Content-Usage: search=y, train-ai=n) — the successor mechanism that updates the Robots Exclusion Protocol (RFC 9309). The AIPREF vocabulary currently defines onlysearchandtrain-ai, so the RAG/answer-engine axis stays onContent-Signalfor now; the policy is unchanged (indexing yes, model training no).- Web Bot Auth directory placeholder.
/.well-known/http-message-signatures-directorynow serves an empty JWKS ({ "keys": [] }) asapplication/json. The site makes no signed outbound requests, so it publishes no keys, but the directory's presence satisfies agent-readiness probes (RFC 9421 HTTP Message Signatures).
CI
- Lighthouse CI pinned to
@lhci/[email protected]instead of@latest, so the runner (and its bundled Lighthouse 12.6.1) no longer re-resolves per run and CI stays deterministic. A note flags adding acategories:agentic-browsingassertion oncelhciships a build bundling Lighthouse ≥ 13.3.0 (the release that made the Agentic Browsing category default).
[1.1.32] — 2026-06-29
Security
- Pagefind stamp script no longer has a check-then-act file race. The build-time stamper probed each core file with
existsSync()and then appended to it by path — a time-of-check/time-of-use window (CWE-367) where the file referenced by the name could change between the two operations. It now opens each file once with anr+descriptor (which fails closed withENOENTwhen the file is absent, preserving the "stamp only if present" behaviour) and appends through that descriptor, so the check and the write target the same handle. CodeQLjs/file-system-racealert resolved.
[1.1.31] — 2026-06-29
Security
- Pagefind search results now scheme-validate their link URLs. Each result's URL was injected into the result anchor's
hrefafter HTML-escaping, which neutralizes markup but not ajavascript:ordata:scheme — so a poisoned index entry could have executed on click. AsanitizeUrl()guard now parses every result URL with the nativeURLconstructor (a dummy base preserves relative paths) and allow-lists onlyhttp:/https:, falling back to#for anything else, before the existing escape. Defense-in-depth: the index is built from our own content, but search URLs are no longer trusted blindly.
Accessibility
- The
/download/version pill reads and behaves as the link it is. The pill links to the GitHub release but rendered as a static-looking badge with no interactive affordance. It now inverts colors on:hover, draws the standard 2px--focus-ringoutline on:focus-visible, presses with aprefers-reduced-motion-gatedscale(0.96)on:active, and carries a descriptivetitle— matching the interaction treatment used elsewhere on the site.
Dependencies
- Dev-only
prettierbump 3.8.4 → 3.9.1 (minor/patch group) — manifest + lockfile only, no source change. The prettier-check, type-check, build, and Lighthouse-CI gates pass unchanged.
[1.1.30] — 2026-06-26
Fixed
- Cmd+K search now actually loads its WebAssembly — Pagefind core JS is cache-busted per deploy. The v1.1.28 CSP fix (
wasm-unsafe-eval) was correct at the origin, but Cloudflare had edge-cached/pagefind/pagefind-worker.jswith the old CSP header; because that file's bytes never change between deploys, conditional revalidation kept returning304and serving the stale header — a "Purge Everything" was re-revalidated straight back to it, so search stayed broken. The build now appends a build-unique stamp to Pagefind's non-fingerprinted core JS (pagefind.js,pagefind-worker.js,pagefind-ui.js) so their ETag changes each deploy, forcing a full200that ships the current CSP. The search worker can compile its WASM module again.
[1.1.29] — 2026-06-25
Changed
- Landing roadmap "Shipped" column scoped to the current release. It had been accumulating the full v1.5.0–v1.5.3 feature list (13 bullets), dwarfing the "Next" and "Never" columns and stretching the section well past a screen. It now lists only the latest release's highlights (v1.5.3) — matching the column's version header — so the three columns read at comparable length, with the full history one click away under "Full changelog →".
[1.1.28] — 2026-06-25
Fixed
- Cmd+K search restored. The Content-Security-Policy
script-srcwas missing'wasm-unsafe-eval', so Pagefind could not compile its WebAssembly module and search silently failed with a CSP console error on every page. Added the narrow'wasm-unsafe-eval'source — it permits WASM compilation only, not generaleval— so the search index loads again.
Build
- Pinned the
vendor/lumasyncsubmodule to the v1.5.3 release commit so the deployed build resolves the v1.5.3 version surfaces (roadmap header, JSON-LDsoftwareVersion, compare cells) and renders the v1.5.3 release notes on/changelog/— completing the v1.1.27 app sync.
[1.1.27] — 2026-06-25
Documentation
- Synced docs to LumaSync app v1.5.3. Added a macOS launch-crash note — the 1.5.2 build crashed on launch on Macs without Xcode, and v1.5.3 fixes it — to the install guide, the error-handling reference, the download page, and USB troubleshooting. Expanded Hue troubleshooting with the self-clearing active-streamer banner, the fixed "Reconnecting" stall, and the
HUE_STOP_TIMEOUT_PARTIAL"Retry Stop" hint. Documented the v1.5.3 shutdown-hardening continuation, the transient-notice timer-leak fix, the visibility-aware Hue polling and output hot-path optimizations, the room-map template-selector design-token +aria-labelwork, and single-HTTP-client gamut fetching. Bumpedupdated:frontmatter on every touched doc.
Content
- Landing page refreshed for v1.5.3. The roadmap "Shipped" column now leads with the v1.5.3 headline items (macOS launch-crash fix, self-clearing Hue active-streamer banner, shutdown hardening), and the macOS platform card notes the 1.5.2 → 1.5.3 launch-crash fix.
Accessibility
- Focus-visible rings on landing-page text links — the custom inline CTA links (
.inline-cta), the feature-grid "→" links, and the trust-section links now draw the standard 2px--focus-ringoutline on keyboard focus, matching the treatment already used on CTAs and cards. Incorporates community PR #103.
SEO
- Bumped the site-wide
Last-Modifiedfreshness signal so answer engines and AI crawlers see a current date on HTML and markdown responses.
[1.1.26] — 2026-06-22
Security
- External-link
noopenerrollout finished on render-time links: the 1.1.25 pass hardened the static-hrefoutbound links, but missed a handful whosehrefresolves conditionally and so never matched a literal-hrefaudit — the 404 page's recovery links (the GitHub "Report a bug" entry), the/community/FAQ answers built as inline HTML strings (the/issuesand/discussions/ideasGitHub links) and the "where to go" forum cards, and the/download/per-OS asset cards. Each now setsrel="noopener noreferrer", with the attribute guarded the same way as thehrefso internal and disabled links stay untouched. Defense-in-depth plus Referer-header suppression; notarget="_blank"exists site-wide.
Accessibility
- Skip-to-content link gains a visible focus ring and press feedback: the
.skip-linkalready slid into view on focus, but rendered no:focus-visibleoutline once visible. It now draws the standard 2px--focus-ringoutline with a 2px offset and aprefers-reduced-motion-gatedscale(0.96):active
Releases
- v1.1.35 — transitive CVE overrides, Astro 7, dependency refreshOpen on GitHub
Security
- Four high-severity CVEs closed in the shipped dependency tree —
js-yaml(GHSA-52cp-r559-cp3m),svgo(GHSA-2p49-hgcm-8545),sharp(GHSA-f88m-g3jw-g9cj),postcss(GHSA-r28c-9q8g-f849). - All four arrive transitively through
astro,@astrojs/mdxand@tailwindcss/vite; each is pinned to its patched range viapnpm.overrides. - The
pnpm audit --prod --audit-level=highgate had been failing onmainand passes again.
Fixed
- TV sizes in the hardware checklist now use
U+2033(double prime) instead of an ambiguous straight quote — the correct character for inches. - The USB controllers page heading's opening quote no longer renders as a closing quote.
Dependencies
- Astro 6.4.8 → 7.1.5 and
@astrojs/mdx6.0.3 → 7.0.5, which also moves vite 7 → 8. - Verified against a baseline build: identical output tree (272 files, 54 HTML pages, 34 byte-identical OG images), scoped-style hashes resolve.
- Remaining deltas are the generator meta tag, regenerated
data-astro-cidhashes, and tighter minification. - TypeScript held at 6.0.3 — the 7.x native compiler drops the programmatic Language Service API
astro checkneeds (withastro/roadmap#1321). - Minor/patch group bump across 11 packages:
satori,tailwindcss,@tailwindcss/vite, three@fontsourcefamilies,marked,isomorphic-dompurify,prettier,prettier-plugin-tailwindcss,@astrojs/check.
CI
actions/setup-nodev6 → v7 in the CI and deploy workflows.
- Four high-severity CVEs closed in the shipped dependency tree —
- v1.1.34 — inline-link press states, dependency bumpsOpen on GitHub
Fixed
- Press-state feedback on inline links now actually renders. The 404 page's
.home-ctaand the/download/version pill both declared aprefers-reduced-motion-gatedtransform: scale(0.96)on:active, but both are anchors laid out as non-replaced inline boxes — where CSStransformdoes not apply. The press animation was silently dead CSS. Both now setdisplay: inline-block, so the tactile:activetreatment shipped for the version pill in v1.1.31 finally takes effect.
Accessibility
- The landing page's
.inline-ctalinks press like the site's other CTAs —display: inline-block, atransformtransition, and aprefers-reduced-motion-gatedscale(0.96)on:active, matching the primary/secondary CTAs and compare cards.
Dependencies
- Minor/patch group bumps across two batches —
tailwindcssand@tailwindcss/vite4.3.0 → 4.3.2,marked18.0.5 → 18.0.6,dompurify3.4.11 → 3.4.12,prettier3.9.1 → 3.9.5. Manifest + lockfile only; all CI gates pass unchanged.
Full changelog: https://github.com/voyvodka/LumaSync-Site/compare/v1.1.33...v1.1.34
- Press-state feedback on inline links now actually renders. The 404 page's
- v1.1.33Open on GitHub
Added
Content-UsageAI-preference signal inrobots.txt. Emitted alongside the existing CloudflareContent-Signal— the IETF AIPREF standards-track successor (Content-Usage: search=y, train-ai=n) that updates RFC 9309. Policy unchanged: indexing yes, model training no. The AIPREF vocabulary defines onlysearch/train-aiso far, so the RAG axis stays onContent-Signal.- Web Bot Auth directory placeholder.
/.well-known/http-message-signatures-directorynow serves an empty JWKS ({ "keys": [] }) asapplication/json, satisfying agent-readiness probes (RFC 9421). The site signs no outbound requests, so it publishes no keys.
CI
- Lighthouse CI pinned to
@lhci/[email protected](was@latest) for deterministic runs. Adding acategories:agentic-browsingassertion is deferred until lhci bundles Lighthouse ≥ 13.3.0.
- v1.1.32Open on GitHub
Security
- Pagefind stamp script no longer has a check-then-act file race. The build-time stamper probed each core file with
existsSync()and then appended to it by path — a time-of-check/time-of-use window (CWE-367) where the file referenced by the name could change between the two operations. It now opens each file once with anr+descriptor (fails closed withENOENTwhen absent, preserving the stamp-only-if-present behaviour) and appends through that descriptor, so the check and the write target the same handle. CodeQLjs/file-system-racealert resolved.
- Pagefind stamp script no longer has a check-then-act file race. The build-time stamper probed each core file with
- v1.1.31Open on GitHub
Security
- Pagefind search results now scheme-validate their link
href— asanitizeUrl()guard parses each result URL with the nativeURLconstructor and allow-lists onlyhttp:/https:(falling back to#) before HTML-escaping, blockingjavascript:/data:URIs from a poisoned index. Defense-in-depth.
Accessibility
- The
/download/version pill now reads as the link it is: color-inverting:hover, a 2px--focus-ring:focus-visibleoutline, aprefers-reduced-motion-gatedscale(0.96):activepress, and a descriptivetitle.
Dependencies
- Dev-only
prettierbump 3.8.4 → 3.9.1 (minor/patch group) — manifest + lockfile only, all gates pass unchanged.
- Pagefind search results now scheme-validate their link
- v1.1.30Open on GitHub
Fixed
- Cmd+K search now actually loads its WebAssembly — Pagefind core JS is cache-busted per deploy. The v1.1.28 CSP fix (
wasm-unsafe-eval) was correct at the origin, but Cloudflare had edge-cached/pagefind/pagefind-worker.jswith the old CSP header. Because that file's bytes never change between deploys, conditional revalidation kept returning304and serving the stale header — a "Purge Everything" was re-revalidated straight back to it, so search stayed broken. The build now appends a build-unique stamp to Pagefind's non-fingerprinted core JS (pagefind.js,pagefind-worker.js,pagefind-ui.js) so their ETag changes each deploy, forcing a full200that ships the current CSP. The search worker can compile its WASM module again.
- Cmd+K search now actually loads its WebAssembly — Pagefind core JS is cache-busted per deploy. The v1.1.28 CSP fix (
- v1.1.29Open on GitHub
Changed
- Landing roadmap "Shipped" column scoped to the current release. It had been accumulating the full v1.5.0–v1.5.3 feature list (13 bullets), dwarfing the "Next" and "Never" columns and stretching the section well past a screen. It now lists only the latest release's highlights (v1.5.3) — matching the column's version header — so the three columns read at comparable length, with the full history one click away under "Full changelog →".
- v1.1.28Open on GitHub
Fixed
- Cmd+K search restored — the Content-Security-Policy
script-srcwas missing'wasm-unsafe-eval', so Pagefind could not compile its WebAssembly module and search silently failed with a CSP console error on every page. Added the narrow'wasm-unsafe-eval'source (WASM compilation only, not generaleval).
Build
- Pinned the
vendor/lumasyncsubmodule to the v1.5.3 release commit so the deployed build resolves the v1.5.3 version surfaces (roadmap header, JSON-LDsoftwareVersion, compare cells) and renders the v1.5.3 release notes on/changelog/— completing the v1.1.27 app sync.
- Cmd+K search restored — the Content-Security-Policy
- v1.1.27Open on GitHub
Marketing/docs site sync to the LumaSync app v1.5.3 release.
Documentation
- macOS launch-crash fix (1.5.2 builds crashed on Macs without Xcode) documented across the install guide, error-handling reference, download page, and USB troubleshooting.
- Hue troubleshooting expanded: self-clearing active-streamer banner, fixed "Reconnecting" stall, and the
HUE_STOP_TIMEOUT_PARTIAL"Retry Stop" hint. - Added v1.5.3 shutdown-hardening continuation, transient-notice timer-leak fix, visibility-aware Hue polling, output hot-path optimizations, room-map template-selector a11y, and single-HTTP-client gamut fetching. Bumped
updated:frontmatter on every touched doc.
Content
- Landing roadmap "Shipped" column now leads with the v1.5.3 highlights; the macOS platform card notes the 1.5.2 → 1.5.3 crash fix.
Accessibility
- Focus-visible rings on the landing page's inline CTA, feature-grid, and trust-section links (incorporates PR #103).
SEO
- Bumped the site-wide
Last-Modifiedfreshness signal.
- v1.1.26Open on GitHub
Security
- Finished the external-link
noopenerrollout on the render-timehreflinks the 1.1.25 pass missed: 404 recovery links,/community/FAQ inline links and forum cards, and/download/per-OS asset cards.rel="noopener noreferrer"is guarded the same way as eachhref, so internal and disabled links stay untouched.
Accessibility
- Skip-to-content link now draws a visible
:focus-visiblering (2px--focus-ring) plus a reduced-motion-gatedscale(0.96)press state once it slides into view. - 404 page recovery cards and the
← Homelink gained the standard:focus-visibleoutline so keyboard users can see which target holds focus.
Dependencies
- Minor/patch group:
astro6.4.7 → 6.4.8,dompurify3.4.8 → 3.4.11,isomorphic-dompurify3.16.0 → 3.18.0 (manifest + lockfile only).
Build
- GitHub Actions:
actions/checkout6 → 7 across CI/CodeQL/deploy, andpnpm/action-setup6.0.8 → 6.0.9 (SHA-pinned). CI-only.
- Finished the external-link
- v1.1.25Open on GitHub
Security
- esbuild advisory cleared (GHSA-gv7w-rqvm-qjhr, GHSA-g7r4-m6w7-qqqr): pnpm override pins
esbuildto>=0.28.1; thepnpm audit --prod --audit-level=highCI gate is green again. - yaml advisory cleared (GHSA-48c2-rrv3-qjmp): pnpm override forces
yamlto>=2.8.3(was 2.7.1 via@astrojs/check).pnpm auditnow reports no known vulnerabilities at any severity, prod or dev. - External-link hardening completed site-wide:
rel="noopener noreferrer"extended to the remaining outbound links on the home, download, and community pages, finishing the rollout begun in 1.1.24.
Accessibility
- Disabled community forum links now show their native
titletooltip on hover (.forums a.disabled:pointer-events: none→cursor: default), with no interactivity regression.
Dependencies
astro6.4.4 → 6.4.7 (manifest + lockfile), plus a full lockfile refresh for the latest in-range patches across the tree.
- esbuild advisory cleared (GHSA-gv7w-rqvm-qjhr, GHSA-g7r4-m6w7-qqqr): pnpm override pins
- v1.1.24Open on GitHub
Security
- CSP
img-srctightened to'self' data:— removed thehttps:scheme wildcard; the site loads no external images (verified by repo-wide scan), so arbitrary-origin image loads are no longer permitted. rel="noopener noreferrer"on external outbound links — GitHub links inCompareCTA, Footer outbound links, and repo/license links on/changelog/and/license/now carry both hints; defense-in-depth (notarget="_blank"exists site-wide) plus Referer-leak prevention.
Full details in CHANGELOG.md.
- CSP
- v1.1.23Open on GitHub
Build
- Declared Node engine floor aligned to the real requirement:
package.jsonengines.nodetightened>=22.0.0→>=22.12.0, and the README "Develop" note now reads "Node 22.12+", matching the floor imposed by Astro 6 and@astrojs/mdx6 (both declarenode >=22.12.0). - No runtime or build-output change —
.nvmrcalready resolves a compliant Node 22.x, so CI was unaffected; this only makes the declared range honest. No redeploy needed.
- Declared Node engine floor aligned to the real requirement:
- v1.1.22Open on GitHub
Accessibility
- Keyboard focus rings (
:focus-visible, 2px--focus-ring) on the primary/secondary CTAs inCompareCTA.astroand on the homepage. - Compare-listing (
/compare/) grid cards gain the same focus ring plus aprefers-reduced-motion-gatedscale(0.96)active-press transform.
Dependencies
- Minor/patch group:
astro6.4.2 → 6.4.4,marked18.0.4 → 18.0.5,dompurify3.4.7 → 3.4.8,isomorphic-dompurify3.15.0 → 3.16.0. @astrojs/mdx5.0.6 → 6.0.2 (major) — Astro 6.4 satisfies the newastro: ^6.4.0peer range; build, type-check, and Lighthouse-CI gates green.
- Keyboard focus rings (
- v1.1.21Open on GitHub
Accessibility
- Disabled Discord card explains itself on hover — the "Coming soon" Discord card on
/community/now carries a nativetitletooltip ("Pending community growth"), mirroring the disabled download-card treatment so hovering users see why the card is inert. Already kept out of the keyboard/click path viaaria-disabledand an undefinedhref.
Dependencies
- Minor/patch group bump (4 updates) —
astro6.3.7 → 6.4.2,@astrojs/sitemap3.7.2 → 3.7.3,dompurify3.4.5 → 3.4.7,isomorphic-dompurify3.14.0 → 3.15.0. Astro is a minor release; the rest are routine upstream patches — lockfile + manifest only, no source change.
- Disabled Discord card explains itself on hover — the "Coming soon" Discord card on
- v1.1.20Open on GitHub
Security
- Response-header hardening — removed the deprecated
block-all-mixed-contentdirective from the CSP (upgrade-insecure-requestssupersedes it) and added aPermissions-Policydenying camera, microphone, geolocation, payment, USB, the motion sensors, and the Topics API. No functional change — the static site calls no powerful browser APIs.
Structured Data
- Organization logo dimensions corrected — the logo
ImageObjectnow declares320x80to match the SVG's intrinsic viewBox (was512x128), so strict validators don't flag a dimension mismatch.
- Response-header hardening — removed the deprecated
- v1.1.19Open on GitHub
Bug Fixes
- Dead links + slashless structured-data URLs —
llms.txtlinkedllms-full.txt/and.well-known/security.txt/(both 404 with a trailing slash) and the docs leaf/group schema URLs (breadcrumb, TechArticle/HowTo, CollectionPage) 308-redirected; all now resolve directly and the Telemetry link points at/docs/reference/telemetry/. /docs/and/compare/hub OG images 404'd — added the missing OG route keys so social/crawler unfurls render a card.SoftwareApplicationshared one@idwith twodownloadUrls — homepage and/download/now both resolve to the stable/download/canonical.humans.txt— corrected the deploy host to Cloudflare Pages.
Content
- Hue Sync comparison repositioned — corrected the inaccurate "discontinued" claim (the Hue Sync desktop app is still maintained; only the mobile app was retired) and reframed LumaSync as a free, open-source alternative, keeping the migration guidance.
Accessibility
- Muted text now meets WCAG AA contrast —
--text-mutedlightened from#6b7280to#8b919c. - Disabled download cards carry a native
titletooltip explaining why they're inert.
Performance
- 30-day caching for
/media/— the LCP hero and screenshots no longer pay the 4h must-revalidate round-trip.
Discoverability
Linkheader advertisingllms.txt/llms-full.txtnow usesrel="alternate"; type="text/markdown".
Build
- CI gates on production CVEs via
pnpm audit --prod --audit-level=high.
- Dead links + slashless structured-data URLs —
- v1.1.18Open on GitHub
Security
- Sanitized GitHub API fetch errors on
/download/— raw error messages are no longer surfaced to the UI; failures are logged server-side and degrade with a genericupstream API unavailablestring, avoiding leakage of upstream API structure or network details.
Accessibility
- Search-hint
<kbd>glyphs hidden from the accessible name — the modal hint's arrow/enter symbols now carryaria-hidden="true"paired withsr-onlytext equivalents ("Up and down arrows", "Enter"), applied to both the static markup and the empty-query repaint; the Close button'sEsckbd is alsoaria-hidden(covered byaria-keyshortcuts).
Interaction
- Press-state feedback on search results — added a
:activescale(0.98)to search results, gated behindprefers-reduced-motion: no-preference.
- Sanitized GitHub API fetch errors on
- v1.1.17Open on GitHub
Security
- CSP hardening —
https:wildcard removed fromscript-srcandconnect-srcinpublic/_headers. Both directives are now pinned to'self'. The site serves no third-party scripts at runtime, so this is a no-op for legitimate traffic and narrows the XSS / data-exfiltration attack surface.
Accessibility
aria-keyshortcuts+ dialog-popup semantics on search triggers: header search button and 404-page.search-ctanow exposearia-keyshortcuts="Control+K Meta+K",aria-haspopup="dialog", andaria-controls="search-dialog", with their visual<kbd>⌘</kbd><kbd>K</kbd>wrappers hidden from AT viaaria-hidden="true". The search modal's Close button also gainsaria-keyshortcuts="Escape". 404 CTA additionally gets an explicitaria-label="Search".- Focus-visible outline on landing-page compare cards — closes the last landing-page interactive surface that lacked a keyboard outline, matching the focus pattern used across the rest of the site.
Dependencies
- Minor/patch group bump (4 updates):
astro6.3.3 → 6.3.7,marked18.0.3 → 18.0.4,dompurify3.4.4 → 3.4.5,isomorphic-dompurify3.13.0 → 3.14.0.
- CSP hardening —
- v1.1.16Open on GitHub
Bug Fixes
- Stale search queries no longer overwrite fresher results in
Search.astro: a monotonicqueryIdis now captured per input event and re-checked after everyawait(loadPagefind,pf.search,data()), so a superseded query bails before touching the DOM. Clearing the input also invalidates any in-flight query.
Accessibility
- Disabled download cards on
/download/now drop theirhrefentirely, removing unavailable-platform cards from the keyboard tab order and disabling Enter-key activation. Mirrors the community-forum-card fix from v1.1.15.
Dependencies
- Minor/patch group:
astro6.3.1 → 6.3.3,@astrojs/mdx5.0.4 → 5.0.6,dompurify3.4.2 → 3.4.4,isomorphic-dompurify3.12.0 → 3.13.0. pnpm/action-setup6.0.6 → 6.0.8 (CI + deploy).cloudflare/wrangler-action3.15.0 → 4.0.0 (deploy) — non-breaking,wranglerVersion: '4'already pinned; stale pin comment corrected to# v4.0.0.
- Stale search queries no longer overwrite fresher results in