title: Sitemap --- summary: Quick demo of how to build a custom sitemap.xml. --- body: If you want to have a `sitemap.xml` file for search engines this is something you can very easily create yourself. All you need for that is a contents file and a custom template. ## Contents File First we need to create a contents file. Since `sitemap.xml` always goes into the same location we create a folder called `sitemap.xml` inside our `content` folder and add a `contents.lr` file with the following data: ``` _template: sitemap.xml ---- _model: none ``` This instructs Lektor to use the template `sitemap.xml` for this page. We also give it the empty `none` model for good measure. ## Template File The template loaded will be `templates/sitemap.xml`. In this file we just iterate over all pages of the site recursively. This also automatically skips hidden pages so those will not be generated out. ```xml+jinja <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> {%- for page in [site.root] if page != this recursive %} <url><loc>{{ page|url(external=true) }}</loc></url> {{- loop(page.children) }} {%- endfor %} </urlset> ``` Note that because sitemaps need to have external URLs (with scheme and everything) you will need to configure the `url` of the site before the template starts working. For more information see [Project File :ref](../../project/) ## Human Readable Sitemap But what if you want a beautiful sitemap as a tree for human reading? This is not any harder. Instead of making a `sitemap.xml/contents.lr` file just create a `sitemap/contents.lr` file instead and use a template like `sitemap.html`. Then use something like this: ```html+jinja {% extends "layout.html" %} {% block title %}Sitemap{% endblock %} {% block body %} <ul class="sitemap"> {% for page in [site.root] recursive if page.record_label %} <li><a href="{{ page|url }}">{{ page.record_label }}</a> {% if page.children %} <ul>{{ loop(page.children) }}</ul> {% endif %} {% endfor %} </ul> {% endblock %} ```