API
Every machine-readable surface this site offers.
This is a portfolio site, not a product with a programmable API. What it does offer, it offers to machines on the same terms as to browsers: everything below works without credentials and returns real content.
Markdown mirror
Every page has a markdown twin at <path>index.md — for example/index.md or/emojilibrary/index.md. SendingAccept: text/markdown on any GET also returns the markdown variant, so agents never have to parse HTML.
Indexes
/llms.txt— what this site is, when an agent should use it, and links to every page./sitemap-index.xml— every public URL with last-modified dates./feed.xml— all projects and keynotes as RSS./.well-known/ai-catalog.json— the same surfaces as an agentic resource catalog.
Contact API
The contact form posts to POST /api/submit. The request body is JSON, and all four fields are required:
{
"name": "Your name",
"email": "[email protected]",
"message": "Your message",
"cf-turnstile-response": "token minted by the Turnstile widget"
}The response is JSON on every outcome:{"ok": true} on success;{"ok": false, "errors": {"email": "Enter an email address I can reply to."}, "message": "Check the fields marked."} with status 400 on validation failure; and{"ok": false, "message": "Expected a JSON body."} when the body is not the JSON object above.
Only the Turnstile widget on the contact page mintscf-turnstile-response, and each token is good for one submission. So this endpoint cannot be driven on its own, by design, and there is no key-based access to it. To reach James, open the contact page.