feat(docs): Docusaurus site scaffold + Pages CI (PR #1/3)#39
feat(docs): Docusaurus site scaffold + Pages CI (PR #1/3)#39EtienneLescot wants to merge 0 commit into
Conversation
|
@FabLrc previous PR was closed by error, so here is a new one |
📝 WalkthroughWalkthroughThis PR adds a Docusaurus-based website under ChangesWebsite scaffold and deployment
Estimated code review effort: 3 (Moderate) | ~25 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
website/package.json (1)
1-45: 📐 Maintainability & Code Quality | 🔴 Critical | ⚡ Quick winFix Biome formatting failure (CRLF line endings).
CI lint reports Biome formatter mismatch on this file due to CRLF line endings; run
biome format --write website/package.json(or configure line endings to LF) to fix.🤖 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 `@website/package.json` around lines 1 - 45, The Biome formatter is failing on this package manifest because of CRLF line endings; update the file to use LF consistently so the formatting check passes. Make the fix in the website/package.json content itself (and any related editor/config defaults if needed) so the package.json formatting stays stable across CI and local runs.Source: Pipeline failures
website/src/pages/index.tsx (1)
123-281: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winFix JSX formatting (Biome formatter failure).
CI reports the formatter would reflow several segments here (span attribute wrapping, paragraph text wrapping) and near the closing
</Layout>. Run Biome format before merging.🤖 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 `@website/src/pages/index.tsx` around lines 123 - 281, The JSX in the index page is not Biome-formatted, causing formatter failures in the span attribute wrapping, paragraph wrapping, and the closing Layout area. Reformat the affected JSX in the index component so it matches Biome’s expected layout, especially around the timeline pills, feature cards, quick start text, and the final </Layout> block.Sources: Coding guidelines, Pipeline failures
🧹 Nitpick comments (5)
.github/workflows/docs.yml (1)
29-49: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueConsider adding
actions/configure-pagesbefore upload.GitHub's official custom-workflow docs for Pages consistently include a
configure-pagesstep ahead ofupload-pages-artifact/deploy-pagesto derive Pages metadata (e.g., base path); this workflow omits it. Since Docusaurus already sets its own staticbaseUrl/urlindocusaurus.config.ts, this is likely non-blocking, but worth confirming the build doesn't rely on metadata this action would otherwise provide (e.g., environment detection).🤖 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 @.github/workflows/docs.yml around lines 29 - 49, The docs Pages workflow is missing the standard GitHub Pages metadata setup step before artifact upload. Update the workflow around the existing checkout/setup/build and `actions/upload-pages-artifact` steps to include `actions/configure-pages` so Pages-specific metadata is initialized consistently; keep the Docusaurus build and artifact path flow intact and verify any `website` build assumptions tied to Pages environment detection still work as expected.website/docusaurus.config.ts (1)
18-37: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winUnauthenticated GitHub API call on every CI build risks rate-limiting.
fetchStarCountruns unauthenticated on everynpm run buildinvocation in CI (perdocs.yml, this happens on every PR and every push tomain). Shared GitHub Actions runner IPs make it plausible to hit GitHub's unauthenticated rate limit (60 req/hour), silently dropping the badge rather than failing the build. Consider passing aGITHUB_TOKEN/PAT viaAuthorizationheader in the workflow env to raise the limit, or caching the last known count.🤖 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 `@website/docusaurus.config.ts` around lines 18 - 37, The `fetchStarCount` path in `createConfig` is making an unauthenticated GitHub API request on every build, which can hit rate limits in CI and drop the badge. Update `fetchStarCount` to send an `Authorization` header when a token is available (for example from `GITHUB_TOKEN`/PAT in the workflow environment), and keep the existing fallback to `null` if the request still fails. If you prefer, also add a cache or persisted fallback for the last known star count so `createConfig` does not depend on a fresh API call every run.website/.gitignore (1)
9-11: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueStray
next/dist/entry looks like leftover from a Next.js template.This is a Docusaurus site (build output already covered by
build/at Line 5);next/dist/doesn't apply here.🤖 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 `@website/.gitignore` around lines 9 - 11, Remove the stray Next.js-specific ignore entry from the Generated files section in .gitignore; the website is a Docusaurus site and build artifacts are already covered by the existing build/ rule. Keep the rest of the ignore list unchanged and delete the next/dist/ pattern so the file only contains entries relevant to this project.website/src/pages/index.module.css (1)
403-413: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUse existing design tokens instead of duplicating raw color values.
.pillDangerand.pillSpeedhardcodergba(248, 113, 113, 0.14)/rgba(251, 146, 60, 0.14), which are exact duplicates of--os-danger-softand--os-speed-washalready defined incustom.css..pillAnnotationright above correctly usesvar(--os-annotation-wash)— worth being consistent.♻️ Proposed fix
.pillDanger { - background: rgba(248, 113, 113, 0.14); + background: var(--os-danger-soft); color: var(--os-danger); border: 1px solid rgba(248, 113, 113, 0.3); } ... .pillSpeed { - background: rgba(251, 146, 60, 0.14); + background: var(--os-speed-wash); color: var(--os-speed); border: 1px solid rgba(251, 146, 60, 0.3); }🤖 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 `@website/src/pages/index.module.css` around lines 403 - 413, Update the pill styles in index.module.css so .pillDanger and .pillSpeed use the existing design tokens from custom.css instead of hardcoded rgba values. Reuse the same token-based pattern already used by .pillAnnotation, and keep the current .pillDanger/.pillSpeed class names and their border/text color rules intact while swapping only the duplicate background values.website/src/pages/index.tsx (1)
49-51: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winUse Docusaurus
Link/useBaseUrlinstead of a hardcoded baseUrl path.
href="/openscreen/docs/intro"bakes in the currentbaseUrlconfig. If the deployment path changes, this link silently 404s. Footer/index.tsx in this same PR already uses<Link>/useBaseUrlcorrectly for this reason — worth being consistent here too, and it gets client-side routing for free.♻️ Proposed fix
+import Link from "`@docusaurus/Link`"; import useDocusaurusContext from "`@docusaurus/useDocusaurusContext`"; ... - <a className={styles.secondaryCta} href="/openscreen/docs/intro"> + <Link className={styles.secondaryCta} to="/docs/intro"> Read the docs - </a> + </Link>🤖 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 `@website/src/pages/index.tsx` around lines 49 - 51, The index page CTA is hardcoding the docs path, which ties it to the current baseUrl and breaks if deployment changes. Update the link in the homepage component (the anchor in the index page) to use Docusaurus `Link` together with `useBaseUrl`, matching the pattern already used in `footer/index.tsx`, so the docs URL stays baseUrl-safe and uses client-side routing.
🤖 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 @.github/workflows/docs.yml:
- Line 30: The checkout step in the docs workflow is persisting the default
GITHUB_TOKEN unnecessarily. Update the actions/checkout usage in the workflow to
explicitly set persist-credentials to false so the token is not left in git
config for later steps; locate the change at the checkout step in the docs job.
In `@website/src/pages/index.tsx`:
- Around line 1-18: The import block in the index page is failing Biome’s
organizeImports check because the imports are not in the expected sorted order.
Update the top-level imports in the index page component so they are reordered
according to Biome’s import discipline rules, keeping the existing modules like
useDocusaurusContext, Layout, Heading, and the lucide-react icons in the correct
grouped order.
In `@website/src/theme/Footer/index.tsx`:
- Around line 24-56: Biome is reflowing the JSX text in Footer’s
brandDescription and bottomBar blocks, so update the formatting in the Footer
component to match the formatter output. Adjust the text wrapping in the
Footer/index.tsx JSX so the brandDescription paragraph and bottomBar content are
laid out in the style Biome expects, then run the formatter to verify the diff
is clean.
- Around line 1-5: The imports in Footer/index.tsx are not ordered according to
Biome’s organizeImports rules, including the type-only ReactNode import. Reorder
the existing imports in the Footer component so Biome’s import sorting passes,
keeping the same symbols (ReactNode, Link, useBaseUrl, and styles) but arranging
them in the correct grouped order.
---
Outside diff comments:
In `@website/package.json`:
- Around line 1-45: The Biome formatter is failing on this package manifest
because of CRLF line endings; update the file to use LF consistently so the
formatting check passes. Make the fix in the website/package.json content itself
(and any related editor/config defaults if needed) so the package.json
formatting stays stable across CI and local runs.
In `@website/src/pages/index.tsx`:
- Around line 123-281: The JSX in the index page is not Biome-formatted, causing
formatter failures in the span attribute wrapping, paragraph wrapping, and the
closing Layout area. Reformat the affected JSX in the index component so it
matches Biome’s expected layout, especially around the timeline pills, feature
cards, quick start text, and the final </Layout> block.
---
Nitpick comments:
In @.github/workflows/docs.yml:
- Around line 29-49: The docs Pages workflow is missing the standard GitHub
Pages metadata setup step before artifact upload. Update the workflow around the
existing checkout/setup/build and `actions/upload-pages-artifact` steps to
include `actions/configure-pages` so Pages-specific metadata is initialized
consistently; keep the Docusaurus build and artifact path flow intact and verify
any `website` build assumptions tied to Pages environment detection still work
as expected.
In `@website/.gitignore`:
- Around line 9-11: Remove the stray Next.js-specific ignore entry from the
Generated files section in .gitignore; the website is a Docusaurus site and
build artifacts are already covered by the existing build/ rule. Keep the rest
of the ignore list unchanged and delete the next/dist/ pattern so the file only
contains entries relevant to this project.
In `@website/docusaurus.config.ts`:
- Around line 18-37: The `fetchStarCount` path in `createConfig` is making an
unauthenticated GitHub API request on every build, which can hit rate limits in
CI and drop the badge. Update `fetchStarCount` to send an `Authorization` header
when a token is available (for example from `GITHUB_TOKEN`/PAT in the workflow
environment), and keep the existing fallback to `null` if the request still
fails. If you prefer, also add a cache or persisted fallback for the last known
star count so `createConfig` does not depend on a fresh API call every run.
In `@website/src/pages/index.module.css`:
- Around line 403-413: Update the pill styles in index.module.css so .pillDanger
and .pillSpeed use the existing design tokens from custom.css instead of
hardcoded rgba values. Reuse the same token-based pattern already used by
.pillAnnotation, and keep the current .pillDanger/.pillSpeed class names and
their border/text color rules intact while swapping only the duplicate
background values.
In `@website/src/pages/index.tsx`:
- Around line 49-51: The index page CTA is hardcoding the docs path, which ties
it to the current baseUrl and breaks if deployment changes. Update the link in
the homepage component (the anchor in the index page) to use Docusaurus `Link`
together with `useBaseUrl`, matching the pattern already used in
`footer/index.tsx`, so the docs URL stays baseUrl-safe and uses client-side
routing.
🪄 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: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 980982dc-1476-4254-8b49-e4ee162adb2f
⛔ Files ignored due to path filters (2)
website/package-lock.jsonis excluded by!**/package-lock.jsonwebsite/static/img/logo-icon.pngis excluded by!**/*.png
📒 Files selected for processing (14)
.github/workflows/docs.ymlwebsite/.gitignorewebsite/README.mdwebsite/docs/intro.mdwebsite/docusaurus.config.tswebsite/package.jsonwebsite/postcss.config.cjswebsite/sidebars.tswebsite/src/css/custom.csswebsite/src/pages/index.module.csswebsite/src/pages/index.tsxwebsite/src/theme/Footer/index.tsxwebsite/src/theme/Footer/styles.module.csswebsite/tsconfig.json
| name: Build site | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win
Set persist-credentials: false on checkout.
Static analysis (zizmor) flags this: the default checkout persists the GITHUB_TOKEN in the local git config for the rest of the job, exposing it to any subsequent step/tool in the build job unnecessarily (credential exposure via artifacts risk). Since this job never needs git push/authenticated git operations, disable persistence.
🔒 Proposed fix
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
+ with:
+ persist-credentials: false📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
| - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
| with: | |
| persist-credentials: false |
🧰 Tools
🪛 zizmor (1.26.1)
[warning] 30-30: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false
(artipacked)
🤖 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 @.github/workflows/docs.yml at line 30, The checkout step in the docs
workflow is persisting the default GITHUB_TOKEN unnecessarily. Update the
actions/checkout usage in the workflow to explicitly set persist-credentials to
false so the token is not left in git config for later steps; locate the change
at the checkout step in the docs job.
Source: Linters/SAST tools
| import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; | ||
| import Heading from "@theme/Heading"; | ||
| import Layout from "@theme/Layout"; | ||
| import { | ||
| AppWindow, | ||
| Apple, | ||
| Captions, | ||
| Cpu, | ||
| Download, | ||
| HeartHandshake, | ||
| Monitor, | ||
| Pause, | ||
| Scissors, | ||
| SkipBack, | ||
| SkipForward, | ||
| Terminal, | ||
| TerminalSquare, | ||
| } from "lucide-react"; |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Fix import order (Biome organizeImports failure).
CI reports unsorted imports in this file. As per coding guidelines, import discipline (including type-only imports) is handled by Biome. Run the Biome auto-fix before merging.
🧰 Tools
🪛 GitHub Actions: CI / 3_Lint.txt
[error] 1-1: Biome organizeImports check failed. Imports/exports are not sorted. Safe fix: Organize Imports (Biome).
🪛 GitHub Actions: CI / Lint
[error] 1-1: Biome assist/source/organizeImports reported unsorted imports/exports (FIXABLE) in website/src/pages/index.tsx. Safe fix: Organize Imports (Biome).
🤖 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 `@website/src/pages/index.tsx` around lines 1 - 18, The import block in the
index page is failing Biome’s organizeImports check because the imports are not
in the expected sorted order. Update the top-level imports in the index page
component so they are reordered according to Biome’s import discipline rules,
keeping the existing modules like useDocusaurusContext, Layout, Heading, and the
lucide-react icons in the correct grouped order.
Sources: Coding guidelines, Pipeline failures
| import type { ReactNode } from "react"; | ||
| import Link from "@docusaurus/Link"; | ||
| import useBaseUrl from "@docusaurus/useBaseUrl"; | ||
|
|
||
| import styles from "./styles.module.css"; |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Fix import order (Biome organizeImports failure).
As per coding guidelines, import discipline (including type-only imports) is handled by Biome; CI reports this file's imports are unsorted.
🧰 Tools
🪛 GitHub Actions: CI / 3_Lint.txt
[error] 1-1: Biome organizeImports check failed. Imports/exports are not sorted. Safe fix: Organize Imports (Biome).
🪛 GitHub Actions: CI / Lint
[error] 1-1: Biome assist/source/organizeImports reported unsorted imports/exports (FIXABLE) in website/src/theme/Footer/index.tsx. Safe fix: Organize Imports (Biome).
🤖 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 `@website/src/theme/Footer/index.tsx` around lines 1 - 5, The imports in
Footer/index.tsx are not ordered according to Biome’s organizeImports rules,
including the type-only ReactNode import. Reorder the existing imports in the
Footer component so Biome’s import sorting passes, keeping the same symbols
(ReactNode, Link, useBaseUrl, and styles) but arranging them in the correct
grouped order.
Sources: Coding guidelines, Pipeline failures
| </div> | ||
| <p className={styles.brandDescription}> | ||
| A free, open-source screen recorder and editor. Community-maintained | ||
| continuation, MIT licensed. | ||
| </p> | ||
| </div> | ||
|
|
||
| <div> | ||
| <div className={styles.colTitle}>Project</div> | ||
| <div className={styles.colLinks}> | ||
| <Link href="https://github.com/getopenscreen/openscreen">GitHub</Link> | ||
| <Link href="https://github.com/getopenscreen/openscreen/releases">Releases</Link> | ||
| </div> | ||
| </div> | ||
|
|
||
| <div> | ||
| <div className={styles.colTitle}>Community</div> | ||
| <div className={styles.colLinks}> | ||
| <Link href="https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md"> | ||
| Contributing | ||
| </Link> | ||
| <Link href="https://github.com/getopenscreen/openscreen/blob/main/LICENSE"> | ||
| License (MIT) | ||
| </Link> | ||
| <Link href="https://discord.gg/VvT6Vtnyh">Discord</Link> | ||
| </div> | ||
| </div> | ||
| </div> | ||
|
|
||
| <div className={styles.bottomBar}> | ||
| OpenScreen is released under the MIT license. Built by the community — free, | ||
| forever. | ||
| </div> |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Fix JSX text-wrapping formatting (Biome formatter failure).
CI reports the formatter would reflow the brandDescription and bottomBar text blocks. Run Biome format before merging.
🧰 Tools
🪛 GitHub Actions: CI / 3_Lint.txt
[error] 24-56: Biome formatter check failed. Formatter would reflow text content inside JSX (e.g., sentence wrapping in the brandDescription
and bottomBar
🪛 GitHub Actions: CI / Lint
[error] 24-56: Biome formatter failed for website/src/theme/Footer/index.tsx: text wrapping in JSX/HTML differs from expected output.
🤖 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 `@website/src/theme/Footer/index.tsx` around lines 24 - 56, Biome is reflowing
the JSX text in Footer’s brandDescription and bottomBar blocks, so update the
formatting in the Footer component to match the formatter output. Adjust the
text wrapping in the Footer/index.tsx JSX so the brandDescription paragraph and
bottomBar content are laid out in the style Biome expects, then run the
formatter to verify the diff is clean.
Source: Pipeline failures
ecc7fea to
070b937
Compare
- Convert website/package.json to LF line endings (Biome formatter failure) - Reformat index.tsx/Footer per Biome (import order, JSX wrapping) - Use var(--os-danger-soft)/var(--os-speed-wash) tokens instead of duplicating raw rgba values - Use Docusaurus Link/useBaseUrl for the docs CTA instead of a hardcoded baseUrl path - Drop stray Next.js next/dist/ entry from website/.gitignore - Set persist-credentials: false on the docs workflow checkout step Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Convert website/package.json to LF line endings (Biome formatter failure) - Reformat index.tsx/Footer per Biome (import order, JSX wrapping) - Use var(--os-danger-soft)/var(--os-speed-wash) tokens instead of duplicating raw rgba values - Use Docusaurus Link/useBaseUrl for the docs CTA instead of a hardcoded baseUrl path - Drop stray Next.js next/dist/ entry from website/.gitignore - Set persist-credentials: false on the docs workflow checkout step Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Reintroduces the Docusaurus scaffold after PR #38 reverted the piggy-backed copy that landed via PR #36, then implements the
OpenScreen Docs Site.dc.htmldesign from the OpenScreen Design System project on top of it, and writes real feature documentation.Scaffold (original three commits, in authored order)
c4d985ffeat(docs): scaffold Docusaurus 3 site + GitHub Pages CI — minimal Docusaurus 3 site (TS config, Infima-tweaked theme, hero landing with WIP badge, intro doc),docs.ymlworkflow (build on PR, deploy on push to main, concurrency group, minimal permissions),postcss.config.cjsTailwind overridee6a6f08style(website): biome auto-format — mechanical biome pass on the scaffold files50dd22bci(docs): pin actions to commit SHAs in docs.yml — pins actions/checkout, actions/setup-node, actions/upload-pages-artifact, actions/deploy-pages with version commentsDesign implementation
26107c7feat(docs): implement OpenScreen Design System landing + docs themeImplements the design 1:1 rather than just the placeholder scaffold:
--os-*tokens (background/surface/border/text/accent) so the navbar, sidebar, TOC, footer, and code blocks all pick up the design palette, not just the landing page.Footercomponent — the default Docusaurus footer (Links/Logo/Copyright) can't produce the design's1.4fr/1fr/1frbrand+description/Project/Community column layout, so this ejects and rewrites it from scratch.assets/logo-icon.pngfrom the design project) as navbar logo, favicon, and social-share image, replacing the placeholder gradientlogo.svg.Feature documentation
ecc7feafeat(docs): write feature documentation grounded in the shipped editorSix new pages — Installation, Quick start, Recording, Editing & timeline, Captions & AI, Export — written directly against the app's actual source (not marketing copy), organized into the Getting Started / Features / Community sidebar the design specifies. Along the way this caught and fixed a few inaccuracies that had crept into the intro page and landing copy: there's no freeform "region" capture (screen or window only), no WebM export (MP4/GIF only), and AI chat editing is a real shipped feature gated behind
AI_FEATURES_ENABLED, not a roadmap item.docs/→website/docs/migration (moving the deeper architecture/engineering/testing specs) is still a separate follow-up — these six pages are new user-facing content, not a port of the existing internal docs.How to validate locally
Deploy status — verified, not just configured
GitHub Pages is already set to Source = GitHub Actions (confirmed via the API,
build_type: "workflow"), and this exactdocs.ymlpipeline has deployed successfully frommainbefore (pre-dating the PR #38 revert) — deployment from 2026-06-26, live athttps://getopenscreen.github.io/openscreen/. The build job has also run green on this PR's head commit. No manual setup step is pending — merging tomainwill deploy cleanly.