RiffPress / Developers
Built to be extended
Riff is built the way a feature plugin is: one track shape everywhere, read through WordPress's own APIs, with a public surface that is written down and kept. Everything below is stable within a major version.
Hooks
Every filter and action, with its parameters and the line it fires on, is in the hooks reference. It is generated from the plugin's own docblocks and checked in CI, so it cannot drift from the code. Set the accent from a theme's theme.json, add chips under Now Playing or controls to the bar, redraw a cover, or turn the player off on a page.
JavaScript
window.riff is the player's API. Actions and filters through wp.hooks, and riff:* events on the player's root, announce every change of state: what is playing, what is queued, what a press did. The JavaScript reference has every one.
REST and GraphQL
The REST API gives each audio and video item in wp/v2/media a riff_track. riff/v1/library lists the posts with tracks and riff/v1/library/{id} opens one with its tracks and rendered blocks; both describe themselves on OPTIONS. With WPGraphQL active, MediaItem.riffTrack and Post.riffTracks. All of it shares one schema, Riff\Tracks::schema(), versioned and held to after the riff_track filter.
Your own tracks
Tracks come from registered sources. The core source reads the audio, video and playlist blocks in posts. A plugin adds its own post type or catalogue by implementing Riff\Source and calling Riff\Sources::register() on init, or through the riff_sources filter, and the library, the REST route and the player read it like any other. The readme's Developers section spells out the interface and the stability promise.
Theming
The player and the Listen block expose custom properties, --riff-accent, --riff-bg and the rest, listed in the readme. A theme sets the accent under settings.custom.riff.accent in theme.json; any plugin can through riff_accent.
Under the hood
Each browser API and CSS feature the player calls has a page of its own: how Riff uses it, why, what happens without it, and the exact lines in the source at the commit that was published.
The code
No build step: the shipped files are the source. The repository has the contributing guide, the test suites, and a Playground blueprint for a scratch site with the demo on it.