[{"data":1,"prerenderedAt":226},["ShallowReactive",2],{"post-\u002Fblog\u002Fhello-world":3},{"id":4,"title":5,"body":6,"date":213,"description":214,"draft":215,"extension":216,"meta":217,"navigation":218,"path":219,"seo":220,"stem":221,"tags":222,"__hash__":225},"blog\u002Fblog\u002Fhello-world.md","Hello, World — Why I Rebuilt My Portfolio on Nuxt",{"type":7,"value":8,"toc":209},"minimark",[9,27,32,35,64,70,74,81,202,205],[10,11,12,13,17,18,21,22,26],"p",{},"I spent years with a single ",[14,15,16],"code",{},"index.html",", an ",[14,19,20],{},"app.js",", and a big stylesheet. It worked.\nBut every time I wanted to add a project or write something, I was editing arrays buried\nin JavaScript. So I rebuilt it as a ",[23,24,25],"strong",{},"template",": content lives in one config file, posts\nlive in markdown, and the design is the reusable shell.",[28,29,31],"h2",{"id":30},"what-changed","What changed",[10,33,34],{},"Three things now live apart from each other:",[36,37,38,49,58],"ol",{},[39,40,41,44,45,48],"li",{},[23,42,43],{},"Config"," — who I am, my projects, my experience. One file: ",[14,46,47],{},"app\u002Fapp.config.ts",".",[39,50,51,54,55,48],{},[23,52,53],{},"Content"," — these blog posts, as plain markdown in ",[14,56,57],{},"content\u002Fblog\u002F",[39,59,60,63],{},[23,61,62],{},"Design"," — the Vue components and the stylesheet that render it all.",[65,66,67],"blockquote",{},[10,68,69],{},"If you can fork it and make it yours by editing data, it's a template. If you have to\ntouch component code, it's just a website.",[28,71,73],{"id":72},"the-blog","The blog",[10,75,76,77,80],{},"This very post is a markdown file. Nuxt Content turns the ",[14,78,79],{},"content\u002F"," folder into a\nqueryable collection, so the index page just asks for every post, sorted by date:",[82,83,88],"pre",{"className":84,"code":85,"language":86,"meta":87,"style":87},"language-ts shiki shiki-themes github-light github-dark","const { data: posts } = await useAsyncData('blog-list', () =>\n  queryCollection('blog').where('draft', '=', false).order('date', 'DESC').all()\n)\n","ts","",[14,89,90,140,196],{"__ignoreMap":87},[91,92,95,99,103,107,110,114,117,120,123,127,130,134,137],"span",{"class":93,"line":94},"line",1,[91,96,98],{"class":97},"szBVR","const",[91,100,102],{"class":101},"sVt8B"," { ",[91,104,106],{"class":105},"s4XuR","data",[91,108,109],{"class":101},": ",[91,111,113],{"class":112},"sj4cs","posts",[91,115,116],{"class":101}," } ",[91,118,119],{"class":97},"=",[91,121,122],{"class":97}," await",[91,124,126],{"class":125},"sScJk"," useAsyncData",[91,128,129],{"class":101},"(",[91,131,133],{"class":132},"sZZnC","'blog-list'",[91,135,136],{"class":101},", () ",[91,138,139],{"class":97},"=>\n",[91,141,143,146,148,151,154,157,159,162,165,168,170,173,175,178,180,183,185,188,190,193],{"class":93,"line":142},2,[91,144,145],{"class":125},"  queryCollection",[91,147,129],{"class":101},[91,149,150],{"class":132},"'blog'",[91,152,153],{"class":101},").",[91,155,156],{"class":125},"where",[91,158,129],{"class":101},[91,160,161],{"class":132},"'draft'",[91,163,164],{"class":101},", ",[91,166,167],{"class":132},"'='",[91,169,164],{"class":101},[91,171,172],{"class":112},"false",[91,174,153],{"class":101},[91,176,177],{"class":125},"order",[91,179,129],{"class":101},[91,181,182],{"class":132},"'date'",[91,184,164],{"class":101},[91,186,187],{"class":132},"'DESC'",[91,189,153],{"class":101},[91,191,192],{"class":125},"all",[91,194,195],{"class":101},"()\n",[91,197,199],{"class":93,"line":198},3,[91,200,201],{"class":101},")\n",[10,203,204],{},"Add a file, get a post. That's the whole workflow.",[206,207,208],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":87,"searchDepth":142,"depth":142,"links":210},[211,212],{"id":30,"depth":142,"text":31},{"id":72,"depth":142,"text":73},"2026-05-31","Moving from a hand-rolled static site to a content-driven Nuxt template, and why the separation of config, content, and design matters.",false,"md",{},true,"\u002Fblog\u002Fhello-world",{"title":5,"description":214},"blog\u002Fhello-world",[223,224],"Nuxt","Meta","vVvXbfWuvSvs9jyJdpGQuQjICk8QA0c5b4c-uRpWggo",1781109090916]