[{"data":1,"prerenderedAt":234},["ShallowReactive",2],{"navigation":3,"projects-page":142,"projects":163},[4],{"title":5,"path":6,"stem":7,"children":8,"page":141},"Blog","/blog","blog",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,129,133,137],{"title":10,"path":11,"stem":12},"VueJS Introducing Dynamic Layouts using the Atomic Design Principles","/blog/vuejs-introducing-dynamic-layouts-using-the-atomic-design-principles","blog/001.vuejs-introducing-dynamic-layouts-using-the-atomic-design-principles",{"title":14,"path":15,"stem":16},"Understanding JavaScript and Its Quirks","/blog/understanding-javascript-and-its-quirks","blog/002.understanding-javascript-and-its-quirks",{"title":18,"path":19,"stem":20},"Introducing Vue’s latest experimental Vapor Mode","/blog/introducing-vues-latest-experimental-vapor-mode","blog/003.introducing-vues-latest-experimental-vapor-mode",{"title":22,"path":23,"stem":24},"ECMAScript 2024 Nears Finalization","/blog/ecmascript-2024-nears-finalization","blog/004.ecmascript-2024-nears-finalization",{"title":26,"path":27,"stem":28},"UI Libraries for VueJS: Vuetify, Tailwind, and PrimeVue","/blog/ui-libraries-for-vuejs-vuetify-tailwind-and-primevue","blog/005.ui-libraries-for-vuejs-vuetify-tailwind-and-primevue",{"title":30,"path":31,"stem":32},"Micro Frontend Architecture","/blog/micro-frontend-architecture","blog/006.micro-frontend-architecture",{"title":34,"path":35,"stem":36},"Pre-rendering and Hydration in Vue.js","/blog/pre-rendering-and-hydration-in-vuejs","blog/007.pre-rendering-and-hydration-in-vuejs",{"title":38,"path":39,"stem":40},"Satori by Vercel — Dynamic Image Generation in JavaScript","/blog/satori-by-vercel-dynamic-image-generation-in-javascript","blog/008.satori-by-vercel-dynamic-image-generation-in-javascript",{"title":42,"path":43,"stem":44},"Vue.js and Progressive Web Apps (PWA) – Enhancing Web Experiences","/blog/vuejs-and-progressive-web-apps-pwa-enhancing-web-experiences","blog/009.vuejs-and-progressive-web-apps-pwa-enhancing-web-experiences",{"title":46,"path":47,"stem":48},"Moving from a Traditional Node.js CRUD API to Serverless Architecture—A Deep Dive","/blog/moving-from-a-traditional-nodejs-crud-api-to-serverless-architecturea-deep-dive","blog/010.moving-from-a-traditional-nodejs-crud-api-to-serverless-architecturea-deep-dive",{"title":50,"path":51,"stem":52},"Nuxt 3 and Serverless Edge Functions—Unlocking Performance and Scalability","/blog/nuxt-3-and-serverless-edge-functionsunlocking-performance-and-scalability","blog/011.nuxt-3-and-serverless-edge-functionsunlocking-performance-and-scalability",{"title":54,"path":55,"stem":56},"A Tribute to Asa Bain: Thank You for Everything","/blog/a-tribute-to-asa-bain-thank-you-for-everything","blog/012.a-tribute-to-asa-bain-thank-you-for-everything",{"title":58,"path":59,"stem":60},"Migrating JavaScript to TypeScript in ASP.NET MVC Projects","/blog/migrating-javascript-to-typescript-in-aspnet-mvc-projects","blog/013.migrating-javascript-to-typescript-in-aspnet-mvc-projects",{"title":62,"path":63,"stem":64},"Modernizing Classic ASP.NET MVC with Vue.js","/blog/modernizing-classic-aspnet-mvc-with-vuejs","blog/014.modernizing-classic-aspnet-mvc-with-vuejs",{"title":66,"path":67,"stem":68},"Which UI JavaScript Framework Should You Use?","/blog/which-ui-javascript-framework-should-you-use","blog/015.which-ui-javascript-framework-should-you-use",{"title":70,"path":71,"stem":72},"Vue + AI Integration Workflows: Enhancing Developer Productivity","/blog/vue-ai-integration-workflows-enhancing-developer-productivity","blog/016.vue-ai-integration-workflows-enhancing-developer-productivity",{"title":74,"path":75,"stem":76},"OpenAPI Standards & Scalar Integration for Node.js Apps","/blog/openapi-standards-scalar-integration-for-nodejs-apps","blog/017.openapi-standards-scalar-integration-for-nodejs-apps",{"title":78,"path":79,"stem":80},"Nuxt 3.17 — Data Fetching Improvements","/blog/nuxt-317-data-fetching-improvements","blog/019.nuxt-317-data-fetching-improvements",{"title":82,"path":83,"stem":84},"Subdomain-Based Multi-Tenancy in Nuxt","/blog/subdomain-based-multi-tenancy-in-nuxt","blog/020.subdomain-based-multi-tenancy-in-nuxt",{"title":86,"path":87,"stem":88},"Type-Safe Backends with TypeScript: tRPC, Zod, and Drizzle ORM","/blog/type-safe-backends-with-typescript-trpc-zod-and-drizzle-orm","blog/021.type-safe-backends-with-typescript-trpc-zod-and-drizzle-orm",{"title":90,"path":91,"stem":92},"Unit Testing Vue Applications with Vitest and Agentic AI","/blog/unit-testing-vue-applications-with-vitest-and-agentic-ai","blog/022.unit-testing-vue-applications-with-vitest-and-agentic-ai",{"title":94,"path":95,"stem":96},"Hidden Features & Lesser-Known TypeScript Gems","/blog/hidden-features-lesser-known-typescript-gems","blog/023.hidden-features-lesser-known-typescript-gems",{"title":98,"path":99,"stem":100},"Nuxt/Vercel Acquisition and Its Impact on NuxtHub Users","/blog/nuxtvercel-acquisition-and-its-impact-on-nuxthub-users","blog/024.nuxtvercel-acquisition-and-its-impact-on-nuxthub-users",{"title":102,"path":103,"stem":104},"State of Vue & Nuxt Ecosystem 2025","/blog/state-of-vue-nuxt-ecosystem-2025","blog/025.state-of-vue-nuxt-ecosystem-2025",{"title":106,"path":107,"stem":108},"Feature Adoption in TypeScript Over Time","/blog/feature-adoption-in-typescript-over-time","blog/026.feature-adoption-in-typescript-over-time",{"title":110,"path":111,"stem":112},"Migrating From WordPress to Nuxt Content & Using Nuxt Studio","/blog/migrating-from-wordpress-to-nuxt-content-using-nuxt-studio","blog/027.migrating-from-wordpress-to-nuxt-content-using-nuxt-studio",{"title":114,"path":115,"stem":116},"Strategic Topic: The “Rust-ification” of Tooling (Biome & Rolldown)","/blog/strategic-topic-the-rust-ification-of-tooling-biome-rolldown","blog/028.strategic-topic-the-rust-ification-of-tooling-biome-rolldown",{"title":118,"path":119,"stem":120},"Nuxt 4 and the Evolving Full-Stack Framework Landscape","/blog/nuxt-4-and-the-evolving-full-stack-framework-landscape","blog/029.nuxt-4-and-the-evolving-full-stack-framework-landscape",{"title":122,"path":123,"stem":124},"Bun as a JavaScript Runtime: Evaluating Readiness Beyond Node.js","/blog/bun-as-a-javascript-runtime-evaluating-readiness-beyond-nodejs","blog/030.bun-as-a-javascript-runtime-evaluating-readiness-beyond-nodejs",{"title":126,"path":127,"stem":128},"Top 10 Nuxt Modules That Supercharge Your App From Day One Introduction","/blog/top-10-nuxt-modules-that-supercharge-your-app-from-day-one-introduction","blog/031.top-10-nuxt-modules-that-supercharge-your-app-from-day-one-introduction",{"title":130,"path":131,"stem":132},"Strategic Topic: Vite+, VoidZero, and the Future of Frontend Tooling","/blog/strategic-topic-vite-voidzero-and-the-future-of-frontend-tooling","blog/032.strategic-topic-vite-voidzero-and-the-future-of-frontend-tooling",{"title":134,"path":135,"stem":136},"The Future of Time in JavaScript: Transitioning to the Native Temporal API","/blog/the-future-of-time-in-javascript-transitioning-to-the-native-temporal-api","blog/033.the-future-of-time-in-javascript-transitioning-to-the-native-temporal-api",{"title":138,"path":139,"stem":140},"Understanding Hydration Issues in Nuxt and How Nuxt Hints Helps","/blog/understanding-hydration-issues-in-nuxt-and-how-nuxt-hints-helps","blog/034.understanding-hydration-issues-in-nuxt-and-how-nuxt-hints-helps",false,{"id":143,"title":144,"body":145,"description":146,"extension":153,"links":154,"meta":157,"navigation":158,"path":159,"seo":160,"stem":161,"__hash__":162},"pages/projects.yml","Featured Projects",{"title":144,"description":146,"links":147},"A selection of projects I've built and contributed to, ranging from HR-tech platforms to financial planning tools. Each showcases my full-stack capabilities and focus on scalable, user-friendly solutions.",[148,151],{"label":149,"color":150},"Let's talk","neutral",{"label":152},"Email me","yml",[155,156],{"label":149,"color":150},{"label":152},{},true,"/projects",{"title":144,"description":146},"projects","N9q73SvEyjhHEKIr0-a8YzakDXaV0LLEGTk5-_94XWY",[164,183,200,217],{"id":165,"title":166,"date":167,"description":168,"extension":153,"image":169,"meta":170,"stem":180,"tags":181,"url":173,"__hash__":182},"projects/projects/pharus.yml","Pharus Tech AB","2019-09-01T00:00:00.000Z","Pharus Tech is an HR-tech company specializing in AI-driven data analytics and talent acquisition tools. Formerly known as JobAgent and is based in Stockholm.","/projects/recent_projects_pharus.jpg",{"path":171,"body":172},"/projects/pharus",{"title":166,"description":168,"image":169,"url":173,"tags":174,"date":179},"https://tqnordic.com/tq-nordic-och-pharus-tech-gar-samman/",[175,176,177,178],"Vue.js","AI/ML","HR Tech","Talent Acquisition","2019-09-01","projects/pharus",[175,176,177,178],"wBUTO05BOqy6HOK58cfrmQLPNDjoYaPgUiCrtB1ocr4",{"id":184,"title":185,"date":186,"description":187,"extension":153,"image":188,"meta":189,"stem":197,"tags":198,"url":192,"__hash__":199},"projects/projects/roommejts.yml","Roommejts AB","2025-06-01T00:00:00.000Z","Roommejts AB is focused on helping clients make smarter, data-driven decisions about interior layouts, renovations, and construction planning. By combining software and automation, they aim to simplify how architects, property managers, and designers plan and optimize living or office spaces.","/projects/recent_projects_roommejts.jpg",{"path":190,"body":191},"/projects/roommejts",{"title":185,"description":187,"image":188,"url":192,"tags":193,"date":196},"https://roommejts.se/",[175,194,195,177],"Node.js","Data Visualization","2025-06-01","projects/roommejts",[175,194,195,177],"kcZUgocQyOsCR5eq3dMKG1nSGNb3T0gyiIuPNAgNrV4",{"id":201,"title":202,"date":203,"description":204,"extension":153,"image":205,"meta":206,"stem":214,"tags":215,"url":209,"__hash__":216},"projects/projects/sysarb.yml","Sysarb AB","2024-01-01T00:00:00.000Z","Sysarb AB is a Sweden-based HR-tech company with nearly 20 years of experience, positioning itself as one of Europe's pioneering and leading voices in pay equity and pay transparency.","/projects/recent_projects_sysarb.jpg",{"path":207,"body":208},"/projects/sysarb",{"title":202,"description":204,"image":205,"url":209,"tags":210,"date":213},"https://sysarb.com/",[175,211,177,212],"Nuxt.js","Pay Equity","2024-01-01","projects/sysarb",[175,211,177,212],"jDltj3qz2XchyNh1gyVJPLgP8YMfif8MOpcYXUq-NdU",{"id":218,"title":219,"date":220,"description":221,"extension":153,"image":222,"meta":223,"stem":231,"tags":232,"url":226,"__hash__":233},"projects/projects/upplan.yml","Up Planner | Up Adviser","2023-04-01T00:00:00.000Z","Up is a free, user-friendly financial life-planning tool that allows anyone to craft and visualize their financial future through simple, interactive simulations.","/projects/recent_projects_upplan.jpg",{"path":224,"body":225},"/projects/upplan",{"title":219,"description":221,"image":222,"url":226,"tags":227,"date":230},"https://www.upplan.sg/up-adviser",[175,228,195,229],"Financial Planning","SaaS","2023-04-01","projects/upplan",[175,228,195,229],"vafwloQcnVzXT3SJAe3u2sWDdYAtmpTGhaVU0wUNuXQ",1773209885397]