diff --git a/.woodpecker/links.yml b/.woodpecker/links.yml
new file mode 100644
index 0000000..01acf6b
--- /dev/null
+++ b/.woodpecker/links.yml
@@ -0,0 +1,23 @@
+# SPDX-FileCopyrightText: 2023 The "Notes on OpenPGP" project
+# SPDX-License-Identifier: CC0-1.0
+
+clone:
+  git:
+    image: woodpeckerci/plugin-git
+    settings:
+      partial: true
+      lfs: false
+
+when:
+  branch: draft
+  event:
+    - push
+    - pull_request
+
+steps:
+  link-check:
+    image: archlinux:latest
+    commands:
+      - pacman -Sy --needed --noconfirm archlinux-keyring
+      - pacman -Syu --needed --noconfirm lychee make python-myst-parser python-sphinx
+      - make -C book html-linkcheck
diff --git a/book/Makefile b/book/Makefile
index cda2a70..15c0f8a 100644
--- a/book/Makefile
+++ b/book/Makefile
@@ -8,6 +8,7 @@
 # from the environment for the first two.
 SPHINXOPTS    ?=
 SPHINXBUILD   ?= sphinx-build
+LYCHEE ?= lychee
 SOURCEDIR     = source
 BUILDDIR      = build
 
@@ -15,6 +16,9 @@ BUILDDIR      = build
 help:
 	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
 
+html-linkcheck: html
+	@$(LYCHEE) "$(BUILDDIR)/html/"*.html
+
 .PHONY: help Makefile
 
 # Catch-all target: route all unknown targets to Sphinx using the new
diff --git a/book/source/10-encryption.md b/book/source/10-encryption.md
index 13b41b1..7e3e4c3 100644
--- a/book/source/10-encryption.md
+++ b/book/source/10-encryption.md
@@ -47,4 +47,4 @@ Produce text around discussion: https://mailarchive.ietf.org/arch/msg/openpgp/ZT
 
 ### SKESK
 
-Also see https://flowcrypt.com/docs/guide/send-and-receive/send-password-protected.html
+Also see https://flowcrypt.com/docs/guide/send-and-receive/send-password-protected-emails.html