[{"data":1,"prerenderedAt":330},["ShallowReactive",2],{"navigation-en":3,"pagesContext-en-2":13,"pagesContext-en-3":42,"authorsContext-en-jeroenbach":63,"content-urls":84,"pagesContext-en-20":292},[4,7,10],{"label":5,"to":6},"Blog","/posts",{"label":8,"to":9},"Portfolio","/content/20-portfolio",{"label":11,"to":12},"About","/content/30-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/content/_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,"/content/_footer",{"title":15,"description":22},"content/_footer","/content/2-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/content/_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,"/content/_footer-about",{"title":44,"description":49},"content/_footer-about","/content/3-footer-about","Qly4UF-AyWmA-RgLWtjW-8SdbCSm9AVV_MDp_C17myA",{"id":64,"company":65,"extension":69,"fullName":70,"github":71,"homePage":72,"imageUrl":68,"linkedIn":73,"meta":74,"role":78,"stem":82,"twitter":79,"userName":77,"__hash__":83},"authors_en/authors/jeroenbach.yaml",{"name":66,"url":67,"imageUrl":68},"Bach.Software","https://bach.software","/JEROEN-_A7R5652-HD-SQUARE-zoom.jpg","yaml","Jeroen Bach","https://github.com/jeroenbach","https://bach.software/pages/about","https://www.linkedin.com/in/jeroenbach/",{"path":75,"body":76,"title":81},"/authors/jeroenbach",{"userName":77,"fullName":70,"role":78,"imageUrl":68,"homePage":72,"linkedIn":73,"twitter":79,"github":71,"company":80},"jeroenbach","Software Engineer / Team Lead","https://x.com/jeroenbach",{"name":66,"url":67,"imageUrl":68},"Jeroenbach","authors/jeroenbach","7vRxBPpv4RsJDyuDH6pOsAIyKicZ2GpMwuwi8si3jvM",{"page":85,"blogPost":171,"blog":291},{"1":86,"10":107,"20":121,"30":135,"404":152},{"en":87,"fr":95,"nl":98,"de":101,"es":104},{"title":88,"path":89,"stem":90,"contentId":91,"url":24,"dateModified":92,"locale":93,"type":94},"Home","/content/home","content/1.home",1,"2025-11-02T18:00:00","en","page",{"title":88,"path":89,"stem":90,"contentId":91,"url":96,"dateModified":92,"locale":97,"type":94},"/fr","fr",{"title":88,"path":89,"stem":90,"contentId":91,"url":99,"dateModified":92,"locale":100,"type":94},"/nl","nl",{"title":88,"path":89,"stem":90,"contentId":91,"url":102,"dateModified":92,"locale":103,"type":94},"/de","de",{"title":88,"path":89,"stem":90,"contentId":91,"url":105,"dateModified":92,"locale":106,"type":94},"/es","es",{"en":108,"fr":113,"nl":115,"de":117,"es":119},{"title":5,"path":109,"stem":110,"contentId":111,"url":6,"dateModified":112,"locale":93,"type":94},"/content/posts","content/10.posts",10,"2025-10-26T18:00:00",{"title":5,"path":109,"stem":110,"contentId":111,"url":114,"dateModified":112,"locale":97,"type":94},"/fr/articles",{"title":5,"path":109,"stem":110,"contentId":111,"url":116,"dateModified":112,"locale":100,"type":94},"/nl/posts",{"title":5,"path":109,"stem":110,"contentId":111,"url":118,"dateModified":112,"locale":103,"type":94},"/de/posts",{"title":5,"path":109,"stem":110,"contentId":111,"url":120,"dateModified":112,"locale":106,"type":94},"/es/articulos",{"en":122,"fr":126,"nl":128,"de":130,"es":132},{"title":8,"path":123,"stem":124,"contentId":125,"url":9,"dateModified":112,"locale":93,"type":94},"/content/portfolio","content/20.portfolio",20,{"title":8,"path":123,"stem":124,"contentId":125,"url":127,"dateModified":112,"locale":97,"type":94},"/fr/content/20-portfolio",{"title":8,"path":123,"stem":124,"contentId":125,"url":129,"dateModified":112,"locale":100,"type":94},"/nl/content/20-portfolio",{"title":8,"path":123,"stem":124,"contentId":125,"url":131,"dateModified":112,"locale":103,"type":94},"/de/content/20-portfolio",{"title":133,"path":123,"stem":124,"contentId":125,"url":134,"dateModified":112,"locale":106,"type":94},"Portafolio","/es/content/20-portafolio",{"en":136,"fr":140,"nl":143,"de":146,"es":149},{"title":11,"path":137,"stem":138,"contentId":139,"url":12,"dateModified":112,"locale":93,"type":94},"/content/about","content/30.about",30,{"title":141,"path":137,"stem":138,"contentId":139,"url":142,"dateModified":112,"locale":97,"type":94},"À propos","/fr/content/30-a-propos",{"title":144,"path":137,"stem":138,"contentId":139,"url":145,"dateModified":112,"locale":100,"type":94},"Over","/nl/content/30-over",{"title":147,"path":137,"stem":138,"contentId":139,"url":148,"dateModified":112,"locale":103,"type":94},"Über mich","/de/content/30-uber-mich",{"title":150,"path":137,"stem":138,"contentId":139,"url":151,"dateModified":112,"locale":106,"type":94},"Acerca de","/es/content/30-acerca-de",{"en":153,"fr":159,"nl":162,"de":165,"es":168},{"title":154,"path":155,"stem":156,"contentId":157,"url":158,"dateModified":92,"locale":93,"type":94},"Page not found","/content/page-not-found","content/404.page-not-found",404,"/content/404-page-not-found",{"title":160,"path":155,"stem":156,"contentId":157,"url":161,"dateModified":92,"locale":97,"type":94},"Page non trouvée","/fr/content/404-page-non-trouvee",{"title":163,"path":155,"stem":156,"contentId":157,"url":164,"dateModified":92,"locale":100,"type":94},"Pagina niet gevonden","/nl/content/404-pagina-niet-gevonden",{"title":166,"path":155,"stem":156,"contentId":157,"url":167,"dateModified":92,"locale":103,"type":94},"Seite nicht gefunden","/de/content/404-seite-nicht-gefunden",{"title":169,"path":155,"stem":156,"contentId":157,"url":170,"dateModified":92,"locale":106,"type":94},"Página no encontrada","/es/content/404-pagina-no-encontrada",{"1":172,"2":196,"3":219,"4":243,"5":267},{"en":173,"fr":180,"nl":185,"de":188,"es":191},{"title":174,"path":175,"stem":176,"contentId":91,"dateModified":177,"url":178,"locale":93,"type":179},"Mastering Conditional Property Types with Vue 3.3 Generics","/posts/1","posts/1","2025-05-27T11:30:00","/posts/1-mastering-conditional-property-types-with-vue-3_3-generics","blogPost",{"title":181,"path":182,"stem":183,"contentId":91,"dateModified":177,"url":184,"locale":97,"type":179},"Maîtriser les types de propriétés conditionnelles avec les génériques de Vue 3.3","/articles/1","articles/1","/fr/articles/1-maitriser-les-types-de-proprietes-conditionnelles-avec-les-generiques-de-vue-3_3",{"title":186,"path":175,"stem":176,"contentId":91,"dateModified":177,"url":187,"locale":100,"type":179},"Conditionele Property Types beheersen met Vue 3.3 Generics","/nl/posts/1-conditionele-property-types-beheersen-met-vue-3_3-generics",{"title":189,"path":175,"stem":176,"contentId":91,"dateModified":177,"url":190,"locale":103,"type":179},"Bedingte Property-Typen mit Vue 3.3 Generics meistern","/de/posts/1-bedingte-property-typen-mit-vue-3_3-generics-meistern",{"title":192,"path":193,"stem":194,"contentId":91,"dateModified":177,"url":195,"locale":106,"type":179},"Dominar los tipos de propiedades condicionales con genéricos de Vue 3.3","/articulos/1","articulos/1","/es/articulos/1-dominar-los-tipos-de-propiedades-condicionales-con-genericos-de-vue-3_3",{"en":197,"fr":203,"nl":208,"de":211,"es":214},{"title":198,"path":199,"stem":200,"contentId":25,"dateModified":201,"url":202,"locale":93,"type":179},"Ditching the Cookie Banners: Run Plausible Analytics on Azure Kubernetes","/posts/2","posts/2","2025-10-04T13:00:00","/posts/2-ditching-the-cookie-banners:-run-plausible-analytics-on-azure-kubernetes",{"title":204,"path":205,"stem":206,"contentId":25,"dateModified":201,"url":207,"locale":97,"type":179},"Éliminer les bannières de cookies: Exécutez Plausible Analytics sur Azure Kubernetes","/articles/2","articles/2","/fr/articles/2-eliminer-les-bannieres-de-cookies:-executez-plausible-analytics-sur-azure-kubernetes",{"title":209,"path":199,"stem":200,"contentId":25,"dateModified":201,"url":210,"locale":100,"type":179},"Afscheid van Cookie Banners: Draai Plausible Analytics op Azure Kubernetes","/nl/posts/2-afscheid-van-cookie-banners:-draai-plausible-analytics-op-azure-kubernetes",{"title":212,"path":199,"stem":200,"contentId":25,"dateModified":201,"url":213,"locale":103,"type":179},"Abschied von Cookie-Bannern: Plausible Analytics auf Azure Kubernetes betreiben","/de/posts/2-abschied-von-cookie-bannern:-plausible-analytics-auf-azure-kubernetes-betreiben",{"title":215,"path":216,"stem":217,"contentId":25,"dateModified":201,"url":218,"locale":106,"type":179},"Eliminar los banners de cookies: Ejecuta Plausible Analytics en Azure Kubernetes","/articulos/2","articulos/2","/es/articulos/2-eliminar-los-banners-de-cookies:-ejecuta-plausible-analytics-en-azure-kubernetes",{"en":220,"fr":226,"nl":232,"de":235,"es":238},{"title":221,"path":222,"stem":223,"contentId":52,"dateModified":224,"url":225,"locale":93,"type":179},"Track how many people read your articles, using Plausible.io, Vue.js and Azure functions","/posts/3","posts/3","2025-08-03T15:45:00","/posts/3-track-how-many-people-read-your-articles-using-plausible_io-vue_js-and-azure-functions",{"title":227,"path":228,"stem":229,"contentId":52,"dateModified":230,"url":231,"locale":97,"type":179},"Suivez combien de personnes lisent vos articles, en utilisant Plausible.io, Vue.js et Azure Functions","/articles/3","articles/3","2025-08-15:45:00","/fr/articles/3-suivez-combien-de-personnes-lisent-vos-articles-en-utilisant-plausible_io-vue_js-et-azure-functions",{"title":233,"path":222,"stem":223,"contentId":52,"dateModified":224,"url":234,"locale":100,"type":179},"Volg hoeveel mensen je artikelen lezen, met Plausible.io, Vue.js en Azure functions","/nl/posts/3-volg-hoeveel-mensen-je-artikelen-lezen-met-plausible_io-vue_js-en-azure-functions",{"title":236,"path":222,"stem":223,"contentId":52,"dateModified":224,"url":237,"locale":103,"type":179},"Verfolgen Sie, wie viele Menschen Ihre Artikel lesen, mit Plausible.io, Vue.js und Azure Functions","/de/posts/3-verfolgen-sie-wie-viele-menschen-ihre-artikel-lesen-mit-plausible_io-vue_js-und-azure-functions",{"title":239,"path":240,"stem":241,"contentId":52,"dateModified":224,"url":242,"locale":106,"type":179},"Rastrea cuántas personas leen tus artículos, usando Plausible.io, Vue.js y funciones de Azure","/articulos/3","articulos/3","/es/articulos/3-rastrea-cuantas-personas-leen-tus-articulos-usando-plausible_io-vue_js-y-funciones-de-azure",{"en":244,"fr":251,"nl":256,"de":259,"es":262},{"title":245,"path":246,"stem":247,"contentId":248,"dateModified":249,"url":250,"locale":93,"type":179},"Deploy a production-ready Kubernetes Cluster on Azure with Terraform","/posts/4","posts/4",4,"2025-12-06T21:00:00","/posts/4-deploy-a-production-ready-kubernetes-cluster-on-azure-with-terraform",{"title":252,"path":253,"stem":254,"contentId":248,"dateModified":249,"url":255,"locale":97,"type":179},"Déployer un cluster Kubernetes prêt pour la production sur Azure avec Terraform","/articles/4","articles/4","/fr/articles/4-deployer-un-cluster-kubernetes-pret-pour-la-production-sur-azure-avec-terraform",{"title":257,"path":246,"stem":247,"contentId":248,"dateModified":249,"url":258,"locale":100,"type":179},"Implementeer een productie-klaar Kubernetes Cluster op Azure met Terraform","/nl/posts/4-implementeer-een-productie-klaar-kubernetes-cluster-op-azure-met-terraform",{"title":260,"path":246,"stem":247,"contentId":248,"dateModified":249,"url":261,"locale":103,"type":179},"Einen produktionsreifen Kubernetes-Cluster auf Azure mit Terraform bereitstellen","/de/posts/4-einen-produktionsreifen-kubernetes-cluster-auf-azure-mit-terraform-bereitstellen",{"title":263,"path":264,"stem":265,"contentId":248,"dateModified":249,"url":266,"locale":106,"type":179},"Despliega un clúster de Kubernetes listo para producción en Azure con Terraform","/articulos/4","articulos/4","/es/articulos/4-despliega-un-cluster-de-kubernetes-listo-para-produccion-en-azure-con-terraform",{"en":268,"fr":275,"nl":280,"de":283,"es":286},{"title":269,"path":270,"stem":271,"contentId":272,"dateModified":273,"url":274,"locale":93,"type":179},"Array to Map conversion in Typescript, with type safety","/posts/5","posts/5",5,"2025-09-29T21:00:00","/posts/5-array-to-map-conversion-in-typescript-with-type-safety",{"title":276,"path":277,"stem":278,"contentId":272,"dateModified":273,"url":279,"locale":97,"type":179},"Conversion de tableau en Map en Typescript, avec sécurité des types","/articles/5","articles/5","/fr/articles/5-conversion-de-tableau-en-map-en-typescript-avec-securite-des-types",{"title":281,"path":270,"stem":271,"contentId":272,"dateModified":273,"url":282,"locale":100,"type":179},"Array naar Map conversie in Typescript, met type veiligheid","/nl/posts/5-array-naar-map-conversie-in-typescript-met-type-veiligheid",{"title":284,"path":270,"stem":271,"contentId":272,"dateModified":273,"url":285,"locale":103,"type":179},"Array zu Map Konvertierung in TypeScript, mit Typsicherheit","/de/posts/5-array-zu-map-konvertierung-in-typescript-mit-typsicherheit",{"title":287,"path":288,"stem":289,"contentId":272,"dateModified":273,"url":290,"locale":106,"type":179},"Conversión de Array a Map en Typescript, con seguridad de tipos","/articulos/5","articulos/5","/es/articulos/5-conversion-de-array-a-map-en-typescript-con-seguridad-de-tipos",{},{"id":293,"title":8,"body":294,"canonicalUrl":27,"company":27,"contentId":125,"dateModified":112,"datePublished":321,"description":322,"draft":28,"enableProse":28,"excludeFromNavigation":28,"extension":29,"imageAlt":27,"imageUrl":27,"meta":323,"navigation":36,"partial":28,"path":123,"seo":328,"slug":27,"stem":124,"url":9,"__hash__":329},"pages_en/content/20.portfolio.md",{"type":17,"value":295,"toc":319},[296,312],[297,298,299,303,306,309],"app-prose",{},[300,301,8],"h1",{"id":302},"portfolio",[20,304,305],{},"Below is a selection of publicly accessible projects I've worked on.",[20,307,308],{},"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,310,311],{},"In the meantime, feel free to explore some of the projects I can share.",[313,314],"portfolio-grid",{":portfolio":315,"className":316},"[{\"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://sofia-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/CD on **Azure DevOps** and containerization via **Docker**.\",\"link\":\"https://travelbags.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 /> \u003Cbr /> Pavo.nl was the second webshop launched using this framework.\",\"link\":\"https://pavo.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/CD on **Azure DevOps** and containerization via **Docker**.\",\"link\":\"https://beautyPlaza.com\",\"liClass\":\"lg:row-span-2\",\"linkClass\":\"max-lg:rounded-b-4xl lg:rounded-r-4xl\",\"imgOption\":\"beautyPlaza\"}]",[317,318],"mt-14","lg:mt-20",{"title":24,"searchDepth":25,"depth":25,"links":320},[],"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":324},{"text":32,"minutes":325,"time":326,"words":327},0.29,17400,58,{"title":8,"description":322},"JsHazjXJwrOdFkfCsSThTyb-BacB-G7eJTQybXF8gpA",1765049998746]