[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fUWdHClDfok7DwJVAEw3YQwSUkop_5_A1HAumIwCfAfY":3},{"id":4,"title":5,"teaser":6,"body":7,"slug":8,"date":9,"tags":10},"775d00a8-6bb3-4511-b265-5206fec84e19","Structural Updates to madsnorgaard.net Headless CMS Stack","Pushed structural changes to madsnorgaard.net refactoring content types and routing between Drupal 11 backend and Nuxt 3 frontend via JSON:API.","I pushed a set of structural changes to the main branch of madsnorgaard.net today - commit 12f0221a represents a refactoring pass focused on how the site handles content types and routing logic between the Drupal backend and Nuxt frontend.\n\n\u003Ch2>What changed in this push\u003C\u002Fh2>\n\n\u003Cp>The \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmadsnorgaard\u002Fmadsnorgaard.net\u002Fcompare\u002F440bc823177c...12f0221af071\">commit diff from 440bc823 to 12f0221a\u003C\u002Fa> shows adjustments to the content architecture. The changes touch how portfolio items and writing pieces are structured in the Drupal 11 CMS, and how those entities are exposed through the JSON:API layer that feeds the Nuxt 3 frontend.\u003C\u002Fp>\n\n\u003Cp>This is maintenance work - not flashy, but necessary. When you run a headless setup like this one, the contract between backend and frontend matters. If the API shape changes without corresponding updates to the consumer, things break. This push keeps both sides aligned.\u003C\u002Fp>\n\n\u003Ch2>Why structural changes matter in a headless architecture\u003C\u002Fh2>\n\n\u003Cp>The madsnorgaard.net stack splits presentation from content management. Drupal handles authoring, taxonomy, media management. Nuxt handles rendering, routing, static generation. The JSON:API specification sits between them as the agreed-upon interface.\u003C\u002Fp>\n\n\u003Cp>When I make changes to content types - adding fields, adjusting view modes, restructuring relationships - those changes ripple outward. The API response shape shifts. The Nuxt components that consume those responses need to adapt. This push addresses some of that coupling, making the frontend more resilient to backend schema evolution.\u003C\u002Fp>\n\n\u003Ch2>Deployment flow and what happens next\u003C\u002Fh2>\n\n\u003Cp>This commit triggers the GitHub Actions CI\u002FCD pipeline that handles deployment to the Contabo VPS. Docker images rebuild, Traefik updates its routing config, and the new version goes live behind the reverse proxy. The whole process is automated - push to main, wait for the pipeline to finish, verify the changes in production.\u003C\u002Fp>\n\n\u003Cp>Self-hosting introduces friction that managed platforms abstract away, but it also gives you full control over the deployment chain. I know exactly what runs where, how traffic flows through Traefik, how Docker Compose orchestrates the services. That transparency is worth the extra operational overhead for a project like this.\u003C\u002Fp>\n\n\u003Cp>This kind of incremental work - small structural improvements, tightening the API contract, refining the deployment process - is what keeps a personal site maintainable over time. The commit is live, the pipeline ran clean, and the site continues to function as both a portfolio and a testing ground for Drupal 11 and Nuxt 3 integration patterns.\u003C\u002Fp>","structural-updates-madsnorgaardnet-headless-cms-stack","2026-04-15T12:12:58+00:00",[]]