[{"data":1,"prerenderedAt":164},["ShallowReactive",2],{"writing-2026-04-17-website-refresh":3,"writing-surr-2026-04-17-website-refresh":158},{"id":4,"title":5,"body":6,"date":147,"description":148,"draft":149,"extension":150,"meta":151,"navigation":152,"path":153,"seo":154,"stem":155,"tags":156,"__hash__":157},"writing\u002Fwriting\u002F2026-04-17-website-refresh.md","Website Refresh 2026",{"type":7,"value":8,"toc":143},"minimark",[9,13,18,21,24,40,47,51,59,62,139],[10,11,12],"p",{},"After five years on the old site, I rewrote everything from scratch. The stack is now just Nuxt 4, Nuxt Content, and Tailwind — and the content lives as plain Markdown files in the repo.",[14,15,17],"h2",{"id":16},"why-rebuild","Why rebuild",[10,19,20],{},"The old stack was fine, but I had accumulated too many moving parts — a headless CMS, an image pipeline, a separate RSS generator. For a personal site that publishes maybe once a month, that's absurd.",[10,22,23],{},"I wanted:",[25,26,27,31,34,37],"ul",{},[28,29,30],"li",{},"One repo, one language",[28,32,33],{},"No database, no admin panel",[28,35,36],{},"Full control over every pixel",[28,38,39],{},"Deploys in under 90 seconds",[41,42,44],"callout",{"type":43},"note",[10,45,46],{},"The whole site is under 200 lines of Vue.",[14,48,50],{"id":49},"the-new-architecture","The new architecture",[10,52,53,54,58],{},"Content is just Markdown. Every post is a file. Pushing new writing is a ",[55,56,57],"code",{},"git commit"," away.",[10,60,61],{},"Here's a short walkthrough:",[63,64,66,69,127,130,136],"youtube",{"id":65},"dQw4w9WgXcQ",[10,67,68],{},"Code blocks work, of course:",[70,71,76],"pre",{"className":72,"code":73,"language":74,"meta":75,"style":75},"language-ts shiki shiki-themes min-light min-light","export default defineNuxtConfig({\n  modules: [\"@nuxt\u002Fcontent\"],\n});\n","ts","",[55,77,78,98,121],{"__ignoreMap":75},[79,80,83,87,90,94],"span",{"class":81,"line":82},"line",1,[79,84,86],{"class":85},"swazO","export",[79,88,89],{"class":85}," default",[79,91,93],{"class":92},"se37E"," defineNuxtConfig",[79,95,97],{"class":96},"svmKd","({\n",[79,99,101,104,107,110,114,117],{"class":81,"line":100},2,[79,102,103],{"class":96},"  modules",[79,105,106],{"class":85},":",[79,108,109],{"class":96}," [",[79,111,113],{"class":112},"sMDDv","\"@nuxt\u002Fcontent\"",[79,115,116],{"class":96},"]",[79,118,120],{"class":119},"s-ZDT",",\n",[79,122,124],{"class":81,"line":123},3,[79,125,126],{"class":96},"});\n",[10,128,129],{},"And callouts for when I want to flag something:",[41,131,133],{"type":132},"warning",[10,134,135],{},"Don't self-host large video files. Use YouTube embeds or a CDN.",[10,137,138],{},"More posts coming soon.",[140,141,142],"style",{},"html pre.shiki code .swazO, html code.shiki .swazO{--shiki-default:#D32F2F;--shiki-dark:#D32F2F}html pre.shiki code .se37E, html code.shiki .se37E{--shiki-default:#6F42C1;--shiki-dark:#6F42C1}html pre.shiki code .svmKd, html code.shiki .svmKd{--shiki-default:#24292EFF;--shiki-dark:#24292EFF}html pre.shiki code .sMDDv, html code.shiki .sMDDv{--shiki-default:#22863A;--shiki-dark:#22863A}html pre.shiki code .s-ZDT, html code.shiki .s-ZDT{--shiki-default:#212121;--shiki-dark:#212121}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":75,"searchDepth":100,"depth":100,"links":144},[145,146],{"id":16,"depth":100,"text":17},{"id":49,"depth":100,"text":50},"2026-04-17","Rebuilding from scratch in Nuxt 4 with nothing but Markdown.",false,"md",{},true,"\u002Fwriting\u002F2026-04-17-website-refresh",{"title":5,"description":148},"writing\u002F2026-04-17-website-refresh",null,"n6cOfPdmWHRRdRg1K8RGzdS-uS2xB7nH8vK4lH6bfrw",[156,159],{"title":160,"path":161,"stem":162,"date":163,"children":-1},"Building AI Tools That Don't Suck","\u002Fwriting\u002F2026-02-10-building-ai-tools","writing\u002F2026-02-10-building-ai-tools","2026-02-10",1776536530707]