[{"data":1,"prerenderedAt":75},["ShallowReactive",2],{"blog:page:\u002Fen\u002Fblog":3,"blog:articles:en":4,"blog:translations:\u002Fen\u002Fblog":72},null,[5,15,27,39,51,60],{"path":6,"stem":7,"title":8,"description":9,"date":10,"author":11,"tags":12,"featured":14,"cover":-1},"\u002Fen\u002Fblog\u002Fdemo-content-note","en\u002Fblog\u002F6.demo-content-note\u002Findex","What this blog is (and is not)","This is a demo vertical slice - real layout, real pipelines, deliberately editorial content.","2026-10-07","John Martin",[13],"meta",false,{"path":16,"stem":17,"title":18,"description":19,"date":20,"author":11,"tags":21,"featured":14,"cover":24},"\u002Fen\u002Fblog\u002Freading-first-design","en\u002Fblog\u002F5.reading-first-design\u002Findex","A reading page is not a documentation page","Why the blog article layout deliberately differs from the docs layout - hierarchy, width, and restraint.","2026-09-30",[22,23],"design","typography",{"src":25,"alt":26},"\u002Fassets\u002Fcover-reading-first.svg","Cover illustration: a narrow single-column article layout chosen over a cluttered multi-column layout",{"path":28,"stem":29,"title":30,"description":31,"date":32,"author":11,"tags":33,"featured":14,"cover":36},"\u002Fen\u002Fblog\u002Fstatic-deployment","en\u002Fblog\u002F4.static-deployment\u002Findex","Deploying a blog as static assets","No Worker script, no database binding - the whole deployment is a directory of files and a 404 page.","2026-09-23",[34,35],"deployment","cloudflare",{"src":37,"alt":38},"\u002Fassets\u002Fcover-static-deployment.svg","Cover illustration: a folder of HTML and SVG files flowing onto a globe of CDN edge nodes",{"path":40,"stem":41,"title":42,"description":43,"date":44,"author":11,"tags":45,"featured":14,"cover":48},"\u002Fen\u002Fblog\u002Flocale-switching","en\u002Fblog\u002F3.locale-switching\u002Findex","Locale switching that never lies","A language switcher should only offer what exists. Here is how the link list is derived from real content.","2026-09-16",[46,47],"i18n","ux",{"src":49,"alt":50},"\u002Fassets\u002Ftwo-locales-one-page.svg","Cover illustration: two locale paths joining into one shared page layout",{"path":52,"stem":53,"title":54,"description":55,"date":56,"author":11,"tags":57,"featured":14,"cover":-1},"\u002Fen\u002Fblog\u002Fbuild-time-content","en\u002Fblog\u002F2.build-time-content\u002Findex","Content is resolved at build time","Why this blog ships as prerendered files instead of a content API - and what that buys.","2026-09-09",[58,59],"architecture","static-sites",{"path":61,"stem":62,"title":63,"description":64,"date":65,"author":11,"tags":66,"featured":68,"cover":69},"\u002Fen\u002Fblog\u002Furl-model","en\u002Fblog\u002F1.url-model\u002Findex","One URL model for every public page","How \u002Flocale\u002Fmount\u002Fpath keeps every public page predictable - and why we enforce it instead of hoping for it.","2026-09-02",[58,67],"urls",true,{"src":70,"alt":71},"\u002Fassets\u002Fcover-url-model.svg","Cover illustration: a single address bar splitting into locale, mount and path segments",[73,74],"en","vi",1791809693768]