Add JSON Feed to a Jekyll Site

I can’t take credit for this – I found the code below (from vallieres) after a quick search for adding feed.json to Jekyll without plugins. The only thing I’ve added is the sitemap front-matter which will exclude the output file from our sitemap.xml

---
layout: null
sitemap:
  exclude: 'yes'
---
{
    "version": "https://jsonfeed.org/version/1",
    "title": "{{ site.title | xml_escape }}",
    "home_page_url": "{{ "/" | absolute_url }}",
    "feed_url": "{{ "/feed.json" | absolute_url }}",
    "description": {{ site.description | jsonify }},
    "icon": "{{ "/apple-touch-icon.png" | absolute_url }}",
    "favicon": "{{ "/favicon.ico" | absolute_url }}",
    "expired": false,
    {% if site.author %}
    "author": {% if site.author.name %} {
        "name": "{{ site.author.name }}",
        "url": {% if site.author.url %}"{{ site.author.url }}"{% else %}null{% endif %},
        "avatar": {% if site.author.avatar %}"{{ site.author.avatar }}"{% else %}null{% endif %}
    },{% else %}"{{ site.author }}",{% endif %}
    {% endif %}
"items": [
    {% for post in site.posts limit:36 %}
        {
            "id": "{{ post.url | absolute_url | sha1 }}",
            "title": {{ post.title | jsonify }},
            "summary": {{ post.seo_description | jsonify }},
            "content_text": {{ post.content | strip_html | strip_newlines | jsonify }},
            "content_html": {{ post.content | strip_newlines | jsonify }},
            "url": "{{ post.url | absolute_url }}",
            {% if post.image.size > 1 %}"image": {{ post.image | jsonify }},{% endif %}
            {% if post.link.size > 1 %}"external_url": "{{ post.link }}",{% endif %}
            {% if post.banner.size > 1 %}"banner_image": "{{ post.banner }}",{% endif %}
            {% if post.tags.size > 1 %}"tags": {{ post.tags | jsonify }},{% endif %}
            {% if post.enclosure.size > 1 %}"attachments": [ {
              "url": "{{ post.enclosure }}",
              "mime_type": "{{ post.enclosure_type }}",
              "size_in_bytes": "{{ post.enclosure_length }}"
            },{% endif %}
            "date_published": "{{ post.date | date_to_xmlschema }}",
            "date_modified": "{{ post.date | date_to_xmlschema }}",
            {% if post.author %}
                "author": {% if post.author.name %} {
                "name": "{{ post.author.name }}",
                "url": {% if post.author.url %}"{{ post.author.url }}"{% else %}null{% endif %},
                "avatar": {% if post.author.avatar %}"{{ post.author.avatar }}"{% else %}null{% endif %}
                }
                {% else %}"{{ post.author }}"{% endif %}
            {% else %}
                "author": {% if site.author.name %} {
                "name": "{{ site.author.name }}",
                "url": {% if site.author.url %}"{{ site.author.url }}"{% else %}null{% endif %},
                "avatar": {% if site.author.avatar %}"{{ site.author.avatar }}"{% else %}null{% endif %}
                }
                {% else %}
                "{{ site.author }}"
                {% endif %}
            {% endif %}
        }{% if forloop.last == false %},{% endif %}
    {% endfor %}
    ]
}