Publishing without a platform
How to wire a personal site's own site.standard.* records so Standard Reader can find it and read articles inline, without going through Leaflet, Pckt, Offprint, or another publishing tool.
Overview
Standard Reader indexes site.standard.document and site.standard.publication records out of AT Proto repos. Platforms like Leaflet, Pckt, and Offprint write these records for you as part of publishing, so their authors get the full reader treatment automatically. If you run your own site and hand-roll your own site.standard integration instead, you write those records yourself — this page covers what to add, including Markpub, the markdown format we recommend for a hand-rolled body.
Discovery
Discovery hints are part of the site.standard spec itself, and our browser extension uses it too! When you land on a URL it hasn't indexed yet, it looks in that page's head for a link tag whose rel matches the record's collection and whose href is the record's at:// URI.
<link rel="site.standard.document" href="at://did:plc:you/site.standard.document/<rkey>" /> <link rel="site.standard.publication" href="at://did:plc:you/site.standard.publication/<rkey>" />
Include the site.standard.publication hint only if the document belongs to a publication record. Add both regardless of which reader you care about — they're how any client on the network resolves your page to its record, not just our extension.
Subscribe embed
Every publication page also serves a themed, embeddable subscribe widget — an iframe you can drop on your own site so visitors can subscribe without leaving your page. The easiest way to get it: open your publication's page on Standard Reader, use Share → Embed subscribe, pick landscape or portrait, and copy the snippet — no account or ownership check required to generate it.
It reads the publication's basicTheme colors automatically, so the card matches your brand with no extra params — fonts aren't picked up though; the card always uses Standard Reader's own type. Here's a live one:
Clicking Subscribe opens Standard Reader itself, not your page — subscribing writes a site.standard.graph.subscription record to the reader's own PDS via their own OAuth session, so it has to happen on our domain. If you'd rather skip the iframe, link straight to /subscribe// and style your own button.
Rendering Content in Standard Reader
Whether tapping an article opens it inline in Standard Reader, or takes the reader straight to your site, depends on one thing: does the record's content field hold a body in a format Standard Reader knows how to render? If content is missing, or set to a format we don't recognize, the article is treated as an external post and always opens on your site — even if textContent carries a plain-text excerpt. To get inline reading, publish the article body in content using one of the recognized formats below.
Supported content formats
Markpub (recommended). at.markpub.markdown — markdown with facets for rich text. It's not part of the site.standard spec either — no markdown format is — but it's the only one that's actually spec'd in a meaningful, reusable way, rather than one app's own ad hoc shape. Use this for a hand-rolled integration unless you already produce one of the platform formats below.
Leaflet, Pckt, Offprint. pub.leaflet.content, blog.pckt.content, and app.offprint.content — the block-based formats those tools write natively.
Everything below is compatibility support for formats already out there in other apps' own repos — none of it is part of the site.standard spec, and none of it is something to model a new integration on.
HTML-in-record. Formats whose payload is { html: "..." } — each from a different, unrelated app, e.g. org.wordpress.html (WordPress) or co.idno.html (Idno). Sanitized before render, never injected raw.
Structured blocks. Rich block-editor documents, each in that editor's own schema — e.g. org.blocknote.document#content (BlockNote) or pub.oxa.document.document (Oxa). Only useful if you're already producing one of these; not worth adopting from scratch.
Other markdown shapes (avoid). site.standard.content.markdown and a scattering of third-party #markdown shapes — e.g. site.standard.document#markdown — carry a raw markdown string under a format-specific key. Don't add another one — publish Markpub instead.
Example record
A minimal loose document — no publication, Markpub markdown body:
{ "$type": "site.standard.document", "site": "https://example.com", "path": "/posts/hello-world", "title": "Hello, world", "publishedAt": "2026-07-01T12:00:00.000Z", "content": { "$type": "at.markpub.markdown", "text": { "$type": "at.markpub.text", "markdown": "# Hello, world\n\nThis renders inline in Standard Reader." } } }