From 80890fca9498c72e6ec2b6a7fe48e1b81dd1c801 Mon Sep 17 00:00:00 2001 From: Carol Willing Date: Mon, 11 May 2026 17:34:13 -0700 Subject: [PATCH 1/4] ci: consolidate lychee config and update link-check workflows --- .github/workflows/build-site.yml | 15 ++++++-- .github/workflows/linkcheck.yml | 16 ++++++--- .gitignore | 1 + lychee.toml | 59 ++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 lychee.toml diff --git a/.github/workflows/build-site.yml b/.github/workflows/build-site.yml index ada4ec41..dc551a94 100644 --- a/.github/workflows/build-site.yml +++ b/.github/workflows/build-site.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the code - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Fetch main run: | @@ -23,7 +23,7 @@ jobs: git branch - name: Setup Ruby - uses: ruby/setup-ruby@v1 + uses: ruby/setup-ruby@6aaa311d81eba98ae12eaffbcb63296ace0efcde # v1.307.0 with: bundler-cache: true # runs 'bundle install' and caches installed gems automatically @@ -32,12 +32,21 @@ jobs: env: JEKYLL_ENV: production + - name: Restore lychee cache + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + with: + path: .lycheecache + key: cache-lychee-${{ hashFiles('lychee.toml', '.lycheeignore') }}-${{ github.sha }} + restore-keys: | + cache-lychee-${{ hashFiles('lychee.toml', '.lycheeignore') }}- + cache-lychee- + - name: Check links with lychee id: lychee uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 #v2.8.0 with: fail: true - args: --no-progress --root-dir _site --exclude 'zenodo\.org' --accept '200..=403' _site + args: --root-dir _site _site env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/linkcheck.yml b/.github/workflows/linkcheck.yml index ff842494..a5b32738 100644 --- a/.github/workflows/linkcheck.yml +++ b/.github/workflows/linkcheck.yml @@ -19,7 +19,7 @@ jobs: git branch - name: Setup Ruby - uses: ruby/setup-ruby@6ca151fd1bfcfd6fe0c4eb6837eb0584d0134a0c #v1.290.0 + uses: ruby/setup-ruby@6aaa311d81eba98ae12eaffbcb63296ace0efcde # v1.307.0 with: bundler-cache: true # runs 'bundle install' and caches installed gems automatically @@ -28,22 +28,28 @@ jobs: env: JEKYLL_ENV: production + - name: Restore lychee cache + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + with: + path: .lycheecache + key: cache-lychee-${{ hashFiles('lychee.toml', '.lycheeignore') }}-${{ github.sha }} + restore-keys: | + cache-lychee-${{ hashFiles('lychee.toml', '.lycheeignore') }}- + cache-lychee- + - name: Link Checker id: lychee uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 #v2.8.0 with: args: > - --no-progress --root-dir ${{ github.workspace }}/_site - --exclude 'zenodo\.org' - --accept '200..=403' _site env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} - name: Create Issue From File if: env.lychee_exit_code != 0 - uses: peter-evans/create-issue-from-file@v6 + uses: peter-evans/create-issue-from-file@fca9117c27cdc29c6c4db3b86c48e4115a786710 # v6.0.0 with: title: Link Checker Report content-filepath: ./lychee/out.md diff --git a/.gitignore b/.gitignore index f081da17..8b5bb863 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ node_modules/* .hugo_build.lock public/ resources/ +.lycheecache diff --git a/lychee.toml b/lychee.toml new file mode 100644 index 00000000..4c2569ab --- /dev/null +++ b/lychee.toml @@ -0,0 +1,59 @@ +# Lychee link-checker config for pyopensci.org +# Docs: https://lychee.cli.rs/ +# +# Domain-level skips live in .lycheeignore. +# CI may pass additional flags via .github/workflows/linkcheck.yml +# (e.g. --root-dir $GITHUB_WORKSPACE/_site). + +############################# Display ############################## + +# Log verbosity: error | warn | info | debug | trace +verbose = "info" + +# Report format. +format = "detailed" + +# Suppress the interactive progress bar (CI-friendly). +no_progress = true + +############################# Cache ################################ + +# Cache responses between runs. +cache = true +max_cache_age = "1d" + +# Never cache server errors so transient 5xx don't stick. +cache_exclude_status = "500.." + +############################# Runtime ############################## + +max_concurrency = 14 +max_redirects = 10 +max_retries = 2 +# Wait longer between retries to give slow servers room to recover. +retry_wait_time = 5 +# Generous timeout for slow-but-healthy servers (academic mirrors, DOIs). +timeout = 30 + +############################# Requests ############################# + +# Some sites block lychee's default UA. Use a generic browser-ish UA. +user_agent = "Mozilla/5.0 (compatible; lychee-link-checker)" + +# Accept 200–403 as success. 401/403 are common on bot-protected or +# auth-walled pages we still want to consider "reachable". +accept = ["200..=403"] + +# Check #fragment anchors in addition to the URL. +# Values: "full" | "basic" | "off" +include_fragments = "full" + +############################# Exclusions ########################### + +# Don't check URLs that only appear inside /
 blocks.
