Media

Money

Dispatch

Company

How this blog is powered

This blog runs on WAVE. Every post is narrated by WAVE Voice, served from the edge, published to agents as JSON, and re-synthesized only when its words change. Here is the stack, with the URL for each part.

0:00
0:00
WAVE Voice

This blog is a WAVE product running on itself. Every post is read aloud by WAVE Voice in a choice of four narrators, served from the edge, published to agents as JSON, and re-narrated only when its text changes. If a capability works here, it works for a customer. This post lists the parts and the URL for each.

What shipped

Narration. Press play on any post and a narrator reads it. The audio for this post is at /blog/how-this-blog-is-powered.mp3; add a narrator key for a specific voice, for example /blog/how-this-blog-is-powered.alice.mp3. Four narrators, 192 kbps, one render per post per change.

The script is the prose. A synthesis engine mispronounces technical writing by default: x402, did:wave, MoQ, mDNS. Before any text reaches the narrator, a pronunciation lexicon rewrites each term into its spoken form, whole token, longest match first: x402 becomes "x four-oh-two", MoQ becomes "Mock", and any remaining two-to-six-letter acronym is spelled out letter by letter. Number ranges read as spans, so a port range reads "5960 to 5970" rather than a subtraction. The lexicon is one file in the repository, reviewed in the same pull request as the post. Code blocks and diagram nodes are not spoken; every sentence of prose is.

Word timings and captions. Each narration ships with word-level timestamps at /blog/<slug>.<voice>.json and captions derived from them at /blog/<slug>.<voice>.vtt. The in-page highlight follows the voice at any playback speed, and the captions dock to the bottom of the screen when you scroll past the player.

The freshness gate. The spoken text of every post is hashed. When a word changes, the hash changes, that one post is marked stale, and only that post is re-synthesized and re-uploaded. The same hash versions the media URLs and sets dateModified for search and answer engines. Editing one post never re-renders the others.

The agent surface. Every post is available as JSON. /v1/posts lists them with metadata, chapters, and audio URLs; /v1/posts/<slug> returns one post in full, transcript included. /v1/mcp lists the same operations as MCP tools, and /.well-known/mcp.json lets an agent discover them. The transcript is also plain text at /blog/<slug>.txt.

Structured data. Each page embeds BlogPosting JSON-LD with an AudioObject for the narration and the full transcript, plus /feed.xml, /sitemap.xml, and /llms.txt. An answer engine can read the post, cite the audio, or quote the transcript without scraping.

Counts without cookies. Views, listens, and downloads are counted in one strongly consistent counter at the edge. No cookies, no accounts, no third-party script. The counts are public at /blog/_stats and refresh every thirty seconds.

One worker at the edge. Pages render at the edge from markdown in a git repository. Audio lives in object storage. Publishing a post is a pull request that adds one file.

What it means

A narrated knowledge base has the same problem this blog has: keep the audio in step with the text without re-rendering everything on every edit. The freshness gate is the answer, and it is a few hundred lines, not a service. The pattern transfers as is.

A page an agent can read is a page an agent can quote correctly. The JSON surface, the transcript, and the structured data exist so that a model answering a question about WAVE reads what we wrote, in full, rather than a scraped fragment.

Nothing here is a special case. WAVE Voice is the same synthesis a customer calls. The edge is the same edge every WAVE surface runs on. The blog is the reference deployment, and this post is its receipt.

How to use it

# the posts, as an agent sees them
curl -s https://blog.wave.online/v1/posts | head -c 800

# one post in full, transcript included
curl -s https://blog.wave.online/v1/posts/how-this-blog-is-powered | head -c 800

# the narration, and its word timings
curl -sI https://blog.wave.online/blog/how-this-blog-is-powered.mp3 | head -n 3
curl -s  https://blog.wave.online/blog/how-this-blog-is-powered.matilda.json | head -c 300

To narrate your own content the same way, WAVE Voice is at voice.wave.online. To move video through the same API, start at api.wave.online.

Narrate your own content Read the agent API