[{"data":1,"prerenderedAt":216},["ShallowReactive",2],{"writing-page-1":3},{"items":4,"total":102,"totalPages":84,"currentPage":84},[5,160],{"id":6,"title":7,"body":8,"date":149,"description":150,"draft":151,"extension":152,"meta":153,"navigation":154,"path":155,"seo":156,"stem":157,"tags":158,"__hash__":159},"writing\u002Fwriting\u002F2026-04-17-website-refresh.md","Website Refresh 2026",{"type":9,"value":10,"toc":145},"minimark",[11,15,20,23,26,42,49,53,61,64,141],[12,13,14],"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.",[16,17,19],"h2",{"id":18},"why-rebuild","Why rebuild",[12,21,22],{},"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.",[12,24,25],{},"I wanted:",[27,28,29,33,36,39],"ul",{},[30,31,32],"li",{},"One repo, one language",[30,34,35],{},"No database, no admin panel",[30,37,38],{},"Full control over every pixel",[30,40,41],{},"Deploys in under 90 seconds",[43,44,46],"callout",{"type":45},"note",[12,47,48],{},"The whole site is under 200 lines of Vue.",[16,50,52],{"id":51},"the-new-architecture","The new architecture",[12,54,55,56,60],{},"Content is just Markdown. Every post is a file. Pushing new writing is a ",[57,58,59],"code",{},"git commit"," away.",[12,62,63],{},"Here's a short walkthrough:",[65,66,68,71,129,132,138],"youtube",{"id":67},"dQw4w9WgXcQ",[12,69,70],{},"Code blocks work, of course:",[72,73,78],"pre",{"className":74,"code":75,"language":76,"meta":77,"style":77},"language-ts shiki shiki-themes min-light min-light","export default defineNuxtConfig({\n  modules: [\"@nuxt\u002Fcontent\"],\n});\n","ts","",[57,79,80,100,123],{"__ignoreMap":77},[81,82,85,89,92,96],"span",{"class":83,"line":84},"line",1,[81,86,88],{"class":87},"swazO","export",[81,90,91],{"class":87}," default",[81,93,95],{"class":94},"se37E"," defineNuxtConfig",[81,97,99],{"class":98},"svmKd","({\n",[81,101,103,106,109,112,116,119],{"class":83,"line":102},2,[81,104,105],{"class":98},"  modules",[81,107,108],{"class":87},":",[81,110,111],{"class":98}," [",[81,113,115],{"class":114},"sMDDv","\"@nuxt\u002Fcontent\"",[81,117,118],{"class":98},"]",[81,120,122],{"class":121},"s-ZDT",",\n",[81,124,126],{"class":83,"line":125},3,[81,127,128],{"class":98},"});\n",[12,130,131],{},"And callouts for when I want to flag something:",[43,133,135],{"type":134},"warning",[12,136,137],{},"Don't self-host large video files. Use YouTube embeds or a CDN.",[12,139,140],{},"More posts coming soon.",[142,143,144],"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":77,"searchDepth":102,"depth":102,"links":146},[147,148],{"id":18,"depth":102,"text":19},{"id":51,"depth":102,"text":52},"2026-04-17","Rebuilding from scratch in Nuxt 4 with nothing but Markdown.",false,"md",{},true,"\u002Fwriting\u002F2026-04-17-website-refresh",{"title":7,"description":150},"writing\u002F2026-04-17-website-refresh",null,"n6cOfPdmWHRRdRg1K8RGzdS-uS2xB7nH8vK4lH6bfrw",{"id":161,"title":162,"body":163,"date":209,"description":210,"draft":151,"extension":152,"meta":211,"navigation":154,"path":212,"seo":213,"stem":214,"tags":158,"__hash__":215},"writing\u002Fwriting\u002F2026-02-10-building-ai-tools.md","Building AI Tools That Don't Suck",{"type":9,"value":164,"toc":205},[165,173,177,180,184,191,202],[12,166,167,168,172],{},"Most AI products feel like a chatbot wrapper around an API. That's not a product — that's a demo. A real tool hides the model and exposes ",[169,170,171],"em",{},"intent",".",[16,174,176],{"id":175},"the-chat-trap","The chat trap",[12,178,179],{},"Chat is the lowest-common-denominator interface. It's great for exploration, terrible for repetition. The moment a user does something twice, you should be asking whether the chat is the right surface.",[16,181,183],{"id":182},"what-good-feels-like","What good feels like",[12,185,186,187,190],{},"The best AI features don't ",[169,188,189],{},"feel"," like AI. They feel like software that finally works the way you always wished it would:",[27,192,193,196,199],{},[30,194,195],{},"Autocomplete that knows your codebase",[30,197,198],{},"Search that understands the question, not just the keywords",[30,200,201],{},"Summaries you can trust without checking",[12,203,204],{},"That's the bar. Everything else is demo-ware.",{"title":77,"searchDepth":102,"depth":102,"links":206},[207,208],{"id":175,"depth":102,"text":176},{"id":182,"depth":102,"text":183},"2026-02-10","On restraint, UX, and why most AI interfaces miss the point.",{},"\u002Fwriting\u002F2026-02-10-building-ai-tools",{"title":162,"description":210},"writing\u002F2026-02-10-building-ai-tools","EMk8hkYCXF9TG-fctv-OoKq_cmt-nO-To4J16lwKzOo",1776536530553]