+include_verbatim = false
+
+# Regex excludes. Plain-domain skips belong in .lycheeignore.
+exclude = [
+    'zenodo\.org',
+]

From 4e69615dc4f416481bc1fc59e74b169768426f29 Mon Sep 17 00:00:00 2001
From: Carol Willing 
Date: Mon, 11 May 2026 18:05:32 -0700
Subject: [PATCH 2/4] update lychee config for fragment check

---
 lychee.toml | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/lychee.toml b/lychee.toml
index 4c2569ab..d04affa8 100644
--- a/lychee.toml
+++ b/lychee.toml
@@ -44,9 +44,8 @@ user_agent = "Mozilla/5.0 (compatible; lychee-link-checker)"
 # auth-walled pages we still want to consider "reachable".
 accept = ["200..=403"]
 
-# Check #fragment anchors in addition to the URL.
-# Values: "full" | "basic" | "off"
-include_fragments = "full"
+# Enable the checking of fragments in links.
+include_fragments = true
 
 ############################# Exclusions ###########################
 

From 322b5e81d97012e345f160a1dc64f44e722770f5 Mon Sep 17 00:00:00 2001
From: Carol Willing 
Date: Mon, 11 May 2026 18:23:43 -0700
Subject: [PATCH 3/4] correct fragment errors and update lychee config to allow
 file

---
 _posts/2024-05-14-pyos-guide-to-pyconus-2024.md       | 2 +-
 _posts/2024-08-30-pyopensci-monumental-growth-2024.md | 4 ++--
 _posts/2025-07-24-scipy-2025-recap.md                 | 2 +-
 lychee.toml                                           | 5 +++++
 4 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/_posts/2024-05-14-pyos-guide-to-pyconus-2024.md b/_posts/2024-05-14-pyos-guide-to-pyconus-2024.md
