What's the right way to create a simple blog in Craft? Should I create a Single for the blog home page content (/blog) and then a Channel to hold the entries (/blog/{slug})?

The blog index page also needs to have non blog entries on, i.e. intro text describing what the blog is about.
A Channel called Blog as follows:


Entry URL Format: blog/{slug}
Entry Template: blog/_entry


In blog/_entry.html:

{% extends "_layout" %}
{% set title = "{{ entry.title }}" %}

{% block content %}
    &lt;article&gt;
        &lt;h2&gt;&lt;a href="{{ entry.url }}"&gt;{{ entry.title }}&lt;/a&gt;&lt;/h2&gt;
        {{ entry.body }}
        &lt;p&gt;Written by {{ entry.author }} on {{ entry.postDate|date('M d, Y') }}&lt;/p&gt;
    &lt;/article&gt;
{% endblock %}


You don't need to create a Single for the Blog index page.

You can just create a template file: blog/index.html with:

{% extends "_layout" %}
{% set title = "Blog" %}

{% block content %}
    {% for entry in craft.entries.section('blog').find() %}
        &lt;article&gt;
            &lt;h2&gt;&lt;a href="{{ entry.url }}"&gt;{{ entry.title }}&lt;/a&gt;&lt;/h2&gt;
            {{ entry.body }}
            &lt;p&gt;Written by {{ entry.author }} on {{ entry.postDate|date('M d, Y') }}&lt;/p&gt;
        &lt;/article&gt;
    {% endfor %}
{% endblock %}


EDIT:

If it is a requirement for end users to be able to publish and edit content, other than blog entries, appearing on Blog index page via the CP, then a Single is the way to go.


Create custom field(s).
Create Single called Blog Index, or Blog Homepage, or something other than Blog.
Add custom field(s) to Blog Single entry type.
Entry Template: blog/index


In blog/index.html:

{% extends "_layout" %}
{% set title = "Blog" %}

{% block content %}
    {{ entry.customField }}

    {% for entry in craft.entries.section('blog').find() %}
        &lt;article&gt;
            &lt;h2&gt;&lt;a href="{{ entry.url }}"&gt;{{ entry.title }}&lt;/a&gt;&lt;/h2&gt;
            {{ entry.body }}
            &lt;p&gt;Written by {{ entry.author }} on {{ entry.postDate|date('M d, Y') }}&lt;/p&gt;
        &lt;/article&gt;
    {% endfor %}
{% endblock %}