{"version":"1.0.0","updatedAt":"2026-04-06T10:11:46.122Z","site":{"name":"Will Haering","description":"Personal website and writing of Will Haering.","url":"https://wch.io","author":"Will Haering"},"entrypoints":{"openapi":"/openapi.yaml","status":"/api/health","search":"/api/search?q={query}","posts":"/api/posts","post":"/api/posts/{id}","portfolio":"/api/portfolio","terminal":"/for-agents/terminal"},"entities":[{"type":"schema:Article","idFormat":"post_{id}","canonicalUrl":"https://wch.io/writing/{slug}","properties":["id","title","content","datePublished","author","url","slug"]},{"type":"schema:Person","idFormat":"person_will_haering","canonicalUrl":"https://wch.io/about","properties":["name","description","url","sameAs"]},{"type":"schema:CreativeWork","idFormat":"project_{id}","canonicalUrl":"https://wch.io/grid/{idx}","properties":["id","name","description","url","dateCreated","images"]},{"type":"schema:ImageObject","idFormat":"img_{hash}","canonicalUrl":"https://wch.io/pictures/{category}/{filename}","properties":["id","contentUrl","description","dateCreated","category"]},{"type":"schema:NewsArticle","idFormat":"news_{timestamp}_{hash}","canonicalUrl":"https://wch.io/news/{id}","properties":["title","timestamp","sourceName","url"]}],"actions":[{"name":"search","method":"GET","path":"/api/search","params":{"q":"string","page":"int?"},"returns":"SearchResult[]","description":"Search across all content"},{"name":"get-posts","method":"GET","path":"/api/posts","params":{"page":"int?","limit":"int?"},"returns":"Post[]","description":"List all blog posts"},{"name":"get-post","method":"GET","path":"/api/posts/{id}","params":{"id":"string"},"returns":"Post","description":"Get specific post details"},{"name":"get-portfolio","method":"GET","path":"/api/portfolio","returns":"PortfolioData","description":"Get portfolio and project information"},{"name":"health-check","method":"GET","path":"/api/health","returns":"HealthStatus","description":"Check system health and status"},{"name":"repl","method":"POST","path":"/api/for-agents/repl","params":{"command":"string"},"returns":"CommandResult","description":"Constrained action REPL 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"}}