{"id":"blog-page","slug":"blog","meta":{"title":"Blog — Andrew Linh on Schemas, Types, and Agents","description":"Essays on schema-driven content, end-to-end type safety, AI agent tooling, and developer experience for structured systems."},"sections":[{"id":"blog-hero-1","type":"page-hero","data":{"label":"Blog","title":"Notes from the seams.","description":"Writing on contracts, type safety, agent evals, and the DX of structured systems."},"settings":{"paddingTop":"lg","paddingBottom":"md"}},{"id":"blog-list-1","type":"posts-list","data":{"title":"All posts","items":{"schema-driven-content":{"id":"schema-driven-content","title":"Schema-driven content is the missing layer","dek":"Why treating page sections as typed contracts beats free-form CMS blobs for multi-tenant sites.","date":"2026-03-12","readingTime":"9 min","tags":["schemas","cms","content-infra"],"body":"## The quiet failure mode\n\nMost content platforms fail the same way: the editor UI drifts from the renderer, and nobody notices until a publish breaks production.\n\n## Contracts over conventions\n\nSchema-driven content means every section, collection item, and form submission has a Zod contract shared by Studio, CI, and runtime.\n\n## The payoff\n\nYou trade a little authoring friction for operational calm. Publish errors become schema errors you can fix before merge.","image":{"url":"https://images.unsplash.com/photo-1516321318423-f06f85e504b3?w=1600&q=80","alt":"Laptop showing structured documents"}},"e2e-type-safety":{"id":"e2e-type-safety","title":"End-to-end type safety without the ceremony","dek":"How to keep Zod, OpenAPI, and generated clients honest without drowning teams in codegen rituals.","date":"2026-01-28","readingTime":"8 min","tags":["type-safety","api","dx"],"body":"## The split brain problem\n\nTeams often maintain three truths: runtime validators, OpenAPI, and handwritten clients.\n\n## One source, many projections\n\nStart with Zod at the boundary. Generate OpenAPI. Generate clients. Contract-test responses against the same types.\n\n## DX that sticks\n\nDevelopers adopt type safety when it removes toil.","image":{"url":"https://images.unsplash.com/photo-1461749280684-dccba630e2f6?w=1600&q=80","alt":"Developer working at a desk with code on screen"}},"ai-agent-tooling":{"id":"ai-agent-tooling","title":"Building AI agent tooling that can be graded","dek":"Deterministic fixtures, typed traces, and golden scorecards turn agent demos into operable systems.","date":"2025-11-04","readingTime":"11 min","tags":["ai","agents","evals"],"body":"## Demos are not systems\n\nAn agent that works in a notebook is not ready for production.\n\n## Make evaluation first-class\n\nDefine scenarios as data. Persist every tool call as a typed event log.\n\n## Calm over clever\n\nThe goal is an agent you can reason about — graded, bisected, and rolled back like any other service.","image":{"url":"https://images.unsplash.com/photo-1677442136019-21780ecad995?w=1600&q=80","alt":"Abstract glowing network suggesting AI systems"}},"dx-of-structured-systems":{"id":"dx-of-structured-systems","title":"Developer experience for structured systems","dek":"Precision tooling should feel quiet: fast feedback, honest errors, and fewer places to look.","date":"2025-09-18","readingTime":"7 min","tags":["dx","tooling","architecture"],"body":"## DX is an architecture outcome\n\nIn structured systems, DX is the system. If the feedback loop is slow, the architecture will be circumvented.\n\n## Terminal aesthetics, human patience\n\nGood tools feel like a well-tuned terminal: dense signal, low noise, predictable commands.","image":{"url":"https://images.unsplash.com/photo-1498050108023-c5249f4df085?w=1600&q=80","alt":"Laptop with code editor beside a notebook"}}}},"settings":{"paddingTop":"md","paddingBottom":"lg"}}]}