{"version":"1.0.0","site":{"name":"Will Haering","description":"Personal website and writing of Will Haering.","url":"https://wch.io","author":"Will Haering"},"entrypoints":{"openapi":"/openapi.yaml","llms":"/llms.txt","status":"/api/health","search":"/api/search?q={query}","posts":"/api/posts","post":"/api/posts/{id}","terminal":"/for-agents/terminal","repl":"/for-agents/repl"},"entities":[{"type":"schema:Article","idFormat":"post_{id}","canonicalUrl":"https://wch.io/writing/{slug}","properties":["id","title","content","datePublished","author","url","slug","tags"],"description":"Blog posts and articles with markdown content"},{"type":"schema:Person","idFormat":"person_will_haering","canonicalUrl":"https://wch.io/about","properties":["name","description","url","sameAs","expertise","experience"],"description":"Personal and professional information about Will Haering"},{"type":"schema:CreativeWork","idFormat":"project_{id}","canonicalUrl":"https://wch.io/grid/{idx}","properties":["id","name","description","url","dateCreated","images","technologies"],"description":"Portfolio projects and creative works"},{"type":"schema:ImageObject","idFormat":"img_{hash}","canonicalUrl":"https://wch.io/pictures/{category}/{filename}","properties":["id","contentUrl","description","dateCreated","category","location"],"description":"Photography collections and images"},{"type":"schema:NewsArticle","idFormat":"news_{timestamp}_{hash}","canonicalUrl":"https://wch.io/news/{id}","properties":["title","timestamp","sourceName","url","summary"],"description":"News coverage and media mentions"}],"actions":[{"name":"search","method":"GET","path":"/api/search","params":{"q":"string","page":"int?","limit":"int?","type":"string?"},"returns":"SearchResult","description":"Search published posts with pagination and relevance scoring"},{"name":"get-posts","method":"GET","path":"/api/posts","params":{"page":"int?","limit":"int?"},"returns":"PostList","description":"List published blog posts with pagination"},{"name":"get-post","method":"GET","path":"/api/posts/{id}","params":{"id":"string"},"returns":"Post","description":"Get a specific published post with markdown content"},{"name":"health-check","method":"GET","path":"/api/health","returns":"HealthStatus","description":"Check system health and status (IP-restricted)"},{"name":"repl","method":"POST","path":"/api/for-agents/repl","params":{"command":"string"},"returns":"CommandResult","description":"Constrained, sandboxed action runner for testing capabilities","auth":"X-Agent-Mode: repl header required","rate_limit":"100/min"}],"auth":{"read":"anonymous","write":"jwt-token","admin":"jwt-token"},"rateLimits":{"anonymous":"100/minute, 1000/hour","authenticated":"500/minute, 5000/hour"},"freshness":{"etag":true,"lastModified":true,"cacheControl":"public, max-age=300","contentUpdates":"immediate"},"contentTypes":{"posts":"markdown","images":"jpeg, png, webp","metadata":"json"},"contact":{"status":"/api/health","uptime":"99.5%","responseTime":"< 500ms"},"updatedAt":"2026-06-05T18:40:02.249Z"}