[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"articles-all-1":3},{"items":4,"total":20,"page":43,"limit":44},[5,21,34],{"_id":6,"title":7,"slug":8,"excerpt":9,"coverImage":10,"tags":11,"publishedAt":17,"access":18,"views":19,"likes":20},"6ac4ef5b8226d6149fb30392","Patterns in the Age of AI, Part 1: Why Bother with Architecture When AI Writes the Code","patterns-in-the-age-of-ai","Why patterns matter more when AI writes the code, shown with a Pinia store factory that unifies data access over REST, Parse Server and mocks.","https:\u002F\u002Fres.cloudinary.com\u002Fdqjivljzi\u002Fimage\u002Fupload\u002Fv1791291939\u002Fdev-blog\u002F4fe42670-179f-4923-8146-657cf46461da.png",[12,13,14,15,16],"vue","pinia","typescript","architecture","ai","2026-10-06T13:00:00.000Z","free",34,3,{"_id":22,"title":23,"slug":24,"excerpt":25,"coverImage":26,"tags":27,"publishedAt":31,"access":18,"views":32,"likes":33},"6ac40eea7ed2305c5a7a2507","The simplest way to deal with modal dialogs in Vue 3","the-simplest-way-to-deal-with-modal-dialogs-in-vue-3","Turn modal dialogs into async functions with vuejs-confirm-dialog: reuse them, chain them and await the user's answer.","https:\u002F\u002Fres.cloudinary.com\u002Fdqjivljzi\u002Fimage\u002Fupload\u002Fv1791237227\u002Fdev-blog\u002F545e7dcd-f0d3-4aeb-8ed3-e3d3e100abd9.png",[28,12,29,30],"javascript","webdev","tutorial","2022-05-07T05:20:00.000Z",17,2,{"_id":35,"title":36,"slug":37,"excerpt":38,"coverImage":39,"tags":40,"publishedAt":41,"access":18,"views":42,"likes":43},"6ac40ee77ed2305c5a7a2505","VueUse: a must-have library for Vue 3","vueuse-a-must-have-library-for-vue-3","Four VueUse functions I keep coming back to: onClickOutside, useStorage with createGlobalState, and useRefHistory with undo and redo. Updated for VueUse 14 and Vue 3.5.","https:\u002F\u002Fres.cloudinary.com\u002Fdqjivljzi\u002Fimage\u002Fupload\u002Fv1791237372\u002Fdev-blog\u002F5c5813be-1884-4112-be20-b30f110b91c3.png",[12,14,29,28],"2021-09-01T05:20:00.000Z",8,1,10]