From 6a9fffa70ecfe5f93b40f09c1be0607344b9aa74 Mon Sep 17 00:00:00 2001 From: "liang.feng" Date: Mon, 8 Jun 2026 08:07:58 -0700 Subject: [PATCH 1/4] docs: add Material for MkDocs site with GitHub Pages publishing Publish the existing README, benchmarks, cookbooks, and notebooks as a Material for MkDocs documentation site (search, sidebar nav, dark mode), matching the look of sites like NVlabs/Sana. - mkdocs.yml: Material theme + mkdocs-jupyter (renders cookbook notebooks) + mkdocs-same-dir (docs_dir at repo root, so no files are moved) - docs-requirements.txt: pinned, build-verified plugin versions - .github/workflows/docs.yml: build on push to main, deploy via the official Pages actions (no gh-pages branch) - .gitignore: ignore build output (/site/, .site/, .venv-docs/) Note: requires enabling Pages with the "GitHub Actions" source. Build is not --strict due to a pre-existing broken link in RELEASE.md. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/docs.yml | 64 +++++++++++++++++++++ .gitignore | 5 ++ docs-requirements.txt | 6 ++ mkdocs.yml | 113 +++++++++++++++++++++++++++++++++++++ 4 files changed, 188 insertions(+) create mode 100644 .github/workflows/docs.yml create mode 100644 docs-requirements.txt create mode 100644 mkdocs.yml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..99078e85 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,64 @@ +name: Publish docs + +# Build the MkDocs site and deploy it to GitHub Pages. +# Pages source must be set to "GitHub Actions" (Settings → Pages → Source). +on: + push: + branches: [main] + # Only rebuild when something that affects the site changes. + paths: + - "**.md" + - "**.ipynb" + - "mkdocs.yml" + - "docs-requirements.txt" + - "cookbooks/**" + - ".github/workflows/docs.yml" + # Allow manual runs from the Actions tab. + workflow_dispatch: + +# Least-privilege token scopes required to deploy to Pages. +permissions: + contents: read + pages: write + id-token: write + +# Let a newer run supersede an in-progress one, but never cancel a live deploy. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # needed for git-based "last updated" timestamps + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + + - name: Install dependencies + run: pip install -r docs-requirements.txt + + - name: Build site + # Not --strict: the repo has pre-existing broken doc links (e.g. RELEASE.md + # → release_notes/v0p1.md). Warnings still appear in the log; fix them and + # add --strict back to enforce link integrity on every deploy. + run: mkdocs build --site-dir site + + - uses: actions/upload-pages-artifact@v3 + with: + path: site + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index fdbd9f7c..d4c1949c 100644 --- a/.gitignore +++ b/.gitignore @@ -192,3 +192,8 @@ core.* /public/ /dataset/ /downloaded_data/ + +# MkDocs build output +/site/ +.site/ +.venv-docs/ diff --git a/docs-requirements.txt b/docs-requirements.txt new file mode 100644 index 00000000..e105fe31 --- /dev/null +++ b/docs-requirements.txt @@ -0,0 +1,6 @@ +# Dependencies for building the Cosmos documentation site (mkdocs.yml). +# Install with: pip install -r docs-requirements.txt +# Versions below are the ones verified to build the site cleanly. +mkdocs-material~=9.7 +mkdocs-jupyter~=0.26 +mkdocs-same-dir~=0.1 diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..5f18aa3d --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,113 @@ +# Cosmos documentation site. +# +# This uses Material for MkDocs to publish the existing Markdown + notebooks +# WITHOUT moving any files: the `same-dir` plugin makes the repo root the docs +# source, so nav entries below point straight at the files where they already +# live. Preview locally with `mkdocs serve`; publish via GitHub Pages later. + +site_name: Cosmos +site_description: NVIDIA Cosmos — world foundation models for Physical AI +site_url: https://nvidia.github.io/cosmos/ + +repo_url: https://github.com/NVIDIA/cosmos +repo_name: NVIDIA/cosmos +edit_uri: edit/main/ + +theme: + name: material + logo: cosmos-logo-thumbnail.png + favicon: cosmos-logo-thumbnail.png + icon: + repo: fontawesome/brands/github + palette: + # Light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: black + accent: green + toggle: + icon: material/weather-night + name: Switch to dark mode + # Dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: black + accent: green + toggle: + icon: material/weather-sunny + name: Switch to light mode + features: + - navigation.tabs + - navigation.sections + - navigation.top + - navigation.indexes + - navigation.footer + - toc.follow + - search.suggest + - search.highlight + - content.code.copy + - content.action.edit + +# docs_dir is the repo root so existing files are published in place (no moves). +# The `same-dir` plugin is what makes pointing docs_dir at the config dir legal. +docs_dir: . + +plugins: + - same-dir + - search + - mkdocs-jupyter: + include_source: true + execute: false + +markdown_extensions: + - admonition + - attr_list + - md_in_html + - tables + - footnotes + - toc: + permalink: true + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + +# Keep the build limited to documentation: with docs_dir at the repo root, +# everything else (data files, large assets, configs) is excluded from copying. +exclude_docs: | + /.github/ + /site/ + /.venv/ + /*.parquet + /**/*.parquet + +nav: + - Home: README.md + - Benchmarks: inference_benchmarks.md + - Cookbooks: + - Environment Setup: cookbooks/cosmos3/README.md + - Reasoner: + - Overview: cookbooks/cosmos3/reasoner/README.md + - Run with Cosmos Framework: cookbooks/cosmos3/reasoner/run_with_cosmos_framework.ipynb + - Run with vLLM: cookbooks/cosmos3/reasoner/run_with_vllm.ipynb + - Run with NIM: cookbooks/cosmos3/reasoner/run_with_nim.ipynb + - Generator — Action: + - Overview: cookbooks/cosmos3/generator/action/README.md + - Run FD with vLLM: cookbooks/cosmos3/generator/action/run_fd_with_vllm.ipynb + - Run ID with vLLM: cookbooks/cosmos3/generator/action/run_id_with_vllm.ipynb + - Run ID with Cosmos Framework: cookbooks/cosmos3/generator/action/run_id_with_cosmos_framework.ipynb + - Run FD with Cosmos Framework: cookbooks/cosmos3/generator/action/run_fd_with_cosmos_framework.ipynb + - Run Policy with Cosmos Framework: cookbooks/cosmos3/generator/action/run_policy_with_cosmos_framework.md + - Generator — Audiovisual: + - Overview: cookbooks/cosmos3/generator/audiovisual/README.md + - Run with diffusers: cookbooks/cosmos3/generator/audiovisual/run_with_diffusers.ipynb + - Run with Cosmos Framework: cookbooks/cosmos3/generator/audiovisual/run_with_cosmos_framework.ipynb + - Run with vLLM Omni: cookbooks/cosmos3/generator/audiovisual/run_with_vllm_omni.ipynb + - Contributing: CONTRIBUTING.md + - Release Notes: RELEASE.md From 6f1270200b0ff9cf64955be8e66b3c802ad00391 Mon Sep 17 00:00:00 2001 From: "liang.feng" Date: Mon, 8 Jun 2026 09:06:36 -0700 Subject: [PATCH 2/4] docs: NVIDIA green theme, left-sidebar TOC, and logo fix - branding/nvidia.css: NVIDIA green (#76b900) on headings, links, and the full left navigation index (all levels); dark-mode variants - branding/cosmos-logo-thumbnail.png: logo copy in a subdir, since the same-dir plugin drops non-Markdown files at the repo root (root logo 404'd) - mkdocs.yml: point logo/favicon at branding/, add extra_css, and enable toc.integrate so each page's table of contents renders in the left sidebar (the README's manual TOC is hidden on the site via CSS, kept for GitHub) Co-Authored-By: Claude Opus 4.8 --- branding/cosmos-logo-thumbnail.png | Bin 0 -> 25459 bytes branding/nvidia.css | 122 +++++++++++++++++++++++++++++ mkdocs.yml | 12 ++- 3 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 branding/cosmos-logo-thumbnail.png create mode 100644 branding/nvidia.css diff --git a/branding/cosmos-logo-thumbnail.png b/branding/cosmos-logo-thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d28473b6344d50a4d9d760c682d8a5177b78c6 GIT binary patch literal 25459 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 sljZR!ZkN$PH)FZgwWiKIW+! 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

    =)Dq;Yr^=SwIF~%5Geg$qW8DoqMdh-YC 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 VWZ_Pj4GaJP002ovPDHLkV1j(~lb-+p literal 0 HcmV?d00001 diff --git a/branding/nvidia.css b/branding/nvidia.css new file mode 100644 index 00000000..9543ca6c --- /dev/null +++ b/branding/nvidia.css @@ -0,0 +1,122 @@ +/* NVIDIA-style theme for the Cosmos docs. + * + * Signature NVIDIA green (#76b900) on headings, links, and accents. + * The top bar stays black on purpose: green-on-black is NVIDIA's iconic + * look and keeps header text readable (bright green + white text fails + * contrast). To make the bar itself green, set palette.primary: custom in + * mkdocs.yml and add `--md-primary-fg-color: #76b900;` below. */ + +:root { + --nv-green: #76b900; /* NVIDIA signature green */ + --nv-green-dark: #5c9100; /* darker — readable on white */ + --nv-green-bright: #8fd11a; /* brighter — for dark backgrounds */ + + /* Accent drives links/hover/active-nav/search highlight in Material. */ + --md-accent-fg-color: var(--nv-green-dark); +} + +/* ---- Headings in NVIDIA green ---- */ +.md-typeset h1 { + color: var(--nv-green-dark); + font-weight: 700; +} + +.md-typeset h2 { + color: var(--nv-green-dark); + font-weight: 600; + /* Subtle green rule under section titles. */ + border-bottom: 2px solid rgba(118, 185, 0, 0.25); + padding-bottom: 0.25em; +} + +.md-typeset h3 { + color: var(--nv-green); + font-weight: 600; +} + +.md-typeset h4, +.md-typeset h5 { + color: var(--nv-green-dark); +} + +/* ---- Links ---- */ +.md-typeset a { + color: var(--nv-green-dark); +} +.md-typeset a:hover, +.md-typeset a:focus { + color: var(--nv-green); +} + +/* ---- Small accents: code-block focus, table header tint ---- */ +.md-typeset table:not([class]) th { + background-color: rgba(118, 185, 0, 0.10); +} + +/* ---- Top-level "tab" navigation in NVIDIA green ---- */ +/* The tab bar on the (black) header. */ +.md-tabs__link { + color: var(--nv-green-bright); + opacity: 1; +} +.md-tabs__link--active { + color: #ffffff; + font-weight: 700; +} +.md-tabs__link:hover { + color: #ffffff; +} + +/* Every entry in the left index (all levels) in NVIDIA green. */ +.md-nav--primary .md-nav__link { + color: var(--nv-green-dark); +} +/* Top level a bit bolder for hierarchy. */ +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { + font-weight: 700; +} +/* Active item: brighter + bold so "you are here" stands out. */ +.md-nav--primary .md-nav__link--active { + color: var(--nv-green); + font-weight: 700; +} + +/* ---- Left sidebar: group / section titles in NVIDIA green ---- */ +.md-nav__title, +.md-nav__item--section > .md-nav__link, +.md-nav__item--section > label.md-nav__link { + color: var(--nv-green-dark); + font-weight: 700; +} + +/* ---- Hide the README's hand-written "Table of Contents" on the site ---- + * It's redundant with the left-sidebar TOC (toc.integrate). The heading is + * kept in README.md so it still renders usefully on GitHub. */ +.md-typeset h2#table-of-contents, +.md-typeset h2#table-of-contents + ul { + display: none; +} + +/* ---- Dark mode: use the brighter green for contrast ---- */ +[data-md-color-scheme="slate"] { + --md-accent-fg-color: var(--nv-green-bright); +} +[data-md-color-scheme="slate"] .md-typeset h1, +[data-md-color-scheme="slate"] .md-typeset h2, +[data-md-color-scheme="slate"] .md-typeset h3, +[data-md-color-scheme="slate"] .md-typeset h4, +[data-md-color-scheme="slate"] .md-typeset h5 { + color: var(--nv-green-bright); +} +[data-md-color-scheme="slate"] .md-typeset a { + color: var(--nv-green-bright); +} +[data-md-color-scheme="slate"] .md-typeset a:hover { + color: #a6e22e; +} +[data-md-color-scheme="slate"] .md-nav__title, +[data-md-color-scheme="slate"] .md-nav__item--section > .md-nav__link, +[data-md-color-scheme="slate"] .md-nav__item--section > label.md-nav__link, +[data-md-color-scheme="slate"] .md-nav--primary .md-nav__link { + color: var(--nv-green-bright); +} diff --git a/mkdocs.yml b/mkdocs.yml index 5f18aa3d..e3fe728a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -15,8 +15,10 @@ edit_uri: edit/main/ theme: name: material - logo: cosmos-logo-thumbnail.png - favicon: cosmos-logo-thumbnail.png + # NOTE: assets must live in a SUBDIRECTORY. The same-dir plugin drops + # non-Markdown files at the repo root, so a root-level logo would 404. + logo: branding/cosmos-logo-thumbnail.png + favicon: branding/cosmos-logo-thumbnail.png icon: repo: fontawesome/brands/github palette: @@ -43,6 +45,9 @@ theme: - navigation.indexes - navigation.footer - toc.follow + # Render each page's table of contents INSIDE the left sidebar (Sana-style), + # instead of a separate right-hand column. Left = jump index, middle = content. + - toc.integrate - search.suggest - search.highlight - content.code.copy @@ -52,6 +57,9 @@ theme: # The `same-dir` plugin is what makes pointing docs_dir at the config dir legal. docs_dir: . +extra_css: + - branding/nvidia.css + plugins: - same-dir - search From cd51d3efb121dfc25c0e23c1132fd3f6cedcbe63 Mon Sep 17 00:00:00 2001 From: "liang.feng" Date: Mon, 8 Jun 2026 09:16:37 -0700 Subject: [PATCH 3/4] ci: build docs on pull requests (deploy still main-only) - Add a pull_request trigger so the MkDocs build is verified on PRs; the deploy job is gated with `if: github.event_name != 'pull_request'`. - Add branding/** to the path filter so CSS/logo changes trigger a rebuild. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/docs.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 99078e85..f1c0c6e8 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -6,13 +6,17 @@ on: push: branches: [main] # Only rebuild when something that affects the site changes. - paths: + paths: &doc_paths - "**.md" - "**.ipynb" - "mkdocs.yml" - "docs-requirements.txt" - "cookbooks/**" + - "branding/**" - ".github/workflows/docs.yml" + # Build (but don't deploy) on PRs so the site is verified before merge. + pull_request: + paths: *doc_paths # Allow manual runs from the Actions tab. workflow_dispatch: @@ -55,6 +59,8 @@ jobs: deploy: needs: build + # Deploy only on main / manual runs — never on pull requests. + if: github.event_name != 'pull_request' runs-on: ubuntu-latest environment: name: github-pages From 3e8507b4311534fa12ef138ee84a3fac88084eca Mon Sep 17 00:00:00 2001 From: "liang.feng" Date: Mon, 8 Jun 2026 20:13:34 -0700 Subject: [PATCH 4/4] ci: point pip cache at docs-requirements.txt setup-python's cache:pip only auto-detects requirements.txt/pyproject.toml; our deps file is docs-requirements.txt, so it failed with 'No file matched'. Set cache-dependency-path explicitly. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/docs.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f1c0c6e8..b876e711 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -43,6 +43,9 @@ jobs: with: python-version: "3.12" cache: pip + # Our deps file isn't named requirements.txt, so point pip caching at it + # explicitly — otherwise setup-python errors with "No file ... matched". + cache-dependency-path: docs-requirements.txt - name: Install dependencies run: pip install -r docs-requirements.txt