{"id":14981440,"url":"https://github.com/scivision/linkchecker-markdown","last_synced_at":"2025-08-20T05:17:13.405Z","repository":{"id":37773798,"uuid":"150527584","full_name":"scivision/linkchecker-markdown","owner":"scivision","description":"Python asyncio + aiohttp Markdown *.md  URL link checker: 10,000 files/second","archived":false,"fork":false,"pushed_at":"2025-01-08T04:18:45.000Z","size":90,"stargazers_count":34,"open_issues_count":11,"forks_count":20,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-07-28T09:49:53.865Z","etag":null,"topics":["aiohttp","asyncio","hugo","jekyll","markdown"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/scivision.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-27T04:12:16.000Z","updated_at":"2025-07-26T10:48:07.000Z","dependencies_parsed_at":"2024-06-19T04:11:20.948Z","dependency_job_id":"796b1cc4-ed22-449d-ab5d-15ad11e0570d","html_url":"https://github.com/scivision/linkchecker-markdown","commit_stats":{"total_commits":51,"total_committers":4,"mean_commits":12.75,"dds":"0.11764705882352944","last_synced_commit":"bfbe3ade840eed5b33f03433f2147f6bbf36dc35"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/scivision/linkchecker-markdown","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scivision%2Flinkchecker-markdown","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scivision%2Flinkchecker-markdown/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scivision%2Flinkchecker-markdown/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scivision%2Flinkchecker-markdown/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scivision","download_url":"https://codeload.github.com/scivision/linkchecker-markdown/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scivision%2Flinkchecker-markdown/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271268859,"owners_count":24730026,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-20T02:00:09.606Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aiohttp","asyncio","hugo","jekyll","markdown"],"created_at":"2024-09-24T14:03:34.599Z","updated_at":"2025-08-20T05:17:13.363Z","avatar_url":"https://github.com/scivision.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Linkchecker for Markdown\n\n[![ci](https://github.com/scivision/linkchecker-markdown/actions/workflows/ci.yml/badge.svg)](https://github.com/scivision/linkchecker-markdown/actions/workflows/ci.yml)\n[![PyPI Download stats](http://pepy.tech/badge/linkcheckmd)](http://pepy.tech/project/linkcheckmd)\n\nBlazing-fast (10000 Markdown files per second) Python asyncio using the high-level\n[aiohttp](https://docs.aiohttp.org/)\nlibrary.\nSimple check of links in Markdown .md files only.\nThis tool is very helpful for statically generated Markdown-based sites (e.g. Jekyll and Hugo).\nMarkdown-based\n[MkDocs](https://www.mkdocs.org/)\ndocumentation projects can also benefit.\n\n## Install\n\nfor latest release:\n\n```sh\npython -m pip install linkcheckmd\n```\n\nor for latest development version.\n\n```sh\ngit clone https://github.com/scivision/linkchecker-markdown\n\npip install -e ./linkchecker-markdown\n```\n\n## Usage\n\nThe static site generator does NOT have to be running for these tests.\nThis program looks at the Markdown .md files directly.\n\nIf any local or remote links are determined to be missing, the following happens:\n\n* the file containing the bad link and the link is printed to \"stdout\"\n* the program will exit with code 22 instead of 0 after all files are checked\n\nThe bad links are printed to stdout since the normal operation of this program is to check for errors.\nDue to the fast, concurrent checking and numerous pages checked, there may be diagnostics printed to stderr.\nThat way library error messages can be kept separate from the missing page locations printed on stdout.\n\n\nThe examples assume webpage Markdown files have top-level directory ~/web.\n*If using the linkchecker on an MkDocs documentation project, Markdown files\nare typically found in a `~/docs` directory.*\n\n### Python code\n\n```python\nimport linkcheckmd as lc\n\nlc.check_links(\"~/web\")\n```\n\n### Command-line\n\nThis program may be invoked:\n\n```sh\npython -m linkcheckmd\n```\n\n* Jekyll\n\n    ```sh\n    python -m linkcheckmd ~/web/_posts\n    ```\n\n* Hugo\n\n    ```sh\n    python -m linkcheckmd ~/web/content\n    ```\n\n* MkDocs Documentation\n\n    ```sh\n    python -m linkcheckmd ~/docs\n    ```\n\nThe `-v` `--verbose` options prints the URLs as they are checked.\nObserve that URLs from different markdown files are interleaved, showing the asynchronous nature of this program.\n\n### Benchmark\n\nFor benchmarking and reference, we include a synchronous Requests-based method.\nFor a website with 100+ pages, compare times of:\n\n### Git precommit\n\nSee\n[./examples/pre-commit](./examples/pre-commit)\nscript for a\n[Git hook pre-commit](https://www.scivision.dev/git-markdown-pre-commit-linkcheck)\nPython script.\n\n### Tox and CI\n\nThis program can also be used as a check for bad links during continuous integration\ntesting or when using [`tox`](https://tox.readthedocs.io/).\n\n## Alternatives\n\nStrict anti-leeching methods can cause false positives with this and other link checking programs.\n\nAlternative solutions include:\n\n* asyncio-based web browser interface like Arsenic\n* Go-based [htmltest](https://github.com/wjdp/htmltest).\n* [GitHub Action](https://github.com/marketplace/actions/markdown-link-check) for checking links in Markdown files.\n* Netlify link-check [plugin](https://github.com/munter/netlify-plugin-checklinks#readme)\n* LinkChecker.py: too many false positives/negatives, very slow and only works with HTML.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscivision%2Flinkchecker-markdown","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscivision%2Flinkchecker-markdown","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscivision%2Flinkchecker-markdown/lists"}