Commit c01dba4633

c01dba4633dd14ecfdaac508b12d347c55ee8af0

parent: 44cb7ee485

Unsigned

cmc <hello@cleberg.net> · 2026-08-22 03:54 UTC

Check links weekly, and point six internal links at their canonical URLs

The six links were written before a URL scheme change and only resolved because
the web server redirects the old paths. orgo --strict did not catch them: it
resolves file: links, and these were bare relative paths passed through as
opaque URLs. Rewriting them as file: links makes orgo validate them from now on
and drops a redirect hop. Link text is unchanged.

Internal links fail the job, external links only report — a dead third-party
link is worth knowing about but is not a reason to block the site.

Layout: unified · split

.github/workflows/link-check.yml added +83
@@ -0,0 +1,83 @@
1name: Link check
2
3# Weekly rather than per-PR: most of these links are external, and the web is
4# flaky enough that a per-PR run would fail for reasons no author controls.
5# The paths filter still runs it on any PR that edits this workflow, so a change
6# here is validated by the thing it changes.
7on:
8 schedule:
9 - cron: "0 7 * * 1"
10 workflow_dispatch:
11 pull_request:
12 paths: [".github/workflows/link-check.yml"]
13
14permissions:
15 contents: read
16
17env:
18 ORGO_VERSION: "0.22.0"
19
20jobs:
21 links:
22 runs-on: ubuntu-latest
23 steps:
24 - uses: actions/checkout@v7
25
26 - name: Cache orgo
27 id: cache-orgo
28 uses: actions/cache@v6
29 with:
30 path: ~/.cargo/bin/orgo
31 key: orgo-${{ env.ORGO_VERSION }}-${{ runner.os }}
32
33 - name: Install orgo
34 if: steps.cache-orgo.outputs.cache-hit != 'true'
35 run: cargo install orgo --version "$ORGO_VERSION" --locked
36
37 # orgo directly, not build.py. A production build rewrites
38 # img.cleberg.net URLs to /img/, which is served from a different docroot
39 # and would look like 198 broken links here. The development output keeps
40 # them absolute, so the image host gets checked for real.
41 - name: Build the site
42 run: orgo build content -o .build-dev --strict
43
44 # Internal links are the half worth gating on: they are entirely within
45 # this repo, so a failure is always a real defect and always fixable here.
46 - name: Internal links
47 uses: lycheeverse/lychee-action@v2.9.0
48 with:
49 args: --offline --base .build-dev --include-verbatim '.build-dev/**/*.html'
50 fail: true
51 output: internal.md
52
53 # External links are reported, not gated. A dead third-party link is worth
54 # knowing about, but it is not a reason to block the site.
55 - name: External links
56 uses: lycheeverse/lychee-action@v2.9.0
57 with:
58 args: >-
59 --exclude-mail
60 --exclude '\.onion'
61 --max-concurrency 8
62 --max-retries 2
63 --timeout 20
64 --accept 200,206,301,302,303,307,308,401,403,429
65 --include-verbatim
66 '.build-dev/**/*.html'
67 fail: false
68 output: external.md
69
70 - name: Summary
71 if: always()
72 run: |
73 { echo "## Internal"; cat internal.md 2>/dev/null || echo "no report";
74 echo; echo "## External"; cat external.md 2>/dev/null || echo "no report";
75 } >> "$GITHUB_STEP_SUMMARY"
76
77 - uses: actions/upload-artifact@v7
78 if: always()
79 with:
80 name: link-reports
81 path: |
82 internal.md
83 external.md
content/blog/2020-01-25-linux-software.org +1 −1
@@ -179,7 +179,7 @@ Finally, install the program:
179179sudo pacman -S steam
180180#+end_src
181181
182[[./2020-01-26-steam-on-ntfs-drives.html][Problem Launching Steam Games? Click Here.]]
182[[file:2020-01-26-steam-on-ntfs.org][Problem Launching Steam Games? Click Here.]]
183183
184184* Command-Line Packages
185185
content/blog/2020-01-26-steam-on-ntfs.org +1 −1
@@ -6,7 +6,7 @@
66
77* Auto-Mount Steam Drives
88
9If you want to see how to install Steam on Linux, see my other post: [[../linux-software/][Linux
9If you want to see how to install Steam on Linux, see my other post: [[file:2020-01-25-linux-software.org][Linux
1010Software]].
1111
1212Are you having trouble launching games, even though they've installed correctly?
content/blog/2020-02-09-cryptography-basics.org +1 −1
@@ -6,7 +6,7 @@
66
77* Similar Article Available
88
9If you haven't already, feel free to read my post on [[../aes-encryption/][AES Encryption]].
9If you haven't already, feel free to read my post on [[file:2018-11-28-aes-encryption.org][AES Encryption]].
1010
1111* What is Cryptography?
1212
content/blog/2020-03-25-session-messenger.org +1 −1
@@ -9,7 +9,7 @@
99The company behind Session (Loki Foundation) is from Australia. If you didn't
1010know, Australia has introduced [[https://parlinfo.aph.gov.au/parlInfo/download/legislation/bills/r6195_aspassed/toc_pdf/18204b01.pdf][legislation]] mandating companies comply with
1111government requests to build back door access into applications. For more
12information, read my article on [[./2020-01-25-aes-encryption.html][AES Encryption]].
12information, read my article on [[file:2018-11-28-aes-encryption.org][AES Encryption]].
1313
1414* About Session
1515
content/blog/2021-04-17-gemini-server.org +1 −1
@@ -7,7 +7,7 @@
77* Similar Article Available
88
99To read more about Gemini and ways to test out this new protocol without your
10own server, see my previous post [[../launching-a-gemini-capsule/][Launching a Gemini Capsule]].
10own server, see my previous post [[file:2021-03-28-gemini-capsule.org][Launching a Gemini Capsule]].
1111
1212* Preparation
1313
content/blog/2024-02-13-ubuntu-emergency-mode.org +1 −1
@@ -6,7 +6,7 @@
66
77* The Problem
88
9I recently [[../zfs/][migrated my hard drives to a ZFS pool]] and found myself stuck in
9I recently [[file:2024-02-06-zfs.org][migrated my hard drives to a ZFS pool]] and found myself stuck in
1010Ubuntu's emergency mode after the first reboot I performed after creating the
1111ZFS pool.
1212