Skip to content

docs: fix 14 broken links and stale talm anchor across v1 docs#486

Merged
lexfrei merged 3 commits intomainfrom
docs/fix-broken-refs
Apr 15, 2026
Merged

docs: fix 14 broken links and stale talm anchor across v1 docs#486
lexfrei merged 3 commits intomainfrom
docs/fix-broken-refs

Conversation

@lexfrei
Copy link
Copy Markdown
Contributor

@lexfrei lexfrei commented Apr 12, 2026

What

Fixes 14 broken links in the v1 docs tree found by an automated pass: static validation of every {{% ref %}} / {{% relref %}} shortcode target plus a lychee offline check of raw markdown links. 11 files touched, two logical groups of fixes.

Group 1 — {{% ref %}} shortcodes written without a leading slash (8 fixes, 6 files):

A ref written as ref "docs/v1/foo" (no leading /) is treated by Hugo as relative to the calling page, so Hugo resolves it to docs/v1/docs/v1/foo, which never exists. The rest of the v1 docs use the absolute form ref "/docs/v1/foo". Normalize the outliers:

  • install/providers/hetzner.md — 2 refs (one also had a stale anchor, see below)
  • operations/services/_index.md — 2 refs
  • guides/concepts.md — 2 refs
  • operations/services/monitoring/dashboards.md — 3 refs
  • operations/services/monitoring/alerting.md — 1 ref
  • operations/services/monitoring/logs.md — 3 refs

Stale anchor inside hetzner.md: the Hetzner install guide linked readers at talm#1-initialize-cluster-configuration, but Talm's guide has since grown a new ## 1. Install Dependencies section ahead of "Initialize Cluster Configuration", which is now ## 2.. Update the anchor to #2-initialize-cluster-configuration.

Group 2 — plain markdown links (6 fixes, 5 files):

  • operations/oidc/enable_oidc.md[Self-Signed Certificates](../self-signed-certificates/): resolves to operations/self-signed-certificates (one directory above where the file lives). Target file is operations/oidc/self-signed-certificates.md, so use ./self-signed-certificates/.
  • operations/oidc/self-signed-certificates.md → two mirror-image breakages: ../enable_oidc/ and ../users_and_roles/ both point one level too high. Use ./enable_oidc/ and ./users_and_roles/.
  • virtualization/vm-instance.md./DEVELOPMENT.md is a dangling relative link to a file that does not exist in content/. Replace with the real Developer Guide at /docs/v1/development/.
  • operations/faq/_index.md/docs/operations/troubleshooting/ is missing the /v1/ segment and points at a non-existent legacy path. Add /v1/.
  • install/providers/servers-com/_index.md/docs/getting-started/install-cozystack has the same missing /v1/ segment. Add /v1/.

Why

