[{"data":1,"prerenderedAt":87},["ShallowReactive",2],{"posts":3,"home":15,"projects:featured":62},[4],{"path":5,"title":6,"description":7,"date":8,"updated":-1,"tags":9,"cover":-1,"readingMinutes":14},"\u002Fblog\u002F2026-09-29-rebuilding-my-site","Rebuilding my site with Nuxt Content and a theme contract","Why I replaced a VitePress portfolio with Nuxt 4, how content, data, and themes are separated, and where it is hosted for free.","2026-09-29",[10,11,12,13],"nuxt","vue","cloudflare","meta",1,{"hero":16,"featuredLimit":21,"latestPostsLimit":21,"skills":22},{"name":17,"role":18,"tagline":19,"avatar":20},"Michel Carlos","Software Engineer","Frontend specialist who ships. Vue by preference, browser extensions by habit, and always learning something new.","\u002Fimages\u002Fme.jpg","3",[23,28,33,37,42,47,52,57],{"name":24,"icon":25,"since":26,"note":27},"Vue","simple-icons:vuedotjs",2020,"My preferred framework. Composition API, Nuxt, and published composables.",{"name":29,"icon":30,"since":31,"note":32},"TypeScript","simple-icons:typescript",2019,"Strict mode on. Types are documentation that the compiler checks.",{"name":34,"icon":35,"since":31,"note":36},"React","simple-icons:react","Comfortable with hooks, Next, and the ecosystem around it.",{"name":38,"icon":39,"since":40,"note":41},"Angular","simple-icons:angular",2017,"Two-plus years on large, opinionated enterprise apps.",{"name":43,"icon":44,"since":45,"note":46},"Tailwind CSS","simple-icons:tailwindcss",2023,"Design tokens as CSS variables, utilities on top.",{"name":48,"icon":49,"since":50,"note":51},"Browser extensions","lucide:puzzle",2024,"Manifest V3, WXT, Chrome Web Store publishing.",{"name":53,"icon":54,"since":55,"note":56},"Testing","simple-icons:cypress",2021,"Cypress and Playwright for end-to-end, Vitest for units.",{"name":58,"icon":59,"since":60,"note":61},"HTML & CSS","simple-icons:css",2009,"Semantic markup, accessibility, and layouts that survive real content.",[63,77],{"path":64,"title":65,"description":66,"date":67,"status":68,"stack":69,"featured":74,"repo":75,"url":-1,"store":76,"cover":-1},"\u002Fprojects\u002Fgringachange","GringaChange","Browser extension for people paid in foreign currency. Live exchange rates, remittance simulator, and rate alerts, all against the Brazilian real.","2026-06-01","live",[70,29,71,72,73],"Vue 3","WXT","lightweight-charts","Playwright",true,"https:\u002F\u002Fgithub.com\u002Fmicheldpcarlos\u002Fgringachange","https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Fgringachange\u002Famkfidglmdkclmhgnnkicocfcgoplanp",{"path":78,"title":79,"description":80,"date":81,"status":68,"stack":82,"featured":74,"repo":85,"url":86,"store":-1,"cover":-1},"\u002Fprojects\u002Fvue-countdown-composable","vue-countdown-composable","Easy to use Vue 3 countdown composables. Date and duration based, TypeScript ready, SSR friendly, and Vapor compatible.","2025-11-01",[70,29,83,84],"Vitest","VitePress","https:\u002F\u002Fgithub.com\u002Fmicheldpcarlos\u002Fvue-countdown-composable","https:\u002F\u002Fmicheldpcarlos.github.io\u002Fvue-countdown-composable\u002F",1790867388439]