---
title: "Raw-markdown post variants + content negotiation"
author: "Matt Pyle"
datePublished: 2026-07-16T00:00:00.000Z
dateShipped: 2026-07-16T00:00:00.000Z
description: "Every post now has a token-efficient raw-markdown sibling at /writing/<slug>.md, and the canonical URL itself serves markdown when a request genuinely prefers it. Took three attempts to land the negotiation."
type: "infra"
significance: "minor"
canonical: https://www.mattpyle.com/changelog/markdown-post-variants/
source: https://www.mattpyle.com/changelog/markdown-post-variants/
---

# Raw-markdown post variants + content negotiation

Agents scraping a post used to pay full HTML-parsing cost and site chrome to reach prose that's already stored as markdown. Now each post has a raw-markdown variant at `/writing/<slug>.md` — attribution frontmatter, a canonical link back to the HTML page, and no site chrome — discoverable from the HTML page itself.

## Phase 2: same URL, negotiated

The second phase made the *canonical* URL serve markdown when a request's `Accept` header genuinely prefers `text/markdown` over `text/html` — real RFC 7231 q-value negotiation, not a substring match.

It took three attempts. A `vercel.json` rewrite proved dead on arrival because Vercel checks the filesystem for a matching static file before evaluating rewrites. Routing Middleware fixed the ordering but then 404'd, because on this adapter Astro's on-demand renderer can only resolve a route as the literal top-level request — not through any internal routing-layer rewrite.

## What actually shipped

The middleware does the Accept parsing and then `fetch()`es the already-working `.md` endpoint directly, relaying the response verbatim under the original URL — a reverse proxy inside the middleware rather than a routing trick. Verified live with a full curl matrix: HTML for browsers, markdown for agents that ask for it, and no cache cross-contamination between the two.