# Customizing Your Theme Altering a theme to suit your needs. --- If you would like to make a few tweaks to an existing theme, there is no need to create your own theme from scratch. For minor tweaks which only require some CSS and/or JavaScript, you can [use the docs_dir](#using-the-docs_dir). However, for more complex customizations, including overriding templates, you will need to [use the theme custom_dir](#using-the-theme-custom_dir) setting. ## Using the docs_dir The [extra_css] and [extra_javascript] configuration options can be used to make tweaks and customizations to existing themes. To use these, you simply need to include either CSS or JavaScript files within your [documentation directory]. For example, to change the color of the headers in your documentation, create a file called (for example) `style.css` and place it next to the documentation Markdown. In that file add the following CSS. ```css h1 { color: red; } ``` Then you need to add it to `mkdocs.yml`: ```yaml extra_css: - style.css ``` After making these changes, they should be visible when you run `mkdocs serve` - if you already had this running, you should see that the CSS changes were automatically picked up and the documentation will be updated. NOTE: Any extra CSS or JavaScript files will be added to the generated HTML document after the page content. If you desire to include a JavaScript library, you may have better success including the library by using the theme [custom_dir]. ## Using the theme custom_dir The [`theme.custom_dir`][custom_dir] configuration option can be used to point to a directory of files which override the files in a parent theme. The parent theme would be the theme defined in the [`theme.name`][name] configuration option. Any file in the `custom_dir` with the same name as a file in the parent theme will replace the file of the same name in the parent theme. Any additional files in the `custom_dir` will be added to the parent theme. The contents of the `custom_dir` should mirror the directory structure of the parent theme. You may include templates, JavaScript files, CSS files, images, fonts, or any other media included in a theme. NOTE: For this to work, the `theme.name` setting must be set to a known installed theme. If the `name` setting is instead set to `null` (or not defined), then there is no theme to override and the contents of the `custom_dir` must be a complete, standalone theme. See the [Theme Developer Guide][custom theme] for more information. For example, the [mkdocs] theme ([browse source]), contains the following directory structure (in part): ```text - css\ - fonts\ - img\ - favicon.ico - grid.png - js\ - 404.html - base.html - content.html - nav-sub.html - nav.html - toc.html ``` To override any of the files contained in that theme, create a new directory next to your `docs_dir`: ```bash mkdir custom_theme ``` And then point your `mkdocs.yml` configuration file at the new directory: ```yaml theme: name: mkdocs custom_dir: custom_theme/ ``` To override the 404 error page ("file not found"), add a new template file named `404.html` to the `custom_theme` directory. For information on what can be included in a template, review the [Theme Developer Guide][custom theme]. To override the favicon, you can add a new icon file at `custom_theme/img/favicon.ico`. To include a JavaScript library, copy the library to the `custom_theme/js/` directory. Your directory structure should now look like this: ```text - docs/ - index.html - custom_theme/ - img/ - favicon.ico - js/ - somelib.js - 404.html - config.yml ``` NOTE: Any files included in the parent theme (defined in `name`) but not included in the `custom_dir` will still be utilized. The `custom_dir` will only override/replace files in the parent theme. If you want to remove files, or build a theme from scratch, then you should review the [Theme Developer Guide][custom theme]. ### Overriding Template Blocks The built-in themes implement many of their parts inside template blocks which can be individually overridden in the `main.html` template. Simply create a `main.html` template file in your `custom_dir` and define replacement blocks within that file. Just make sure that the `main.html` extends `base.html`. For example, to alter the title of the MkDocs theme, your replacement `main.html` template would contain the following: ```django {% extends "base.html" %} {% block htmltitle %}