[{"data":1,"prerenderedAt":221},["ShallowReactive",2],{"blog:page:\u002Fen\u002Fblog\u002Fbuild-time-content":3,"blog:articles:en":161,"blog:translations:\u002Fen\u002Fblog\u002Fbuild-time-content":218},{"id":4,"title":5,"author":6,"body":7,"cover":147,"coverAlt":147,"date":148,"description":149,"extension":150,"featured":151,"meta":152,"navigation":153,"path":154,"seo":155,"stem":156,"tags":157,"__hash__":160},"blog\u002Fen\u002Fblog\u002F2.build-time-content\u002Findex.md","Content is resolved at build time","John Martin",{"type":8,"value":9,"toc":140},"minimark",[10,14,18,25,30,53,57,109,112,116,119,125,128],[11,12,5],"h1",{"id":13},"content-is-resolved-at-build-time",[15,16,17],"p",{},"When you open an article here, no server asks a database what the article says.\nThe answer was already written down - as a plain HTML file - the moment the\nsite was built.",[15,19,20],{},[21,22],"img",{"alt":23,"src":24},"Pipeline diagram: Markdown flows through a static build into plain HTML, CSS and SVG files","\u002Fassets\u002Fbuild-time-pipeline.svg",[26,27,29],"h2",{"id":28},"the-pipeline","The pipeline",[31,32,33,41,47],"ol",{},[34,35,36,40],"li",{},[37,38,39],"strong",{},"Write"," - an article is a Markdown file with frontmatter, colocated with\nits images.",[34,42,43,46],{},[37,44,45],{},"Build"," - the static build runs every content query once, on the build\nmachine: listings, the featured pick, previous and next links.",[34,48,49,52],{},[37,50,51],{},"Serve"," - the edge serves files. Nothing renders per request.",[26,54,56],{"id":55},"what-this-buys","What this buys",[58,59,60,73],"table",{},[61,62,63],"thead",{},[64,65,66,70],"tr",{},[67,68,69],"th",{},"Concern",[67,71,72],{},"Static answer",[74,75,76,85,93,101],"tbody",{},[64,77,78,82],{},[79,80,81],"td",{},"Latency",[79,83,84],{},"CDN cache hit, no origin render",[64,86,87,90],{},[79,88,89],{},"Availability",[79,91,92],{},"The site survives a database being down",[64,94,95,98],{},[79,96,97],{},"Cost model",[79,99,100],{},"Serving files, not running compute",[64,102,103,106],{},[79,104,105],{},"Content correctness",[79,107,108],{},"What you published is what you serve",[15,110,111],{},"The table above is the honest list. Static generation is not the right answer\nfor every product surface, but for reading surfaces it is hard to beat.",[26,113,115],{"id":114},"the-trade-we-accepted","The trade we accepted",[15,117,118],{},"Publishing is no longer instant: content changes land with the next build.\nFor a blog, that is the right trade - a deploy takes minutes, and in return\nthe reading path never waits on a runtime query.",[120,121,122],"blockquote",{},[15,123,124],{},"A page that renders from files cannot have a slow query. The class of\noutage simply does not exist for it.",[126,127],"hr",{},[15,129,130],{},[131,132,133,134,139],"em",{},"The ",[135,136,138],"a",{"href":137},"\u002Fen\u002Fblog\u002Furl-model","URL model"," post covers how these files end up at\nclean, localized addresses.",{"title":141,"searchDepth":142,"depth":142,"links":143},"",2,[144,145,146],{"id":28,"depth":142,"text":29},{"id":55,"depth":142,"text":56},{"id":114,"depth":142,"text":115},null,"2026-09-09","Why this blog ships as prerendered files instead of a content API - and what that buys.","md",false,{},true,"\u002Fen\u002Fblog\u002Fbuild-time-content",{"title":5,"description":149},"en\u002Fblog\u002F2.build-time-content\u002Findex",[158,159],"architecture","static-sites","9kqLgmvuKEZVs8vzsxE9U6mAPCnjrMNDSgNR2jTn3tw",[162,170,182,194,206,208],{"path":163,"stem":164,"title":165,"description":166,"date":167,"author":6,"tags":168,"featured":151},"\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",[169],"meta",{"path":171,"stem":172,"title":173,"description":174,"date":175,"author":6,"tags":176,"featured":151,"cover":179},"\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",[177,178],"design","typography",{"src":180,"alt":181},"\u002Fassets\u002Fcover-reading-first.svg","Cover illustration: a narrow single-column article layout chosen over a cluttered multi-column layout",{"path":183,"stem":184,"title":185,"description":186,"date":187,"author":6,"tags":188,"featured":151,"cover":191},"\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",[189,190],"deployment","cloudflare",{"src":192,"alt":193},"\u002Fassets\u002Fcover-static-deployment.svg","Cover illustration: a folder of HTML and SVG files flowing onto a globe of CDN edge nodes",{"path":195,"stem":196,"title":197,"description":198,"date":199,"author":6,"tags":200,"featured":151,"cover":203},"\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",[201,202],"i18n","ux",{"src":204,"alt":205},"\u002Fassets\u002Ftwo-locales-one-page.svg","Cover illustration: two locale paths joining into one shared page layout",{"path":154,"stem":156,"title":5,"description":149,"date":148,"author":6,"tags":207,"featured":151},[158,159],{"path":137,"stem":209,"title":210,"description":211,"date":212,"author":6,"tags":213,"featured":153,"cover":215},"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",[158,214],"urls",{"src":216,"alt":217},"\u002Fassets\u002Fcover-url-model.svg","Cover illustration: a single address bar splitting into locale, mount and path segments",[219,220],"en","vi",1791809694157]