{"id":13573399,"url":"https://github.com/backstage/mkdocs-techdocs-core","last_synced_at":"2025-11-12T22:38:17.989Z","repository":{"id":39904307,"uuid":"309646141","full_name":"backstage/mkdocs-techdocs-core","owner":"backstage","description":"The core MkDocs plugin used by Backstage's TechDocs as a wrapper around multiple MkDocs plugins and Python Markdown extensions","archived":false,"fork":false,"pushed_at":"2025-11-11T22:02:17.000Z","size":380,"stargazers_count":103,"open_issues_count":2,"forks_count":76,"subscribers_count":12,"default_branch":"main","last_synced_at":"2025-11-12T00:10:08.319Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/backstage.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-11-03T10:13:07.000Z","updated_at":"2025-11-07T02:21:20.000Z","dependencies_parsed_at":"2023-11-25T20:26:26.714Z","dependency_job_id":"b00588a6-18c9-43c3-876c-0abc0f230427","html_url":"https://github.com/backstage/mkdocs-techdocs-core","commit_stats":{"total_commits":102,"total_committers":29,"mean_commits":"3.5172413793103448","dds":0.7745098039215687,"last_synced_commit":"c45280572c590e33ff5bbd82edede53830fdf9bb"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/backstage/mkdocs-techdocs-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/backstage%2Fmkdocs-techdocs-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/backstage%2Fmkdocs-techdocs-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/backstage%2Fmkdocs-techdocs-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/backstage%2Fmkdocs-techdocs-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/backstage","download_url":"https://codeload.github.com/backstage/mkdocs-techdocs-core/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/backstage%2Fmkdocs-techdocs-core/sbom","scorecard":{"id":222691,"data":{"date":"2025-08-11","repo":{"name":"github.com/backstage/mkdocs-techdocs-core","commit":"0f415d64eb658b43d154ffd8586dbcc6bdd73148"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.8,"checks":[{"name":"Code-Review","score":7,"reason":"Found 3/4 approved changesets -- score normalized to 7","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"20 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automate-stale.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/automate-stale.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/lint.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/lint.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/manual-versioning.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/manual-versioning.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/manual-versioning.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/manual-versioning.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/manual-versioning.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/manual-versioning.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/pypi-publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/pypi-publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/pypi-publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/validate-renovate.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/validate-renovate.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/validate-renovate.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/backstage/mkdocs-techdocs-core/validate-renovate.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/pypi-publish.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:21","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:22","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:31","Info:   0 out of   9 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned","Info:   0 out of   4 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/manual-versioning.yml:21","Warn: no topLevel permission defined: .github/workflows/automate-stale.yml:1","Warn: no topLevel permission defined: .github/workflows/lint.yml:1","Warn: no topLevel permission defined: .github/workflows/manual-versioning.yml:1","Warn: no topLevel permission defined: .github/workflows/pypi-publish.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Warn: no topLevel permission defined: .github/workflows/validate-renovate.yml:1"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/pypi-publish.yml:11"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T02:57:51.068Z","repository_id":39904307,"created_at":"2025-08-17T02:57:51.068Z","updated_at":"2025-08-17T02:57:51.068Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284122919,"owners_count":26951149,"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-11-12T02:00:06.336Z","response_time":59,"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":[],"created_at":"2024-08-01T15:00:34.240Z","updated_at":"2025-11-12T22:38:17.981Z","avatar_url":"https://github.com/backstage.png","language":"Python","readme":"# mkdocs-techdocs-core\n\nThis is the base [Mkdocs](https://mkdocs.org) plugin used when using Mkdocs with Spotify's [TechDocs](https://backstage.io/docs/features/techdocs/techdocs-overview). It is written in Python and packages all of our Mkdocs defaults, such as theming, plugins, etc in a single plugin.\n\n[![Package on PyPI](https://img.shields.io/pypi/v/mkdocs-techdocs-core)](https://pypi.org/project/mkdocs-techdocs-core/)\n\n## Usage\n\n\u003e Requires Python version \u003e= 3.8\n\n```bash\n$ pip install mkdocs-techdocs-core\n```\n\nOnce you have installed the `mkdocs-techdocs-core` plugin, you'll need to add it to your `mkdocs.yml`.\n\n```yaml\nsite_name: Backstage Docs\n\nnav:\n  - Home: index.md\n  - Developing a Plugin: developing-a-plugin.md\n\nplugins:\n  - techdocs-core\n```\n\n(Optional) To use material theme search to generate the `search/search_index.json` (responsible for the search functionality in the TechDocs reader), you need to add the following configuration to your `mkdocs.yml`:\n\n```yaml\nplugins:\n  - techdocs-core:\n      use_material_search: true\n```\n\n(Optional) To use [PyMdown Blocks Extensions](https://facelessuser.github.io/pymdown-extensions/extensions/blocks/) (replaces `admonitions`, `pymdownx.details` and `pymdownx.tabbed` extensions), you need to add the following configuration to your `mkdocs.yml`:\n\n```yaml\nplugins:\n  - techdocs-core:\n      use_pymdownx_blocks: true\n```\n\n## Development\n\n### Running Locally\n\nYou can install this package locally using `pip` and the `--editable` flag used for making developing Python packages.\n\n```bash\npip install --editable .\n```\n\nYou'll then have the `techdocs-core` package available to use in Mkdocs and `pip` will point the dependency to this folder.\n\n### Linting\n\nWe use [black](https://github.com/psf/black) as our linter. Please run it against your code before submitting a pull request.\n\n```bash\npip install black\nblack .\n```\n\n**Note:** This will write to all Python files in `src/` with the formatted code. If you would like to only check to see if it passes, simply append the `--check` flag.\n\n### Testing Dependencies End-to-End\n\nIf you have made changes to the plugin itself, or updated a dependency it's\nstrongly recommended to test the plugin.\n\nTo build a version of the `spotify/techdocs` docker image with your changes,\nrun the below script in this repository:\n```bash\n./build-e2e-image.sh\n```\n_The script is only tested on OSX_\n\nThe script assumes that you have the \n[image repository](https://github.com/backstage/techdocs-container) cloned in a\nsibling directory to this repository (or you can specify its location).\n\nIt will build an image called `mkdocs:local-dev` including the changes you \nhave made locally. To test the image in backstage, edit the config (e.g. \n`app-config.yaml`) with the following:\n\n```yaml\ntechdocs:\n  generator:\n    runIn: \"docker\"\n    dockerImage: \"mkdocs:local-dev\"\n    pullImage: false\n```\n\n### Release\n\nIn order to publish a release, you must manually dispatch the [`manual-versioning`](https://github.com/backstage/mkdocs-techdocs-core/actions/workflows/manual-versioning.yml) GitHub Action. Please see the official GitHub documentation on [Manual Workflows](https://docs.github.com/en/actions/how-tos/managing-workflow-runs-and-deployments/managing-workflow-runs/manually-running-a-workflow?tool=webui) for full instructions.\n\n\u003e [!TIP]\n\u003e If you decide to provide an explicit `levelBump`, please respect SemVer. When left empty, PSR will determine the best version bump based on the commits since the previous release. Automatic Versioning does rely on `conventional-commits` which is **not** enforced within this project.\n\nThis project utilizes PSR (Python Semantic Release) to create releases.\nRelease Notes will be generated from commit messages and the [CHANGELOG.md](CHANGELOG.md) will be automatically updated with all commits since the previous release.\n\n## MkDocs plugins and extensions\n\nThe TechDocs Core MkDocs plugin comes with a set of extensions and plugins that mkdocs supports. Below you can find a list of all extensions and plugins that are included in the\nTechDocs Core plugin:\n\n**Plugins**:\n\n- [search](https://www.mkdocs.org/user-guide/configuration/#search): A search plugin is provided by default with MkDocs which uses [lunr.js](https://lunrjs.com/) as a search engine.\n- [mkdocs-monorepo-plugin](https://github.com/backstage/mkdocs-monorepo-plugin): This plugin enables you to build multiple sets of documentation in a single MkDocs project. It is designed to address writing documentation in Spotify's largest and most business-critical codebases (typically monoliths or monorepos).\n\n**Extensions**:\n\n- [admonition](https://squidfunk.github.io/mkdocs-material/reference/admonitions/#admonitions): Admonitions, also known as call-outs, are an excellent choice for including side content without significantly interrupting the document flow. Material for MkDocs provides several different types of admonitions and allows for the inclusion and nesting of arbitrary content.\n- [toc](https://python-markdown.github.io/extensions/toc/): The Table of Contents extension generates a Table of Contents from a Markdown document and adds it into the resulting HTML document.\n  This extension is included in the standard Markdown library.\n- [pymdown](https://facelessuser.github.io/pymdown-extensions/): PyMdown Extensions is a collection of extensions for Python Markdown.\n  All extensions are found under the module namespace of pymdownx.\n  - caret: Caret is an extension that is syntactically built around the ^ character. It adds support for inserting superscripts and adds an easy way to place \u003cins\u003etext\u003c/ins\u003e in an \u003c_ins_\u003e tag.\n  - critic: Critic adds handling and support of Critic Markup.\n  - details: Details creates collapsible elements with \u003c_details_\u003e and \u003c_summary_\u003e tags.\n  - emoji: Emoji makes adding emoji via Markdown easy 😄.\n  - superfences: SuperFences is like Python Markdown's fences, but better. Nest fences under lists, admonitions, and other syntaxes. You can even create special custom fences for content like UML.\n  - inlinehilite: InlineHilite highlights inline code: from module import function as func.\n  - magiclink: MagicLink linkafies URL and email links without having to wrap them in Markdown syntax. Also, shortens repository issue, pull request, and commit links automatically for popular code hosting providers. You can even use special shorthand syntax to link to issues, diffs, and even mention people\n  - mark: Mark allows you to mark words easily.\n  - smartsymbols: SmartSymbols inserts commonly used Unicode characters via simple ASCII representations: =/= → ≠.\n  - highlight: Highlight allows you to configure the syntax highlighting of SuperFences and InlineHilite. Also passes standard Markdown indented code blocks through the syntax highlighter.\n  - extra: Extra is just like Python Markdown's Extra package except it uses PyMdown Extensions to substitute similar extensions.\n  - tabbed: Tabbed allows for tabbed Markdown content.\n  - tasklist: Tasklist allows inserting lists with check boxes.\n  - tilde: Tilde is syntactically built around the ~ character. It adds support for inserting subscripts and adds an easy way to place text in a \u003c_del_\u003e tag.\n- [markdown_inline_graphviz](https://pypi.org/project/markdown-inline-graphviz/): A Python Markdown extension replaces inline Graphviz definitions with inline SVGs or PNGs.\n  Activate the inline_graphviz extension using the [usage instructions](https://github.com/sprin/markdown-inline-graphviz#usage).\n\n- [plantuml_markdown](https://pypi.org/project/plantuml-markdown/): This plugin implements a block extension which can be used to specify a PlantUML diagram which will be converted into an image and inserted in the document.\n\n  - Note that the format `svg_object` is not supported for rendering diagrams. Read more in the [TechDocs troubleshooting](https://backstage.io/docs/features/techdocs/troubleshooting#plantuml-with-svg_object-doesnt-render) section.\n\n- [mdx_truly_sane_lists](https://pypi.org/project/mdx-truly-sane-lists/): An extension for Python-Markdown that makes lists truly sane. Features custom indents for nested lists and fix for messy linebreaks and paragraphs between lists.\n\n### Other plugins and extensions\n\nNote that the above set of plugins and extensions represents an opinionated\nlist providing a core set of functionality necessary for most technical\ndocumentation needs (hence: `techdocs-core`). PRs introducing new plugins or\nextensions are welcome, but they are not guaranteed to be accepted.\n\nIn order to solve your organization's specific needs, you're encouraged to\ninstall any necessary extensions/plugins in your own environment on top of\n`techdocs-core` (be it the TechDocs backend container, or a custom TechDocs\nbuild container).\n\n## Caveats\n\n## [Changelog](CHANGELOG.md)\n\n### Theme\n\nWe only use `material-mkdocs` as base styles because Backstage also uses the `Material UI` on the client-side. We don't expect people to use themes other than `Material UI` to maintain consistency across all Backstage pages (in other words, documentation pages have the same look and feel as any other Backstage page) and so we use the `BackstageTheme` configured in Front-end application as the source of truth for all application design tokens like colors, typography and etc. So here you can [see](https://github.com/backstage/backstage/blob/master/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/dom.tsx#L160-L692) that some styles will always be overridden regardless of the `mkdocs-material` plugin theme settings and this can cause unexpected behavior for those who override the theme setting in a `mkdocs.yaml` file.\n\n## License\n\nCopyright 2020-2023 © The Backstage Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage\n\nLicensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0\n","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbackstage%2Fmkdocs-techdocs-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbackstage%2Fmkdocs-techdocs-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbackstage%2Fmkdocs-techdocs-core/lists"}