Calculate the estimated read time for content.


Read Time is a lightweight Craft CMS plugin that calculates the estimated reading time for your content. Whether you're running a blog, news site, or content-heavy publication, it gives your readers a quick "X min read" estimate so they know what to expect before they dive in. Just point it at your entries, Matrix, or Neo fields and it handles the rest—counting words and converting them into clean, human-readable reading times. You can fine-tune the calculation to match your audience by adjusting the average reading speed in a simple config file, and access the results anywhere in your templates through easy-to-use Twig filters and functions.

Usage

Using the Filter

The |readTime filter returns a TimeModel of how long it takes the average user to read the provided content. The value provided can be a string or an array of values.

Seconds are included by default, but can be disabled by using |readTime(false) — this only affects the human time format.

{{ string|readTime }}
{# Returns: 30 seconds #}

{{ richTextField|readTime }}
{# Returns: 2 minutes, 40 seconds #}

{{ richTextField|readTime(false) }}
{# Returns: 3 minutes #}

Using the Function

The readTime() function returns a TimeModel for the whole entry (based on its field layout) or for a block field passed directly.

Seconds are included by default, but can be disabled by passing false as a second parameter — this only affects the human time format.

{{ readTime(entry) }}
{{ readTime(entry.matrixField.all()) }}

{{ readTime(entry, false) }}
{{ readTime(entry.matrixField.all(), false) }}

Supported Field Types

When you pass an entry to readTime(), the plugin walks its field layout and counts the content of each field, recursing into nested-block fields:

Field typeNotes
Plain text / rich text (e.g. Redactor, Plain Text)Counted directly.
Matrix (native)On Craft 5, Matrix blocks are entrified — each block is an Entry element. Their nested fields are walked recursively.
Neo (spicyweb/craft-neo)Each Neo block's fields are walked recursively.
Vizy (verbb/vizy)Rich-text content is counted and Vizy blocks' nested fields are walked recursively.
CKEditor (craft/ckeditor)The editor's rich-text content is counted, plus the content of any entries embedded inside the field.

Neo, Vizy, and CKEditor are treated as optional, soft dependencies — the plugin loads and computes read time fine on sites that don't have them installed.

Super Table is no longer supported. It does not exist for Craft 5, so it has been removed from the Craft 5 code path. Super Table support remains in the Craft 4 (2.x) line.

TimeModel

Both the filter and the function return a TimeModel. Output it directly for a human-readable duration, or read one of its properties for a specific value:

{% set time = readTime(entry) %}

{{ time }}          {# 2 minutes, 40 seconds #}
{{ time.human }}    {# 2 minutes, 40 seconds #}
{{ time.seconds }}  {# 160 #}
{{ time.minutes }}  {# 2 #}
{{ time.hours }}    {# 0 #}
PropertyReturns
time / time.humanThe human-readable duration.
time.secondsThe total number of seconds.
time.minutesThe total number of whole minutes.
time.hoursThe total number of whole hours.

You can also format the duration as a DateInterval by passing a format string to interval():

{{ time.interval('%h hours, %i minutes, %s seconds') }}  {# 0 hours, 2 minutes, 40 seconds #}

Overriding Plugin Settings

The average user read speed is set at 200 words per minute by default. This can be changed in the plugin settings, or overridden with a config file.

If you create a config file in your config folder called read-time.php, you can override the plugin's settings in the Control Panel. Since that config file is fully multi-environment aware, this is a handy way to have different settings across multiple environments. An example is included at config/read-time.php.

<?php

return [
    'wordsPerMinute' => 200,
];
Installation Instructions

To install this plugin, copy the command above to your terminal.

Reviews

This plugin doesn't have any reviews.

Active Installs
278
Version
3.1.0
License
MIT
Compatibility
Craft 3, Craft 4, Craft 5
Last release
June 13, 2026
Activity (30 days)
9
Closed Issues
0
Open Issues
8
Merged PRs
0
Open PRs