EarshotPodcast WordPress Theme
The waveform is the real file, and the search reads the transcripts — down to the second.
Open live preview ↗
Overview
Who it is for
Earshot is for a podcast or a small podcast network — one show or several, with a back catalogue big enough that finding things in it has become the problem. It is not a generic blog theme with a play button bolted on.
Two failures, both fixed properly
Almost every podcast website has the same two faults. The scrub bar is a picture of a waveform that belongs to no particular episode, so it tells a listener nothing about where they are. And an hour of conversation is unsearchable, so everything anybody said is effectively lost the day after it goes out.
The waveform is measured, in the editor’s own browser
Attach an audio file to an episode and press Measure waveform. The browser fetches the file, decodes it with the Web Audio API — a real decoder, the same one that plays it — reduces it to four hundred loudness readings, and stores them with the post. What appears on the page afterwards is the shape of that file: where the quiet bits are, where somebody laughs, where the music bed comes in.
This means no ffmpeg, no exec() and no shell on the server, which most hosts do not offer and none should need; and no third-party waveform service, so an episode’s audio is never uploaded anywhere else. It is done once, at edit time, not on every page view.
Loudness is RMS rather than peak-hold, and the difference is the whole point: a peak-hold reading is dominated by single-sample transients, so a peak-hold waveform of speech comes out looking like a flat wall. RMS tracks loudness as heard, which is what makes a conversation’s shape visible at all.
If an episode is never measured, the theme draws a plain bar. It does not invent a shape — a plausible-looking waveform is worse than none, because it tells a listener there is something quiet at twelve minutes when there is not.
The transcript is searchable, and it seeks
Paste whatever your transcription tool produced. The parser takes a timecode, an optional speaker and the line, because every transcription tool on earth already emits something close to [00:04:12] Alma: and that was the argument. No proprietary block, no import step.
Site search then reads those transcripts as well as titles and descriptions, and a result links to the second the phrase was spoken rather than to the top of a ninety-minute file. Clicking any line of a transcript moves the playhead, and the line being spoken highlights as it plays.
One player for the whole page
A single audio element serves the entire site. Every episode row, the hero player and every transcript cue drive it, so pressing play on a second episode stops the first rather than leaving two voices talking over each other — which is exactly what happens when a separate player is dropped into every card. The scrub bar is a genuine slider: arrow keys seek, Home and End work, and the operating system’s lock screen shows the episode rather than “unknown”.
A room, not a spectrum analyser
The background is deliberately not an audio visualiser. It is the place these conversations are actually recorded: a wall of acoustic wedge foam in raking light, rendered as a real height field. The wedges are square pyramids, so the surface normal comes from the geometry rather than from noise and each face catches the light the way a flat face does. Parallax occlusion means near ridges genuinely hide the troughs behind them where the wall is seen at a glancing angle, and every wedge has its own height so it never reads as a tiled image.
Degrades honestly
One full-screen fragment shader, no textures. The theme measures its own frame time on the median rather than the mean and steps down through lower render resolutions one rung at a time; at the bottom of the ladder it stops animating and leaves the last frame on screen. With prefers-reduced-motion it paints a single still frame and never starts a loop. Without WebGL2 the page renders on plain dark ground and nothing else changes.
With scripting off, the waveform is still there — it is inline SVG, so the shape is in the markup — and the transcript is still readable with its timecodes.
What is in the box
- Episodes with number, audio (uploaded or an external URL), measured waveform, measured duration, guests and transcript.
- Shows as a taxonomy, so a network runs several under one roof.
- People for hosts and regulars.
No page builder, no ACF, no build step, no audio library, no player framework and no iframe. The only bundled binaries are two variable fonts, both under the SIL Open Font License and self-hosted, so listening to a show does not report the listener to anyone.
What's included
- Full theme source — every template, style sheet & script
- One-click demo importer (idempotent, no page builder)
- Live Customizer controls for copy, colours & content
- Translation-ready .pot file + RTL stylesheet
- HTML documentation + a CHANGELOG file
- Lifetime updates + 6 months support (renewable)
Specifications
| WordPress | 5.6 – 7.0 |
|---|---|
| PHP | 8.0 – 8.3 |
| Browsers | Chrome, Firefox, Safari, Edge (latest) |
| Layout | Fully responsive, mobile → desktop |
| Localization | Translation-ready · RTL included |
| Accessibility | Keyboard-navigable · prefers-reduced-motion |
| Page builder | Not required — native Customizer |
| License | GNU GPL v2 · single-site commercial |
Release
The complete, dated version history ships in the theme’s CHANGELOG file. Every purchase includes lifetime access to future updates.