[{"data":1,"prerenderedAt":267},["ShallowReactive",2],{"blog-posts":3},[4,14,24,33,40,48,55,63,70,77,84,92,99,106,113,121,127,135,144,152,158,165,171,179,187,194,200,206,213,219,225,231,238,245,252,260],{"_path":5,"title":6,"description":7,"date":8,"tags":9,"readingTime":13},"\u002Fblog\u002Fclient-side-tools-that-earn-trust\u002F","Client-Side Tools That Earn Trust","How to design browser tools that feel private by default—local processing, clear data boundaries, and UX that never asks people to guess where their files go.","2026-07-20",[10,11,12],"privacy","frontend","tools",5,{"_path":15,"title":16,"description":17,"date":18,"tags":19,"readingTime":23},"\u002Fblog\u002Fusb-c-cables-that-actually-matter\u002F","USB-C Cables That Actually Matter","How to buy USB-C cables by wattage and data speed so you stop guessing which cord charges slowly or fails a file transfer.","2026-07-14",[20,21,22],"gadgets","hardware","productivity",4,{"_path":25,"title":26,"description":27,"date":28,"tags":29,"readingTime":13},"\u002Fblog\u002Fcolor-contrast-people-can-read\u002F","Color Contrast People Can Actually Read","Quick checks for text and UI colors that stay legible in light mode, dark mode, and on mediocre displays.","2026-07-07",[30,31,32],"accessibility","css","design",{"_path":34,"title":35,"description":36,"date":37,"tags":38,"readingTime":13},"\u002Fblog\u002Fportable-ssds-worth-carrying\u002F","Portable SSDs Worth Carrying","When a pocket SSD beats cloud sync for travel, backups, and large media—and how to pick one that stays fast and durable.","2026-06-26",[20,39,22],"storage",{"_path":41,"title":42,"description":43,"date":44,"tags":45,"readingTime":13},"\u002Fblog\u002Fwireless-earbuds-that-last-the-day\u002F","Wireless Earbuds That Last the Day","Simple charging and fit habits that stretch earbud battery life without babysitting the case every few hours.","2026-06-18",[20,46,47],"audio","habits",{"_path":49,"title":50,"description":51,"date":52,"tags":53,"readingTime":23},"\u002Fblog\u002Fwhen-a-second-monitor-helps\u002F","When a Second Monitor Actually Helps","A practical take on dual screens for coding, writing, and research—plus when a single good display is still the better desk.","2026-06-10",[20,22,54],"workspace",{"_path":56,"title":57,"description":58,"date":59,"tags":60,"readingTime":23},"\u002Fblog\u002Fshort-session-game-picks\u002F","Short-Session Games That Respect Your Evening","Genres and design patterns that fit a 30-minute window without the “one more hour” trap.","2026-06-04",[61,47,62],"gaming","indie",{"_path":64,"title":65,"description":66,"date":67,"tags":68,"readingTime":13},"\u002Fblog\u002Fphone-charging-habits-that-age-better\u002F","Phone Charging Habits That Age Better","Practical charging routines that keep a phone useful longer—without obsessing over the perfect battery percentage.","2026-05-23",[20,69,47],"mobile",{"_path":71,"title":72,"description":73,"date":74,"tags":75,"readingTime":13},"\u002Fblog\u002Ffinishing-side-projects-without-burning-out\u002F","Finishing Side Projects Without Burning Out","A practical playbook for shrinking scope, shipping thin vertical slices, and keeping personal projects fun long enough to actually launch.","2026-05-14",[22,76,47],"side-projects",{"_path":78,"title":79,"description":80,"date":81,"tags":82,"readingTime":13},"\u002Fblog\u002Faccessible-forms-people-finish\u002F","Accessible Forms That People Actually Finish","Practical accessibility checks for labels, errors, and focus so your forms work for more users.","2026-05-07",[30,83,11],"html",{"_path":85,"title":86,"description":87,"date":88,"tags":89,"readingTime":13},"\u002Fblog\u002Fvue-composition-api-patterns\u002F","Practical Vue Composition API Patterns","Reusable patterns for composables, shared state, and cleaner component logic in Vue 3.","2026-04-27",[90,91,11],"vue","javascript",{"_path":93,"title":94,"description":95,"date":96,"tags":97,"readingTime":13},"\u002Fblog\u002Fdesigning-empty-states-that-teach\u002F","Designing Empty States That Teach the Product","Empty screens are not placeholders—they are onboarding. How to write, layout, and sequence first-run UI so people know what to do next.","2026-04-19",[98,11,32],"ux",{"_path":100,"title":101,"description":102,"date":103,"tags":104,"readingTime":13},"\u002Fblog\u002Fwhy-indie-games-keep-winning\u002F","Why Indie Games Keep Winning Attention","How small teams punch above their weight with focused design, personality, and smart scope.","2026-04-13",[61,62,105],"industry",{"_path":107,"title":108,"description":109,"date":110,"tags":111,"readingTime":13},"\u002Fblog\u002Fkeeping-component-props-simple\u002F","Keeping Component Props Simple","When to split a component, when to use slots, and how to avoid prop objects that grow forever.","2026-04-03",[90,11,112],"best-practices",{"_path":114,"title":115,"description":116,"date":117,"tags":118,"readingTime":13},"\u002Fblog\u002Fcalm-frontend-performance\u002F","A Calm Approach to Frontend Performance","Performance work that sticks: measure what users feel, fix the critical path first, and avoid optimization theater on personal and portfolio sites.","2026-03-26",[119,11,120],"performance","web",{"_path":122,"title":123,"description":124,"date":125,"tags":126,"readingTime":13},"\u002Fblog\u002Fcss-layout-without-the-hacks\u002F","CSS Layout Without the Hacks","Modern Flexbox and Grid techniques that replace brittle floats, magic numbers, and overflow tricks.","2026-03-17",[31,11,32],{"_path":128,"title":129,"description":130,"date":131,"tags":132,"readingTime":13},"\u002Fblog\u002Fcloud-gaming-what-gets-in-the-way\u002F","Cloud Gaming: What Still Gets in the Way","Latency, input feel, and library lock-in—why streaming games is impressive and still uneven.","2026-03-10",[61,133,134],"cloud-gaming","tech",{"_path":136,"title":137,"description":138,"date":139,"tags":140,"readingTime":13},"\u002Fblog\u002Fshipping-static-sites-with-nuxt\u002F","Shipping Static Sites with Nuxt","How I build and deploy a Nuxt site to Cloudflare Pages with predictable routes and content.","2026-03-02",[141,142,143],"nuxt","ssg","devops",{"_path":145,"title":146,"description":147,"date":148,"tags":149,"readingTime":13},"\u002Fblog\u002Fdebugging-faster-in-the-browser\u002F","Debugging Faster in the Browser","A short toolkit of DevTools habits—breakpoints, network filters, and DOM inspection—that cut debug time.","2026-02-24",[91,150,151],"devtools","debugging",{"_path":153,"title":154,"description":155,"date":156,"tags":157,"readingTime":13},"\u002Fblog\u002Fsmall-javascript-habits-that-scale\u002F","Small JavaScript Habits That Scale","Everyday habits—naming, early returns, and clearer async flow—that keep front-end codebases maintainable.","2026-02-18",[91,112,11],{"_path":159,"title":160,"description":161,"date":162,"tags":163,"readingTime":23},"\u002Fblog\u002Fhealthier-gaming-routine\u002F","Building a Healthier Gaming Routine","Simple habits for sessions that stay fun—breaks, goals, and knowing when to stop.","2026-02-02",[61,47,164],"wellness",{"_path":166,"title":167,"description":168,"date":169,"tags":170,"readingTime":13},"\u002Fblog\u002Fresponsive-images-without-layout-shift\u002F","Responsive Images Without Layout Shift","Width, height, srcset, and lazy loading patterns that keep pages stable while images load.","2026-01-22",[83,119,11],{"_path":172,"title":173,"description":174,"date":175,"tags":176,"readingTime":13},"\u002Fblog\u002Fgit-habits-for-small-teams\u002F","Git Habits for Solo and Small Teams","Branch naming, commit messages, and PR hygiene that keep history useful without slowing you down.","2026-01-09",[177,178,22],"git","workflow",{"_path":180,"title":181,"description":182,"date":183,"tags":184,"readingTime":13},"\u002Fblog\u002Fwhat-makes-a-game-stream-worth-watching\u002F","What Makes a Game Stream Worth Watching","Commentary, pacing, and community—why some streams click even when the gameplay is messy.","2025-12-14",[61,185,186],"streaming","content",{"_path":188,"title":189,"description":190,"date":191,"tags":192,"readingTime":13},"\u002Fblog\u002Fwhen-to-reach-for-typescript-vue\u002F","When to Reach for TypeScript on a Vue App","A pragmatic take on where TypeScript pays off in Vue—and where plain JS is still fine.","2025-11-30",[193,90,11],"typescript",{"_path":195,"title":196,"description":197,"date":198,"tags":199,"readingTime":13},"\u002Fblog\u002Fenvironment-variables-for-static-sites\u002F","Environment Variables for Static Sites","How to use build-time env vars in Nuxt and other static generators without leaking secrets or breaking CI.","2025-10-05",[141,143,11],{"_path":201,"title":202,"description":203,"date":204,"tags":205,"readingTime":13},"\u002Fblog\u002Fpicking-a-side-project-stack\u002F","Picking a Side Project Stack Without Overthinking It","How to choose tools for a personal project when the goal is shipping, not building the perfect architecture.","2025-09-18",[22,11,112],{"_path":207,"title":208,"description":209,"date":210,"tags":211,"readingTime":23},"\u002Fblog\u002Fco-op-games-for-busy-friends\u002F","Co-op Games That Work When Everyone Is Busy","Async-friendly and drop-in co-op picks for friend groups that rarely share the same free evening.","2025-08-22",[61,212,47],"co-op",{"_path":214,"title":215,"description":216,"date":217,"tags":218,"readingTime":13},"\u002Fblog\u002Fsemantic-html-still-matters\u002F","Semantic HTML Still Matters","Landmarks, headings, and native elements that make pages easier to use, style, and maintain.","2025-07-06",[83,30,11],{"_path":220,"title":221,"description":222,"date":223,"tags":224,"readingTime":13},"\u002Fblog\u002Fgit-without-the-jargon\u002F","Learning Git Without the Jargon","A plain-language mental model for commits, branches, and merges when tutorials assume you already know Git.","2025-05-14",[177,178,22],{"_path":226,"title":227,"description":228,"date":229,"tags":230,"readingTime":13},"\u002Fblog\u002Fwhy-loading-states-matter\u002F","Why Loading States Matter More Than Animations","Skeletons, disabled buttons, and honest feedback beat flashy spinners when data takes time to arrive.","2025-03-28",[98,11,32],{"_path":232,"title":233,"description":234,"date":235,"tags":236,"readingTime":13},"\u002Fblog\u002Fnaming-things-so-future-you-survives\u002F","Naming Things So Future You Survives","Practical rules for naming variables, components, and files so a codebase stays readable months after the clever jokes fade.","2025-03-10",[91,112,237],"maintainability",{"_path":239,"title":240,"description":241,"date":242,"tags":243,"readingTime":13},"\u002Fblog\u002Fsave-systems-that-respect-time\u002F","Save Systems That Respect the Player’s Time","Checkpoints, autosaves, and manual slots are design choices. How thoughtful saving reduces rage-quits without deleting tension from the game.","2025-02-28",[61,244,98],"game-design",{"_path":246,"title":247,"description":248,"date":249,"tags":250,"readingTime":13},"\u002Fblog\u002Fmicrocopy-that-makes-interfaces-human\u002F","Microcopy That Makes Interfaces Feel Human","Button labels, error lines, and helper text are product design. How to write UI words that reduce hesitation without sounding like a chatbot.","2025-01-22",[98,251,32],"writing",{"_path":253,"title":254,"description":255,"date":256,"tags":257,"readingTime":13},"\u002Fblog\u002Freadmes-that-get-projects-running\u002F","READMEs That Get Projects Running","How to write a README that helps someone—including future you—install, run, and understand a project without opening a support chat.","2024-12-18",[258,259,47],"documentation","open-source",{"_path":261,"title":262,"description":263,"date":264,"tags":265,"readingTime":13},"\u002Fblog\u002Fprogressive-enhancement-still-pays-off\u002F","Progressive Enhancement Still Pays Off","Build the core experience in HTML first, then layer CSS and JavaScript so your site stays useful when networks, scripts, or devices misbehave.","2024-11-05",[83,11,266],"architecture",1784620506145]