=== Readerr ===
Contributors: readerr
Tags: text to speech, audio, tts, accessibility, audio player
Requires at least: 6.9
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 0.7.7
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Let readers listen to your articles: natural AI-read audio for your posts, in a light, cookie-free player.

== Description ==

Readerr turns your published posts into MP3s read by an AI voice - posts that are long enough (1,500 characters by default) and have audio switched on - and shows a light player above or below the post, or wherever you place the Readerr block or the `[readerr_player]` shortcode.

**Readerr is a paid service with a free trial.** The audio is made and hosted by the Readerr service, so you need a Readerr account and an API key: sign up at https://readerr.app/app/signup. Plans and prices: https://readerr.app/pricing.

What makes it different from plugins that read the page aloud in the visitor's browser:

* The audio is made once, in advance, and saved as an MP3, so visitors need no browser voice.
* The text is prepared before it is read, so numbers, dates, abbreviations and names come out right in Polish, German, French and English.
* A visible "read by AI" label sits in the player, in the language of the article.
* The player sets no cookies and uses no localStorage or sessionStorage. Audio loads only after the reader presses play (`preload="none"`).
* Updating a published post keeps its current audio by default. Ask for new audio in the editor with one checkbox, or switch the default in the settings. A new voice always makes new audio.
* A per-post audio switch and voice, a player colour, and optional audio for scheduled posts.
* Posts protected by a password are never sent to the service and never get a player.

= Trial, plans and what the plugin does =

The plugin has no licence key and no usage limit of its own. It sends your posts to the Readerr service and shows the audio that comes back. Your plan in your Readerr account sets how much you can convert. When the trial or plan ends and a 7-day grace period has passed, the plugin stops showing the players for that account. It also hides them if it could not confirm your account for 7 days (for example WP-Cron is off or the Readerr API was unreachable), and at once if the service rejects the API key (for example a revoked or wrong key). Nothing in WordPress is locked; the players come back when you choose a plan or the check succeeds again.

= The "read by AI" label =