All 14 are real broken links on the live site right now. None of them produce a Hugo build error (Hugo's default refLinksErrorLevel is warning, and plain markdown link resolution happens at browser time, not build time), which is why they accumulated unnoticed. Every broken link costs readers trust and routes them to 404s or to wrong pages.

Verification

  • Wrote a Python walker that enumerates every {{% ref %}}/{{% relref %}} target in content/en/docs/v1/ and tries to resolve it against the filesystem — after this PR it reports 0 missing targets (down from 8).
  • Ran lychee --offline on content/en/docs/v1/**/*.md before and after. False positives for /img/... absolute paths and for Hugo-routed absolute paths like /docs/v1/development/ (where a page exists but lychee does not know Hugo's routing) were filtered manually by cross-checking each finding against the actual filesystem. After the fixes, the remaining lychee "errors" are all confirmed false positives (static asset paths and Hugo-routed pages that do exist).
  • hugo builds cleanly (440 pages, no ref warnings) both before and after.
  • Every replacement was spot-checked against the real target file existing on disk.

Out of scope

  • lychee also flagged a large number of /img/... absolute image paths as broken, but those are all false positives — /img/ is a static asset root, Hugo serves it via static/img/, and the rendered pages on the live site show the images correctly.
  • markdownlint across the v1 tree surfaced many style-only issues (MD030, MD012, MD033, MD034 bare URLs, MD040 missing code-block language) that are pre-existing and mostly in auto-generated content/en/docs/v1/applications/*.md files (which are regenerated from upstream cozystack/cozystack READMEs). Those should be fixed in the upstream READMEs, not here.

Summary by CodeRabbit

  • Documentation
    • Normalized internal documentation links and cross-references across multiple guides and reference pages to use consistent, versioned/absolute paths. This improves navigation reliability and prevents broken or ambiguous links in concept, install, operations, and virtualization docs.

@lexfrei lexfrei requested review from kvaps and lllamnyp as code owners April 12, 2026 10:50
@netlify
Copy link
Copy Markdown

netlify Bot commented Apr 12, 2026

Deploy Preview for cozystack ready!

Name Link
🔨 Latest commit 7288874
🔍 Latest deploy log https://app.netlify.com/projects/cozystack/deploys/69df9e71a4d6f0000873159d
😎 Deploy Preview https://deploy-preview-486--cozystack.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 12, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: feeb7b0a-5a0a-4c73-b628-8a607c5493f6

📥 Commits

Reviewing files that changed from the base of the PR and between 10d62db and 15663cb.

📒 Files selected for processing (11)
  • content/en/docs/v1/guides/concepts.md
  • content/en/docs/v1/install/providers/hetzner.md
  • content/en/docs/v1/install/providers/servers-com/_index.md
  • content/en/docs/v1/operations/faq/_index.md
  • content/en/docs/v1/operations/oidc/enable_oidc.md
  • content/en/docs/v1/operations/oidc/self-signed-certificates.md
  • content/en/docs/v1/operations/services/_index.md
  • content/en/docs/v1/operations/services/monitoring/alerting.md
  • content/en/docs/v1/operations/services/monitoring/dashboards.md
  • content/en/docs/v1/operations/services/monitoring/logs.md
  • content/en/docs/v1/virtualization/vm-instance.md
✅ Files skipped from review due to trivial changes (11)
  • content/en/docs/v1/operations/faq/_index.md
  • content/en/docs/v1/operations/oidc/enable_oidc.md
  • content/en/docs/v1/operations/services/monitoring/dashboards.md
  • content/en/docs/v1/operations/services/_index.md
  • content/en/docs/v1/operations/services/monitoring/alerting.md
  • content/en/docs/v1/virtualization/vm-instance.md
  • content/en/docs/v1/operations/services/monitoring/logs.md
  • content/en/docs/v1/operations/oidc/self-signed-certificates.md
  • content/en/docs/v1/install/providers/servers-com/_index.md
  • content/en/docs/v1/guides/concepts.md
  • content/en/docs/v1/install/providers/hetzner.md

📝 Walkthrough

Walkthrough

Updated internal documentation link references across 11 files to use consistent absolute/versioned Hugo ref targets (leading /docs/v1/...) or explicit ref shortcodes; only link targets changed, no content, headings, or logic were modified.

Changes

Cohort / File(s) Summary
Ref path standardization (monitoring & services)
content/en/docs/v1/operations/services/_index.md, content/en/docs/v1/operations/services/monitoring/alerting.md, content/en/docs/v1/operations/services/monitoring/dashboards.md, content/en/docs/v1/operations/services/monitoring/logs.md
Replaced relative/unnormalized ref targets with root‑relative /docs/v1/... Hugo ref paths (added leading /).
Guides concepts
content/en/docs/v1/guides/concepts.md
Changed two ref targets to absolute /docs/v1/... paths.
OIDC docs cross‑refs
content/en/docs/v1/operations/oidc/enable_oidc.md, content/en/docs/v1/operations/oidc/self-signed-certificates.md
Converted relative links to explicit Hugo ref targets using /docs/v1/operations/oidc/... paths.
Hetzner provider
content/en/docs/v1/install/providers/hetzner.md
Updated two documentation ref links to use absolute /docs/v1/... paths and preserved fragment identifiers.
Servers.com install index
content/en/docs/v1/install/providers/servers-com/_index.md
Replaced unversioned /docs/getting-started/install-cozystack with versioned /docs/v1/getting-started/install-cozystack via ref.
Operations FAQ alert
content/en/docs/v1/operations/faq/_index.md
Replaced hardcoded /docs/operations/troubleshooting/ with a versioned ref (/docs/v1/operations/troubleshooting).
Virtualization dev link
content/en/docs/v1/virtualization/vm-instance.md
Replaced local ./DEVELOPMENT.md reference with Hugo ref to /docs/v1/development/.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Poem

🐇 I hopped through docs with nimble paws,

Fixed slashes, refs and tiny flaws,
Now links alight on versioned tracks,
No more 404s or wandering backs,
A rabbit's patch — small, tidy, fast.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main objective of the PR: fixing broken documentation links across v1 docs by normalizing Hugo ref paths to absolute form and correcting markdown link targets.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/fix-broken-refs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request standardizes internal documentation links by updating {{% ref %}} shortcode paths and correcting relative links across various guides. The feedback suggests further improving link reliability by replacing remaining raw markdown links with the {{% ref %}} shortcode, which provides build-time validation and ensures link consistency.

```

Now follow **Get Started** guide starting from the [**Install Cozystack**](/docs/getting-started/install-cozystack) section, to continue the installation.
Now follow **Get Started** guide starting from the [**Install Cozystack**](/docs/v1/getting-started/install-cozystack) section, to continue the installation.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using the {{% ref %}} shortcode is preferred for internal links. It provides build-time validation and ensures the link remains correct even if the site's base URL or structure changes. This aligns with the PR's goal of preventing broken links.

Suggested change
Now follow **Get Started** guide starting from the [**Install Cozystack**](/docs/v1/getting-started/install-cozystack) section, to continue the installation.
Now follow **Get Started** guide starting from the [**Install Cozystack**]({{% ref "/docs/v1/getting-started/install-cozystack" %}}) section, to continue the installation.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in 15663cb. Thanks!


{{% alert title="Troubleshooting" %}}
Troubleshooting advice can be found on our [Troubleshooting Cheatsheet](/docs/operations/troubleshooting/).
Troubleshooting advice can be found on our [Troubleshooting Cheatsheet](/docs/v1/operations/troubleshooting/).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using the {{% ref %}} shortcode is preferred for internal links to enable build-time validation and maintain consistency across the documentation.

Suggested change
Troubleshooting advice can be found on our [Troubleshooting Cheatsheet](/docs/v1/operations/troubleshooting/).
Troubleshooting advice can be found on our [Troubleshooting Cheatsheet]({{% ref "/docs/v1/operations/troubleshooting" %}}).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in 15663cb. Thanks!


{{% alert color="info" %}}
**Optional**: If you want the dashboard to reach Keycloak via the internal cluster network instead of the external ingress, set `keycloakInternalUrl`. This is useful in environments with self-signed certificates or restricted external access. See [Self-Signed Certificates](../self-signed-certificates/) for details.
**Optional**: If you want the dashboard to reach Keycloak via the internal cluster network instead of the external ingress, set `keycloakInternalUrl`. This is useful in environments with self-signed certificates or restricted external access. See [Self-Signed Certificates](./self-signed-certificates/) for details.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using the {{% ref %}} shortcode for internal links is more robust than raw markdown links, as it allows Hugo to validate the target at build time.

Suggested change
**Optional**: If you want the dashboard to reach Keycloak via the internal cluster network instead of the external ingress, set `keycloakInternalUrl`. This is useful in environments with self-signed certificates or restricted external access. See [Self-Signed Certificates](./self-signed-certificates/) for details.
**Optional**: If you want the dashboard to reach Keycloak via the internal cluster network instead of the external ingress, set `keycloakInternalUrl`. This is useful in environments with self-signed certificates or restricted external access. See [Self-Signed Certificates]({{% ref "/docs/v1/operations/oidc/self-signed-certificates" %}}) for details.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in 15663cb. Thanks!

## Prerequisites

- Cozystack cluster with OIDC enabled (see [Enable OIDC Server](../enable_oidc/))
- Cozystack cluster with OIDC enabled (see [Enable OIDC Server](./enable_oidc/))
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using the {{% ref %}} shortcode for internal links is more robust than raw markdown links, as it allows Hugo to validate the target at build time.

Suggested change
- Cozystack cluster with OIDC enabled (see [Enable OIDC Server](./enable_oidc/))
- Cozystack cluster with OIDC enabled (see [Enable OIDC Server]({{% ref "/docs/v1/operations/oidc/enable_oidc" %}}))

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in 15663cb. Thanks!

- **Certificate not found**: Ensure the certificate file path in `extraVolumes` matches the path specified in `oidc-ca-file`.
- **Domain resolution fails**: Verify that `extraHostEntries` is correctly configured on all control plane nodes.
- **Authentication fails**: Check that the user exists in Keycloak and has the required group memberships (see [Users and Roles](../users_and_roles/)).
- **Authentication fails**: Check that the user exists in Keycloak and has the required group memberships (see [Users and Roles](./users_and_roles/)).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using the {{% ref %}} shortcode for internal links is more robust than raw markdown links, as it allows Hugo to validate the target at build time.

Suggested change
- **Authentication fails**: Check that the user exists in Keycloak and has the required group memberships (see [Users and Roles](./users_and_roles/)).
- **Authentication fails**: Check that the user exists in Keycloak and has the required group memberships (see [Users and Roles]({{% ref "/docs/v1/operations/oidc/users_and_roles" %}})).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in 15663cb. Thanks!


To get started with customizing or creating your own instancetypes and preferences
see [DEVELOPMENT.md](./DEVELOPMENT.md).
see [Developer Guide](/docs/v1/development/).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using the {{% ref %}} shortcode for internal links is more robust than raw markdown links, as it allows Hugo to validate the target at build time.

Suggested change
see [Developer Guide](/docs/v1/development/).
see [Developer Guide]({{% ref "/docs/v1/development" %}}).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in 15663cb. Thanks!

@lexfrei lexfrei force-pushed the docs/fix-broken-refs branch from 10d62db to 29110e8 Compare April 12, 2026 11:47
@lexfrei lexfrei self-assigned this Apr 12, 2026
Leading-slash ref issues in the v1.2 tree were already fixed by the
v1.0/v1.1/v1.2 refactor. Six remaining broken links survived the
refactor because they were plain markdown links, not ref shortcodes:

- hetzner.md — stale anchor #1-initialize-cluster-configuration → #2
  (talm.md grew a new "## 1. Install Dependencies" section ahead of
  "Initialize Cluster Configuration", which is now ## 2).
- servers-com/_index.md — unversioned /docs/getting-started/... link
  wrapped in a ref shortcode and pointed at /docs/v1.2/.
- operations/faq/_index.md — same fix for /docs/operations/... link
  → ref /docs/v1.2/operations/troubleshooting.
- oidc/enable_oidc.md, oidc/self-signed-certificates.md — replaced
  Hugo-unfriendly relative paths (../sibling/) with absolute ref
  shortcodes so the build fails if the target is renamed.
- virtualization/vm-instance.md — ./DEVELOPMENT.md pointed at a file
  that does not exist; replaced with ref to /docs/v1.2/development.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
@lexfrei lexfrei force-pushed the docs/fix-broken-refs branch from 15663cb to 87c158f Compare April 15, 2026 13:59
Copy link
Copy Markdown
Member

@kvaps kvaps left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@lexfrei lexfrei enabled auto-merge April 15, 2026 14:19
@lexfrei lexfrei merged commit 0be1724 into main Apr 15, 2026
1 check passed
@lexfrei lexfrei deleted the docs/fix-broken-refs branch April 15, 2026 14:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants