Skip to content

Conversation

@cliftonmcintosh
Copy link
Contributor

@cliftonmcintosh cliftonmcintosh commented Dec 4, 2025

Description

Implements automatic validation of internal markdown links at build time to prevent broken links from being deployed.

Changes

  1. Added custom link render hook (layouts/_default/_markup/render-link.html)

    • Validates internal links against actual content pages, resources, and heading fragments
    • Reuses existing linkErrorLevel configuration from hugo.toml
    • Skips validation for Hugo shortcode placeholders
    • Based on Veriphor's link render hook
  2. Fixed Hextra theme breadcrumb compatibility (layouts/docs/list.html:8)

    • Corrected breadcrumb partial call to match Hextra's expected dict format. See comment in PR.
  3. Added development workflow features

    • CSS styling for visually highlighting broken links in development.
    • README documentation for configuration and workflow
  4. Fixed all broken internal links

Testing

  • Build now fails when linkErrorLevel = "ERROR" if broken links are present
  • Previously broken links have been fixed and validated
  • Development mode with linkErrorLevel = "WARNING" and highlightBroken = true allows iterative fixing with visual feedback

Closes #2069

AI Disclosure

This PR was developed using Claude Code. Use included:

  • Providing Claude Code with a description of the problem and asking it to help define an implementation plan for solving the problem.
  • Asking Claude Code to help me understand the Veriphor link render hook that we used as the basis for our custom render hook because I did not have previous experience with Go templating. (I have a document of our discussion.)
  • Asking Claude Code to help implement a solution step-by-step. For each step, I analyzed and validated the changes.
  • Asking Claude Code to help me troubleshoot issues. In particular, it was very good at identifying the breadcrumb issue mentioned above.
  • Asking Claude Code to help write the update to the README documenting the automatic link checking.

When working with an AI coding assistant, the assistant and I keep logs of our work. I can provide those documents if it would be useful to see how I work with the assistant.

License

The software is provided under AGPL-3.0. Contributions to this project are accepted under the same license.

@cliftonmcintosh
Copy link
Contributor Author

cliftonmcintosh commented Dec 4, 2025

@mrjones-plip

With the hook running my docker container for cht-docs errors out because of links that the hook can't find. That's good, but some of the failures seem to be because the render link hook does not handle aliases. I would like guidance on how to proceed.

List of errors that the hook generated

Expand to see the error output

I have been spot-checking but have not checked them all. I don't know yet how many are the hook not checking aliases.

$ docker compose up
Attaching to cht-hugo
cht-hugo  | OK: 28 MiB in 41 packages
cht-hugo  | Watching for changes in /src/{assets,content,data,i18n,layouts,static}
cht-hugo  | Watching for config changes in /src/hugo.toml, /src/go.mod
cht-hugo  | Start building sites …
cht-hugo  | hugo v0.152.2+extended linux/arm64 BuildDate=2025-10-24T16:50:43Z VendorInfo=hugomods
cht-hugo  |
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "/core" in /src/content/en/building/_index.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "/score" in /src/content/en/building/_index.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "4-test-locally-the-keystore" in building/branding/android.md. See /src/content/en/building/branding/android.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "3-create-and-upload-a-blank-project" in building/local-setup.md. See /src/content/en/building/branding/application-graphics.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "3-create-and-upload-a-blank-project" in building/local-setup.md. See /src/content/en/building/contact-summary/contact-summary-overview.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "credentials" in building/reference/app-settings/outbound.md. See /src/content/en/building/integrations/custom.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/analytics" in /src/content/en/technical-overview/data/analytics/data-flows-for-analytics.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//community/contributing/code/core/feature-flags" in /src/content/en/building/reports/reports-overview.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "translations" in building/translations/overview.md. See /src/content/en/building/translations/overview.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/sso" in /src/content/en/building/reference/api.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//technical-overview/architecture/cht-watchdog" in /src/content/en/building/reference/api.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/analytics" in /src/content/en/_index.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "../generative-template" in /src/content/en/design/user-experience-research/user-interviews.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "../scoped" in /src/content/en/design/user-experience-research/user-interviews.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "3-create-and-upload-a-blank-project" in building/local-setup.md. See /src/content/en/building/translations/localizing.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "overview" in technical-overview/architecture/_index.md. See /src/content/en/hosting/analytics/setup-docker-compose.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "../template" in /src/content/en/design/user-experience-research/focus-group-discussions.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "macos--123" in community/contributing/code/core/dev-environment.md. See /src/content/en/building/local-setup.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "cht-docker-helper-for-4x" in hosting/cht/app-developer.md. See /src/content/en/building/local-setup.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/couch2pg/setup-and-devlopment" in /src/content/en/hosting/couch2pg/migration.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "cht-docker-helper-for-4x" in hosting/cht/app-developer.md. See /src/content/en/hosting/cht/requirements.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "3-create-and-upload-a-blank-project" in building/local-setup.md. See /src/content/en/building/targets/target-widgets.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "main-list" in building/reports/_index.md. See /src/content/en/building/training/training-cards/_index.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "supervisor-dashboards" in building/supervision/_index.md. See /src/content/en/building/training/training-cards/_index.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "chw-aggregate-targets" in building/supervision/_index.md. See /src/content/en/building/training/training-cards/_index.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "supervisor-tasks" in building/supervision/_index.md. See /src/content/en/building/training/training-cards/_index.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "/core" in /src/content/en/building/implementations.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "/hosting/requirements" in /src/content/en/hosting/cht/costs.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "accuracy" in _index.md. See /src/content/en/_index.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "/hosting/kubernetes-vs-docker/#example-deployments" in /src/content/en/_index.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "overview" in technical-overview/architecture/_index.md. See /src/content/en/hosting/couch2pg/couch2pg-setup.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/analytics/testing-dbt-models" in /src/content/en/hosting/analytics/building-dbt-models.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/sso" in /src/content/en/building/reference/app-settings/oidc_provider.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//community/contributing/code/core/feature-flags" in /src/content/en/building/reference/app-settings/user-permissions.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "accept-patient-reports" in building/reference/app-settings/transitions.md. See /src/content/en/building/reference/app-settings/transitions.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "accept-case-reports" in building/reference/app-settings/transitions.md. See /src/content/en/building/reference/app-settings/transitions.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "generate-shortcode-on-contacts" in building/reference/app-settings/transitions.md. See /src/content/en/building/reference/app-settings/transitions.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "generate-patient-id-on-people" in building/reference/app-settings/transitions.md. See /src/content/en/building/reference/app-settings/transitions.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//design/interface/icons" in /src/content/en/design/best-practices.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "" in /src/content/en/building/workflows/workflows-overview.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "3-create-and-upload-a-blank-project" in building/local-setup.md. See /src/content/en/building/forms/form-properties.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "3-create-and-upload-a-blank-project" in building/local-setup.md. See /src/content/en/building/condition-cards.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "dbt-tags" in hosting/analytics/tuning-dbt.md. See /src/content/en/hosting/analytics/tuning-dbt.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "3-create-and-upload-a-blank-project" in building/local-setup.md. See /src/content/en/building/tutorials/app-forms.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "supervisor-view" in building/targets/targets-overview.md. See /src/content/en/building/integrations/oppia.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "../workflow/#commits" in /src/content/en/community/contributing/code/repository-checklist.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "/building/local-setup/privacy.error.png" in /src/content/en/hosting/cht/app-developer.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "../../docker" in /src/content/en/hosting/cht/kubernetes/gcp-multinode.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/cht/app-developer" in /src/content/en/community/contributing/code/core/apdex-automation-tests.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "3-create-and-upload-a-blank-project" in building/local-setup.md. See /src/content/en/building/tutorials/application-tests.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "assessment-form-test-3" in building/tutorials/application-tests.md. See /src/content/en/building/tutorials/application-tests.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "assessment-form-test" in building/tutorials/application-tests.md. See /src/content/en/building/tutorials/application-tests.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "harness-defaults-json-31" in building/tutorials/application-tests.md. See /src/content/en/building/tutorials/application-tests.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "harness-defaults-json-26" in building/tutorials/application-tests.md. See /src/content/en/building/tutorials/application-tests.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "harness-defaults-json-36" in building/tutorials/application-tests.md. See /src/content/en/building/tutorials/application-tests.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "supervisor-tasks" in building/supervision/_index.md. See /src/content/en/building/training/training-instance.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "/apps/reference/api#put-apiv1credentials" in /src/content/en/building/messaging/gateways/africas-talking.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "/apps/reference/api#put-apiv1credentials" in /src/content/en/building/messaging/gateways/nepal_doit.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "copy-secret" in _index.md. See /src/content/en/_index.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "cht-docker-helper-for-4x" in hosting/cht/app-developer.md. See /src/content/en/_index.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "cht-docker-helper-for-4x" in hosting/cht/app-developer.md. See /src/content/en/hosting/SSO/entra.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "on-cht-watchdog-import-grafana-dashboard" in hosting/monitoring/integration.md. See /src/content/en/hosting/monitoring/integration.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/sso" in /src/content/en/hosting/SSO/technical.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "../images/2.14.0.pdf" in /src/content/en/releases/2_14_0.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/cht" in /src/content/en/_index.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "bulk-delete-reports" in building/reports/_index.md. See /src/content/en/releases/4_1_0.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/sso" in /src/content/en/releases/4_20_0.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "../images/4_4_0-8238.sync.improvements.png" in /src/content/en/releases/4_4_0.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "related-content" in reference-apps/covid-rdt-reference-app.md. See /src/content/en/reference-apps/covid-rdt-reference-app.md
cht-hugo  | ERROR The "link" render hook was unable to find heading ID "base64-image-extraction" in _index.md. See /src/content/en/_index.md
cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "//hosting/analytics" in /src/content/en/technical-overview/data/analytics/querying_training_card_telemetry.md
cht-hugo  | Built in 5685 ms
cht-hugo  | Error: error building site: logged 71 error(s)
cht-hugo exited with code 1

You can also see them in CI: https://github.com/medic/cht-docs/actions/runs/19934828879/job/57156581913?pr=2094

The problem with marking aliases as errors

From what I can tell, the render hook uses Hugo's .GetPage method like this:

{{- with $p := or ($.PageInner.GetPage .) ($.PageInner.GetPage (strings.TrimRight "/" .)) }}

The .GetPage method only looks up pages by their actual file paths, not by their aliases, so aliases fail the link check.

Here's an example error that the custom hook generates:

cht-hugo  | ERROR The "link" render hook was unable to resolve the destination "/hosting/requirements" in /src/content/en/hosting/cht/costs.md

When I click on the link for

In order to get a better idea of fixed monthly costs, let's look at the smallest Kubernetes deployment per the [requirements docs](/hosting/requirements).

in https://docs.communityhealthtoolkit.org/hosting/cht/costs/, it takes me to https://docs.communityhealthtoolkit.org/hosting/cht/requirements/, which appears to be a valid place to go. That is powered by content/en/hosting/cht/requirements.md and one of the aliases listed in that file is /hosting/requirements/.

Possible solutions

Option 1: Replace aliases with actual page paths. We can update the links that generate the error so that we don't use aliases.

Option 2: Update the hook to search for aliases. I believe we can adjust the hook to also search for aliases, but that may slow down the build time. I think it would require the hook to iterate through all site pages for every link that doesn't resolve directly.

@cliftonmcintosh cliftonmcintosh changed the title fix(#2069) Add Render Hook for Automatic Link Checking for Markdown Links fix(#2069): Add Render Hook for Automatic Link Checking for Markdown Links Dec 4, 2025
@mrjones-plip
Copy link
Contributor

mrjones-plip commented Dec 4, 2025

@cliftonmcintosh - your detailed and helpful write up of where you're stuck has a perfect eye for detail and explicit request for clarification. When coupled with two solutions, it makes for a tremendously actionable and async friendly PR. Thank you!!

To the matter at hand, I think we should pay the one time cost of fixing all the aliases. This will make it faster (vs option 2), will create less aliases of aliases of aliases links over time and will prevent the same for larger refactors in the future.

As such, I'll help fix all the links in this PR as I can go through them pretty quick and know the content decently well. I'll try and get this done in the next day or so as a PR against your branch.

cc @andrablaj

@mrjones-plip
Copy link
Contributor

mrjones-plip commented Dec 4, 2025

Oh wow - I replaced all the (https://docs.communityhealthtoolkit.org/LINK_HERE) with (/LINK_HERE) so this branch's link checker would check them and found another ~60 broken links in my branch 🤦

Well - the only way to get out of here is through fixing all the links just this this once 🚀

@cliftonmcintosh
Copy link
Contributor Author

found another ~60 broken links in my branch 🤦

😮

Copy link
Contributor

@mrjones-plip mrjones-plip left a comment

Choose a reason for hiding this comment

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

@cliftonmcintosh - this is looking really good!

I know this is a WIP PR and we're still waiting for me to tidy up all the links, but giving some early feedback to be sure both linkErrorLevel and highlightBroken work.

While I was able to easily change linkErrorLevel to the hugo.toml in the [params] section and got WARN instead of ERROR in the log, I was unable to get the highlightBroken classes to show on the broken links.

As well, we'll need to add the corresponding CSS:

a.broken {
  background: #ff0;
  border: 2px solid #f00;
  padding: 0.1em 0.2em;
}

Finally, we should be sure to document how these two features work, as it greatly eases the pain of needing to restart hugo every time you fix a broken link. Included should obviously be the the importance of NOT committing linkErrorLevel = "WARN" to main 😅 .

I'm super excited to see this through - I think these tight constrains on link integrity will be really great long term!

@cliftonmcintosh
Copy link
Contributor Author

@mrjones-plip

Thanks for the suggestions. I've made updates based on them. I've verified that the highlighting works when checking is set to the warn level.

Screenshot 2025-12-09 at 16 53 14

@mrjones-plip
Copy link
Contributor

Ohh - yeah - this all looks great - thanks @cliftonmcintosh ! I'll spin up another round of link fixing tomorrow-ish, but I'll first be sure to merge your latest changes back to my branch and follow these steps.

Thanks and stay tuned!!

…ot-working-with-markdown-links' into 2069-automatic-link-checking-not-working-with-markdown-links
@mrjones-plip
Copy link
Contributor

@cliftonmcintosh - I merged your latest changes to my branch and I'm still stuck on it not ever starting the web server.

I'll think on this some more and have reached out to some colleagues to help debug, but feel free to dive in if you're feeling ambitious!

@mrjones-plip mrjones-plip self-requested a review December 10, 2025 23:34
Copy link
Contributor

@mrjones-plip mrjones-plip left a comment

Choose a reason for hiding this comment

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

@cliftonmcintosh - yay! Great team work on this.

The one issue I found is it breaks on certain links. Can you reproduce and try and fix this bug I found? Steps to reproduce

  1. Stop and delete your hugo docker container if running
  2. Pull in the latest of this branch
  3. Edit line 144 of the keycloak file to be as shown below.:
    Why does [this link](/hosting/sso/keycloak/#copy-secret) break my brain?
  4. Start up the docker container: docker compose up

Expected: The docs site compiles fine and web server starts on http://localhost:1313 and shows this log entry in the container:

cht-hugo  | Web Server is available at http://localhost:1313/ (bind address 0.0.0.0) 
cht-hugo  | Press Ctrl+C to stop

Actual: The docs site never gets past Start building sites … and showing the hugo version:

cht-hugo  | Start building sites … 
cht-hugo  | hugo v0.152.2

Note: if you use [this link](/hosting/sso/keycloak/) it works fine, but both [this link](/hosting/sso/keycloak/#copy-secret) and [this link](/hosting/sso/keycloak#copy-secret) cause the bug.

Maybe there's some recursive logic that it gets stuck in? I doubt this b/c CPU load is nominal when it fails to build.

We may ultimately choose to ship this as is and see how bad it gets, but it feels like a footgun we should try and avoid.

@mrjones-plip
Copy link
Contributor

Also - lovely AI disclosure per our request and the offer to share logs is icing on the cake - thank you!!

@cliftonmcintosh
Copy link
Contributor Author

The one issue I found is it breaks on certain links. Can you reproduce and try and fix this bug I found?

Thanks for the testing. I'll take a look at this. I may not get to it until tomorrow.

In the interest of learning a little more, I'm curious how you knew to test that scenario. If you have time to share insights, they would be appreciated.

@mrjones-plip
Copy link
Contributor

No rush on getting back to this! Speaking of which, most of Medic will be off Dec 22 - Jan 2.

otherwise it was total luck I found this issue! When I was in there fixing all the links, suddenly hugo stopped working (as described). I knew it was one of my commits in my PR and narrowed it down to one of them. Ultimately, it was Josh who bisected my commits to figure out it was the specific link I cited above that was causing the issue 🤷

@cliftonmcintosh
Copy link
Contributor Author

I believe I've fixed the hang when pages link to themselves with fragments (e.g., [link](/current-page/#heading)).

The problem: Accessing .Fragments on a page object from .GetPage that represents the current page causes a deadlock.

The solution: Detect self-references by comparing permalinks. When found, use $.Page instead of the .GetPage result for validation. $.Page.Fragments works fine while $p.Fragments hangs.

Result: Validation of links should now work, including self-referencing ones with full validation.

Does this break anything else in validation?

I don't think it will. It is contained in an if/else block that is scoped to pages with self-references.

I tested some other link validations, and they worked okay.

AI Disclosure

I collaborated with Claude Code on this change.

Before taking this approach, Claude Code suggested skipping fragment validation for self-referencing links. You can see that approach in 60ee295. If you prefer that approach, we can roll back to that commit.

Copy link
Contributor

@mrjones-plip mrjones-plip left a comment

Choose a reason for hiding this comment

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

Nice work on a quick turn around!

I did a git pull origin on your branch and confirmed I'm on your latest commit:

 git rev-parse --short HEAD
69a6547a

However, the issue still persists when I follow the steps to reproduce. Could you please take another look?

I took a video of my test steps in case I'm skipping something important. Let me know if I am!

Video showing test failing

Screencast.From.2025-12-11.13-36-12.mp4

@cliftonmcintosh
Copy link
Contributor Author

Interesting. FWICT, it only seems to hang when inside a tab block. In my testing earlier, I had added the test link outside of the tab, not inside of it.

Today I have tested placing the test link in other places:

  • before the section that the fragment references
  • inside different blocks (a callout block and a steps)
  • between tab blocks
  • inside a different tab block

It hangs in both tab blocks but nowhere else. When I roll back to commit 60ee295, which skips fragment validation for self-referencing links, it also still hangs when the self-referencing link is in a tab block, but not in the other situations.

I can continue to try to explore fixes. Or we can document this shortcoming somewhere.

Copy link
Contributor

@mrjones-plip mrjones-plip left a comment

Choose a reason for hiding this comment

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

Thanks for the research! And wow - what luck that we found it then, as that's a very narrowly defined failure mode. Let's leave it as is (failing only inside a tab block) and then document this caveat.

Approving now knowing you'll add the note in the readme.

I'll get someone else to do the final review!

@mrjones-plip mrjones-plip requested a review from witash December 12, 2025 21:52
@mrjones-plip
Copy link
Contributor

@witash - you feeling like diving into some docs trickery? Tagged you in for a review, but lemme know if it's not a fit and I can grab someone else!

@cliftonmcintosh
Copy link
Contributor Author

Let's leave it as is (failing only inside a tab block) and then document this caveat.

We probably want to remove my commits that tried to fix it, then. I'll revert the last two commits, verify that this still only happens in a tab block, and then add documentation.

@cliftonmcintosh
Copy link
Contributor Author

@witash - you feeling like diving into some docs trickery? Tagged you in for a review, but lemme know if it's not a fit and I can grab someone else!

@witash

I've made updates and I believe this is ready for review.

@mrjones-plip
Copy link
Contributor

Thanks again for your help on this @cliftonmcintosh ! It looks like most folks are signing off for the holiday break. We might ship this week, but likely will wait 'til the start of the new year.

Copy link
Member

@andrablaj andrablaj left a comment

Choose a reason for hiding this comment

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

Thanks for the massive work @cliftonmcintosh! ✨

Added two minor non-blocking comments about the README.

Co-authored-by: Andra Blaj <[email protected]>
@mrjones-plip mrjones-plip merged commit 9fd6c69 into medic:main Dec 18, 2025
1 check passed
@mrjones-plip
Copy link
Contributor

@cliftonmcintosh - thanks so much for a great PR! I'm excited to be able to merge this before years end so we can start off the new year with a clean slate of all good links!

Medic will be mostly closed until Jan 5th - see you then!

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.

Automatic link checking not working with markdown links

4 participants