WP Manifestindependent plugin directory
manifest / performance / hearpost

Hearpost

A floating "Listen to this article" widget for WordPress, powered entirely by the visitor's own browser. No API keys, no external text-to-speech services, no ongoing cost.

★ 0stars

Install

Download source zip No release zip yet

This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/pathmaka/hearpost/archive/refs/heads/main.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

A floating "Listen to this article" widget for WordPress, powered entirely by the visitor's own browser. No API keys, no external text-to-speech services, no ongoing cost.

Features

  • Floating widget — collapses to a small icon; click to expand into the full player
  • Play / Pause toggle, with a Speed slider (0.5x–2x)
  • Voice selector — automatically shown only when the visitor's browser actually offers more than one voice; hidden entirely otherwise
  • Six position presets — Top Left, Top Right, Middle Left, Middle Right, Bottom Left, Bottom Right
  • Customizable icon color via a native WordPress color picker
  • Customizable widget title, also shown as a hover tooltip on the collapsed icon
  • [hearpost_reader] shortcode for manual placement, if you'd rather not auto-insert it everywhere
  • Reset to Defaults button to wipe customizations and start over
  • Fully self-contained icon (inline SVG) — no external requests, not even to WordPress's own emoji CDN

Screenshots

Collapsed widget Expanded widget Settings page Settings page

Installation

  1. Download or clone this repo
  2. Upload the folder to /wp-content/plugins/ so the path looks like:
    /wp-content/plugins/hearpost/hearpost.php
  3. Activate Hearpost from the Plugins screen
  4. Configure it at Settings → Hearpost

Alternatively, zip the plugin folder (named hearpost) and install it via Plugins → Add New → Upload Plugin.

Settings (Settings → Hearpost)

Setting Description
Enable on Choose whether the widget appears on Posts, Pages, or both
Widget Toggle automatic insertion on/off. If disabled, place it manually with the [hearpost_reader] shortcode — it still floats at the position chosen below regardless of where the shortcode is placed
Position Where the widget floats: Top/Middle/Bottom × Left/Right (6 options)
Icon color Background color of the icon and Play button, via a standard color picker
Default speed Initial playback speed (0.5x–2x) before a visitor adjusts the slider
Widget title The text shown inside the expanded panel and as the hover tooltip on the collapsed icon
Reset to Defaults Wipes all of the above back to their original defaults (asks for confirmation first)

Shortcode

[hearpost_reader]

Use this on any singular post or page if you've turned off automatic insertion but still want the widget on that specific piece of content.

Requirements

  • WordPress 5.8 or later
  • PHP 7.4 or later
  • No requirements on the visitor's side beyond a browser that supports the Web Speech API (all major modern browsers do, to varying degrees of voice quality)

How It Works

The widget extracts the plain text of a post/page server-side, then hands it to the visitor's own browser via the Web Speech API (SpeechSynthesisUtterance). Nothing is sent to any external server — the entire reading happens locally in the visitor's browser.

Notes & Limitations

  • Voice availability is entirely browser/OS-dependent. Desktop Chrome tends to offer several voices; some mobile browsers offer only one (or none) — in the latter case, the Voice dropdown is automatically hidden.
  • Changing speed or voice mid-playback resumes from roughly the last spoken word (tracked via the browser's boundary events) rather than restarting from the top — but this depends on the browser/voice actually firing those events. When it isn't supported, it falls back to restarting from the beginning.
  • Closing the widget (×) does not pause or stop playback — it keeps reading in the background, the same way a minimized media player would. Reopening the panel reflects the correct Play/Pause state.
  • Some browsers' built-in voices (e.g. certain Chrome "network" voices) stream over the internet in the background as an inherent part of how the browser implements them — this is outside the plugin's control either way.

Changelog

  • 1.0.0 — Initial release
    • Floating widget (collapsible icon → expands to full player)
    • Play/Pause toggle with adjustable speed (0.5x–2x slider)
    • Optional voice selector, shown only when the browser offers more than one voice
    • Six position presets, customizable icon color, and customizable widget title
    • [hearpost_reader] shortcode for manual placement
    • Reset to Defaults option
    • Self-contained inline SVG icon (no external requests)

License

Licensed under the GPL v2 or later, the same license as WordPress itself.

Author

Pathmaka Galappaththi www.linkedin.com/in/pathmaka

Credits

Built with the help of Claude (Anthropic).