The label says the audio is AI-generated and names the provider (in English: "AI-generated audio (Readerr) - may contain errors", translated into the article's language). It is an AI disclosure, not an advertisement and not a link, and it stays visible on every player.

== External services ==

This plugin is an interface to the Readerr service, operated by IT Busters Marcin Rybak, Poland (https://readerr.app). Without a Readerr account and an API key it does nothing: until you save an API key in Settings > Readerr, no post data leaves your site, the plugin makes no calls to the API, and nothing is loaded from Readerr servers.

**Readerr API (api.readerr.app)** makes the audio.

* What is sent: the post ID, title, content (HTML), permalink, the article language from the plugin settings and the chosen voice, together with your API key. Every request has a User-Agent such as `Readerr-WordPress/0.7.6 WordPress/7.1 PHP/8.3` (your versions), so support knows what your site runs. Like any request, it also shows your server's IP address.
* When: after a post is published, after its voice changes, after it is updated and you ask for new audio (or set new audio on every update in the settings), and for scheduled posts only if you enable it in the settings. The plugin also asks the API for the status of each post's audio until it is ready, checks your account status and quota once a day and when you open the settings, fetches the list of voices in the post editor and on the settings screen, and tells the API to delete the audio when a post is trashed, deleted, set to a password or unpublished.
* The service prepares the text for speech with an AI model (Google Gemini) and deletes the article text once the audio is ready. If the audio fails or is held for review, the text is kept at most 30 days after the last attempt.

**Readerr CDN (cdn.readerr.app)** delivers the player and the audio.

* The reader's browser loads the player script (`player.js`) from the CDN on pages that show a player, and the MP3 file only after the reader presses play. Once an API key is saved, the same script is loaded on the plugin's settings screen in your admin, for the colour preview, and a sample recording is fetched there when you press play in the preview.
* The "Listen" button next to the default voice on the settings screen loads a sample of that voice, only when you click it.
* The CDN is served through Cloudflare and receives the usual request data a browser sends (IP address, user agent).

**Listening statistics (beacon.readerr.app)** count plays.

* Sent from the reader's browser, only after the reader presses play: the event (play, and 25, 50, 75 and 95 percent of the audio), the audio file path, the language, the post ID and the site's host name.
* No cookies, no local storage, no session or user identifier. The service stores no IP address, user agent or country with the events. Events are kept in Cloudflare Analytics Engine for 3 months and as daily totals in the service.

For each service: Terms of service https://readerr.app/terms, Privacy policy https://readerr.app/privacy. Data processing agreement: https://readerr.app/dpa

The plugin adds suggested privacy policy text under Settings > Privacy > Policy Guide; if you use it, mention the listening statistics.

== Source code and libraries ==

* Action Scheduler (https://github.com/woocommerce/action-scheduler, GPL-3.0-or-later) is bundled in `vendor/` and runs the plugin's background jobs.
* The plugin's own JavaScript (`assets/editor-sidebar.js`, `assets/block-player.js`) ships as readable source, with no build step.
* The player script is part of the hosted Readerr service, loaded from cdn.readerr.app and not bundled here.

== Installation ==

1. Install and activate the plugin.
2. Create an account at https://readerr.app/app/signup and add your site.
3. Copy the API key from your Readerr panel to Settings > Readerr, choose the language, and save. Saving the key connects the site to the Readerr service. The default voice is set in your Readerr panel; the settings screen only shows it.
4. Publish a post. The audio appears when it is ready, usually within a few minutes.

== Frequently Asked Questions ==

= Does the player slow down my pages? =

No. The player script is small and deferred, and the audio file is not downloaded until the reader presses play.

= Can I remove the "read by AI" label? =

No. The label is part of the player and stays visible on every site.

= What happens when my trial or subscription ends? =

After a grace period of 7 days the plugin stops showing the players and the service makes no new audio. The players are also hidden when the account check has not succeeded for 7 days, or when the API key is rejected. Nothing else in WordPress changes, and the players come back when you choose a plan or the check succeeds again.

= Which parts of a post are read aloud? =

Paragraphs, headings, lists and quotes. Custom HTML, embeds, buttons, galleries and blocks from other plugins are skipped, so a promo box or carousel stays silent and costs no characters. To skip any other block, select it, open Advanced in the block settings and add `readerr-skip` to "Additional CSS class(es)". In the classic editor, add `class="readerr-skip"` to the element.

= Does a dictionary change re-generate old audio? =

No. Audio is made again only when you ask for it on an update, when the post's voice changes, or when the settings say so for every update.

= Are password-protected posts converted? =

No. A post with a password is never sent to the service and shows no player. If a post that already has audio gets a password, its audio is deleted.

= What does uninstalling remove? =

Deleting the plugin removes its settings, API key, cached data and scheduled jobs. The audio links of posts with ready audio are kept, so installing the plugin again finds that audio. Posts whose audio was not ready get sent again on their next save. Removing the plugin does not delete audio on the CDN: if you trashed a post and removed the plugin within minutes, its audio may stay until you ask support to delete it.

== Screenshots ==

1. The settings screen: API key, language, voice, player position and colour, with a preview.
2. The post editor panel: audio switch, voice, estimated cost and audio status.
3. The player on a post, with the "read by AI" label.
4. The Readerr block in the block editor, to place the player where you want it.
5. The top of the settings screen: characters used this period, and the notice shown after a trial ends.

== Changelog ==

= 0.7.7 =
* Requires WordPress 6.9 or later (Action Scheduler 4.2.0).
* Translations now come from translate.wordpress.org; the plugin no longer ships its own translation files.

= 0.7.6 =
* Password-protected posts are never sent and show no player; a post with audio that gets a password has its audio deleted.
* Deleting the plugin removes its settings, API key, cached data and scheduled jobs. Posts that were password-protected before this version have their audio deleted once, in the background.
* A note next to the API key says that saving it connects the site to Readerr, and the plugin suggests privacy policy text. The colour preview on the settings screen appears only after you save an API key.
* The player script carries the plugin version; the editor's switch, voice and update choice are no longer readable by visitors in the REST API.

Older versions: see changelog.txt.

== Upgrade Notice ==

= 0.7.7 =
Requires WordPress 6.9 or later.
