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 @@ |
| |
1 | name: 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. |
| |
7 | on: |
| |
8 | schedule: |
| |
9 | - cron: "0 7 * * 1" |
| |
10 | workflow_dispatch: |
| |
11 | pull_request: |
| |
12 | paths: [".github/workflows/link-check.yml"] |
| |
13 | |
| |
14 | permissions: |
| |
15 | contents: read |
| |
16 | |
| |
17 | env: |
| |
18 | ORGO_VERSION: "0.22.0" |
| |
19 | |
| |
20 | jobs: |
| |
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: |
| 179 | sudo pacman -S steam |
179 | sudo pacman -S steam |
| 180 | #+end_src |
180 | #+end_src |
| 181 | |
181 | |
| 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.]] |
| 183 | |
183 | |
| 184 | * Command-Line Packages |
184 | * Command-Line Packages |
| 185 | |
185 | |
content/blog/2020-01-26-steam-on-ntfs.org
+1 −1
| @@ -6,7 +6,7 @@ |
| 6 | |
6 | |
| 7 | * Auto-Mount Steam Drives |
7 | * Auto-Mount Steam Drives |
| 8 | |
8 | |
| 9 | If you want to see how to install Steam on Linux, see my other post: [[../linux-software/][Linux |
9 | If you want to see how to install Steam on Linux, see my other post: [[file:2020-01-25-linux-software.org][Linux |
| 10 | Software]]. |
10 | Software]]. |
| 11 | |
11 | |
| 12 | Are you having trouble launching games, even though they've installed correctly? |
12 | Are 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 @@ |
| 6 | |
6 | |
| 7 | * Similar Article Available |
7 | * Similar Article Available |
| 8 | |
8 | |
| 9 | If you haven't already, feel free to read my post on [[../aes-encryption/][AES Encryption]]. |
9 | If you haven't already, feel free to read my post on [[file:2018-11-28-aes-encryption.org][AES Encryption]]. |
| 10 | |
10 | |
| 11 | * What is Cryptography? |
11 | * What is Cryptography? |
| 12 | |
12 | |
content/blog/2020-03-25-session-messenger.org
+1 −1
| @@ -9,7 +9,7 @@ |
| 9 | The company behind Session (Loki Foundation) is from Australia. If you didn't |
9 | The company behind Session (Loki Foundation) is from Australia. If you didn't |
| 10 | know, Australia has introduced [[https://parlinfo.aph.gov.au/parlInfo/download/legislation/bills/r6195_aspassed/toc_pdf/18204b01.pdf][legislation]] mandating companies comply with |
10 | know, Australia has introduced [[https://parlinfo.aph.gov.au/parlInfo/download/legislation/bills/r6195_aspassed/toc_pdf/18204b01.pdf][legislation]] mandating companies comply with |
| 11 | government requests to build back door access into applications. For more |
11 | government requests to build back door access into applications. For more |
| 12 | information, read my article on [[./2020-01-25-aes-encryption.html][AES Encryption]]. |
12 | information, read my article on [[file:2018-11-28-aes-encryption.org][AES Encryption]]. |
| 13 | |
13 | |
| 14 | * About Session |
14 | * About Session |
| 15 | |
15 | |
content/blog/2021-04-17-gemini-server.org
+1 −1
| @@ -7,7 +7,7 @@ |
| 7 | * Similar Article Available |
7 | * Similar Article Available |
| 8 | |
8 | |
| 9 | To read more about Gemini and ways to test out this new protocol without your |
9 | To read more about Gemini and ways to test out this new protocol without your |
| 10 | own server, see my previous post [[../launching-a-gemini-capsule/][Launching a Gemini Capsule]]. |
10 | own server, see my previous post [[file:2021-03-28-gemini-capsule.org][Launching a Gemini Capsule]]. |
| 11 | |
11 | |
| 12 | * Preparation |
12 | * Preparation |
| 13 | |
13 | |
content/blog/2024-02-13-ubuntu-emergency-mode.org
+1 −1
| @@ -6,7 +6,7 @@ |
| 6 | |
6 | |
| 7 | * The Problem |
7 | * The Problem |
| 8 | |
8 | |
| 9 | I recently [[../zfs/][migrated my hard drives to a ZFS pool]] and found myself stuck in |
9 | I recently [[file:2024-02-06-zfs.org][migrated my hard drives to a ZFS pool]] and found myself stuck in |
| 10 | Ubuntu's emergency mode after the first reboot I performed after creating the |
10 | Ubuntu's emergency mode after the first reboot I performed after creating the |
| 11 | ZFS pool. |
11 | ZFS pool. |
| 12 | |
12 | |