diff -pruN 1.4.2-1/.copier-answers.yml 1.4.3-1/.copier-answers.yml
--- 1.4.2-1/.copier-answers.yml	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/.copier-answers.yml	2025-08-26 14:23:06.000000000 +0000
@@ -1,5 +1,5 @@
 # Changes here will be overwritten by Copier.
-_commit: 1.8.4
+_commit: 1.8.9
 _src_path: gh:pawamoy/copier-uv
 author_email: dev@pawamoy.fr
 author_fullname: Timothée Mazzucotelli
diff -pruN 1.4.2-1/CHANGELOG.md 1.4.3-1/CHANGELOG.md
--- 1.4.2-1/CHANGELOG.md	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/CHANGELOG.md	2025-08-26 14:23:06.000000000 +0000
@@ -5,6 +5,14 @@ The format is based on [Keep a Changelog
 and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
 
 <!-- insertion marker -->
+## [1.4.3](https://github.com/mkdocstrings/autorefs/releases/tag/1.4.3) - 2025-08-26
+
+<small>[Compare with 1.4.2](https://github.com/mkdocstrings/autorefs/compare/1.4.2...1.4.3)</small>
+
+### Code Refactoring
+
+- Be more robust when getting breadcrumbs/backlinks ([664aece](https://github.com/mkdocstrings/autorefs/commit/664aece875aa90dfe2f9661f18a27ff27c258f8c) by Timothée Mazzucotelli).
+
 ## [1.4.2](https://github.com/mkdocstrings/autorefs/releases/tag/1.4.2) - 2025-05-20
 
 <small>[Compare with 1.4.1](https://github.com/mkdocstrings/autorefs/compare/1.4.1...1.4.2)</small>
diff -pruN 1.4.2-1/Makefile 1.4.3-1/Makefile
--- 1.4.2-1/Makefile	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/Makefile	2025-08-26 14:23:06.000000000 +0000
@@ -2,6 +2,13 @@
 # the `make` command will point at the `scripts/make` shell script.
 # This Makefile is just here to allow auto-completion in the terminal.
 
+default: help
+	@echo
+	@echo 'Enable direnv in your shell to use the `make` command: `direnv allow`'
+	@echo 'Or use `python scripts/make ARGS` to run the commands/tasks directly.'
+
+.DEFAULT_GOAL: default
+
 actions = \
 	allrun \
 	changelog \
diff -pruN 1.4.2-1/README.md 1.4.3-1/README.md
--- 1.4.2-1/README.md	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/README.md	2025-08-26 14:23:06.000000000 +0000
@@ -4,8 +4,7 @@
 [![documentation](https://img.shields.io/badge/docs-mkdocs-708FCC.svg?style=flat)](https://mkdocstrings.github.io/autorefs/)
 [![pypi version](https://img.shields.io/pypi/v/mkdocs-autorefs.svg)](https://pypi.org/project/mkdocs-autorefs/)
 [![conda version](https://img.shields.io/conda/vn/conda-forge/mkdocs-autorefs.svg)](https://anaconda.org/conda-forge/mkdocs-autorefs)
-[![gitpod](https://img.shields.io/badge/gitpod-workspace-708FCC.svg?style=flat)](https://gitpod.io/#https://github.com/mkdocstrings/autorefs)
-[![gitter](https://badges.gitter.im/join%20chat.svg)](https://app.gitter.im/#/room/#autorefs:gitter.im)
+[![gitter](https://img.shields.io/badge/matrix-chat-4DB798.svg?style=flat)](https://app.gitter.im/#/room/#autorefs:gitter.im)
 
 Automatically link across pages in MkDocs.
 
diff -pruN 1.4.2-1/debian/changelog 1.4.3-1/debian/changelog
--- 1.4.2-1/debian/changelog	2025-05-25 07:39:04.000000000 +0000
+++ 1.4.3-1/debian/changelog	2025-09-19 13:11:46.000000000 +0000
@@ -1,3 +1,10 @@
+mkdocs-autorefs (1.4.3-1) unstable; urgency=medium
+
+  * [fa81f83] d/watch: Convert to version 5
+  * [d5085d5] New upstream version 1.4.3
+
+ -- Carsten Schoenert <c.schoenert@t-online.de>  Fri, 19 Sep 2025 15:11:46 +0200
+
 mkdocs-autorefs (1.4.2-1) unstable; urgency=medium
 
   * [be0b61d] New upstream version 1.4.2
diff -pruN 1.4.2-1/debian/watch 1.4.3-1/debian/watch
--- 1.4.2-1/debian/watch	2024-03-02 18:26:16.000000000 +0000
+++ 1.4.3-1/debian/watch	2025-09-19 13:09:19.000000000 +0000
@@ -1,10 +1,9 @@
-# watch file for mkdocs-autorefs
+Version: 5
 
-version=4
-
-opts="mode=git, \
-      compression=gz, \
-      uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\.?\d*)$/$1~$2/, \
-      dversionmangle=s/\+ds(\.?\d+)?$//" \
-https://github.com/mkdocstrings/autorefs.git \
-      refs/tags/@ANY_VERSION@
+Source: https://github.com/mkdocstrings/autorefs.git
+Matching-Pattern: refs/tags/@ANY_VERSION@
+Compression: gz
+Dversion-Mangle: s/\+ds(\.?\d+)?$//
+Uversion-Mangle: s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\.?\d*)$/$1~$2/
+Mode: git
+Pgpmode: none
diff -pruN 1.4.2-1/duties.py 1.4.3-1/duties.py
--- 1.4.2-1/duties.py	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/duties.py	2025-08-26 14:23:06.000000000 +0000
@@ -25,6 +25,8 @@ CI = os.environ.get("CI", "0") in {"1",
 WINDOWS = os.name == "nt"
 PTY = not WINDOWS and not CI
 MULTIRUN = os.environ.get("MULTIRUN", "0") == "1"
+PY_VERSION = f"{sys.version_info.major}{sys.version_info.minor}"
+PY_DEV = "314"
 
 
 def pyprefix(title: str) -> str:
@@ -68,7 +70,7 @@ def check(ctx: Context) -> None:
     """Check it all!"""
 
 
-@duty
+@duty(nofail=PY_VERSION == PY_DEV)
 def check_quality(ctx: Context) -> None:
     """Check the code quality."""
     ctx.run(
@@ -77,7 +79,7 @@ def check_quality(ctx: Context) -> None:
     )
 
 
-@duty
+@duty(nofail=PY_VERSION == PY_DEV)
 def check_docs(ctx: Context) -> None:
     """Check if the documentation builds correctly."""
     Path("htmlcov").mkdir(parents=True, exist_ok=True)
@@ -89,7 +91,7 @@ def check_docs(ctx: Context) -> None:
         )
 
 
-@duty
+@duty(nofail=PY_VERSION == PY_DEV)
 def check_types(ctx: Context) -> None:
     """Check that the code is correctly typed."""
     os.environ["FORCE_COLOR"] = "1"
@@ -99,7 +101,7 @@ def check_types(ctx: Context) -> None:
     )
 
 
-@duty
+@duty(nofail=PY_VERSION == PY_DEV)
 def check_api(ctx: Context, *cli_args: str) -> None:
     """Check for API breaking changes."""
     ctx.run(
@@ -192,15 +194,14 @@ def coverage(ctx: Context) -> None:
     ctx.run(tools.coverage.html(rcfile="config/coverage.ini"))
 
 
-@duty
-def test(ctx: Context, *cli_args: str, match: str = "") -> None:
+@duty(nofail=PY_VERSION == PY_DEV)
+def test(ctx: Context, *cli_args: str, match: str = "") -> None:  # noqa: PT028
     """Run the test suite.
 
     Parameters:
         match: A pytest expression to filter selected tests.
     """
-    py_version = f"{sys.version_info.major}{sys.version_info.minor}"
-    os.environ["COVERAGE_FILE"] = f".coverage.{py_version}"
+    os.environ["COVERAGE_FILE"] = f".coverage.{PY_VERSION}"
     ctx.run(
         tools.pytest(
             "tests",
diff -pruN 1.4.2-1/scripts/get_version.py 1.4.3-1/scripts/get_version.py
--- 1.4.2-1/scripts/get_version.py	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/scripts/get_version.py	2025-08-26 14:23:06.000000000 +0000
@@ -4,7 +4,12 @@ import re
 from contextlib import suppress
 from pathlib import Path
 
-from pdm.backend.hooks.version import SCMVersion, Version, default_version_formatter, get_version_from_scm
+from pdm.backend.hooks.version import (  # ty: ignore[unresolved-import]
+    SCMVersion,
+    Version,
+    default_version_formatter,
+    get_version_from_scm,
+)
 
 _root = Path(__file__).parent.parent
 _changelog = _root / "CHANGELOG.md"
diff -pruN 1.4.2-1/scripts/make 1.4.3-1/scripts/make
--- 1.4.2-1/scripts/make	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/scripts/make	2025-08-26 14:23:06.000000000 +0000
@@ -15,6 +15,7 @@ if TYPE_CHECKING:
 
 
 PYTHON_VERSIONS = os.getenv("PYTHON_VERSIONS", "3.9 3.10 3.11 3.12 3.13 3.14").split()
+PYTHON_DEV = "3.14"
 
 
 def shell(cmd: str, *, capture_output: bool = False, **kwargs: Any) -> str | None:
@@ -67,16 +68,31 @@ def setup() -> None:
                 uv_install(venv_path)
 
 
+class _RunError(subprocess.CalledProcessError):
+    def __init__(self, *args: Any, python_version: str, **kwargs: Any):
+        super().__init__(*args, **kwargs)
+        self.python_version = python_version
+
+
 def run(version: str, cmd: str, *args: str, **kwargs: Any) -> None:
     """Run a command in a virtual environment."""
     kwargs = {"check": True, **kwargs}
     uv_run = ["uv", "run", "--no-sync"]
-    if version == "default":
-        with environ(UV_PROJECT_ENVIRONMENT=".venv"):
-            subprocess.run([*uv_run, cmd, *args], **kwargs)  # noqa: S603, PLW1510
-    else:
-        with environ(UV_PROJECT_ENVIRONMENT=f".venvs/{version}", MULTIRUN="1"):
-            subprocess.run([*uv_run, cmd, *args], **kwargs)  # noqa: S603, PLW1510
+    try:
+        if version == "default":
+            with environ(UV_PROJECT_ENVIRONMENT=".venv"):
+                subprocess.run([*uv_run, cmd, *args], **kwargs)  # noqa: S603, PLW1510
+        else:
+            with environ(UV_PROJECT_ENVIRONMENT=f".venvs/{version}", MULTIRUN="1"):
+                subprocess.run([*uv_run, cmd, *args], **kwargs)  # noqa: S603, PLW1510
+    except subprocess.CalledProcessError as process:
+        raise _RunError(
+            returncode=process.returncode,
+            python_version=version,
+            cmd=process.cmd,
+            output=process.output,
+            stderr=process.stderr,
+        ) from process
 
 
 def multirun(cmd: str, *args: str, **kwargs: Any) -> None:
@@ -144,19 +160,31 @@ def main() -> int:
         cmd = args.pop(0)
 
         if cmd == "run":
-            run("default", *args)
+            if not args:
+                print("make: run: missing command", file=sys.stderr)
+                return 1
+            run("default", *args)  # ty: ignore[missing-argument]
             return 0
 
         if cmd == "multirun":
-            multirun(*args)
+            if not args:
+                print("make: run: missing command", file=sys.stderr)
+                return 1
+            multirun(*args)  # ty: ignore[missing-argument]
             return 0
 
         if cmd == "allrun":
-            allrun(*args)
+            if not args:
+                print("make: run: missing command", file=sys.stderr)
+                return 1
+            allrun(*args)  # ty: ignore[missing-argument]
             return 0
 
         if cmd.startswith("3."):
-            run(cmd, *args)
+            if not args:
+                print("make: run: missing command", file=sys.stderr)
+                return 1
+            run(cmd, *args)  # ty: ignore[missing-argument]
             return 0
 
         opts = []
@@ -183,7 +211,14 @@ def main() -> int:
 if __name__ == "__main__":
     try:
         sys.exit(main())
-    except subprocess.CalledProcessError as process:
+    except _RunError as process:
         if process.output:
             print(process.output, file=sys.stderr)
-        sys.exit(process.returncode)
+        if (code := process.returncode) == 139:  # noqa: PLR2004
+            print(
+                f"✗ (python{process.python_version})  '{' '.join(process.cmd)}' failed with return code {code} (segfault)",
+                file=sys.stderr,
+            )
+            if process.python_version == PYTHON_DEV:
+                code = 0
+        sys.exit(code)
diff -pruN 1.4.2-1/scripts/make.py 1.4.3-1/scripts/make.py
--- 1.4.2-1/scripts/make.py	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/scripts/make.py	2025-08-26 14:23:06.000000000 +0000
@@ -15,6 +15,7 @@ if TYPE_CHECKING:
 
 
 PYTHON_VERSIONS = os.getenv("PYTHON_VERSIONS", "3.9 3.10 3.11 3.12 3.13 3.14").split()
+PYTHON_DEV = "3.14"
 
 
 def shell(cmd: str, *, capture_output: bool = False, **kwargs: Any) -> str | None:
@@ -67,16 +68,31 @@ def setup() -> None:
                 uv_install(venv_path)
 
 
+class _RunError(subprocess.CalledProcessError):
+    def __init__(self, *args: Any, python_version: str, **kwargs: Any):
+        super().__init__(*args, **kwargs)
+        self.python_version = python_version
+
+
 def run(version: str, cmd: str, *args: str, **kwargs: Any) -> None:
     """Run a command in a virtual environment."""
     kwargs = {"check": True, **kwargs}
     uv_run = ["uv", "run", "--no-sync"]
-    if version == "default":
-        with environ(UV_PROJECT_ENVIRONMENT=".venv"):
-            subprocess.run([*uv_run, cmd, *args], **kwargs)  # noqa: S603, PLW1510
-    else:
-        with environ(UV_PROJECT_ENVIRONMENT=f".venvs/{version}", MULTIRUN="1"):
-            subprocess.run([*uv_run, cmd, *args], **kwargs)  # noqa: S603, PLW1510
+    try:
+        if version == "default":
+            with environ(UV_PROJECT_ENVIRONMENT=".venv"):
+                subprocess.run([*uv_run, cmd, *args], **kwargs)  # noqa: S603, PLW1510
+        else:
+            with environ(UV_PROJECT_ENVIRONMENT=f".venvs/{version}", MULTIRUN="1"):
+                subprocess.run([*uv_run, cmd, *args], **kwargs)  # noqa: S603, PLW1510
+    except subprocess.CalledProcessError as process:
+        raise _RunError(
+            returncode=process.returncode,
+            python_version=version,
+            cmd=process.cmd,
+            output=process.output,
+            stderr=process.stderr,
+        ) from process
 
 
 def multirun(cmd: str, *args: str, **kwargs: Any) -> None:
@@ -144,19 +160,31 @@ def main() -> int:
         cmd = args.pop(0)
 
         if cmd == "run":
-            run("default", *args)
+            if not args:
+                print("make: run: missing command", file=sys.stderr)
+                return 1
+            run("default", *args)  # ty: ignore[missing-argument]
             return 0
 
         if cmd == "multirun":
-            multirun(*args)
+            if not args:
+                print("make: run: missing command", file=sys.stderr)
+                return 1
+            multirun(*args)  # ty: ignore[missing-argument]
             return 0
 
         if cmd == "allrun":
-            allrun(*args)
+            if not args:
+                print("make: run: missing command", file=sys.stderr)
+                return 1
+            allrun(*args)  # ty: ignore[missing-argument]
             return 0
 
         if cmd.startswith("3."):
-            run(cmd, *args)
+            if not args:
+                print("make: run: missing command", file=sys.stderr)
+                return 1
+            run(cmd, *args)  # ty: ignore[missing-argument]
             return 0
 
         opts = []
@@ -183,7 +211,14 @@ def main() -> int:
 if __name__ == "__main__":
     try:
         sys.exit(main())
-    except subprocess.CalledProcessError as process:
+    except _RunError as process:
         if process.output:
             print(process.output, file=sys.stderr)
-        sys.exit(process.returncode)
+        if (code := process.returncode) == 139:  # noqa: PLR2004
+            print(
+                f"✗ (python{process.python_version})  '{' '.join(process.cmd)}' failed with return code {code} (segfault)",
+                file=sys.stderr,
+            )
+            if process.python_version == PYTHON_DEV:
+                code = 0
+        sys.exit(code)
diff -pruN 1.4.2-1/src/mkdocs_autorefs/_internal/backlinks.py 1.4.3-1/src/mkdocs_autorefs/_internal/backlinks.py
--- 1.4.2-1/src/mkdocs_autorefs/_internal/backlinks.py	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/src/mkdocs_autorefs/_internal/backlinks.py	2025-08-26 14:23:06.000000000 +0000
@@ -26,7 +26,7 @@ except ImportError:
 
 
 @dataclass(frozen=True, order=True)
-class BacklinkCrumb:
+class BacklinkCrumb:  # noqa: PLW1641
     """A navigation breadcrumb for a backlink."""
 
     title: str
diff -pruN 1.4.2-1/src/mkdocs_autorefs/_internal/debug.py 1.4.3-1/src/mkdocs_autorefs/_internal/debug.py
--- 1.4.2-1/src/mkdocs_autorefs/_internal/debug.py	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/src/mkdocs_autorefs/_internal/debug.py	2025-08-26 14:23:06.000000000 +0000
@@ -85,7 +85,7 @@ def _get_debug_info() -> _Environment:
         interpreter_version=py_version,
         interpreter_path=sys.executable,
         platform=platform.platform(),
-        variables=[_Variable(var, val) for var in variables if (val := os.getenv(var))],
+        variables=[_Variable(var, val) for var in variables if (val := os.getenv(var))],  # ty: ignore[invalid-argument-type]
         packages=[_Package(pkg, _get_version(pkg)) for pkg in packages],
     )
 
diff -pruN 1.4.2-1/src/mkdocs_autorefs/_internal/plugin.py 1.4.3-1/src/mkdocs_autorefs/_internal/plugin.py
--- 1.4.2-1/src/mkdocs_autorefs/_internal/plugin.py	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/src/mkdocs_autorefs/_internal/plugin.py	2025-08-26 14:23:06.000000000 +0000
@@ -317,7 +317,7 @@ class AutorefsPlugin(BasePlugin[Autorefs
             try:
                 page = self._url_to_page[page]
             except KeyError:
-                page = self.current_page
+                page = self.current_page  # type: ignore[assignment]
 
         self.register_anchor(page, anchor.id, title=anchor.title, primary=True)
         breadcrumb = self._get_breadcrumb(page, anchor, parent)
@@ -383,12 +383,16 @@ class AutorefsPlugin(BasePlugin[Autorefs
             backlinks = self._backlinks.get(identifier, {})
             for backlink_type, backlink_urls in backlinks.items():
                 for backlink_url in backlink_urls:
-                    relative_backlinks[backlink_type].add(self._get_backlink(from_url, backlink_url))
+                    if backlink := self._get_backlink(from_url, backlink_url):
+                        relative_backlinks[backlink_type].add(backlink)
         return relative_backlinks
 
-    def _get_backlink(self, from_url: str, backlink_url: str) -> Backlink:
+    def _get_backlink(self, from_url: str, backlink_url: str) -> Backlink | None:
         breadcrumbs = []
-        breadcrumb: BacklinkCrumb | None = self._breadcrumbs_map[backlink_url]
+        breadcrumb: BacklinkCrumb | None
+        if not (breadcrumb := self._breadcrumbs_map.get(backlink_url)):
+            _log.debug("No breadcrumb for backlink URL %s", backlink_url)
+            return None
         while breadcrumb:
             breadcrumbs.append(
                 BacklinkCrumb(
@@ -423,7 +427,7 @@ class AutorefsPlugin(BasePlugin[Autorefs
             try:
                 page = self._url_to_page[page]
             except KeyError:
-                page = self.current_page
+                page = self.current_page  # type: ignore[assignment]
 
         url = f"{page.url}#{anchor or identifier}"
         url_map = self._primary_url_map if primary else self._secondary_url_map
diff -pruN 1.4.2-1/tests/test_api.py 1.4.3-1/tests/test_api.py
--- 1.4.2-1/tests/test_api.py	2025-05-20 13:07:56.000000000 +0000
+++ 1.4.3-1/tests/test_api.py	2025-08-26 14:23:06.000000000 +0000
@@ -91,7 +91,7 @@ def _fixture_public_objects(public_api:
 def _fixture_inventory() -> Inventory:
     inventory_file = Path(__file__).parent.parent / "site" / "objects.inv"
     if not inventory_file.exists():
-        raise pytest.skip("The objects inventory is not available.")
+        pytest.skip("The objects inventory is not available.")  # ty: ignore[call-non-callable]
     with inventory_file.open("rb") as file:
         return Inventory.parse_sphinx(file)
 
