mkdocs-material is a theme compiled from TypeScript, pinned to MkDocs 1.x
Documentation that simply works
At a glance
- What is it?
- Material for MkDocs is a documentation theme for MkDocs, installed with two lines and switched on by naming it in mkdocs.yml, with the front end compiled out of TypeScript and SCSS into a material/ directory that the Python package ships. The search runs in the browser on a lunr index, the runtime dependency list pins mkdocs>=1.6,<2, and the container build has a WITH_PLUGINS flag that decides what goes into the image.
- Who is it for?
- The theme fits a team that writes documentation in Markdown, wants search and a responsive site without running a service. It does not fit a project already on MkDocs 2, since the requirement is capped below 2, and it does not fit a team that expects weekly theme updates, because the release list moves in months rather than days.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 7 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.
Star history
- squidfunk/mkdocs-material27,613 ★ · +98
| Repository | 2026-09-28 | 2026-11-13 |
|---|---|---|
| squidfunk/mkdocs-material | 27.5k | 27.6k |
98 Stars in the last 46 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The theme is a build artefact, and material/ is what ships
Material for MkDocs is a theme, and the repository makes the build pipeline unusually visible. The Node side of the project compiles the front end, and the build script starts by deleting the output directory and then running the build tool with an optimize flag:
`rimraf material && ts-node -T tools/build --optimize`
There is a `--all` variant that builds everything, a `--dirty` variant for an incremental build, and a `start` script that combines verbose, all, dirty and watch for development. The lint scripts confirm what the front end is written in, with one check running `tsc --noEmit` and the style checks split into `stylelint "src/**/*.scss"` and `eslint --cache "src/**/*.ts"`.
So the directory the Python package installs, `material/`, is generated from `src/`, and it is present at the repository root, where the container build copies it from. That is the shape to keep in mind when reading this repository: the Python theme and the TypeScript front end are one project with two build halves, not two projects.
Search is a lunr index in the browser, not a service
The runtime JavaScript dependencies in package.json explain how the theme behaves without a backend. `lunr` and `lunr-languages` are the search index and its language support, `fuzzaldrin-plus` does fuzzy matching, and `clipboard`, `focus-visible` and `escape-html` handle copying, keyboard focus styling and escaping. `rxjs` carries the reactive plumbing that keeps a search box and a results list in step.
The consequence is architectural rather than cosmetic. Search runs in the visitor's browser against an index that ships with the built site, so there is no search service to run, no index to keep warm, and no query leaving the machine.
For a reader weighing this against a hosted documentation platform, that is the line to compare on: what the theme needs at runtime is nothing, and what it needs at build time is Python, MkDocs and a Node toolchain.
mkdocs>=1.6,<2 is the pin that will decide your upgrade date
requirements.txt is the most useful file in the repository for a decision, and it is split into two labelled groups. The core requirements are `jinja2>=3.1.6`, `markdown>=3.8.1`, `mkdocs>=1.6,<2`, `mkdocs-material-extensions>=1.3`, `pygments>=2.20.0` and `pymdown-extensions>=11.0.1`. The plugin requirements are `babel>=2.10`, `colorama>=0.4`, `paginate>=0.5`, `backrefs>=5.7.post1` and `requests>=2.33.0`.
The line to look at is `mkdocs>=1.6,<2`. The upper bound is a deliberate ceiling, and it means a project that moves to MkDocs 2 cannot simply bump the theme and carry on; the pin has to change first, and the icon, extension and Python-Markdown packages that surround it move on their own schedules.
The Python floor matters too: pyproject.toml declares `requires-python = ">=3.11"`, and the README says Material for MkDocs requires Python 3.11 or newer. The container image builds on `python:3.11-alpine3.24`.
Two install lines, and a YAML block that names the theme
The quick start in the README is deliberately short. Install the package:
pip install mkdocs-materialThen add the theme to your configuration:
theme:
name: materialThat is the whole installation. Detailed instructions and the configuration options live in the project's own documentation site.
The theme covers the appearance and behaviour of a documentation site, not the content pipeline around it, so a team that needs a different markdown dialect or a different search backend is configuring MkDocs itself rather than this theme.
WITH_PLUGINS decides what the container contains
The Dockerfile in the repository root starts from `python:3.11-alpine3.24` and declares a build argument, `ARG WITH_PLUGINS=true`, which is the switch to look at first. It also sets the package directory and `PYTHONDONTWRITEBYTECODE=1`, then copies exactly four things into the build: the `material` directory, `package.json`, `pyproject.toml` and `README.md`, plus every file matching `*requirements.txt`.
The system packages it installs explain what the build needs rather than what the site needs: `cairo`, `freetype-dev`, `jpeg-dev` and `zlib-dev` for image handling, `git` and `git-fast-import` for version metadata, `pngquant` for compressing image assets, `openssh`, and `tini` as the init process.
So the plugin flag is the difference between an image that carries the plugin requirements and one that does not. A team pinning a base image for their documentation build should decide that explicitly rather than inherit the default.
One version number, kept in the Node manifest
The Python metadata declares its version as dynamic rather than writing a number into pyproject.toml, and the build requirements include `hatch-nodejs-version`, alongside `hatchling`, `hatch-requirements-txt` and `trove_classifiers`, the last with a comment saying it is needed for the `Framework :: MkDocs` classifier. Meanwhile package.json in the repository declares version 9.8.0.
The effect is that the Python package and the TypeScript front end cannot drift apart, because the front end's manifest is the place the version is written. The classifiers reinforce the framing, with an inactive development status (`7 - Inactive`), a web environment, MkDocs as the framework, MIT as the licence, and both JavaScript and Python listed as implementation languages for a project that is really one thing in two languages.
A contributor also has to work in both. The `check` script fans out to a TypeScript check and the style checks, the `fix` scripts mirror them, and the `upgrade` pair uses a version-check tool that only upgrades caret ranges, so the dependency policy is expressed in the scripts rather than in a policy document.
Sponsor tiers on the front page, releases every few months
The README now leads with a warning that Material for MkDocs reaches end of life on May 5, 2027, with critical fixes and security updates continuing until then, and points to Zensical as a maintained successor. Its user list names projects including FastAPI, Pydantic, Ruff, OpenSSL, AWS Copilot and Google Accompanist.
The licence is MIT, and the copyright header carried at the top of requirements.txt and the Dockerfile is the interesting artefact: it spells out the MIT permission notice in full, on every file, which is the convention a project uses when it wants the licence to travel with the source rather than sit in one file.
On maintenance, the repository is not archived and the last push was on 2026-10-30, but the release dates are slower than the commit dates suggest: 9.8.0 on 2026-10-24, 9.7.7 on 2026-07-17, 9.7.6 on 2026-03-19. So the theme moves in months, and a team that expects a documentation theme to be updated every week should plan around that cadence rather than around the commit log.
Editorial conclusion
The theme fits a team that writes documentation in Markdown, wants search and a responsive site without running a service. It does not fit a project already on MkDocs 2, since the requirement is capped below 2, and it does not fit a team that expects weekly theme updates, because the release list moves in months rather than days. Before adopting, note that the README announces end of life on May 5, 2027, with Zensical as the maintained successor, then check your MkDocs version against the `mkdocs>=1.6,<2` pin, and if you build the container, decide explicitly whether WITH_PLUGINS should stay true.
Frequently asked questions
What is mkdocs-material?
It is a documentation framework built on top of MkDocs. You write your documentation in Markdown and it produces a searchable, customisable static site, with support for more than 60 languages, and it is licensed under MIT and published as the mkdocs-material package.
What is MkDocs?
MkDocs is the underlying project that this theme sits on, at mkdocs.org, and the theme requires it explicitly: requirements.txt pins mkdocs>=1.6,<2. So MkDocs is the static site generator, and the theme is what you configure through the theme key in mkdocs.yml.
What is the difference between MkDocs Material and MkDocs itself?
MkDocs builds static sites from Markdown, and Material for MkDocs is the theme layer on top of it. You install the theme with pip and enable it in your configuration by naming it under theme, so the difference is presentation, search and the extra features, not a different site generator.
How do I install mkdocs-material?
Run `pip install mkdocs-material` and add two lines to mkdocs.yml, `theme:` followed by ` name: material`. The project requires Python 3.11 or newer and MkDocs 1.6 or newer but below 2, and the detailed installation instructions are in its own documentation site.
How do I use mkdocs material?
Write your documentation in Markdown, configure the theme through mkdocs.yml. The theme's search runs in the browser using lunr and lunr-languages, so there is no search service to operate.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/squidfunk-mkdocs-material)Star history chart for your README
[](https://hysenlabs.com/projects/squidfunk-mkdocs-material)Was this useful?