[{"data":1,"prerenderedAt":326},["ShallowReactive",2],{"navigation-en":3,"pagesContext-en-2":13,"pagesContext-en-3":42,"authorsContext-en-jeroenbach":63,"content-urls":80,"pagesContext-en-20":288},[4,7,10],{"label":5,"to":6},"Blog","\u002Fposts",{"label":8,"to":9},"Portfolio","\u002Fcontent\u002F20-portfolio",{"label":11,"to":12},"About","\u002Fcontent\u002F30-about",{"id":14,"title":15,"body":16,"canonicalUrl":27,"company":27,"contentId":25,"dateModified":27,"datePublished":27,"description":22,"draft":28,"enableProse":28,"excludeFromNavigation":28,"extension":29,"imageAlt":27,"imageUrl":27,"meta":30,"navigation":36,"partial":36,"path":37,"seo":38,"slug":27,"stem":39,"url":40,"__hash__":41},"pages_en\u002Fcontent\u002F_footer.md","About Jeroen Bach",{"type":17,"value":18,"toc":23},"minimark",[19],[20,21,22],"p",{},"Designed in Figma and built with Vue.js, Nuxt.js and Tailwind CSS.\nDeployed via Azure Static Web App and Azure Functions.\nWebsite analytics are powered by Plausible Analytics, deployed using Azure Kubernetes Service.",{"title":24,"searchDepth":25,"depth":25,"links":26},"",2,[],null,false,"md",{"readingTime":31},{"text":32,"minutes":33,"time":34,"words":35},"1 min read",0.16,9600,32,true,"\u002Fcontent\u002F_footer",{"title":15,"description":22},"content\u002F_footer","\u002Fcontent\u002F2-about-jeroen-bach","tgPfOB73xkNtsI3Ers_EH08FHEHR7ko45cqNiVgrM0s",{"id":43,"title":44,"body":45,"canonicalUrl":27,"company":27,"contentId":52,"dateModified":27,"datePublished":27,"description":49,"draft":28,"enableProse":28,"excludeFromNavigation":28,"extension":29,"imageAlt":27,"imageUrl":27,"meta":53,"navigation":36,"partial":36,"path":58,"seo":59,"slug":27,"stem":60,"url":61,"__hash__":62},"pages_en\u002Fcontent\u002F_footer-about.md","Footer About",{"type":17,"value":46,"toc":50},[47],[20,48,49],{},"I'm a Software Engineer and Team Lead with over 15 years of professional experience.\nI'm passionate about solving complex problems through simple, elegant solutions.\nThis blog is where I share techniques and insights for building great software, inspired by real-world projects.",{"title":24,"searchDepth":25,"depth":25,"links":51},[],3,{"readingTime":54},{"text":32,"minutes":55,"time":56,"words":57},0.205,12300,41,"\u002Fcontent\u002F_footer-about",{"description":49},"content\u002F_footer-about","\u002Fcontent\u002F3-footer-about","49ofD3QAU2eKgnsoCR9zQhGEP7EECAsjUJeOHSF1GJI",{"id":64,"company":65,"extension":69,"fullName":70,"github":71,"homePage":72,"imageUrl":68,"linkedIn":73,"meta":74,"role":75,"stem":76,"twitter":77,"userName":78,"__hash__":79},"authors_en\u002Fauthors\u002Fjeroenbach.yaml",{"name":66,"url":67,"imageUrl":68},"Bach.Software","https:\u002F\u002Fbach.software","\u002FJEROEN-_A7R5652-HD-SQUARE-zoom.jpg","yaml","Jeroen Bach","https:\u002F\u002Fgithub.com\u002Fjeroenbach","https:\u002F\u002Fbach.software\u002Fpages\u002Fabout","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fjeroenbach\u002F",{},"Software Engineer \u002F Team Lead","authors\u002Fjeroenbach","https:\u002F\u002Fx.com\u002Fjeroenbach","jeroenbach","QjQ1vpL_EQbLZNaZdDNOjIkS-thm6oxHuAdoNIauNI8",{"page":81,"blogPost":167,"blog":287},{"1":82,"10":103,"20":117,"30":131,"404":148},{"en":83,"fr":91,"nl":94,"de":97,"es":100},{"title":84,"path":85,"stem":86,"contentId":87,"url":24,"dateModified":88,"locale":89,"type":90},"Home","\u002Fcontent\u002Fhome","content\u002F1.home",1,"2025-11-02T18:00:00","en","page",{"title":84,"path":85,"stem":86,"contentId":87,"url":92,"dateModified":88,"locale":93,"type":90},"\u002Ffr","fr",{"title":84,"path":85,"stem":86,"contentId":87,"url":95,"dateModified":88,"locale":96,"type":90},"\u002Fnl","nl",{"title":84,"path":85,"stem":86,"contentId":87,"url":98,"dateModified":88,"locale":99,"type":90},"\u002Fde","de",{"title":84,"path":85,"stem":86,"contentId":87,"url":101,"dateModified":88,"locale":102,"type":90},"\u002Fes","es",{"en":104,"fr":109,"nl":111,"de":113,"es":115},{"title":5,"path":105,"stem":106,"contentId":107,"url":6,"dateModified":108,"locale":89,"type":90},"\u002Fcontent\u002Fposts","content\u002F10.posts",10,"2025-10-26T18:00:00",{"title":5,"path":105,"stem":106,"contentId":107,"url":110,"dateModified":108,"locale":93,"type":90},"\u002Ffr\u002Farticles",{"title":5,"path":105,"stem":106,"contentId":107,"url":112,"dateModified":108,"locale":96,"type":90},"\u002Fnl\u002Fposts",{"title":5,"path":105,"stem":106,"contentId":107,"url":114,"dateModified":108,"locale":99,"type":90},"\u002Fde\u002Fposts",{"title":5,"path":105,"stem":106,"contentId":107,"url":116,"dateModified":108,"locale":102,"type":90},"\u002Fes\u002Farticulos",{"en":118,"fr":122,"nl":124,"de":126,"es":128},{"title":8,"path":119,"stem":120,"contentId":121,"url":9,"dateModified":108,"locale":89,"type":90},"\u002Fcontent\u002Fportfolio","content\u002F20.portfolio",20,{"title":8,"path":119,"stem":120,"contentId":121,"url":123,"dateModified":108,"locale":93,"type":90},"\u002Ffr\u002Fcontent\u002F20-portfolio",{"title":8,"path":119,"stem":120,"contentId":121,"url":125,"dateModified":108,"locale":96,"type":90},"\u002Fnl\u002Fcontent\u002F20-portfolio",{"title":8,"path":119,"stem":120,"contentId":121,"url":127,"dateModified":108,"locale":99,"type":90},"\u002Fde\u002Fcontent\u002F20-portfolio",{"title":129,"path":119,"stem":120,"contentId":121,"url":130,"dateModified":108,"locale":102,"type":90},"Portafolio","\u002Fes\u002Fcontent\u002F20-portafolio",{"en":132,"fr":136,"nl":139,"de":142,"es":145},{"title":11,"path":133,"stem":134,"contentId":135,"url":12,"dateModified":108,"locale":89,"type":90},"\u002Fcontent\u002Fabout","content\u002F30.about",30,{"title":137,"path":133,"stem":134,"contentId":135,"url":138,"dateModified":108,"locale":93,"type":90},"À propos","\u002Ffr\u002Fcontent\u002F30-a-propos",{"title":140,"path":133,"stem":134,"contentId":135,"url":141,"dateModified":108,"locale":96,"type":90},"Over","\u002Fnl\u002Fcontent\u002F30-over",{"title":143,"path":133,"stem":134,"contentId":135,"url":144,"dateModified":108,"locale":99,"type":90},"Über mich","\u002Fde\u002Fcontent\u002F30-uber-mich",{"title":146,"path":133,"stem":134,"contentId":135,"url":147,"dateModified":108,"locale":102,"type":90},"Acerca de","\u002Fes\u002Fcontent\u002F30-acerca-de",{"en":149,"fr":155,"nl":158,"de":161,"es":164},{"title":150,"path":151,"stem":152,"contentId":153,"url":154,"dateModified":88,"locale":89,"type":90},"Page not found","\u002Fcontent\u002Fpage-not-found","content\u002F404.page-not-found",404,"\u002Fcontent\u002F404-page-not-found",{"title":156,"path":151,"stem":152,"contentId":153,"url":157,"dateModified":88,"locale":93,"type":90},"Page non trouvée","\u002Ffr\u002Fcontent\u002F404-page-non-trouvee",{"title":159,"path":151,"stem":152,"contentId":153,"url":160,"dateModified":88,"locale":96,"type":90},"Pagina niet gevonden","\u002Fnl\u002Fcontent\u002F404-pagina-niet-gevonden",{"title":162,"path":151,"stem":152,"contentId":153,"url":163,"dateModified":88,"locale":99,"type":90},"Seite nicht gefunden","\u002Fde\u002Fcontent\u002F404-seite-nicht-gefunden",{"title":165,"path":151,"stem":152,"contentId":153,"url":166,"dateModified":88,"locale":102,"type":90},"Página no encontrada","\u002Fes\u002Fcontent\u002F404-pagina-no-encontrada",{"1":168,"2":192,"3":215,"4":239,"5":263},{"en":169,"fr":176,"nl":181,"de":184,"es":187},{"title":170,"path":171,"stem":172,"contentId":87,"dateModified":173,"url":174,"locale":89,"type":175},"Mastering Conditional Property Types with Vue 3.3 Generics","\u002Fposts\u002F1","posts\u002F1","2025-05-27T11:30:00","\u002Fposts\u002F1-mastering-conditional-property-types-with-vue-3_3-generics","blogPost",{"title":177,"path":178,"stem":179,"contentId":87,"dateModified":173,"url":180,"locale":93,"type":175},"Maîtriser les types de propriétés conditionnelles avec les génériques de Vue 3.3","\u002Farticles\u002F1","articles\u002F1","\u002Ffr\u002Farticles\u002F1-maitriser-les-types-de-proprietes-conditionnelles-avec-les-generiques-de-vue-3_3",{"title":182,"path":171,"stem":172,"contentId":87,"dateModified":173,"url":183,"locale":96,"type":175},"Conditionele Property Types beheersen met Vue 3.3 Generics","\u002Fnl\u002Fposts\u002F1-conditionele-property-types-beheersen-met-vue-3_3-generics",{"title":185,"path":171,"stem":172,"contentId":87,"dateModified":173,"url":186,"locale":99,"type":175},"Bedingte Property-Typen mit Vue 3.3 Generics meistern","\u002Fde\u002Fposts\u002F1-bedingte-property-typen-mit-vue-3_3-generics-meistern",{"title":188,"path":189,"stem":190,"contentId":87,"dateModified":173,"url":191,"locale":102,"type":175},"Dominar los tipos de propiedades condicionales con genéricos de Vue 3.3","\u002Farticulos\u002F1","articulos\u002F1","\u002Fes\u002Farticulos\u002F1-dominar-los-tipos-de-propiedades-condicionales-con-genericos-de-vue-3_3",{"en":193,"fr":199,"nl":204,"de":207,"es":210},{"title":194,"path":195,"stem":196,"contentId":25,"dateModified":197,"url":198,"locale":89,"type":175},"Ditching the Cookie Banners: Run Plausible Analytics on Azure Kubernetes","\u002Fposts\u002F2","posts\u002F2","2025-10-04T13:00:00","\u002Fposts\u002F2-ditching-the-cookie-banners:-run-plausible-analytics-on-azure-kubernetes",{"title":200,"path":201,"stem":202,"contentId":25,"dateModified":197,"url":203,"locale":93,"type":175},"Éliminer les bannières de cookies: Exécutez Plausible Analytics sur Azure Kubernetes","\u002Farticles\u002F2","articles\u002F2","\u002Ffr\u002Farticles\u002F2-eliminer-les-bannieres-de-cookies:-executez-plausible-analytics-sur-azure-kubernetes",{"title":205,"path":195,"stem":196,"contentId":25,"dateModified":197,"url":206,"locale":96,"type":175},"Afscheid van Cookie Banners: Draai Plausible Analytics op Azure Kubernetes","\u002Fnl\u002Fposts\u002F2-afscheid-van-cookie-banners:-draai-plausible-analytics-op-azure-kubernetes",{"title":208,"path":195,"stem":196,"contentId":25,"dateModified":197,"url":209,"locale":99,"type":175},"Abschied von Cookie-Bannern: Plausible Analytics auf Azure Kubernetes betreiben","\u002Fde\u002Fposts\u002F2-abschied-von-cookie-bannern:-plausible-analytics-auf-azure-kubernetes-betreiben",{"title":211,"path":212,"stem":213,"contentId":25,"dateModified":197,"url":214,"locale":102,"type":175},"Eliminar los banners de cookies: Ejecuta Plausible Analytics en Azure Kubernetes","\u002Farticulos\u002F2","articulos\u002F2","\u002Fes\u002Farticulos\u002F2-eliminar-los-banners-de-cookies:-ejecuta-plausible-analytics-en-azure-kubernetes",{"en":216,"fr":222,"nl":228,"de":231,"es":234},{"title":217,"path":218,"stem":219,"contentId":52,"dateModified":220,"url":221,"locale":89,"type":175},"Track how many people read your articles, using Plausible.io, Vue.js and Azure functions","\u002Fposts\u002F3","posts\u002F3","2025-08-03T15:45:00","\u002Fposts\u002F3-track-how-many-people-read-your-articles-using-plausible_io-vue_js-and-azure-functions",{"title":223,"path":224,"stem":225,"contentId":52,"dateModified":226,"url":227,"locale":93,"type":175},"Suivez combien de personnes lisent vos articles, en utilisant Plausible.io, Vue.js et Azure Functions","\u002Farticles\u002F3","articles\u002F3","2025-08-15:45:00","\u002Ffr\u002Farticles\u002F3-suivez-combien-de-personnes-lisent-vos-articles-en-utilisant-plausible_io-vue_js-et-azure-functions",{"title":229,"path":218,"stem":219,"contentId":52,"dateModified":220,"url":230,"locale":96,"type":175},"Volg hoeveel mensen je artikelen lezen, met Plausible.io, Vue.js en Azure functions","\u002Fnl\u002Fposts\u002F3-volg-hoeveel-mensen-je-artikelen-lezen-met-plausible_io-vue_js-en-azure-functions",{"title":232,"path":218,"stem":219,"contentId":52,"dateModified":220,"url":233,"locale":99,"type":175},"Verfolgen Sie, wie viele Menschen Ihre Artikel lesen, mit Plausible.io, Vue.js und Azure Functions","\u002Fde\u002Fposts\u002F3-verfolgen-sie-wie-viele-menschen-ihre-artikel-lesen-mit-plausible_io-vue_js-und-azure-functions",{"title":235,"path":236,"stem":237,"contentId":52,"dateModified":220,"url":238,"locale":102,"type":175},"Rastrea cuántas personas leen tus artículos, usando Plausible.io, Vue.js y funciones de Azure","\u002Farticulos\u002F3","articulos\u002F3","\u002Fes\u002Farticulos\u002F3-rastrea-cuantas-personas-leen-tus-articulos-usando-plausible_io-vue_js-y-funciones-de-azure",{"en":240,"fr":247,"nl":252,"de":255,"es":258},{"title":241,"path":242,"stem":243,"contentId":244,"dateModified":245,"url":246,"locale":89,"type":175},"Deploy a production-ready Kubernetes Cluster on Azure with Terraform","\u002Fposts\u002F4","posts\u002F4",4,"2025-12-06T21:00:00","\u002Fposts\u002F4-deploy-a-production-ready-kubernetes-cluster-on-azure-with-terraform",{"title":248,"path":249,"stem":250,"contentId":244,"dateModified":245,"url":251,"locale":93,"type":175},"Déployer un cluster Kubernetes prêt pour la production sur Azure avec Terraform","\u002Farticles\u002F4","articles\u002F4","\u002Ffr\u002Farticles\u002F4-deployer-un-cluster-kubernetes-pret-pour-la-production-sur-azure-avec-terraform",{"title":253,"path":242,"stem":243,"contentId":244,"dateModified":245,"url":254,"locale":96,"type":175},"Implementeer een productie-klaar Kubernetes Cluster op Azure met Terraform","\u002Fnl\u002Fposts\u002F4-implementeer-een-productie-klaar-kubernetes-cluster-op-azure-met-terraform",{"title":256,"path":242,"stem":243,"contentId":244,"dateModified":245,"url":257,"locale":99,"type":175},"Einen produktionsreifen Kubernetes-Cluster auf Azure mit Terraform bereitstellen","\u002Fde\u002Fposts\u002F4-einen-produktionsreifen-kubernetes-cluster-auf-azure-mit-terraform-bereitstellen",{"title":259,"path":260,"stem":261,"contentId":244,"dateModified":245,"url":262,"locale":102,"type":175},"Despliega un clúster de Kubernetes listo para producción en Azure con Terraform","\u002Farticulos\u002F4","articulos\u002F4","\u002Fes\u002Farticulos\u002F4-despliega-un-cluster-de-kubernetes-listo-para-produccion-en-azure-con-terraform",{"en":264,"fr":271,"nl":276,"de":279,"es":282},{"title":265,"path":266,"stem":267,"contentId":268,"dateModified":269,"url":270,"locale":89,"type":175},"Array to Map conversion in Typescript, with type safety","\u002Fposts\u002F5","posts\u002F5",5,"2025-09-29T21:00:00","\u002Fposts\u002F5-array-to-map-conversion-in-typescript-with-type-safety",{"title":272,"path":273,"stem":274,"contentId":268,"dateModified":269,"url":275,"locale":93,"type":175},"Conversion de tableau en Map en Typescript, avec sécurité des types","\u002Farticles\u002F5","articles\u002F5","\u002Ffr\u002Farticles\u002F5-conversion-de-tableau-en-map-en-typescript-avec-securite-des-types",{"title":277,"path":266,"stem":267,"contentId":268,"dateModified":269,"url":278,"locale":96,"type":175},"Array naar Map conversie in Typescript, met type veiligheid","\u002Fnl\u002Fposts\u002F5-array-naar-map-conversie-in-typescript-met-type-veiligheid",{"title":280,"path":266,"stem":267,"contentId":268,"dateModified":269,"url":281,"locale":99,"type":175},"Array zu Map Konvertierung in TypeScript, mit Typsicherheit","\u002Fde\u002Fposts\u002F5-array-zu-map-konvertierung-in-typescript-mit-typsicherheit",{"title":283,"path":284,"stem":285,"contentId":268,"dateModified":269,"url":286,"locale":102,"type":175},"Conversión de Array a Map en Typescript, con seguridad de tipos","\u002Farticulos\u002F5","articulos\u002F5","\u002Fes\u002Farticulos\u002F5-conversion-de-array-a-map-en-typescript-con-seguridad-de-tipos",{},{"id":289,"title":8,"body":290,"canonicalUrl":27,"company":27,"contentId":121,"dateModified":108,"datePublished":317,"description":318,"draft":28,"enableProse":28,"excludeFromNavigation":28,"extension":29,"imageAlt":27,"imageUrl":27,"meta":319,"navigation":36,"partial":28,"path":119,"seo":324,"slug":27,"stem":120,"url":9,"__hash__":325},"pages_en\u002Fcontent\u002F20.portfolio.md",{"type":17,"value":291,"toc":315},[292,308],[293,294,295,299,302,305],"app-prose",{},[296,297,8],"h1",{"id":298},"portfolio",[20,300,301],{},"Below is a selection of publicly accessible projects I've worked on.",[20,303,304],{},"Much of my work has involved proprietary or internal applications, making it difficult to build a portfolio\nthat fully reflects my experience. Through this blog and future open source projects, I aim to change that.",[20,306,307],{},"In the meantime, feel free to explore some of the projects I can share.",[309,310],"portfolio-grid",{":portfolio":311,"className":312},"[{\"title\":\"Sofia Vera\",\"description\":\"I designed Sofia-Vera.com in **Figma** and created a theme for **PrestaShop**. Run the whole environment on **Azure Kubernetes Services**.\",\"link\":\"https:\u002F\u002Fsofia-vera.com\",\"liClass\":\"lg:row-span-2\",\"linkClass\":\"max-lg:rounded-t-4xl lg:rounded-l-4xl\",\"imgOption\":\"sofiaVera\"},{\"title\":\"Travelbags\",\"description\":\"We build a high-performance e-commerce platform using **Vue.js**, **SSR**, **Node.js** and **.NET**. The project included CI\u002FCD on **Azure DevOps** and containerization via **Docker**.\",\"link\":\"https:\u002F\u002Ftravelbags.nl\",\"liClass\":\"max-lg:row-start-2\",\"imgOption\":\"travelBags\"},{\"title\":\"Pavo\",\"description\":\"With the **travelbags.nl** webshop, we developed a **framework** that enables rapid development of e-commerce platforms. \u003Cbr \u002F> \u003Cbr \u002F> Pavo.nl was the second webshop launched using this framework.\",\"link\":\"https:\u002F\u002Fpavo.nl\",\"liClass\":\"max-lg:row-start-3 lg:col-start-2 lg:row-start-2\",\"imgOption\":\"pavo\"},{\"title\":\"Beauty Plaza\",\"description\":\"The third webshop we built using the **travelbags.nl** framework. It uses **Vue.js**, **SSR**, **Node.js** and **.NET**, with CI\u002FCD on **Azure DevOps** and containerization via **Docker**.\",\"link\":\"https:\u002F\u002FbeautyPlaza.com\",\"liClass\":\"lg:row-span-2\",\"linkClass\":\"max-lg:rounded-b-4xl lg:rounded-r-4xl\",\"imgOption\":\"beautyPlaza\"}]",[313,314],"mt-14","lg:mt-20",{"title":24,"searchDepth":25,"depth":25,"links":316},[],"2025-07-26T18:00:00","Publicly accessible projects and a commitment to open source—sharing insights and giving back to the developer community through real-world experience.",{"readingTime":320},{"text":32,"minutes":321,"time":322,"words":323},0.29,17400,58,{"title":8,"description":318},"JsHazjXJwrOdFkfCsSThTyb-BacB-G7eJTQybXF8gpA",1781641709303]