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.
Install
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.zipA 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

Installation
- Download or clone this repo
- Upload the folder to
/wp-content/plugins/so the path looks like:/wp-content/plugins/hearpost/hearpost.php - Activate Hearpost from the Plugins screen
- 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
boundaryevents) 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).