iammatthias.com developer documentation
This site makes its content available in machine-readable form. It is public and free. There is no account, API key, or paid tier.
Quickstart
# Search the site
curl "https://iammatthias.com/api/search.json?q=cloudflare+workers"
# List one section
curl "https://iammatthias.com/api/content.json?section=recipes"
# Read a document as markdown
curl "https://iammatthias.com/posts/1779066375000-farfield.md"
# The whole corpus in one request
curl "https://iammatthias.com/llms-full.txt"HTTP endpoints
GET /api/search-corpus.json- Every searchable item on the site (documents and feed posts) as compact text, each carrying its Farfield content hash (cid). Intended for building your own index; the site's own search embeds this locally in the browser.
GET /api/search-vectors.json- Precomputed embedding vectors for the corpus, keyed by cid, with the model name and dimension count. Built at deploy time with the ternlight model.
GET /api/content.json- Every published document as structured JSON: title, section, tags, dates, content hash, canonical URL, and markdown URL. Filterable by section and tag.
GET /api/search.json- Ranked keyword search over titles, excerpts, tags, and body text of every published document and feed post. Returns canonical and markdown URLs per hit.
The full specification is at openapi.json. Errors are RFC 9457 problem documents. Each one has a resolution field that says how to retry.
MCP server
The MCP server uses Streamable HTTP at https://iammatthias.com/mcp. It does not require authentication. Add it to any MCP client:
{ "mcpServers": { "iammatthias": { "url": "https://iammatthias.com/mcp" } } }search_site: Search Matthias Jordan's writing, photography notes, and recipes by keyword. Returns titles, excerpts, and both HTML and markdown URLs.get_document: Fetch the full markdown source of one document by its path or slug, with front matter (title, dates, tags, content hash) and images resolved to public URLs.list_sections: List the site's publications (art, posts, recipes, melange, open-source) with descriptions and entry counts.list_recent: List the most recently published documents, newest first, optionally filtered to one section.
Preview the tools without connecting: server-card.json.
Markdown twins
Every content URL has a markdown twin at the same path plus .md. It includes front matter with the title, dates, tags, content hash, and canonical URL. Images resolve to public URLs. Section indexes are at /<section>.md. Each section has scoped context at /<section>/llms.txt.
Everything else
- llms.txt site map: Index of every published document with links to its markdown twin.
- Full corpus in one file: Every published document, front matter included, in a single markdown file.
- iammatthias.com MCP server: Streamable HTTP MCP server exposing site search and document retrieval as tools. No authentication required.
- GraphQL endpoint: Typed, introspectable GraphQL over the same content: search, list, and read documents in one round trip. Relay connections, schema-modeled errors, no authentication.
- GraphQL schema (SDL): The GraphQL schema as SDL, for codegen or reading without an introspection query.
- OpenAPI specification: OpenAPI 3.1 description of the site's public read-only JSON endpoints.
- XML sitemap: Every indexable URL with last-modified dates.
- RSS feed: Sitewide RSS with full article bodies; per-section feeds at /<section>/rss.xml.
Caching and etiquette
Every record has a cid, which is a CIDv1 content hash. The same cid means the same bytes, forever. Cache against it instead of fetching the record again. Prefer llms-full.txt to crawling page by page. Send a descriptive User-Agent. The source is at github.com/iammatthias/com.