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/_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
new file mode 100644
index 00000000..bf876392
--- /dev/null
+++ b/lychee.toml
@@ -0,0 +1,63 @@
+# 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 = 45
+
+############################# 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"]
+
+# Enable the checking of fragments in links.
+include_fragments = false
+
+# 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 /