index f9cd9925..27fe4fe2 100644
--- a/_posts/2024-05-14-pyos-guide-to-pyconus-2024.md
+++ b/_posts/2024-05-14-pyos-guide-to-pyconus-2024.md
@@ -41,7 +41,7 @@ Henry will be guiding attendees through how easy it is now to set up a binary ex
 ###  2:45--3:15 PM: Hatch: The only tool you need
 *Ballroom A*\
 **[Ofek Lev](https://github.com/ofek)**\
-It's no secret that we're big fans of Hatch---we even [taught a Python Packaging Workshop](https://www.pyopensci.org/blog/pyos-education-announcement.html#enroll-in-pyopenscis-upcoming-workshop-from-python-code-to-module) using [Hatch](https://hatch.pypa.io/latest/)! With an ever-growing set of tools used in Python packaging, Ofek will be presenting on how Hatch can be used as a unifying tool for Python packaging.
+It's no secret that we're big fans of Hatch---we even [taught a Python Packaging Workshop](https://www.pyopensci.org/blog/pyos-education-announcement.html) using [Hatch](https://hatch.pypa.io/latest/)! With an ever-growing set of tools used in Python packaging, Ofek will be presenting on how Hatch can be used as a unifying tool for Python packaging.
 
 ##  Saturday, May 18th
 ###  9:00--9:25 AM: Diversity & Inclusion Panel
diff --git a/_posts/2024-08-30-pyopensci-monumental-growth-2024.md b/_posts/2024-08-30-pyopensci-monumental-growth-2024.md
index 0c0fcdcc..b7d1ead5 100644
--- a/_posts/2024-08-30-pyopensci-monumental-growth-2024.md
+++ b/_posts/2024-08-30-pyopensci-monumental-growth-2024.md
@@ -157,8 +157,8 @@ The pyOpenSci packaging guide provides an overview of the Python packaging ecosy
 
 * [build backend](https://www.pyopensci.org/python-package-guide/package-structure-code/python-package-build-tools.html#build-back-ends),
 * [build frontend](https://www.pyopensci.org/python-package-guide/package-structure-code/python-package-build-tools.html#python-package-build-front-ends),
-* [wheel](https://www.pyopensci.org/python-package-guide/package-structure-code/python-package-distribution-files-sdist-wheel.html#wheel-whl-files), and
-* [sdist](https://www.pyopensci.org/python-package-guide/package-structure-code/python-package-distribution-files-sdist-wheel.html#source-distribution-sdist).
+* [wheel](https://www.pyopensci.org/python-package-guide/package-structure-code/python-package-distribution-files-sdist-wheel.html), and
+* [sdist](https://www.pyopensci.org/python-package-guide/package-structure-code/python-package-distribution-files-sdist-wheel.html).
 
 Our Python Packaging Guide aims to translate the technical jargon that gets in the way of new users having a successful packaging experience. Over time, we
 hope that this will make packaging less confusing and more accessible to more people.
diff --git a/_posts/2025-07-24-scipy-2025-recap.md b/_posts/2025-07-24-scipy-2025-recap.md
index b8ebf940..be403e43 100644
--- a/_posts/2025-07-24-scipy-2025-recap.md
+++ b/_posts/2025-07-24-scipy-2025-recap.md
@@ -39,7 +39,7 @@ We love Hatch because it includes a task runner out of the box (see [the Scienti
 
 Shoutout to [Carol Willing](https://github.com/willingc), [Inessa Pawson](https://github.com/InessaPawson), [Jeremiah Paige](https://github.com/ucodery), and [Tetsuo Koyama](https://github.com/tkoyama010) for making this workshop such a success.
 
-We also attended the Pixi workshop, which showcased how [Pixi](https://pixi.sh) utilizes UV and supports mixed [PyPI](https://pypi.org/)/[Conda](https://docs.conda.io/projects/conda/en/latest/user-guide/getting-started.html#managing-python) environments. The instructors walked us through spinning up cloud-based GPU compute using [NVIDIA Brev,](https://developer.nvidia.com/brev) which was quick, powerful, and surprisingly easy to configure. Pixi is a great option for you if you want the speed of UV but the Conda support!
+We also attended the Pixi workshop, which showcased how [Pixi](https://pixi.sh) utilizes UV and supports mixed [PyPI](https://pypi.org/)/[Conda](https://docs.conda.io/projects/conda/en/latest/user-guide/getting-started.html) environments. The instructors walked us through spinning up cloud-based GPU compute using [NVIDIA Brev,](https://developer.nvidia.com/brev) which was quick, powerful, and surprisingly easy to configure. Pixi is a great option for you if you want the speed of UV but the Conda support!
 
 
diff --git a/lychee.toml b/lychee.toml index d04affa8..4e7cf7c9 100644 --- a/lychee.toml +++ b/lychee.toml @@ -47,6 +47,11 @@ accept = ["200..=403"] # Enable the checking of fragments in links. include_fragments = true +# Only test links with the given schemes (e.g. https). +# At the moment, we support http, https, file, and mailto. +scheme = ["https", "file"] + + ############################# Exclusions ########################### # Don't check URLs that only appear inside /
 blocks.

From 5dc62136a6ff4f7c98045c90ac012e164d889a6f Mon Sep 17 00:00:00 2001
From: Carol Willing 
Date: Mon, 11 May 2026 18:28:57 -0700
Subject: [PATCH 4/4] increase timeout and disable fragment checking

---
 lychee.toml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lychee.toml b/lychee.toml
index 4e7cf7c9..bf876392 100644
--- a/lychee.toml
+++ b/lychee.toml
@@ -33,7 +33,7 @@ max_retries = 2
 # Wait longer between retries to give slow servers room to recover.
 retry_wait_time = 5
 # Generous timeout for slow-but-healthy servers (academic mirrors, DOIs).
-timeout = 30
+timeout = 45
 
 ############################# Requests #############################
 
@@ -45,7 +45,7 @@ user_agent = "Mozilla/5.0 (compatible; lychee-link-checker)"
 accept = ["200..=403"]
 
 # Enable the checking of fragments in links.
-include_fragments = true
+include_fragments = false
 
 # Only test links with the given schemes (e.g. https).
 # At the moment, we support http, https, file, and mailto.