[{"data":1,"prerenderedAt":574},["ShallowReactive",2],{"posts-list":3},[4,396,473],{"id":5,"title":6,"body":7,"date":383,"description":384,"extension":385,"meta":386,"navigation":387,"path":388,"seo":389,"stem":390,"tags":391,"__hash__":395},"posts\u002Fblog\u002Fproject-log-blog-build.md","Project log: building this blog",{"type":8,"value":9,"toc":377},"minimark",[10,14,19,38,42,66,292,296,313,316,348,355,359,370,373],[11,12,13],"p",{},"Meta entry: this site itself was the first project I logged.",[15,16,18],"h2",{"id":17},"the-brief","The brief",[20,21,22,26,29,32,35],"ul",{},[23,24,25],"li",{},"A markdown-driven blog",[23,27,28],{},"Retro feel, but legible — not gimmicky",[23,30,31],{},"Greens and browns, outdoor \u002F nature mood",[23,33,34],{},"No mascot",[23,36,37],{},"Static-friendly, low-maintenance",[15,39,41],{"id":40},"the-stack","The stack",[20,43,44,51,57,63],{},[23,45,46,50],{},[47,48,49],"strong",{},"Nuxt 4"," — file-based routing, Vue 3, SSR \u002F SSG out of the box",[23,52,53,56],{},[47,54,55],{},"@nuxt\u002Fcontent v3"," — markdown collections with typed schemas",[23,58,59,62],{},[47,60,61],{},"pnpm"," — fast, disk-friendly package manager",[23,64,65],{},"Hand-written CSS — no framework, palette baked into custom properties",[67,68,73],"pre",{"className":69,"code":70,"language":71,"meta":72,"style":72},"language-ts shiki shiki-themes vitesse-dark","\u002F\u002F content.config.ts\nexport default defineContentConfig({\n  collections: {\n    posts: defineCollection({\n      type: 'page',\n      source: 'blog\u002F**\u002F*.md',\n      schema: z.object({\n        title: z.string(),\n        description: z.string(),\n        date: z.string(),\n        tags: z.array(z.string()).default([])\n      })\n    })\n  }\n})\n","ts","",[74,75,76,85,103,113,127,148,165,185,203,219,235,268,274,280,286],"code",{"__ignoreMap":72},[77,78,81],"span",{"class":79,"line":80},"line",1,[77,82,84],{"class":83},"sux-A","\u002F\u002F content.config.ts\n",[77,86,88,92,95,99],{"class":79,"line":87},2,[77,89,91],{"class":90},"s3QIE","export",[77,93,94],{"class":90}," default",[77,96,98],{"class":97},"sCK9x"," defineContentConfig",[77,100,102],{"class":101},"s_pn2","({\n",[77,104,106,110],{"class":79,"line":105},3,[77,107,109],{"class":108},"sm68I","  collections",[77,111,112],{"class":101},": {\n",[77,114,116,119,122,125],{"class":79,"line":115},4,[77,117,118],{"class":108},"    posts",[77,120,121],{"class":101},": ",[77,123,124],{"class":97},"defineCollection",[77,126,102],{"class":101},[77,128,130,133,135,139,143,145],{"class":79,"line":129},5,[77,131,132],{"class":108},"      type",[77,134,121],{"class":101},[77,136,138],{"class":137},"sNJcY","'",[77,140,142],{"class":141},"s7rlk","page",[77,144,138],{"class":137},[77,146,147],{"class":101},",\n",[77,149,151,154,156,158,161,163],{"class":79,"line":150},6,[77,152,153],{"class":108},"      source",[77,155,121],{"class":101},[77,157,138],{"class":137},[77,159,160],{"class":141},"blog\u002F**\u002F*.md",[77,162,138],{"class":137},[77,164,147],{"class":101},[77,166,168,171,173,177,180,183],{"class":79,"line":167},7,[77,169,170],{"class":108},"      schema",[77,172,121],{"class":101},[77,174,176],{"class":175},"st-jp","z",[77,178,179],{"class":101},".",[77,181,182],{"class":97},"object",[77,184,102],{"class":101},[77,186,188,191,193,195,197,200],{"class":79,"line":187},8,[77,189,190],{"class":108},"        title",[77,192,121],{"class":101},[77,194,176],{"class":175},[77,196,179],{"class":101},[77,198,199],{"class":97},"string",[77,201,202],{"class":101},"(),\n",[77,204,206,209,211,213,215,217],{"class":79,"line":205},9,[77,207,208],{"class":108},"        description",[77,210,121],{"class":101},[77,212,176],{"class":175},[77,214,179],{"class":101},[77,216,199],{"class":97},[77,218,202],{"class":101},[77,220,222,225,227,229,231,233],{"class":79,"line":221},10,[77,223,224],{"class":108},"        date",[77,226,121],{"class":101},[77,228,176],{"class":175},[77,230,179],{"class":101},[77,232,199],{"class":97},[77,234,202],{"class":101},[77,236,238,241,243,245,247,250,253,255,257,259,262,265],{"class":79,"line":237},11,[77,239,240],{"class":108},"        tags",[77,242,121],{"class":101},[77,244,176],{"class":175},[77,246,179],{"class":101},[77,248,249],{"class":97},"array",[77,251,252],{"class":101},"(",[77,254,176],{"class":175},[77,256,179],{"class":101},[77,258,199],{"class":97},[77,260,261],{"class":101},"()).",[77,263,264],{"class":97},"default",[77,266,267],{"class":101},"([])\n",[77,269,271],{"class":79,"line":270},12,[77,272,273],{"class":101},"      })\n",[77,275,277],{"class":79,"line":276},13,[77,278,279],{"class":101},"    })\n",[77,281,283],{"class":79,"line":282},14,[77,284,285],{"class":101},"  }\n",[77,287,289],{"class":79,"line":288},15,[77,290,291],{"class":101},"})\n",[15,293,295],{"id":294},"the-look","The look",[11,297,298,299,306,307,312],{},"I wanted the ",[300,301,305],"a",{"href":302,"rel":303},"https:\u002F\u002Fgarden.bradwoods.io\u002F",[304],"nofollow","Brad Woods"," chunky-shadow\nenergy paired with a ",[300,308,311],{"href":309,"rel":310},"https:\u002F\u002Fposthog.com\u002F",[304],"PostHog","-style retro card,\nbut pulled toward forest greens and warm browns instead of neon.",[11,314,315],{},"Palette ended up roughly:",[20,317,318,324,330,336,342],{},[23,319,320,323],{},[74,321,322],{},"#2a3d2c"," — deep forest (headings, header bg)",[23,325,326,329],{},[74,327,328],{},"#5a6f3a"," — moss (borders, accents, link underline)",[23,331,332,335],{},[74,333,334],{},"#3b2a1a"," — bark (body text)",[23,337,338,341],{},[74,339,340],{},"#efe4c2"," — paper (background)",[23,343,344,347],{},[74,345,346],{},"#a64a2a"," — rust (hover accent)",[11,349,350,351,354],{},"Pixel font for headings (",[74,352,353],{},"VT323","), monospace for body. Drop shadows\nand dashed borders carry the rest of the retro weight.",[15,356,358],{"id":357},"what-id-revisit","What I'd revisit",[20,360,361,364,367],{},[23,362,363],{},"Syntax highlighting theme to match the palette",[23,365,366],{},"An RSS feed",[23,368,369],{},"Tag pages — easy to bolt on once a few more entries pile up",[11,371,372],{},"Done is better than perfect. Camp's set up. Time to start logging\nreal entries.",[374,375,376],"style",{},"html pre.shiki code .sux-A, html code.shiki .sux-A{--shiki-default:#758575DD}html pre.shiki code .s3QIE, html code.shiki .s3QIE{--shiki-default:#4D9375}html pre.shiki code .sCK9x, html code.shiki .sCK9x{--shiki-default:#80A665}html pre.shiki code .s_pn2, html code.shiki .s_pn2{--shiki-default:#666666}html pre.shiki code .sm68I, html code.shiki .sm68I{--shiki-default:#B8A965}html pre.shiki code .sNJcY, html code.shiki .sNJcY{--shiki-default:#C98A7D77}html pre.shiki code .s7rlk, html code.shiki .s7rlk{--shiki-default:#C98A7D}html pre.shiki code .st-jp, html code.shiki .st-jp{--shiki-default:#BD976A}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);}",{"title":72,"searchDepth":87,"depth":87,"links":378},[379,380,381,382],{"id":17,"depth":87,"text":18},{"id":40,"depth":87,"text":41},{"id":294,"depth":87,"text":295},{"id":357,"depth":87,"text":358},"2026-04-28","How I scaffolded AI Trail with Nuxt 4 and the Content module — start to finish in an afternoon.","md",{},true,"\u002Fblog\u002Fproject-log-blog-build",{"title":6,"description":384},"blog\u002Fproject-log-blog-build",[392,393,394],"project-log","nuxt","design","cQ6kKMhGsxf3WI4c0TvPN_q1YLgcs2B5gd8gzjDCTPQ",{"id":397,"title":398,"body":399,"date":383,"description":464,"extension":385,"meta":465,"navigation":387,"path":466,"seo":467,"stem":468,"tags":469,"__hash__":472},"posts\u002Fblog\u002Fwelcome-to-the-trail.md","Welcome to the trail",{"type":8,"value":400,"toc":460},[401,408,412,415,436,440,451,457],[11,402,403,404,407],{},"This is the first entry in ",[47,405,406],{},"AI Trail"," — a public-ish journal of how\nI'm using AI in my day-to-day building. Not a tutorial site. Not a\nthink-piece site. Just notes from the trail.",[15,409,411],{"id":410},"why-log-it","Why log it",[11,413,414],{},"A few reasons:",[416,417,418,424,430],"ol",{},[23,419,420,423],{},[47,421,422],{},"Memory is cheap when written down."," I keep rediscovering the same\npatterns. Writing them down means I stop paying that tax.",[23,425,426,429],{},[47,427,428],{},"AI tooling moves fast."," What worked last month might be obsolete\nnext month. A dated journal beats a polished evergreen page.",[23,431,432,435],{},[47,433,434],{},"Showing my working"," is more useful than showing my conclusions —\nto future-me, and to anyone walking the same trail behind me.",[15,437,439],{"id":438},"what-youll-find-here","What you'll find here",[20,441,442,445,448],{},[23,443,444],{},"Project logs from things I'm shipping",[23,446,447],{},"Patterns I keep reaching for (and ones I keep regretting)",[23,449,450],{},"Honest notes when something doesn't work",[452,453,454],"blockquote",{},[11,455,456],{},"Trees grow slow. So does taste. This is a place for both.",[11,458,459],{},"See you on the next entry.",{"title":72,"searchDepth":87,"depth":87,"links":461},[462,463],{"id":410,"depth":87,"text":411},{"id":438,"depth":87,"text":439},"Why I started this log, and what you'll find here.",{},"\u002Fblog\u002Fwelcome-to-the-trail",{"title":398,"description":464},"blog\u002Fwelcome-to-the-trail",[470,471],"meta","intro","d0YZ0AQcHbT4hWngyLsA8OgJUSPGt7SngUyuzFgvCi0",{"id":474,"title":475,"body":476,"date":563,"description":564,"extension":385,"meta":565,"navigation":387,"path":566,"seo":567,"stem":568,"tags":569,"__hash__":573},"posts\u002Fblog\u002Fagents-as-collaborators.md","Agents as collaborators, not autocomplete",{"type":8,"value":477,"toc":558},[478,481,493,497,500,520,524,527,535,538,544,551,555],[11,479,480],{},"For about a year I treated coding agents like a fancier autocomplete —\ntype a comment, get a function, glance at it, accept. It was fine. It\nwasn't transformative.",[11,482,483,484,488,489,492],{},"The shift came when I stopped writing prompts ",[485,486,487],"em",{},"at"," the agent and\nstarted writing prompts ",[485,490,491],{},"to"," it.",[15,494,496],{"id":495},"what-changed","What changed",[11,498,499],{},"Three small things:",[20,501,502,508,514],{},[23,503,504,507],{},[47,505,506],{},"Brief like a colleague."," Why does this matter, what have I tried,\nwhat am I worried about. Terse imperatives produce shallow work.",[23,509,510,513],{},[47,511,512],{},"Hand over context, not instructions."," A good prompt proves I\nunderstood the problem. The agent fills in the work, not the thinking.",[23,515,516,519],{},[47,517,518],{},"Trust, then verify the diff."," \"Done\" from the agent means\n\"intended to do\" — never \"actually did.\"",[15,521,523],{"id":522},"a-small-example","A small example",[11,525,526],{},"I had a flaky test in a Go service. Old me would have written:",[67,528,533],{"className":529,"code":531,"language":532},[530],"language-text","Fix the flaky test in payments_test.go\n","text",[74,534,531],{"__ignoreMap":72},[11,536,537],{},"Now I'd write something like:",[67,539,542],{"className":540,"code":541,"language":532},[530],"Fix the flake in TestRefundIdempotency. Context: it's racy on the\nledger write — two goroutines compete for the same row and the\ntest asserts a specific ordering. I want the test to assert\nthe invariant (one row exists with the final state), not the\nordering. Fix the test, not the production code.\n",[74,543,541],{"__ignoreMap":72},[11,545,546,547,550],{},"The second version doesn't take longer to write. It just front-loads\nthe thinking that I'd otherwise do ",[485,548,549],{},"after"," reading the agent's first\nattempt.",[15,552,554],{"id":553},"the-trade","The trade",[11,556,557],{},"Briefer prompts feel faster, but you pay later — re-reading bad output,\nre-prompting, undoing. Investing 30 seconds in the prompt saves 5\nminutes of cleanup. Compounds across a day.",{"title":72,"searchDepth":87,"depth":87,"links":559},[560,561,562],{"id":495,"depth":87,"text":496},{"id":522,"depth":87,"text":523},{"id":553,"depth":87,"text":554},"2026-04-22","The mental shift that changed how I work with Claude Code.",{},"\u002Fblog\u002Fagents-as-collaborators",{"title":475,"description":564},"blog\u002Fagents-as-collaborators",[570,571,572],"ai","workflow","claude-code","It6-J35rZ3GBOWn8rmy8J2MUaqeXTalbH7so-HAannk",1777388214869]