{
	"version": "https://jsonfeed.org/version/1.1",
	"title": "Cases by Holger Hellinger",
	"language": "en",
	"home_page_url": "https://b.polente.de/",
	"feed_url": "https://b.polente.de/feed/feed.json",
	"description": "Welcome to my focused blog where I share case studies and projects from my daily work. Dive into in-depth analyses and innovative solutions from my professional experiences, exploring real-world scenarios and practical applications. Join me in this unique journey.",
	"author": {
		"name": "Holger Hellinger",
		"url": "https://polente.de/ueber/"
	},
	"items": [
		{
			"id": "https://b.polente.de/blog/EUPayTransparencyDirectiveAShiftInHiringCulture/",
			"url": "https://b.polente.de/blog/EUPayTransparencyDirectiveAShiftInHiringCulture/",
			"title": "EU Pay Transparency Directive: A Shift in Hiring Culture",
			"content_html": "<h2 id=\"the-new-rules-for-pay-transparency\" tabindex=\"-1\">The New Rules for Pay Transparency <a class=\"header-anchor\" href=\"https://b.polente.de/blog/EUPayTransparencyDirectiveAShiftInHiringCulture/\">#</a></h2>\n<p>Starting in June 2026, the EU Pay Transparency Directive changes how companies hire. It removes the old information advantage that employers held for a long time. The rules are clear and strict.</p>\n<p>Employers must state the starting salary or the salary range in every job advertisement. They are no longer allowed to ask candidates about their past salary history. Candidates do not have to provide salary expectations anymore. If a portal has a mandatory field for salary, you can simply write that you align with the company's internal salary bands.</p>\n<p>On demand, companies must also provide clear criteria on how they calculate salaries and career progression.</p>\n<h2 id=\"red-flags-and-culture\" tabindex=\"-1\">Red Flags and Culture <a class=\"header-anchor\" href=\"https://b.polente.de/blog/EUPayTransparencyDirectiveAShiftInHiringCulture/\">#</a></h2>\n<p>This law shows a lot about a company culture. When a business does not include a salary range in the advertisement, it is a clear warning sign. It shows they either do not care about the new legal standards or they want to hide something.</p>\n<p>When HR managers give vague answers about money during interviews, it indicates a culture problem. True openness is not a bonus feature. It is the basis for psychological safety and a good environment where people can grow. Companies that share this data proactively show that they respect workers as equal partners.</p>\n<h2 id=\"impact-on-workflow-and-infrastructure\" tabindex=\"-1\">Impact on Workflow and Infrastructure <a class=\"header-anchor\" href=\"https://b.polente.de/blog/EUPayTransparencyDirectiveAShiftInHiringCulture/\">#</a></h2>\n<p>For engineering leaders and managers, this means we must update our systems and processes. Job boards, applicant tracking software, and interview guidelines need changes immediately. We must train hiring teams to never ask about previous compensation. All internal salary bands must be clean, documented, and well structured.</p>\n<h2 id=\"looking-forward\" tabindex=\"-1\">Looking Forward <a class=\"header-anchor\" href=\"https://b.polente.de/blog/EUPayTransparencyDirectiveAShiftInHiringCulture/\">#</a></h2>\n<p>If a company ignores these rules, candidates can report them to the anti-discrimination authorities. In case of pay discrimination, the burden of proof is now on the employer. The company must prove they did not discriminate.</p>\n<p>I am very interested to see how my own employer, Publicis Sapient, will handle this transition across our teams. As a large global business, our internal tooling, career frameworks, and job portals must adapt quickly to meet these standards in time.</p>\n<p>What changes have you noticed in your hiring pipelines or with employers lately?</p>\n<h2 id=\"links\" tabindex=\"-1\">Links <a class=\"header-anchor\" href=\"https://b.polente.de/blog/EUPayTransparencyDirectiveAShiftInHiringCulture/\">#</a></h2>\n<p><a href=\"https://eur-lex.europa.eu/eli/dir/2023/970/oj/eng\">Directive (EU) 2023/970 of the European Parliament and of the Council of 10 May 2023 to strengthen the application of the principle of equal pay for equal work or work of equal value between men and women through pay transparency and enforcement mechanisms (Text with EEA relevance)</a></p>\n",
			"date_published": "2026-05-18T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/TheMythOfTheCodeReaderWhyAIAgentsAreTheBetterSeniorEngineers/",
			"url": "https://b.polente.de/blog/TheMythOfTheCodeReaderWhyAIAgentsAreTheBetterSeniorEngineers/",
			"title": "The Myth of the Code Reader: Why AI Agents Are the Better Senior Engineers",
			"content_html": "<h2 id=\"the-supposed-senior-discipline\" tabindex=\"-1\">The Supposed Senior Discipline <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheMythOfTheCodeReaderWhyAIAgentsAreTheBetterSeniorEngineers/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/At39nBHC2L-360.avif 360w, https://b.polente.de/img/At39nBHC2L-608.avif 608w, https://b.polente.de/img/At39nBHC2L-960.avif 960w, https://b.polente.de/img/At39nBHC2L-1240.avif 1240w, https://b.polente.de/img/At39nBHC2L-1376.avif 1376w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/At39nBHC2L-360.webp 360w, https://b.polente.de/img/At39nBHC2L-608.webp 608w, https://b.polente.de/img/At39nBHC2L-960.webp 960w, https://b.polente.de/img/At39nBHC2L-1240.webp 1240w, https://b.polente.de/img/At39nBHC2L-1376.webp 1376w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/At39nBHC2L-360.png 360w, https://b.polente.de/img/At39nBHC2L-608.png 608w, https://b.polente.de/img/At39nBHC2L-960.png 960w, https://b.polente.de/img/At39nBHC2L-1240.png 1240w, https://b.polente.de/img/At39nBHC2L-1376.png 1376w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A futuristic control room overlooking a cyberpunk city at night. In the foreground, a man with smart glasses and a sleek humanoid robot interact with glowing holographic interfaces showing code, flowcharts, and metrics. Other workers monitor data screens in the background. Neon blue and purple lighting.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/At39nBHC2L-360.png\" width=\"1376\" height=\"768\"></picture></p>\n<p>A common argument in the current AI debate says that developers will write less code but read and understand much more of it. The idea is that because AI tools are still immature and repeat errors, we need senior human engineers to review everything and keep control.</p>\n<p>This is short-sighted. Yes, current tooling is not fully mature yet. But thinking that deep code reading will stay a human task for decades underestimates how fast AI context engineering is growing.</p>\n<h2 id=\"humans-repeat-errors-agents-follow-structure\" tabindex=\"-1\">Humans Repeat Errors. Agents Follow Structure. <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheMythOfTheCodeReaderWhyAIAgentsAreTheBetterSeniorEngineers/\">#</a></h2>\n<p>Many critics say AI code generators build the same structural errors again and again. But let us be honest: this happens in human development teams all the time. An engineer in a hurry rarely reads the full project history or deep documentation. People copy old errors, ignore best practices, and skip reading.</p>\n<p>With autonomous AI agents, it is different. They do not feel time pressure and they do not get tired of reading. If we document architectural rules and past decisions clearly – for example in a central <code>decision.md</code> file –, something great happens:</p>\n<blockquote>\n<p>Busy human engineers often ignore documentation when the deadline is near. AI agents will read and follow the instructions in decision.md strictly on every single run.</p>\n</blockquote>\n<h2 id=\"from-simple-prompting-to-context-engineering\" tabindex=\"-1\">From Simple Prompting to Context Engineering <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheMythOfTheCodeReaderWhyAIAgentsAreTheBetterSeniorEngineers/\">#</a></h2>\n<p>The future is not about seniors spending all day proofreading bad AI code. The tools will get mature very soon. The real senior discipline is shifting away from code reading towards Context Engineering.</p>\n<p>It is about building the right tooling infrastructure. We need to feed the agents with precise context so that bad code never gets created in the first place. When you keep your software architecture and coding standards machine-readable, your agent pipelines will work with fewer errors than a stressed human team ever could.</p>\n",
			"date_published": "2026-05-16T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/IsAIRottingOurProgrammingBrainsorFreeingUs/",
			"url": "https://b.polente.de/blog/IsAIRottingOurProgrammingBrainsorFreeingUs/",
			"title": "Engineering Excellence or Brain Rot? The AI Development Paradox",
			"content_html": "<h2 id=\"the-illusion-of-easy-code\" tabindex=\"-1\">The Illusion of Easy Code <a class=\"header-anchor\" href=\"https://b.polente.de/blog/IsAIRottingOurProgrammingBrainsorFreeingUs/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/JqjPc5Lskc-360.avif 360w, https://b.polente.de/img/JqjPc5Lskc-608.avif 608w, https://b.polente.de/img/JqjPc5Lskc-960.avif 960w, https://b.polente.de/img/JqjPc5Lskc-1240.avif 1240w, https://b.polente.de/img/JqjPc5Lskc-2752.avif 2752w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/JqjPc5Lskc-360.webp 360w, https://b.polente.de/img/JqjPc5Lskc-608.webp 608w, https://b.polente.de/img/JqjPc5Lskc-960.webp 960w, https://b.polente.de/img/JqjPc5Lskc-1240.webp 1240w, https://b.polente.de/img/JqjPc5Lskc-2752.webp 2752w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/JqjPc5Lskc-360.png 360w, https://b.polente.de/img/JqjPc5Lskc-608.png 608w, https://b.polente.de/img/JqjPc5Lskc-960.png 960w, https://b.polente.de/img/JqjPc5Lskc-1240.png 1240w, https://b.polente.de/img/JqjPc5Lskc-2752.png 2752w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A split illustration comparing 'Unmanaged AI' vs 'Managed AI.' Left: A tired developer in a messy office with 'Rat's Nest' code and 'Brain Rot.' Right: A smiling developer at a clean standing desk using structured 'Quality Pipelines,' 'AI Agents,' and 'Sprints' for 'Engineering Excellence.'\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/JqjPc5Lskc-360.png\" width=\"2752\" height=\"1536\"></picture></p>\n<p>A recent headline from <strong>404 Media</strong> caught my eye: <em>&quot;Software Developers Say AI Is Rotting Their Brains.&quot;</em> It’s a provocative title, but for many of us in the trenches, it hits home. Developers report a sense of &quot;de-skilling&quot;, a feeling that by outsourcing the &quot;thinking&quot; to an LLM, we are losing our ability to reason about complex systems. One developer compared it to the way we stopped remembering phone numbers once we got cellphones; now, we are mentally outsourcing our critical thinking.</p>\n<p>I remember the early arguments for AI: <em>&quot;Don’t worry. The goal is to free you from repetitive tasks so you can focus on high-value work.&quot;</em></p>\n<p>The reality is that AI rarely meets high standards. It is easy to like the idea of delegating boring work, but it brings a vital question: What exactly are these &quot;high-value&quot; tasks? If the parts we loved about our jobs, the problem-solving and the deep focus, are being automated, what is left? Only a capitalist value creation that might not lead to better user experiences at all.</p>\n<h2 id=\"the-disillusionment-of-the-legacy-trap\" tabindex=\"-1\">The Disillusionment of the Legacy Trap <a class=\"header-anchor\" href=\"https://b.polente.de/blog/IsAIRottingOurProgrammingBrainsorFreeingUs/\">#</a></h2>\n<p>I experienced this paradox firsthand on a large legacy codebase. At the start, I was enthusiastic. We were able to churn out code at a pace that felt like magic. But the quality was far from ideal.</p>\n<p>We quickly fell into the &quot;shit in, shit out&quot; trap. Without a common baseline or strict quality control, the AI simply followed the existing mess of the legacy system. The result was a &quot;rat’s nest&quot; of tech debt that became increasingly hard to untangle. I left that account feeling disillusioned. I realized then that if you don't invest heavily in the foundations, AI doesn't help you; it just helps you fail faster.</p>\n<h2 id=\"the-greenfield-turning-point\" tabindex=\"-1\">The Greenfield Turning Point <a class=\"header-anchor\" href=\"https://b.polente.de/blog/IsAIRottingOurProgrammingBrainsorFreeingUs/\">#</a></h2>\n<p>However, my perspective shifted recently while working on a near-greenfield project. I had the opportunity to cut out everything unnecessary from the initial POC, starting with a clean slate.</p>\n<p>This time, I set up my agents to follow strict coding guidelines from day one. I ran specialized quality agents that checked for architectural rules, OWASP security standards, and style guides. The difference was night and day.</p>\n<p><strong>We delivered in 8 weeks what would have taken us years to build just two years ago.</strong></p>\n<p>The key wasn't just &quot;using AI&quot;; it was <em>managing</em> it. We treated the agents as part of a sophisticated workflow, ensuring they didn't turn our pull requests into a mess.</p>\n<h2 id=\"investing-in-the-baseline\" tabindex=\"-1\">Investing in the &quot;Baseline&quot; <a class=\"header-anchor\" href=\"https://b.polente.de/blog/IsAIRottingOurProgrammingBrainsorFreeingUs/\">#</a></h2>\n<p>To avoid the &quot;brain rot&quot; and achieve actual engineering excellence, there is a huge investment required. It isn't just about writing a prompt; it's about aligning your entire ecosystem:</p>\n<ul>\n<li><strong>Design Alignment:</strong> Designs in <strong>Figma</strong> (or your design system of choice) must align properly with the codebase.</li>\n<li><strong>Common Naming:</strong> Naming conventions need to match perfectly across design tokens and code.</li>\n<li><strong>Documented Intent:</strong> Everything needs to be documented and improved by annotations and &quot;prompt helpers&quot; that provide the AI with the necessary context.</li>\n<li><strong>Workflow Cleanup:</strong> You cannot automate a mess. You must rework code to align to a common baseline first.</li>\n</ul>\n<h2 id=\"a-new-way-of-working-the-ai-pipeline\" tabindex=\"-1\">A New Way of Working: The AI Pipeline <a class=\"header-anchor\" href=\"https://b.polente.de/blog/IsAIRottingOurProgrammingBrainsorFreeingUs/\">#</a></h2>\n<p>We are entering a completely different era of software engineering. Today, no one questions a CI/CD pipeline; it’s a baseline necessity for handling repeating tasks. Software development, especially in e-commerce, involves a massive amount of repetition. Creating your fifth or sixth platform is often just orchestrating the middle layer and painting a new frontend on top of established baseline functionality.</p>\n<p>AI is the next evolution of that automation. But it requires a new set of rules to prevent quality decay:</p>\n<ol>\n<li><strong>Keep PRs small:</strong> Small changes are easier for humans to audit.</li>\n<li><strong>Sprints &amp; Small Increments:</strong> Build in manageable cycles.</li>\n<li><strong>Human-in-the-loop:</strong> Always let humans review the output.</li>\n<li><strong>No Cryptic Names:</strong> If a human can't read it, the next agent won't understand it either.</li>\n<li><strong>Quality Agents:</strong> Run automated checks for security, performance, and style.</li>\n<li><strong>Trust, but Verify:</strong> Maintain your standard pipeline (Sonarqube, Snyk, E2E tests).</li>\n</ol>\n<p><strong>Use AI, but never trust it blindly.</strong> By focusing on the workflow and the baseline, we can ensure that AI is a tool for excellence, not a catalyst for atrophy.</p>\n<hr>\n<h2 id=\"references\" tabindex=\"-1\">References <a class=\"header-anchor\" href=\"https://b.polente.de/blog/IsAIRottingOurProgrammingBrainsorFreeingUs/\">#</a></h2>\n<ul>\n<li><strong>404 Media:</strong> <a href=\"https://www.404media.co/software-developers-say-ai-is-rotting-their-brains/\">Software Developers Say AI Is Rotting Their Brains</a></li>\n</ul>\n",
			"date_published": "2026-05-15T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/",
			"url": "https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/",
			"title": "The hidden cost of vibe coding and AI agents",
			"content_html": "<h2 id=\"the-general-illusion\" tabindex=\"-1\">The general illusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/s7rutJa9qL-360.avif 360w, https://b.polente.de/img/s7rutJa9qL-608.avif 608w, https://b.polente.de/img/s7rutJa9qL-960.avif 960w, https://b.polente.de/img/s7rutJa9qL-1240.avif 1240w, https://b.polente.de/img/s7rutJa9qL-2816.avif 2816w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/s7rutJa9qL-360.webp 360w, https://b.polente.de/img/s7rutJa9qL-608.webp 608w, https://b.polente.de/img/s7rutJa9qL-960.webp 960w, https://b.polente.de/img/s7rutJa9qL-1240.webp 1240w, https://b.polente.de/img/s7rutJa9qL-2816.webp 2816w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/s7rutJa9qL-360.png 360w, https://b.polente.de/img/s7rutJa9qL-608.png 608w, https://b.polente.de/img/s7rutJa9qL-960.png 960w, https://b.polente.de/img/s7rutJa9qL-1240.png 1240w, https://b.polente.de/img/s7rutJa9qL-2816.png 2816w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Collaborative workspace, group of senior developers inspect a large glowing code scroll with a magnifying glass, AI agent in the background, professional and calm atmosphere. \" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/s7rutJa9qL-360.png\" width=\"2816\" height=\"1536\"></picture></p>\n<p>I see it every day now. A developer types a short prompt. The AI agent writes 200 lines of code. It looks perfect. The UI is pretty. The feature is &quot;done&quot; in ten minutes. We call this vibe coding. If it feels right and the demo works, we ship it.</p>\n<p>But there is a trap. AI is very good at making things that look like they work. It is not always good at making things that actually work for a long time. In my 25 years of tech, I have seen many hypes. AI is different because it is so fast. It can create technical debt faster than any human.</p>\n<p>We need to talk about the real price of this speed. It is not just about writing code. It is about owning it.</p>\n<h2 id=\"what-changed-with-ai-coding-agents\" tabindex=\"-1\">What changed with AI coding agents <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>Before we had &quot;Copilots&quot;. They suggested a line or a block. Now we have &quot;Agents&quot;. They can create whole projects. They can run terminal commands. They can &quot;fix&quot; bugs themselves. The barrier to entry is gone. Even people who never learned how a browser works can now build a web app. This is great for ideas. But it is dangerous for systems that need to stay alive for years.</p>\n<h2 id=\"the-myth-of-agent-only-code\" tabindex=\"-1\">The myth of &quot;Agent Only&quot; code <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>I hear a new idea lately. People say: &quot;Why do we care about clean code? Why format it nicely?&quot;. They think the agent can read any mess. They say we can just recreate the code every time with a prompt. If it is ugly for humans it does not matter because humans do not read it anymore.</p>\n<p>While it is highly likely that in the future we will not need clean code anymore—because AI will flawlessly manage and understand any mess—we are not there yet.</p>\n<p>Right now, AI still does a lot of things wrong. When an agent makes a mistake, it is still the human who has to jump in and find the bug. Because of this, being able to read and understand code is still incredibly important. If the code has no structure, it has no logic you can follow to correct the AI's errors. &quot;Vibe coding&quot; should not mean &quot;messy coding&quot; today. Good engineering is still about clarity, at least until the AI is truly infallible.</p>\n<h2 id=\"the-illusion-of-speed\" tabindex=\"-1\">The illusion of speed <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>Speed is the main selling point. But we often confuse &quot;shipping code&quot; with &quot;delivering value&quot;. If the code causes a security leak next week the speed was a lie. True speed is measured by how long the code stays in production without breaking.</p>\n<h2 id=\"skill-gap-and-trust-in-ai-output\" tabindex=\"-1\">Skill gap and trust in AI output <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>There is a big problem called Automation Bias. When the AI gives a confident answer we tend to believe it.</p>\n<ul>\n<li>Novices: A study showed that beginners who use AI often score 17% lower on understanding the concepts they just &quot;coded&quot;.</li>\n<li>Experts: Senior engineers use AI to skip the boring parts. But even they can get lazy. If you do not understand the output you cannot validate it.</li>\n<li>The Trust Gap: 80% of teams trust AI tools but 59% are worried about the bugs they bring.</li>\n</ul>\n<h2 id=\"technical-debt-and-maintainability\" tabindex=\"-1\">Technical debt and maintainability <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>AI code often lacks &quot;soul&quot; or what we call clean architecture.</p>\n<ul>\n<li>Code Churn: GitClear found that code duplication is rising fast. AI often copy-pastes logic instead of creating reusable modules.</li>\n<li>Maintenance Cost: &quot;It works&quot; is only the start. 46% of code changes are now new lines but refactoring is going down. This means we are building a big pile of code that nobody wants to touch later.</li>\n</ul>\n<h2 id=\"security-risks-you-still-see-every-day\" tabindex=\"-1\">Security risks you still see every day <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>AI-generated code has 2.74 times more vulnerabilities than human code.</p>\n<ul>\n<li>Secrets Exposure: There is a 40% jump in hardcoded API keys and tokens.</li>\n<li>Privilege Escalation: These paths increased by 322%. The AI often uses permissive defaults from its training data.</li>\n</ul>\n<h3 id=\"example-exposed-api-key\" tabindex=\"-1\">Example: Exposed API Key <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h3>\n<h4 id=\"bad-ai-often-does-this-for-speed\" tabindex=\"-1\">BAD (AI often does this for speed): <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h4>\n<pre class=\"language-JavaScript\" tabindex=\"0\"><code class=\"language-JavaScript\">const apiKey = \"sk-1234567890abcdef\";\nfetch(`https://api.service.com/data?key=${apiKey}`);</code></pre>\n<h4 id=\"better\" tabindex=\"-1\">BETTER: <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h4>\n<pre class=\"language-JavaScript\" tabindex=\"0\"><code class=\"language-JavaScript\">// Use environment variables and a backend proxy\nconst response = await fetch('/api/proxy-endpoint');</code></pre>\n<h2 id=\"performance-and-data-architecture-mistakes\" tabindex=\"-1\">Performance and data architecture mistakes <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>AI likes to solve things &quot;locally&quot;. If you ask for a list of active users it might fetch 10,000 users and filter them in the browser.</p>\n<h3 id=\"example-client-side-filtering\" tabindex=\"-1\">Example: Client-side filtering <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h3>\n<h4 id=\"bad\" tabindex=\"-1\">BAD: <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h4>\n<pre class=\"language-JavaScript\" tabindex=\"0\"><code class=\"language-JavaScript\">const users = await fetch('/api/all-users').then(res => res.json());\n// AI filter on client side. Very slow with 5000 users!\nconst activeUsers = users.filter(u => u.active === true);</code></pre>\n<h4 id=\"better-1\" tabindex=\"-1\">BETTER: <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h4>\n<pre class=\"language-JavaScript\" tabindex=\"0\"><code class=\"language-JavaScript\">// Filter on the database level\nconst activeUsers = await fetch('/api/users?status=active').then(res => res.json());</code></pre>\n<h2 id=\"accessibility-and-why-we-still-fail\" tabindex=\"-1\">Accessibility and why we still fail <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>AI still fails at accessibility at scale. It can help with simple alt text but it struggles with complex keyboard navigation.</p>\n<h3 id=\"example-the-fake-button\" tabindex=\"-1\">Example: The &quot;Fake&quot; Button <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h3>\n<h4 id=\"bad-1\" tabindex=\"-1\">BAD: <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h4>\n<pre class=\"language-HTML\" tabindex=\"0\"><code class=\"language-HTML\">&lt;div onclick=&quot;submitForm()&quot; class=&quot;blue-box&quot;&gt;Click Me&lt;/div&gt;</code></pre>\n<h4 id=\"better-2\" tabindex=\"-1\">BETTER: <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h4>\n<pre class=\"language-HTML\" tabindex=\"0\"><code class=\"language-HTML\">&lt;button type=&quot;button&quot; onclick=&quot;submitForm()&quot;&gt;Click Me&lt;/button&gt;</code></pre>\n<p><em>Why? A real button handles spacebar and enter key by default. A div does nothing</em></p>\n<h2 id=\"why-just-fix-it-later-does-not-work\" tabindex=\"-1\">Why &quot;just fix it later&quot; does not work <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>Many think: &quot;I build fast now and then I let an agent refactor it later.&quot; This is a lie.</p>\n<ul>\n<li>Security: A leaked key is leaked forever.</li>\n<li>Architecture: You cannot &quot;patch&quot; a bad data model easily when the app is live.</li>\n<li>Accessibility: If your core components are broken fixing them later means rebuilding the whole UI.</li>\n</ul>\n<h2 id=\"this-problem-is-not-new\" tabindex=\"-1\">This problem is not new <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>We had bad code before AI. But AI increases speed and volume. It lowers the barrier to ship bad solutions. We are now producing mess at scale.</p>\n<h2 id=\"training-data-problem-shit-in-shit-out\" tabindex=\"-1\">Training data problem &quot;shit in shit out&quot; <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>AI learns from the internet. The internet is full of bad and old and insecure code.</p>\n<ul>\n<li>Amplification Bias: A 2024 study found that AI does not just learn human mistakes. It makes them worse.</li>\n<li>Outdated Patterns: AI might suggest older ways to code because they were popular years ago.</li>\n</ul>\n<h2 id=\"where-ai-actually-works-well\" tabindex=\"-1\">Where AI actually works well <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>I am not anti-AI. It is great for:</p>\n<ul>\n<li>Writing unit tests for small functions.</li>\n<li>Explaining complex legacy code.</li>\n<li>Generating boilerplate like CSS Grid layouts.</li>\n<li>Helping with regex.</li>\n</ul>\n<h2 id=\"practical-mitigation-playbook\" tabindex=\"-1\">Practical mitigation playbook <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<p>If you use AI agents in your team you need rules. Here is my &quot;Stay Safe&quot; list:</p>\n<ul>\n<li>Strict Performance Budgets: No page should load more than 200kb of JS. This stops AI from importing huge libraries.</li>\n<li>No &quot;Vibe Reviews&quot;: Pull Requests must be reviewed by a human who understands the logic. Do not just look at the screenshot.</li>\n<li>Automated Security Scans: Use tools like Snyk to catch AI mistakes before they merge.</li>\n<li>Accessibility First: Run axe-core in your pipeline. If the AI built a div button the build must fail.</li>\n<li>Clean Code Standards: Even if an agent wrote it it must be formatted and readable. No &quot;Agent Only&quot; code allowed.</li>\n<li>Small Contexts: Give the agent small tasks. Do not say &quot;Build me a shop&quot;. Say &quot;Build me a component for a price tag&quot;.</li>\n</ul>\n<p>AI is a power tool. It is like a chainsaw. It can help you build a house fast. But if you don't know how to sue it you might lose a leg. Let's stay safe.</p>\n<h2 id=\"sources-and-further-reading\" tabindex=\"-1\">Sources and further reading <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheHiddenCostOfVibeCodingAndAIAgents/\">#</a></h2>\n<ul>\n<li><a href=\"https://www.gitclear.com/ai_assistant_code_quality_2025_research\">AI Copilot Code Quality: 2025 Look Back at 12 Months of Data</a></li>\n<li><a href=\"https://www.veracode.com/resources/analyst-reports/2025-genai-code-security-report/\">October 2025 Update: GenAI Code Security Report</a></li>\n<li><a href=\"https://www.anthropic.com/research/AI-assistance-coding-skills\">How AI assistance impacts the formation of coding skills</a></li>\n<li><a href=\"https://owasp.org/www-project-top-10-for-large-language-model-applications/\">OWASP Top 10 for Large Language Model Applications</a></li>\n<li><a href=\"https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai\">AI Act</a></li>\n</ul>\n",
			"date_published": "2026-05-11T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/PromptingIsNotEverythingWhyTheToolMatters/",
			"url": "https://b.polente.de/blog/PromptingIsNotEverythingWhyTheToolMatters/",
			"title": "Prompting is not everything — Why the tool matters",
			"content_html": "<h2 id=\"the-experiment-building-a-cv-website-with-ai\" tabindex=\"-1\">The Experiment: Building a CV Website with AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/PromptingIsNotEverythingWhyTheToolMatters/\">#</a></h2>\n<p>I did a fun project to check how modern CLIs and Chat agents work with a simple prompt and clean data. The goal was to see if an AI can build a state-of-the-art CV webpage completely alone. No questions allowed—just &quot;Zero-Shot&quot; execution.</p>\n<p>All code and the source data are here: <a href=\"https://github.com/polent/Research\">github.com/polent/Research</a></p>\n<h2 id=\"the-setup-and-the-tools\" tabindex=\"-1\">The Setup and the Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/PromptingIsNotEverythingWhyTheToolMatters/\">#</a></h2>\n<p>I used a JSON file for the content and a profile image. The prompt asked for a professional design, light and dark themes, and high standards for accessibility and SEO.</p>\n<p>I tested four different setups. It was a bit unfair for Copilot because I used an older version without a subscription. But this shows exactly the point: the more expensive and modern tools work better. Even the best prompt cannot save an outdated model.</p>\n<h2 id=\"the-results\" tabindex=\"-1\">The Results <a class=\"header-anchor\" href=\"https://b.polente.de/blog/PromptingIsNotEverythingWhyTheToolMatters/\">#</a></h2>\n<p>You can see the difference in the output links:</p>\n<ul>\n<li><strong>Claude (Opus 4.7):</strong> This was my favorite. The code is very clean and follow all rules. <a href=\"https://present.polente.de/research/claude-opus-4-7/\">View Claude Result</a></li>\n<li><strong>Gemini (CLI):</strong> It made the file very SEO friendly. This was expected and shows good technical logic. <a href=\"https://present.polente.de/research/gemini-cli/\">View Gemini Result</a></li>\n<li><strong>Copilot (GPT-4):</strong> This result was massive broken. It produced a lot of useless code. <a href=\"https://present.polente.de/research/copilot-gpt4/\">View Copilot Result</a></li>\n<li><strong>Something (Sonnet):</strong> This one was massive overengineered and still broken. It even looked for images outside the correct folder. <a href=\"https://present.polente.de/research/ss-claude-sonnet-4/\">Something Result</a></li>\n</ul>\n<h2 id=\"my-conclusion\" tabindex=\"-1\">My Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/PromptingIsNotEverythingWhyTheToolMatters/\">#</a></h2>\n<p>The tool you use is just as critical as the prompt you write. For complex frontend tasks that need to be &quot;Zero-Shot,&quot; you need a tool that understands modern W3C standards and accessibility: <strong>Success with Claude / Gemini</strong></p>\n<h2 id=\"the-master-prompt\" tabindex=\"-1\">The Master Prompt <a class=\"header-anchor\" href=\"https://b.polente.de/blog/PromptingIsNotEverythingWhyTheToolMatters/\">#</a></h2>\n<p>This is the MD file I used as the input for all agents:</p>\n<pre class=\"language-Markdown\" tabindex=\"0\"><code class=\"language-Markdown\"># Autonomous CV Website Generator Prompt\n\nYou are an expert Frontend Developer and UI/UX Designer. Your task is to\nautonomously generate a state-of-the-art, fully static CV/Resume webpage based\non the provided source data.\n\n## Constraints & Execution Mode\n\n- **Zero-Shot Execution:** You must work completely autonomously. Do NOT ask any\n  clarifying questions. Use your best judgment for any ambiguities and output\n  the final result.\n- **Output Location:** Place all generated files into the\n  `dist/<your_agent_name>` directory so that the webpage can be browsed\n  statically (e.g., `dist/gpt4/index.html`).\n\n## Input Data\n\n- All raw data is located in the `src/` directory of the project root.\n- Use `src/index.json` for the text content of the CV.\n- Use the image `src/HolgerHellinger640.png` as the profile picture.\n\n## Core Requirements\n\n### 1. Design & Aesthetics\n\n- **State-of-the-Art:** Create a modern, professional, and visually stunning\n  aesthetic. Use excellent typography, whitespace, and subtle\n  animations/transitions.\n- **Icons & Imagery:** Effectively feature the provided profile image. Create\n  and use high-quality, modern SVG icons for contact details, social links,\n  sections, and skills.\n- **Theming:** Implement **Light and Dark themes**. Respect system preferences\n  by default (`prefers-color-scheme`) and include a functional toggle switch\n  for manual overrides.\n\n### 2. Print & Export\n\n- **Print Styles:** Write robust @media print CSS rules. When the user\n  attempts to print or save the page as a PDF, the CV must format perfectly to\n  standard paper sizes (A4/Letter), hiding UI elements like the theme toggle,\n  removing dark mode backgrounds, and handling page breaks elegantly.\n\n### 3. Optimization & Readability\n\n- **Accessibility (a11y):** The HTML must be fully accessible. Use semantic\n  HTML5, correct heading hierarchy, and proper ARIA labels. Ensure keyboard\n  navigability and high contrast.\n- **SEO:** Optimize the site for search engines with comprehensive\n  <meta> tags (title, description, viewport, OpenGraph).\n- **Agent/Machine Readable:** Ensure the site structure is highly logical so AI\n  agents can parse it effortlessly. Embed the CV data into the HTML using\n  JSON-LD with the schema.org/Person specification.</your_agent_name></code></pre>\n",
			"date_published": "2026-05-06T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/",
			"url": "https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/",
			"title": "The Agentic Design Workflow - Orchestrating MCP and AI for Scale",
			"content_html": "<h2 id=\"executive-summary\" tabindex=\"-1\">Executive Summary <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h2>\n<p>The year 2026 marks a significant evolution in design system management, shifting from the &quot;Jack-of-all-trades&quot; design team structures prevalent in 2023 to a highly integrated &quot;Human + AI Pairing&quot; model. This whitepaper introduces &quot;The Agentic Design Workflow,&quot; an approach that leverages the Model Context Protocol (MCP) and advanced agentic reasoning to streamline the entire design-to-development lifecycle. By orchestrating AI with existing tools like Figma, Storybook, and Jira, this workflow shifts the design focus from creating static, high-fidelity mockups to defining system components, patterns, and annotations, which intelligent agents use to construct production-ready interfaces.</p>\n<p>At the core of this approach are three interconnected MCP layers: the <strong>Figma MCP Server</strong> exposes design context to AI agents, <strong>MCP Apps</strong> render interactive review and configuration UIs directly inside AI conversations, and the <strong>Storybook MCP</strong> resolves design components to framework-specific code. Together, they form a continuous design system flow that replaces manual handoffs with an automated, bidirectional pipeline.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/2h_4cJOyPu-360.avif 360w, https://b.polente.de/img/2h_4cJOyPu-608.avif 608w, https://b.polente.de/img/2h_4cJOyPu-960.avif 960w, https://b.polente.de/img/2h_4cJOyPu-1240.avif 1240w, https://b.polente.de/img/2h_4cJOyPu-2816.avif 2816w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/2h_4cJOyPu-360.webp 360w, https://b.polente.de/img/2h_4cJOyPu-608.webp 608w, https://b.polente.de/img/2h_4cJOyPu-960.webp 960w, https://b.polente.de/img/2h_4cJOyPu-1240.webp 1240w, https://b.polente.de/img/2h_4cJOyPu-2816.webp 2816w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/2h_4cJOyPu-360.png 360w, https://b.polente.de/img/2h_4cJOyPu-608.png 608w, https://b.polente.de/img/2h_4cJOyPu-960.png 960w, https://b.polente.de/img/2h_4cJOyPu-1240.png 1240w, https://b.polente.de/img/2h_4cJOyPu-2816.png 2816w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A conceptual line-art illustration of a suspension bridge labeled 'AI Orchestration Model Context Protocol.' The bridge connects 'Design Tokens' and 'Design Systems' on the left—represented by icons like color palettes and layers—to technical data structures and code blocks on the right.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/2h_4cJOyPu-360.png\" width=\"2816\" height=\"1536\"></picture></p>\n<h2 id=\"the-problem-space\" tabindex=\"-1\">The Problem Space <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h2>\n<p>Traditional design and development workflows are plagued by inefficiencies stemming from disconnected tools, manual handoffs, and the constant need to translate design intent into production-ready code. Teams create full-blown designs and comprehensive workflows within Figma, making long-term management of design and UX artifacts incredibly difficult. In this &quot;visual-first&quot; approach, it becomes unclear to stakeholders what represents the latest truth, and deprecating old designs is a cumbersome, manual process.</p>\n<p>This fragmentation leads to what we call the <strong>&quot;re-inventing the wheel&quot; problem</strong>: design components are meticulously crafted in design tools, only to be laboriously re-implemented by developers. Industry estimates suggest this traditional approach contributes to approximately <strong>30% waste</strong> in time and resources across the design-to-development lifecycle.</p>\n<p>Design systems, while intended to solve this, often become rigid <strong>&quot;golden cages&quot;</strong>, systems too inflexible to adapt to evolving project needs and technology stacks. The absence of a seamless, bidirectional flow between design artifacts (Figma components, design tokens) and development assets (Storybook components, production code) creates friction, delays, and perpetual synchronization challenges. This is exacerbated in complex, multi-platform environments where consistency and rapid iteration are paramount yet frequently undermined by the very processes designed to ensure them.</p>\n<h2 id=\"the-proposed-workflow-step-by-step\" tabindex=\"-1\">The Proposed Workflow (Step-by-Step) <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h2>\n<figure class=\"mermaid\"><html><head></head><body><svg id=\"mermaid-kkmjmxxapoqx\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" class=\"flowchart\" style=\"max-width: 893.21484375px;\" viewBox=\"0 0 893.21484375 1108\" role=\"graphics-document document\" aria-roledescription=\"flowchart-v2\"><style>#mermaid-kkmjmxxapoqx{font-family:arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-kkmjmxxapoqx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-kkmjmxxapoqx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-kkmjmxxapoqx .error-icon{fill:#552222;}#mermaid-kkmjmxxapoqx .error-text{fill:#552222;stroke:#552222;}#mermaid-kkmjmxxapoqx .edge-thickness-normal{stroke-width:1px;}#mermaid-kkmjmxxapoqx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-kkmjmxxapoqx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-kkmjmxxapoqx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-kkmjmxxapoqx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-kkmjmxxapoqx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-kkmjmxxapoqx .marker{fill:#333333;stroke:#333333;}#mermaid-kkmjmxxapoqx .marker.cross{stroke:#333333;}#mermaid-kkmjmxxapoqx svg{font-family:arial,sans-serif;font-size:16px;}#mermaid-kkmjmxxapoqx p{margin:0;}#mermaid-kkmjmxxapoqx .label{font-family:arial,sans-serif;color:#333;}#mermaid-kkmjmxxapoqx .cluster-label text{fill:#333;}#mermaid-kkmjmxxapoqx .cluster-label span{color:#333;}#mermaid-kkmjmxxapoqx .cluster-label span p{background-color:transparent;}#mermaid-kkmjmxxapoqx .label text,#mermaid-kkmjmxxapoqx span{fill:#333;color:#333;}#mermaid-kkmjmxxapoqx .node rect,#mermaid-kkmjmxxapoqx .node circle,#mermaid-kkmjmxxapoqx .node ellipse,#mermaid-kkmjmxxapoqx .node polygon,#mermaid-kkmjmxxapoqx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-kkmjmxxapoqx .rough-node .label text,#mermaid-kkmjmxxapoqx .node .label text,#mermaid-kkmjmxxapoqx .image-shape .label,#mermaid-kkmjmxxapoqx .icon-shape .label{text-anchor:middle;}#mermaid-kkmjmxxapoqx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-kkmjmxxapoqx .rough-node .label,#mermaid-kkmjmxxapoqx .node .label,#mermaid-kkmjmxxapoqx .image-shape .label,#mermaid-kkmjmxxapoqx .icon-shape .label{text-align:center;}#mermaid-kkmjmxxapoqx .node.clickable{cursor:pointer;}#mermaid-kkmjmxxapoqx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-kkmjmxxapoqx .arrowheadPath{fill:#333333;}#mermaid-kkmjmxxapoqx .edgePath .path{stroke:#333333;stroke-width:1px;}#mermaid-kkmjmxxapoqx .flowchart-link{stroke:#333333;fill:none;}#mermaid-kkmjmxxapoqx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-kkmjmxxapoqx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-kkmjmxxapoqx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-kkmjmxxapoqx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-kkmjmxxapoqx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-kkmjmxxapoqx .cluster text{fill:#333;}#mermaid-kkmjmxxapoqx .cluster span{color:#333;}#mermaid-kkmjmxxapoqx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-kkmjmxxapoqx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-kkmjmxxapoqx rect.text{fill:none;stroke-width:0;}#mermaid-kkmjmxxapoqx .icon-shape,#mermaid-kkmjmxxapoqx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-kkmjmxxapoqx .icon-shape p,#mermaid-kkmjmxxapoqx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-kkmjmxxapoqx .icon-shape .label rect,#mermaid-kkmjmxxapoqx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-kkmjmxxapoqx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-kkmjmxxapoqx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-kkmjmxxapoqx .node .neo-node{stroke:#9370DB;}#mermaid-kkmjmxxapoqx [data-look=\"neo\"].node rect,#mermaid-kkmjmxxapoqx [data-look=\"neo\"].cluster rect,#mermaid-kkmjmxxapoqx [data-look=\"neo\"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#mermaid-kkmjmxxapoqx [data-look=\"neo\"].node path{stroke:#9370DB;stroke-width:1px;}#mermaid-kkmjmxxapoqx [data-look=\"neo\"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#mermaid-kkmjmxxapoqx [data-look=\"neo\"].node .neo-line path{stroke:#9370DB;filter:none;}#mermaid-kkmjmxxapoqx [data-look=\"neo\"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#mermaid-kkmjmxxapoqx [data-look=\"neo\"].node circle .state-start{fill:#000000;}#mermaid-kkmjmxxapoqx [data-look=\"neo\"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#mermaid-kkmjmxxapoqx [data-look=\"neo\"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#mermaid-kkmjmxxapoqx :root{--mermaid-font-family:arial,sans-serif;}#mermaid-kkmjmxxapoqx .banana&gt;*{fill:rgb(209, 232, 255)!important;stroke:rgb(0, 82, 204)!important;stroke-width:1px!important;color:rgb(0, 51, 102)!important;rx:10!important;ry:10!important;}#mermaid-kkmjmxxapoqx .banana span{fill:rgb(209, 232, 255)!important;stroke:rgb(0, 82, 204)!important;stroke-width:1px!important;color:rgb(0, 51, 102)!important;rx:10!important;ry:10!important;}#mermaid-kkmjmxxapoqx .banana tspan{fill:rgb(0, 51, 102)!important;}#mermaid-kkmjmxxapoqx .peel&gt;*{fill:rgb(240, 247, 255)!important;stroke:rgb(142, 182, 230)!important;stroke-width:1px!important;color:rgb(0, 51, 102)!important;rx:10!important;ry:10!important;}#mermaid-kkmjmxxapoqx .peel span{fill:rgb(240, 247, 255)!important;stroke:rgb(142, 182, 230)!important;stroke-width:1px!important;color:rgb(0, 51, 102)!important;rx:10!important;ry:10!important;}#mermaid-kkmjmxxapoqx .peel tspan{fill:rgb(0, 51, 102)!important;}#mermaid-kkmjmxxapoqx .stem&gt;*{fill:rgb(0, 82, 204)!important;stroke:rgb(0, 51, 102)!important;stroke-width:1px!important;color:rgb(255, 255, 255)!important;rx:5!important;ry:5!important;}#mermaid-kkmjmxxapoqx .stem span{fill:rgb(0, 82, 204)!important;stroke:rgb(0, 51, 102)!important;stroke-width:1px!important;color:rgb(255, 255, 255)!important;rx:5!important;ry:5!important;}#mermaid-kkmjmxxapoqx .stem tspan{fill:rgb(255, 255, 255)!important;}</style><g><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-pointStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"4.5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 5 L 10 10 L 10 0 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"11.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"10.5\" markerHeight=\"14\" orient=\"auto\"><path d=\"M 0 0 L 11.5 7 L 0 14 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-pointStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"1\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11.5\" markerHeight=\"14\" orient=\"auto\"><polygon points=\"0,7 11.5,14 11.5,0\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></polygon></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-circleEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"11\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-circleStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-1\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-circleEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refY=\"5\" refX=\"12.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-circleStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-2\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-crossEnd\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"12\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-crossStart\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"-1\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-crossEnd-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"17.7\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5;\"></path></marker><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-crossStart-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"-3.5\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5; stroke-dasharray: 1, 0;\"></path></marker><g class=\"root\"><g class=\"clusters\"><g class=\"cluster\" id=\"mermaid-kkmjmxxapoqx-Dev_Handoff\" data-look=\"classic\"><rect style=\"\" x=\"58.73828125\" y=\"644\" width=\"826.4765625\" height=\"456\"></rect><g class=\"cluster-label\" transform=\"translate(384.1640625, 644)\"><foreignObject width=\"175.625\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5;\"><span class=\"nodeLabel\"><p>💻 Orchestration &amp; Build</p></span></div></foreignObject></g></g><g class=\"cluster\" id=\"mermaid-kkmjmxxapoqx-Interaction_Phase\" data-look=\"classic\"><rect style=\"\" x=\"123.6796875\" y=\"8\" width=\"662.55078125\" height=\"128\"></rect><g class=\"cluster-label\" transform=\"translate(362.837890625, 8)\"><foreignObject width=\"184.234375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5;\"><span class=\"nodeLabel\"><p>🔄 MCP Integration Layer</p></span></div></foreignObject></g></g><g class=\"cluster\" id=\"mermaid-kkmjmxxapoqx-Design_Phase\" data-look=\"classic\"><rect style=\"\" x=\"8\" y=\"186\" width=\"717.21484375\" height=\"408\"></rect><g class=\"cluster-label\" transform=\"translate(286.349609375, 186)\"><foreignObject width=\"160.515625\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5;\"><span class=\"nodeLabel\"><p>💻 Design &amp; Definition</p></span></div></foreignObject></g></g></g><g class=\"edgePaths\"><path d=\"M171.193,289L167.573,293.167C163.954,297.333,156.715,305.667,153.096,320.5C149.477,335.333,149.477,356.667,149.477,378C149.477,399.333,149.477,420.667,149.477,436.833C149.477,453,149.477,464,149.477,469.5L149.477,475\" id=\"mermaid-kkmjmxxapoqx-L_S1_S2_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S1_S2_0\" data-points=\"W3sieCI6MTcxLjE5Mjg3MTA5Mzc1LCJ5IjoyODl9LHsieCI6MTQ5LjQ3NjU2MjUsInkiOjMxNH0seyJ4IjoxNDkuNDc2NTYyNSwieSI6Mzc4fSx7IngiOjE0OS40NzY1NjI1LCJ5Ijo0NDJ9LHsieCI6MTQ5LjQ3NjU2MjUsInkiOjQ3OX1d\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M291.204,289L300.406,293.167C309.609,297.333,328.013,305.667,342.725,313.622C357.436,321.578,368.455,329.156,373.964,332.944L379.473,336.733\" id=\"mermaid-kkmjmxxapoqx-L_S1_S5_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S1_S5_0\" data-points=\"W3sieCI6MjkxLjIwNDA0MDUyNzM0Mzc1LCJ5IjoyODl9LHsieCI6MzQ2LjQxNzk2ODc1LCJ5IjozMTR9LHsieCI6MzgyLjc2ODk4MTkzMzU5Mzc1LCJ5IjozMzl9XQ==\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M439.477,417L439.477,421.167C439.477,425.333,439.477,433.667,439.477,441.333C439.477,449,439.477,456,439.477,459.5L439.477,463\" id=\"mermaid-kkmjmxxapoqx-L_S5_S6_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S5_S6_0\" data-points=\"W3sieCI6NDM5LjQ3NjU2MjUsInkiOjQxN30seyJ4Ijo0MzkuNDc2NTYyNSwieSI6NDQyfSx7IngiOjQzOS40NzY1NjI1LCJ5Ijo0Njd9XQ==\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M225.094,111L221.757,115.167C218.42,119.333,211.745,127.667,208.408,136C205.07,144.333,205.07,152.667,205.07,161C205.07,169.333,205.07,177.667,205.07,185.333C205.07,193,205.07,200,205.07,203.5L205.07,207\" id=\"mermaid-kkmjmxxapoqx-L_S3_S1_0\" class=\"edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S3_S1_0\" data-points=\"W3sieCI6MjI1LjA5NDQyMTM4NjcxODc1LCJ5IjoxMTF9LHsieCI6MjA1LjA3MDMxMjUsInkiOjEzNn0seyJ4IjoyMDUuMDcwMzEyNSwieSI6MTYxfSx7IngiOjIwNS4wNzAzMTI1LCJ5IjoxODZ9LHsieCI6MjA1LjA3MDMxMjUsInkiOjIxMX1d\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M664.199,111L664.199,115.167C664.199,119.333,664.199,127.667,664.199,136C664.199,144.333,664.199,152.667,638.535,161C612.871,169.333,561.543,177.667,535.879,192.5C510.215,207.333,510.215,228.667,510.215,250C510.215,271.333,510.215,292.667,506.104,307.053C501.993,321.439,493.771,328.878,489.66,332.597L485.549,336.316\" id=\"mermaid-kkmjmxxapoqx-L_S4_S5_0\" class=\"edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S4_S5_0\" data-points=\"W3sieCI6NjY0LjE5OTIxODc1LCJ5IjoxMTF9LHsieCI6NjY0LjE5OTIxODc1LCJ5IjoxMzZ9LHsieCI6NjY0LjE5OTIxODc1LCJ5IjoxNjF9LHsieCI6NTEwLjIxNDg0Mzc1LCJ5IjoxODZ9LHsieCI6NTEwLjIxNDg0Mzc1LCJ5IjoyNTB9LHsieCI6NTEwLjIxNDg0Mzc1LCJ5IjozMTR9LHsieCI6NDgyLjU4MjcwMjYzNjcxODc1LCJ5IjozMzl9XQ==\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M386.288,569L381.942,573.167C377.597,577.333,368.906,585.667,364.56,594C360.215,602.333,360.215,610.667,360.215,619C360.215,627.333,360.215,635.667,360.215,645.333C360.215,655,360.215,666,360.215,671.5L360.215,677\" id=\"mermaid-kkmjmxxapoqx-L_S6_S7_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S6_S7_0\" data-points=\"W3sieCI6Mzg2LjI4Nzc3NzU0OTM0MjEsInkiOjU2OX0seyJ4IjozNjAuMjE0ODQzNzUsInkiOjU5NH0seyJ4IjozNjAuMjE0ODQzNzUsInkiOjYxOX0seyJ4IjozNjAuMjE0ODQzNzUsInkiOjY0NH0seyJ4IjozNjAuMjE0ODQzNzUsInkiOjY4MX1d\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M554.477,561.539L568.766,566.949C583.056,572.36,611.635,583.18,625.925,592.757C640.215,602.333,640.215,610.667,640.215,619C640.215,627.333,640.215,635.667,640.215,643.333C640.215,651,640.215,658,640.215,661.5L640.215,665\" id=\"mermaid-kkmjmxxapoqx-L_S6_S8_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S6_S8_0\" data-points=\"W3sieCI6NTU0LjQ3NjU2MjUsInkiOjU2MS41MzkyNzg4MzM5OTE3fSx7IngiOjY0MC4yMTQ4NDM3NSwieSI6NTk0fSx7IngiOjY0MC4yMTQ4NDM3NSwieSI6NjE5fSx7IngiOjY0MC4yMTQ4NDM3NSwieSI6NjQ0fSx7IngiOjY0MC4yMTQ4NDM3NSwieSI6NjY5fV0=\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M360.215,783L360.215,789.167C360.215,795.333,360.215,807.667,362.174,817.415C364.134,827.164,368.053,834.327,370.013,837.909L371.972,841.491\" id=\"mermaid-kkmjmxxapoqx-L_S7_S9_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S7_S9_0\" data-points=\"W3sieCI6MzYwLjIxNDg0Mzc1LCJ5Ijo3ODN9LHsieCI6MzYwLjIxNDg0Mzc1LCJ5Ijo4MjB9LHsieCI6MzczLjg5MTg1ODU1MjYzMTU2LCJ5Ijo4NDV9XQ==\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M640.215,795L640.215,799.167C640.215,803.333,640.215,811.667,620.28,822.188C600.345,832.709,560.474,845.418,540.539,851.773L520.604,858.127\" id=\"mermaid-kkmjmxxapoqx-L_S8_S9_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S8_S9_0\" data-points=\"W3sieCI6NjQwLjIxNDg0Mzc1LCJ5Ijo3OTV9LHsieCI6NjQwLjIxNDg0Mzc1LCJ5Ijo4MjB9LHsieCI6NTE2Ljc5Mjk2ODc1LCJ5Ijo4NTkuMzQyMjg5Nzk2MTg1OH1d\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M401.793,947L401.793,951.167C401.793,955.333,401.793,963.667,401.793,971.333C401.793,979,401.793,986,401.793,989.5L401.793,993\" id=\"mermaid-kkmjmxxapoqx-L_S9_S10_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S9_S10_0\" data-points=\"W3sieCI6NDAxLjc5Mjk2ODc1LCJ5Ijo5NDd9LHsieCI6NDAxLjc5Mjk2ODc1LCJ5Ijo5NzJ9LHsieCI6NDAxLjc5Mjk2ODc1LCJ5Ijo5OTd9XQ==\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M149.477,557L149.477,563.167C149.477,569.333,149.477,581.667,149.477,592C149.477,602.333,149.477,610.667,149.477,619C149.477,627.333,149.477,635.667,149.477,654.5C149.477,673.333,149.477,702.667,149.477,732C149.477,761.333,149.477,790.667,171.724,812.035C193.972,833.402,238.467,846.805,260.715,853.506L282.963,860.207\" id=\"mermaid-kkmjmxxapoqx-L_S2_S9_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S2_S9_0\" data-points=\"W3sieCI6MTQ5LjQ3NjU2MjUsInkiOjU1N30seyJ4IjoxNDkuNDc2NTYyNSwieSI6NTk0fSx7IngiOjE0OS40NzY1NjI1LCJ5Ijo2MTl9LHsieCI6MTQ5LjQ3NjU2MjUsInkiOjY0NH0seyJ4IjoxNDkuNDc2NTYyNSwieSI6NzMyfSx7IngiOjE0OS40NzY1NjI1LCJ5Ijo4MjB9LHsieCI6Mjg2Ljc5Mjk2ODc1LCJ5Ijo4NjEuMzYwOTUyNDI1MTg1NH1d\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path><path d=\"M344.113,96.377L367.893,102.981C391.673,109.585,439.233,122.792,463.013,133.563C486.793,144.333,486.793,152.667,539.03,161C591.267,169.333,695.741,177.667,747.978,192.5C800.215,207.333,800.215,228.667,800.215,250C800.215,271.333,800.215,292.667,800.215,314C800.215,335.333,800.215,356.667,800.215,378C800.215,399.333,800.215,420.667,800.215,444C800.215,467.333,800.215,492.667,800.215,518C800.215,543.333,800.215,568.667,800.215,585.5C800.215,602.333,800.215,610.667,800.215,619C800.215,627.333,800.215,635.667,800.215,654.5C800.215,673.333,800.215,702.667,800.215,732C800.215,761.333,800.215,790.667,753.633,814.219C707.051,837.771,613.886,855.543,567.304,864.428L520.722,873.314\" id=\"mermaid-kkmjmxxapoqx-L_S3_S9_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\"stroke:#7B92B2;stroke-width:1px;;;stroke:#7B92B2;stroke-width:1px\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_S3_S9_0\" data-points=\"W3sieCI6MzQ0LjExMzI4MTI1LCJ5Ijo5Ni4zNzcyMzMxMjY1NDY2Nn0seyJ4Ijo0ODYuNzkyOTY4NzUsInkiOjEzNn0seyJ4Ijo0ODYuNzkyOTY4NzUsInkiOjE2MX0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjE4Nn0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjI1MH0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjMxNH0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjM3OH0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjQ0Mn0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjUxOH0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjU5NH0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjYxOX0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjY0NH0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjczMn0seyJ4Ijo4MDAuMjE0ODQzNzUsInkiOjgyMH0seyJ4Ijo1MTYuNzkyOTY4NzUsInkiOjg3NC4wNjM0NTM0Njg3NjM0fV0=\" data-look=\"classic\" marker-end=\"url(#mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S1_S2_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S1_S5_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S5_S6_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S3_S1_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S4_S5_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S6_S7_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S6_S8_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S7_S9_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S8_S9_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S9_S10_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S2_S9_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_S3_S9_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"node default banana\" id=\"mermaid-kkmjmxxapoqx-flowchart-S1-0\" data-look=\"classic\" transform=\"translate(205.0703125, 250)\"><rect class=\"basic label-container\" style=\"fill:#D1E8FF !important;stroke:#0052CC !important;stroke-width:1px !important;rx:10 !important;ry:10 !important\" rx=\"5\" ry=\"5\" x=\"-95.4921875\" y=\"-39\" width=\"190.984375\" height=\"78\"></rect><g class=\"label\" style=\"color:#003366 !important\" transform=\"translate(-80.4921875, -24)\"><rect></rect><foreignObject width=\"160.984375\" height=\"48\"><div style=\"color: rgb(0, 51, 102) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http://www.w3.org/1999/xhtml\"><span style=\"color:#003366 !important\" class=\"nodeLabel\"><p>Step 1: Figma Setup &amp;<br>Annotation Framework</p></span></div></foreignObject></g></g><g class=\"node default banana\" id=\"mermaid-kkmjmxxapoqx-flowchart-S2-1\" data-look=\"classic\" transform=\"translate(149.4765625, 518)\"><rect class=\"basic label-container\" style=\"fill:#D1E8FF !important;stroke:#0052CC !important;stroke-width:1px !important;rx:10 !important;ry:10 !important\" rx=\"5\" ry=\"5\" x=\"-106.4765625\" y=\"-39\" width=\"212.953125\" height=\"78\"></rect><g class=\"label\" style=\"color:#003366 !important\" transform=\"translate(-91.4765625, -24)\"><rect></rect><foreignObject width=\"182.953125\" height=\"48\"><div style=\"color: rgb(0, 51, 102) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http://www.w3.org/1999/xhtml\"><span style=\"color:#003366 !important\" class=\"nodeLabel\"><p>Step 2: Token Intelligence<br>(Brand Intent)</p></span></div></foreignObject></g></g><g class=\"node default banana\" id=\"mermaid-kkmjmxxapoqx-flowchart-S5-2\" data-look=\"classic\" transform=\"translate(439.4765625, 378)\"><rect class=\"basic label-container\" style=\"fill:#D1E8FF !important;stroke:#0052CC !important;stroke-width:1px !important;rx:10 !important;ry:10 !important\" rx=\"5\" ry=\"5\" x=\"-93.71875\" y=\"-39\" width=\"187.4375\" height=\"78\"></rect><g class=\"label\" style=\"color:#003366 !important\" transform=\"translate(-78.71875, -24)\"><rect></rect><foreignObject width=\"157.4375\" height=\"48\"><div style=\"color: rgb(0, 51, 102) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http://www.w3.org/1999/xhtml\"><span style=\"color:#003366 !important\" class=\"nodeLabel\"><p>Step 5: Pattern-Based<br>Annotation</p></span></div></foreignObject></g></g><g class=\"node default banana\" id=\"mermaid-kkmjmxxapoqx-flowchart-S6-3\" data-look=\"classic\" transform=\"translate(439.4765625, 518)\"><rect class=\"basic label-container\" style=\"fill:#D1E8FF !important;stroke:#0052CC !important;stroke-width:1px !important;rx:10 !important;ry:10 !important\" rx=\"5\" ry=\"5\" x=\"-115\" y=\"-51\" width=\"230\" height=\"102\"></rect><g class=\"label\" style=\"color:#003366 !important\" transform=\"translate(-100, -36)\"><rect></rect><foreignObject width=\"200\" height=\"72\"><div style=\"color: rgb(0, 51, 102) !important; display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;\" xmlns=\"http://www.w3.org/1999/xhtml\"><span style=\"color:#003366 !important\" class=\"nodeLabel\"><p>Step 6: Component Architecture<br>(Slots)</p></span></div></foreignObject></g></g><g class=\"node default peel\" id=\"mermaid-kkmjmxxapoqx-flowchart-S3-10\" data-look=\"classic\" transform=\"translate(256.33203125, 72)\"><rect class=\"basic label-container\" style=\"fill:#F0F7FF !important;stroke:#8EB6E6 !important;stroke-width:1px !important;rx:10 !important;ry:10 !important\" rx=\"5\" ry=\"5\" x=\"-87.78125\" y=\"-39\" width=\"175.5625\" height=\"78\"></rect><g class=\"label\" style=\"color:#003366 !important\" transform=\"translate(-72.78125, -24)\"><rect></rect><foreignObject width=\"145.5625\" height=\"48\"><div style=\"color: rgb(0, 51, 102) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http://www.w3.org/1999/xhtml\"><span style=\"color:#003366 !important\" class=\"nodeLabel\"><p>Step 3: MCP Apps &amp;<br>Figma MCP Server</p></span></div></foreignObject></g></g><g class=\"node default peel\" id=\"mermaid-kkmjmxxapoqx-flowchart-S4-11\" data-look=\"classic\" transform=\"translate(664.19921875, 72)\"><rect class=\"basic label-container\" style=\"fill:#F0F7FF !important;stroke:#8EB6E6 !important;stroke-width:1px !important;rx:10 !important;ry:10 !important\" rx=\"5\" ry=\"5\" x=\"-87.03125\" y=\"-39\" width=\"174.0625\" height=\"78\"></rect><g class=\"label\" style=\"color:#003366 !important\" transform=\"translate(-72.03125, -24)\"><rect></rect><foreignObject width=\"144.0625\" height=\"48\"><div style=\"color: rgb(0, 51, 102) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http://www.w3.org/1999/xhtml\"><span style=\"color:#003366 !important\" class=\"nodeLabel\"><p>Step 4: Real-time UI<br>Rendering (JSON)</p></span></div></foreignObject></g></g><g class=\"node default banana\" id=\"mermaid-kkmjmxxapoqx-flowchart-S7-16\" data-look=\"classic\" transform=\"translate(360.21484375, 732)\"><rect class=\"basic label-container\" style=\"fill:#D1E8FF !important;stroke:#0052CC !important;stroke-width:1px !important;rx:10 !important;ry:10 !important\" rx=\"5\" ry=\"5\" x=\"-115\" y=\"-51\" width=\"230\" height=\"102\"></rect><g class=\"label\" style=\"color:#003366 !important\" transform=\"translate(-100, -36)\"><rect></rect><foreignObject width=\"200\" height=\"72\"><div style=\"color: rgb(0, 51, 102) !important; display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;\" xmlns=\"http://www.w3.org/1999/xhtml\"><span style=\"color:#003366 !important\" class=\"nodeLabel\"><p>Step 7: Component Mapping<br>(Figma Connect / React)</p></span></div></foreignObject></g></g><g class=\"node default banana\" id=\"mermaid-kkmjmxxapoqx-flowchart-S8-17\" data-look=\"classic\" transform=\"translate(640.21484375, 732)\"><rect class=\"basic label-container\" style=\"fill:#D1E8FF !important;stroke:#0052CC !important;stroke-width:1px !important;rx:10 !important;ry:10 !important\" rx=\"5\" ry=\"5\" x=\"-115\" y=\"-63\" width=\"230\" height=\"126\"></rect><g class=\"label\" style=\"color:#003366 !important\" transform=\"translate(-100, -48)\"><rect></rect><foreignObject width=\"200\" height=\"96\"><div style=\"color: rgb(0, 51, 102) !important; display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;\" xmlns=\"http://www.w3.org/1999/xhtml\"><span style=\"color:#003366 !important\" class=\"nodeLabel\"><p>Step 8: Framework-Agnostic<br>Resolution (Storybook MCP)</p></span></div></foreignObject></g></g><g class=\"node default stem\" id=\"mermaid-kkmjmxxapoqx-flowchart-S9-18\" data-look=\"classic\" transform=\"translate(401.79296875, 896)\"><rect class=\"basic label-container\" style=\"fill:#0052CC !important;stroke:#003366 !important;stroke-width:1px !important;rx:5 !important;ry:5 !important\" rx=\"5\" ry=\"5\" x=\"-115\" y=\"-51\" width=\"230\" height=\"102\"></rect><g class=\"label\" style=\"color:#FFFFFF !important\" transform=\"translate(-100, -36)\"><rect></rect><foreignObject width=\"200\" height=\"72\"><div style=\"color: rgb(255, 255, 255) !important; display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;\" xmlns=\"http://www.w3.org/1999/xhtml\"><span style=\"color:#FFFFFF !important\" class=\"nodeLabel\"><p>Step 9: Component Orchestration<br>(Code Generation)</p></span></div></foreignObject></g></g><g class=\"node default peel\" id=\"mermaid-kkmjmxxapoqx-flowchart-S10-19\" data-look=\"classic\" transform=\"translate(401.79296875, 1036)\"><rect class=\"basic label-container\" style=\"fill:#F0F7FF !important;stroke:#8EB6E6 !important;stroke-width:1px !important;rx:10 !important;ry:10 !important\" rx=\"5\" ry=\"5\" x=\"-85.2734375\" y=\"-39\" width=\"170.546875\" height=\"78\"></rect><g class=\"label\" style=\"color:#003366 !important\" transform=\"translate(-70.2734375, -24)\"><rect></rect><foreignObject width=\"140.546875\" height=\"48\"><div style=\"color: rgb(0, 51, 102) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\" xmlns=\"http://www.w3.org/1999/xhtml\"><span style=\"color:#003366 !important\" class=\"nodeLabel\"><p>Step 10: Automated<br>Documentation</p></span></div></foreignObject></g></g></g></g><marker id=\"mermaid-kkmjmxxapoqx_flowchart-v2-pointEnd__7B92B2\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\" stroke=\"#7B92B2\" fill=\"#7B92B2\"></path></marker></g><defs><filter id=\"mermaid-kkmjmxxapoqx-drop-shadow\" height=\"130%\" width=\"130%\"><fedropshadow dx=\"4\" dy=\"4\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#000000\"></fedropshadow></filter></defs><defs><filter id=\"mermaid-kkmjmxxapoqx-drop-shadow-small\" height=\"150%\" width=\"150%\"><fedropshadow dx=\"2\" dy=\"2\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#000000\"></fedropshadow></filter></defs></svg></body></html></figure><h3 id=\"step-1-figma-setup-and-annotation-framework\" tabindex=\"-1\">Step 1: Figma Setup &amp; Annotation Framework <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>The foundational step involves importing the baseline design system into Figma <strong>and establishing a robust annotation framework.</strong> This isn't merely about visual assets; it's about <strong>setting up a system of annotations—similar to how we currently handle Accessibility or SEO—to define design intent.</strong> This framework allows designers to annotate spacing, gaps, font sizes, coloring, borders, and shadows (all managed via Tokens) directly on simplified layouts, rather than manually crafting every pixel for every state.</p>\n<h3 id=\"step-2-token-intelligence\" tabindex=\"-1\">Step 2: Token Intelligence <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>Building on the Figma setup, this step focuses on exporting semantic tokens from brand intent via a pipeline workflow. Design tokens, as defined by Holger Hellinger's insights, are the atomic units of a design system, encapsulating styling information (colors, typography, spacing, etc.). An intelligent pipeline, potentially augmented by AI, will extract and formalize these tokens from the Figma design system, ensuring consistency and enabling dynamic application across various platforms and technologies. This process moves beyond static values to semantic understanding, linking design decisions directly to their underlying brand principles.</p>\n<h3 id=\"step-3-mcp-apps-and-the-figma-mcp-server\" tabindex=\"-1\">Step 3: MCP Apps &amp; the Figma MCP Server <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>This step introduces the two MCP capabilities that make the agentic workflow possible. Understanding the distinction between them is critical.</p>\n<h4 id=\"the-figma-mcp-server-design-context-layer\" tabindex=\"-1\">The Figma MCP Server (Design Context Layer) <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h4>\n<p>The <strong>Figma MCP Server</strong> is a standard MCP server that exposes design system data to AI agents. Available as both a remote hosted endpoint and a local desktop server, it provides three specialized agent skills:</p>\n<ul>\n<li><strong>Implement Design</strong>: Select a Figma frame and generate code from it, respecting component structure and token values.</li>\n<li><strong>Code Connect Components</strong>: Map Figma components to their code implementations, creating a bidirectional link between design and development.</li>\n<li><strong>Create Design System Rules</strong>: Define and enforce design system constraints that agents must follow during code generation.</li>\n</ul>\n<p>The Figma MCP Server is the <strong>read side</strong> of the workflow: it gives agents access to tokens, component metadata, layout structures, and Code Connect mappings.</p>\n<h4 id=\"mcp-apps-interactive-review-layer\" tabindex=\"-1\">MCP Apps (Interactive Review Layer) <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h4>\n<p><strong>MCP Apps</strong> are a fundamentally different capability. Released in January 2026 as the first official MCP extension (<code>@modelcontextprotocol/ext-apps</code>), they allow MCP servers to return <strong>interactive UI components</strong> that render directly inside AI conversations — in Claude, VS Code, ChatGPT, or any supporting MCP host.</p>\n<p>Architecturally, an MCP App consists of two paired primitives:</p>\n<ol>\n<li><strong>A standard MCP tool</strong> that executes logic and returns results, with a <code>_meta.ui.resourceUri</code> field pointing to a UI resource.</li>\n<li><strong>A UI Resource</strong> served via the <code>ui://</code> scheme, containing bundled HTML/JavaScript that renders in a sandboxed iframe within the host application.</li>\n</ol>\n<p>The host and the UI communicate bidirectionally via JSON-RPC over <code>postMessage</code>. The UI can receive tool results, call server tools, and maintain persistent state — all while the AI model stays informed of user interactions.</p>\n<h4 id=\"why-mcp-apps-matter-for-design-systems\" tabindex=\"-1\">Why MCP Apps Matter for Design Systems <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h4>\n<p>Where the Figma MCP Server lets agents <em>read</em> design context, MCP Apps let agents <em>present interactive interfaces</em> back to the user. This closes a critical gap in the continuous design flow:</p>\n<ul>\n<li><strong>Component inventory dashboards</strong> — The agent queries the Figma MCP Server for component status, then renders an MCP App showing which components are Available, Partial, or Missing in Storybook, with interactive filtering and drill-down.</li>\n<li><strong>Token diff reviewers</strong> — When design tokens change, an MCP App renders a visual before/after comparison inline in the conversation, allowing designers to approve or reject changes without leaving the AI workspace.</li>\n<li><strong>Pattern selection galleries</strong> — Instead of the agent guessing which responsive pattern to apply, an MCP App presents a gallery of available patterns for the designer to select interactively, combining human judgment with agent execution.</li>\n<li><strong>Multi-step configuration wizards</strong> — For complex component orchestration (see Step 9), an MCP App walks the user through slot configuration, theme selection, and responsive breakpoint choices as an interactive form.</li>\n</ul>\n<h4 id=\"the-continuous-design-system-flow\" tabindex=\"-1\">The Continuous Design System Flow <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h4>\n<p>Together, these layers form a continuous, bidirectional pipeline:</p>\n<pre class=\"language-text\" tabindex=\"0\"><code class=\"language-text\">Figma MCP Server → MCP Apps → Storybook MCP → Agent Assembly\n  (read design)    (review/decide)  (resolve code)   (generate output)</code></pre>\n<p>The designer annotates in Figma. The agent reads context via the Figma MCP Server. An MCP App surfaces an interactive review for the designer to confirm or adjust. The agent then resolves the final components via Storybook MCP and assembles production code. At no point does the workflow require leaving the AI conversation or manually translating between tools.</p>\n<h3 id=\"step-4-real-time-ui-rendering\" tabindex=\"-1\">Step 4: Real-time UI Rendering <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>Leveraging concepts from Vercel Labs' <code>json-render</code>, this step focuses on rendering design intent (expressed as JSON schemas) directly into UI. Rather than working with static visual artifacts, designers and agents manipulate production-ready component schemas that render in real time.</p>\n<p>This capability connects directly to the MCP layer: the Figma MCP Server provides the design context, the agent assembles a JSON schema from annotations and token values, and the rendering engine produces a live preview. MCP Apps can embed these previews inline in the AI conversation, allowing designers to see the result immediately and iterate without switching tools. The goal is to find the sweet spot between granular designer control and overall developer efficiency, focusing on production and high-fidelity use cases.</p>\n<h3 id=\"step-5-pattern-based-annotation\" tabindex=\"-1\">Step 5: Pattern-Based Annotation <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p><strong>Instead of letting AI or agents generate massive designs from specs that are difficult to consume or validate later, this workflow leverages Responsive Patterns and annotations.</strong> Designers utilize these patterns to describe how maintained library components are utilized within a layout.\n<strong>Design and UX teams can focus on high-value annotations and &quot;nice-to-haves&quot; rather than repeatedly creating designs for multiple layouts.</strong> The workflow is annotation-driven:</p>\n<ul>\n<li><strong>Responsive Patterns:</strong> Define the structural behavior.</li>\n<li><strong>Token Annotations:</strong> Define the styling (spacing, colors, etc.).</li>\n<li><strong>Logic Annotations:</strong> Define the flow (e.g., &quot;Split form if &gt; 5 elements&quot;).</li>\n</ul>\n<h3 id=\"step-6-component-architecture-composition-with-slots\" tabindex=\"-1\">Step 6: Component Architecture: Composition with Slots <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>To truly move from &quot;drawing pages&quot; to &quot;orchestrating systems,&quot; the architecture of components themselves must evolve from rigid configurations to flexible compositions. This is achieved by adopting a <strong>slot-based component architecture,</strong> a concept recently highlighted by Figma as a path forward for modern design systems.</p>\n<p>Instead of creating dozens of variants for a single component (e.g., <code>card-with-button</code>, <code>card-with-image</code>, <code>card-with-button-and-image</code>), a slot-based approach defines a single <code>card</code> component with designated &quot;slots&quot; where content like a header, media, or actions can be placed. This decouples the container from its content.</p>\n<ul>\n<li><strong>The Agentic Advantage:</strong> This architecture is a powerful enabler for the agentic workflow. The designer's job is no longer to create every possible permutation of a component. Instead, they design flexible, &quot;slottable&quot; components and provide high-level annotations for a specific context. The agent then interprets these needs and intelligently &quot;fills the slots&quot; with the appropriate atomic components from the library. This drastically reduces redundant design work and directly addresses the &quot;golden cage&quot; problem described earlier.</li>\n<li><strong>Designer Empowerment:</strong> By offloading the repetitive task of creating component variations to the agent, designers are freed to focus on higher-value work: designing new, robust base components, evolving system-wide patterns, and solving novel user experience challenges.</li>\n</ul>\n<h3 id=\"step-7-component-mapping\" tabindex=\"-1\">Step 7: Component Mapping <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>A crucial step in bridging the design-development gap is ensuring that components within Figma are accurately mapped to their corresponding Storybook components via Figma Connect. This mapping is vital for the agent to correctly populate responsive patterns and templates with the right interactive elements. By establishing a robust, automated link, any updates or changes in the Figma design system can be reflected and validated directly within Storybook, maintaining synchronization and reducing discrepancies between design and code.</p>\n<h3 id=\"step-8-framework-agnostic-component-resolution\" tabindex=\"-1\">Step 8: Framework-Agnostic Component Resolution <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>While Figma Connect facilitates mapping for React components, a significant portion of the digital landscape involves other frameworks (Vue, Angular, Svelte) or pure web components. For these, the agentic workflow relies on the <strong>Storybook MCP</strong>, a server that merges Storybook component metadata with Figma design context into a single rich context for the AI agent. The Storybook MCP can classify each component as Available, Partial, or Missing relative to the design system, providing the agent with a complete inventory regardless of the target framework. Combined with task context from ticketing systems (Jira, etc.), the agent can intelligently resolve and utilize the correct, framework-agnostic components. This ensures that the benefits of component orchestration extend beyond a single framework, providing comprehensive design system coverage.</p>\n<h3 id=\"step-9-component-orchestration-via-mcp\" tabindex=\"-1\">Step 9: Component Orchestration via MCP <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>This is where agentic reasoning truly shines. <strong>MCP servers consume the Figma annotations as prompts, combining them with component documentation to generate the final UI.</strong> An ideal workflow looks like this: The agent reads a prompt derived from annotations, such as: <em>&quot;For this Registration form, only use pattern XYZ and the following form fields. Make sure to use Theme ABC and strip the form into steps when more than 5 form elements are needed on one form, except when only 1 form field is left on the second step.&quot;</em> The agent then maps these instructions to Storybook components and assembles the code automatically. This eliminates the need for visual mockups of every state, relying instead on the logic defined in the annotations.</p>\n<h3 id=\"step-10-documentation\" tabindex=\"-1\">Step 10: Documentation <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>The ongoing maintenance of design system documentation is often a bottleneck. In this agentic workflow, documentation is not an afterthought but an integrated, continuous process. Through MCP-connected platforms like Jira or Confluence, agents can automatically generate, write, and update <code>.md</code> documentation based on changes in Figma, Storybook, or project requirements. This ensures that documentation remains current, accurate, and accessible, serving as a living repository of the design system's evolution.</p>\n<h2 id=\"tooling-roadmap\" tabindex=\"-1\">Tooling Roadmap <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h2>\n<p>Implementing the Agentic Design Workflow requires assembling a concrete stack of MCP-compatible tools. The following table maps each layer of the continuous design flow to its current tooling:</p>\n<ol>\n<li><strong>Design Context — Figma MCP Server</strong> (Remote or Desktop): Exposes tokens, components, layouts, and Code Connect mappings to agents. Provides three agent skills: Implement Design, Code Connect Components, and Create Design System Rules.</li>\n<li><strong>Interactive Review — MCP Apps</strong> (<code>@modelcontextprotocol/ext-apps</code> SDK): Renders interactive dashboards, diff viewers, pattern galleries, and configuration wizards inside AI conversations (Claude, VS Code, ChatGPT, Goose).</li>\n<li><strong>Code Resolution — Storybook MCP</strong>: Merges Storybook component metadata with Figma design context. Classifies components as Available, Partial, or Missing. Provides framework-agnostic component inventory.</li>\n<li><strong>Task Context — Jira / Confluence MCP adapters</strong>: Supplies project requirements, task descriptions, and acceptance criteria to agents. Receives auto-generated documentation updates.</li>\n<li><strong>Agent Orchestration — Instruction files, prompt templates, or dedicated agent engines</strong> (e.g., Claude Agent SDK): Interprets design prompts, coordinates MCP server calls, and orchestrates component assembly and code generation.</li>\n</ol>\n<p>Implementation should follow the phased adoption strategy (see Adoption &amp; Scaling Strategy below), starting with the Figma MCP Server and progressively adding MCP Apps and Storybook MCP as the team's annotation practice matures.</p>\n<h2 id=\"case-studies-and-examples\" tabindex=\"-1\">Case Studies &amp; Examples <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h2>\n<h3 id=\"scenario-1-annotation-driven-form-creation\" tabindex=\"-1\">Scenario 1: Annotation-Driven Form Creation <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>This scenario illustrates the shift away from creating complete, pixel-perfect designs in Figma towards a more efficient, annotation-oriented approach.</p>\n<ul>\n<li><strong>The Goal:</strong> A complex multi-step registration form is needed.</li>\n<li><strong>Traditional Workflow:</strong> A designer creates 10+ screens in Figma to show every validation state, error message, and step transition. These screens quickly become outdated as requirements change, and developers struggle to identify which screen is the &quot;latest,&quot; making deprecation and management difficult.</li>\n<li><strong>Agentic Workflow:</strong> The designer places a single &quot;Form Container&quot; component in Figma and applies a set of annotations:\n<ol>\n<li><strong>Pattern:</strong> &quot;Multi-step Wizard Pattern&quot;</li>\n<li><strong>Content:</strong> List of required fields (Name, Email, Password, etc.)</li>\n<li><strong>Logic Annotation:</strong> &quot;Split into steps if fields &gt; 5. Ensure final step has &gt; 1 field.&quot;</li>\n<li><strong>Style Annotation:</strong> &quot;Use 'Compact' spacing token set.&quot;\nThe MCP agent reads these annotations as a prompt. It fetches the &quot;Wizard&quot; pattern and the necessary form fields from Storybook. It applies the logic to split the fields into two steps and generates the code. No visual mockups for the separate steps were ever drawn in Figma; they were generated from the annotated intent.</li>\n</ol>\n</li>\n<li><strong>Outcome:</strong> Drastic reduction in design file size and maintenance overhead. The &quot;source of truth&quot; is the logic and annotation, not a static image.</li>\n</ul>\n<h3 id=\"scenario-2-system-wide-brand-refresh-and-theming\" tabindex=\"-1\">Scenario 2: System-Wide Brand Refresh and Theming <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>This scenario demonstrates the power of a token-based architecture when making global changes or introducing new themes.</p>\n<ul>\n<li><strong>The Goal:</strong> The company is refreshing its brand with a new color palette and wants to introduce a dark mode.</li>\n<li><strong>Traditional Workflow:</strong> A monumental manual task. Designers would spend days or weeks updating colors across hundreds of Figma files. Developers would then perform a search-and-replace for color values in the codebase, a process fraught with errors and inconsistencies. Creating a dark mode would involve writing extensive, hard-to-maintain CSS overrides.</li>\n<li><strong>Agentic Workflow:</strong> The design system’s foundation is its token architecture. To implement the brand refresh, a designer simply updates the core color tokens. As all components are linked to these tokens, changes are propagated system-wide in an instant. For theming, a new set of &quot;dark mode&quot; tokens is created to overwrite the baseline. The agent can apply this new theme with a single command. If a responsive pattern itself needs an update (e.g., changing how a grid behaves on tablets), that single pattern is modified, and the agent ensures all components using it are correctly updated.</li>\n<li><strong>Outcome:</strong> What traditionally took weeks of coordinated effort is now achievable in hours. The design system becomes a flexible, living entity. A simple color change is a minor configuration update, not a major project. New themes are no longer a daunting task but a simple extension of the existing token structure, allowing for rapid adaptation to new market or user requirements.</li>\n</ul>\n<h2 id=\"capability-amplification\" tabindex=\"-1\">Capability Amplification <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h2>\n<p>The Agentic Design Workflow fundamentally amplifies the capabilities of design and engineering teams. By replacing manual handoffs with MCP-driven automation, leaner teams can achieve significantly higher output. This amplification stems from:</p>\n<ol>\n<li><strong>Automation of Repetitive Tasks:</strong> Agents handle the mundane and repetitive aspects of design system management, component assembly, and documentation, freeing up human talent for creative problem-solving and strategic initiatives.</li>\n<li><strong>Reduced Handoff Friction:</strong> The seamless, MCP-driven communication between design and development tools virtually eliminates traditional handoff issues, accelerating cycles and reducing rework.</li>\n<li><strong>Enhanced Consistency &amp; Quality:</strong> By enforcing design system rules and leveraging predefined patterns and tokens, the workflow ensures a higher degree of consistency and quality across all digital products.</li>\n<li><strong>Accelerated Iteration:</strong> Designers and developers can iterate faster, test ideas more rapidly, and bring products to market with unprecedented speed.</li>\n</ol>\n<h2 id=\"adoption-and-scaling-strategy-a-figma-first-approach\" tabindex=\"-1\">Adoption &amp; Scaling Strategy: A Figma-First Approach <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h2>\n<p>Adopting the Agentic Design Workflow is a strategic shift in process and mindset. It can be rolled out in managed phases, ensuring each step builds value and buy-in before advancing to the next level of automation. The focus begins in the design tool (Figma) and progressively expands into the development pipeline.</p>\n<h3 id=\"phase-1-establishing-figma-as-the-source-of-truth\" tabindex=\"-1\">Phase 1: Establishing Figma as the Source of Truth <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>Before any automation, the foundation must be solidified within Figma. The initial phase is dedicated to creating a well-structured design environment that is <em>ready</em> for an agent to understand.</p>\n<ul>\n<li><strong>Objectives:</strong>\n<ul>\n<li>Establish a robust, semantic library of <strong>design tokens</strong>.</li>\n<li>Build a comprehensive set of <strong>atomic components</strong> (atoms, molecules), leveraging <strong>Figma Slots</strong> to enhance their flexibility and reusability across diverse contexts without creating an explosion of variants.</li>\n<li>Crucially, define and document a catalog of <strong>responsive layout patterns</strong> that govern how components are arranged on different viewports, making these patterns inherently more adaptable through the use of slots.</li>\n<li>This foundational work itself can be accelerated by leveraging emerging AI design assistants within Figma to help generate, name, and organize these core assets.</li>\n</ul>\n</li>\n<li><strong>Outcome:</strong> A highly organized Figma environment becomes the single source of truth for the design system. Designers and developers begin referencing this structured system manually, moving away from ad-hoc design files. The organization learns to think in terms of systems and patterns, not just pages.</li>\n</ul>\n<h3 id=\"phase-2-introducing-agent-assisted-assembly-and-prototyping\" tabindex=\"-1\">Phase 2: Introducing Agent-Assisted Assembly &amp; Prototyping <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>With the foundation in place, the agent is introduced as a powerful assistant to accelerate the design and feedback cycle. The designer's role officially shifts from creating static visuals to orchestrating systems.</p>\n<ul>\n<li><strong>Objectives:</strong>\n<ul>\n<li>Designers stop creating pixel-perfect pages, instead composing layouts in Figma by combining components, applying responsive patterns, and adding <strong>functional annotations</strong> to define intent, behavior, and data needs.</li>\n<li>An MCP-connected agent reads these annotated Figma files and <strong>generates high-fidelity, code-based prototypes</strong> automatically, using a technical component library that mirrors the Figma setup.</li>\n</ul>\n</li>\n<li><strong>Outcome:</strong> The loop between design intent and a working prototype is reduced from weeks to hours. The agent's ability to correctly interpret the designer's system-based instructions is validated, building trust in the workflow. The technical component library is built out in lockstep with the needs defined in Figma.</li>\n</ul>\n<h3 id=\"phase-3-full-orchestration-and-production-integration\" tabindex=\"-1\">Phase 3: Full Orchestration and Production Integration <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<p>In the final phase, the agent graduates from a prototyping assistant to a core orchestrator in the production pipeline. The workflow becomes a seamless, automated flow from design to deployment.</p>\n<ul>\n<li><strong>Objectives:</strong>\n<ul>\n<li>The agent directly translates the annotated Figma specifications into <strong>production-ready code</strong>, creating pull requests for review by the development team.</li>\n<li>The workflow expands beyond components to include tasks like <strong>automated documentation updates</strong>, where changes in Figma components or patterns trigger updates in Confluence or Markdown files.</li>\n</ul>\n</li>\n<li><strong>Outcome:</strong> The &quot;Human + AI Pairing&quot; model is fully realized. The design system is a living entity, with Figma as the undisputed source of intent and the agent as the tireless orchestrator, ensuring that what is designed is precisely what is built.</li>\n</ul>\n<h2 id=\"conclusion-and-resources\" tabindex=\"-1\">Conclusion &amp; Resources <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h2>\n<p>The Agentic Design Workflow, powered by the Model Context Protocol and advanced AI reasoning, represents a paradigm shift in how we approach design and development. By fostering a truly integrated &quot;Human + AI Pairing&quot; model, we can overcome the inefficiencies of traditional processes, significantly reduce waste, and unlock unprecedented levels of creativity and productivity. This whitepaper has outlined a vision for a future where design systems are not static repositories but living, evolving entities orchestrated by intelligent agents.</p>\n<h2 id=\"referenced-resources\" tabindex=\"-1\">Referenced Resources <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h2>\n<h3 id=\"mcp-and-protocol\" tabindex=\"-1\">MCP &amp; Protocol <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<ul>\n<li><strong>MCP Apps Announcement:</strong> <a href=\"https://blog.modelcontextprotocol.io/posts/2026-01-26-mcp-apps/\">MCP Apps — Bringing UI Capabilities to MCP Clients (Jan 2026)</a></li>\n<li><strong>MCP Apps Spec &amp; SDK:</strong> <a href=\"https://github.com/modelcontextprotocol/ext-apps\">Official ext-apps Repository (GitHub)</a></li>\n<li><strong>MCP Apps Quickstart:</strong> <a href=\"https://modelcontextprotocol.github.io/ext-apps/api/documents/Quickstart.html\">Building Your First MCP App</a></li>\n<li><strong>MCP Apps in VS Code:</strong> <a href=\"https://code.visualstudio.com/blogs/2026/01/26/mcp-apps-support\">Giving Agents a Visual Voice (VS Code Blog, Jan 2026)</a></li>\n</ul>\n<h3 id=\"figma-and-design-systems\" tabindex=\"-1\">Figma &amp; Design Systems <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<ul>\n<li><strong>Figma MCP Server:</strong> <a href=\"https://developers.figma.com/docs/figma-mcp-server/\">Developer Documentation</a></li>\n<li><strong>Figma MCP Blog:</strong> <a href=\"https://www.figma.com/blog/introducing-figma-mcp-server/\">Introducing Our Dev Mode MCP Server</a></li>\n<li><strong>Figma Slots:</strong> <a href=\"https://www.figma.com/blog/schema-2025-design-systems-recap/#slots\">Schema 2025 — Design Systems for a New Era</a></li>\n<li><strong>Storybook MCP Discussion:</strong> <a href=\"https://github.com/storybookjs/storybook/discussions/31788\">RFC — MCP Server Integration (GitHub)</a></li>\n</ul>\n<h3 id=\"design-patterns-and-rendering\" tabindex=\"-1\">Design Patterns &amp; Rendering <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<ul>\n<li><strong>Responsive Patterns:</strong> <a href=\"https://bradfrost.github.io/this-is-responsive/patterns.html\">Brad Frost — This Is Responsive</a></li>\n<li><strong>Dynamic UI Rendering:</strong> <a href=\"https://github.com/vercel-labs/json-render\">Vercel Labs — JSON Render (GitHub)</a></li>\n</ul>\n<h3 id=\"research\" tabindex=\"-1\">Research <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<ul>\n<li><strong>Agentic AI:</strong> <a href=\"https://arxiv.org/pdf/2601.12538\">Agentic Reasoning for LLMs (arXiv)</a></li>\n</ul>\n<h3 id=\"experience-engineering-insights\" tabindex=\"-1\">Experience Engineering Insights <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheAgenticDesignWorkflowOrchestratingMCPAndAIForScale/\">#</a></h3>\n<ul>\n<li><strong>Holger Hellinger’s Blog:</strong> <a href=\"https://b.polente.de/blog/\">Design Tokens &amp; MCP</a>\n<ul>\n<li><a href=\"https://b.polente.de/blog/DesignTokensAreFinalNow/\">Design Tokens — from bold vision to standard practice</a></li>\n<li><a href=\"https://b.polente.de/blog/MCPServerInDesignSystemWorkflows/\">Using MCP Servers for Design System Management</a></li>\n<li><a href=\"https://b.polente.de/blog/EmbracingTheFreedomOfCustomExperiencePipelines/\">Escaping the Golden Cage of Design Systems</a></li>\n</ul>\n</li>\n</ul>\n",
			"date_published": "2026-03-16T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/TheDIDitParadoxWhenDigitalSovereigntyBurnsThePlanet/",
			"url": "https://b.polente.de/blog/TheDIDitParadoxWhenDigitalSovereigntyBurnsThePlanet/",
			"title": "The DIDit Paradox – When Digital Sovereignty Burns the Planet",
			"content_html": "<h2 id=\"the-hater-blind-spot\" tabindex=\"-1\">The Hater Blind Spot <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheDIDitParadoxWhenDigitalSovereigntyBurnsThePlanet/\">#</a></h2>\n<p>For years, the Linux and open-source communities have waited for their &quot;daylight&quot;; a moment where the world finally sees the danger of the Big Tech silos. With the rise of the <strong>#DIDit</strong> (Digital Independence Day) movement, sparked by the cultural momentum of Marc-Uwe Kling, that moment has arrived. People are deleting their Meta accounts, ditching Windows, and proudly announcing they now host their own Mastodon or Nextcloud instances.</p>\n<p>But there is a bitter irony here. In the rush to show off their independence to Microsoft and Google, many tech-sovereign advocates are ignoring the massive environmental ledger they are creating. While they escape the &quot;claws&quot; of the Big Five, they are often replacing highly optimized infrastructure with fragmented, energy-hungry chaos.</p>\n<h2 id=\"the-efficiency-trap-scaling-matters\" tabindex=\"-1\">The Efficiency Trap: Scaling Matters <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheDIDitParadoxWhenDigitalSovereigntyBurnsThePlanet/\">#</a></h2>\n<p>The hard truth is that <strong>sharing is almost always greener than owning</strong>. Hyperscale data centers (AWS, Google, Azure) operate with a Power Usage Effectiveness (PUE) as low as <strong>1.09</strong>. This means nearly every watt goes directly into computing.</p>\n<p>In contrast, the average private server or &quot;home cloud&quot; setup is often an ecological disaster:</p>\n<ul>\n<li><strong>Idle Power Waste:</strong> A private instance typically sits at <strong>5–15% utilization</strong>, yet it burns power 24/7.</li>\n<li><strong>Utilization Gap:</strong> Cloud providers can do <strong>3 to 5 times more work per watt</strong> than a standard enterprise or home-managed server.</li>\n<li><strong>Thermal Inefficiency:</strong> Without professional, climate-optimized cooling, private hardware wastefully converts electricity into heat rather than bits.</li>\n</ul>\n<blockquote>\n<p>To put it bluntly: Running your own server just to prove you don't need a billionaire's cloud is like driving a private diesel truck to work every day just to prove you don't need the public bus system. It is independent, but it is ecologically irresponsible.</p>\n</blockquote>\n<pre class=\"language-json\" tabindex=\"0\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"key_insight\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Hyperscale efficiency vs. Fragmented waste\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"pue_hyperscale\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1.09</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"pue_private_avg\"</span><span class=\"token operator\">:</span> <span class=\"token number\">2.1</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"efficiency_delta\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Professional cloud is up to 4x more energy efficient\"</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"european-hosters-a-better-middle-ground\" tabindex=\"-1\">European Hosters: A Better Middle Ground? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheDIDitParadoxWhenDigitalSovereigntyBurnsThePlanet/\">#</a></h2>\n<p>If you want to be free from the US &quot;Oligarchs&quot; without burning the planet, you don't have to host it under your desk. Several European providers offer a more sustainable path to sovereignty:</p>\n<table>\n<thead>\n<tr>\n<th>Provider</th>\n<th>Origin</th>\n<th>Sustainability Profile</th>\n<th>Professional Focus</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong><a href=\"https://www.hetzner.com/unternehmen/nachhaltigkeit/\">Hetzner</a></strong></td>\n<td>Germany</td>\n<td>Uses 100% renewable energy from wind and water in its German and Finnish parks.</td>\n<td>High performance/price ratio for VPS and dedicated servers.</td>\n</tr>\n<tr>\n<td><strong><a href=\"https://corporate.ovhcloud.com/en/sustainability/\">OVHcloud</a></strong></td>\n<td>France</td>\n<td>Vertically integrated; they build their own servers and use innovative water-cooling to reduce PUE.</td>\n<td>Broad range of managed services with data sovereignty.</td>\n</tr>\n<tr>\n<td><strong><a href=\"https://www.scaleway.com/en/environmental-footprint-calculator/\">Scaleway</a></strong></td>\n<td>France</td>\n<td>Extreme focus on circular economy and solar-powered data centers; highly transparent footprint.</td>\n<td>Developer-friendly and Green IT leadership.</td>\n</tr>\n<tr>\n<td><strong><a href=\"https://www.ionos.de/umwelt\">IONOS</a></strong></td>\n<td>Germany</td>\n<td>Major player focusing on enterprise reliability with 100% green energy in many regions.</td>\n<td>Stability and GDPR compliance for larger business structures.</td>\n</tr>\n</tbody>\n</table>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/11hDVAJFHd-360.avif 360w, https://b.polente.de/img/11hDVAJFHd-608.avif 608w, https://b.polente.de/img/11hDVAJFHd-960.avif 960w, https://b.polente.de/img/11hDVAJFHd-1000.avif 1000w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/11hDVAJFHd-360.webp 360w, https://b.polente.de/img/11hDVAJFHd-608.webp 608w, https://b.polente.de/img/11hDVAJFHd-960.webp 960w, https://b.polente.de/img/11hDVAJFHd-1000.webp 1000w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/jpeg\" srcset=\"https://b.polente.de/img/11hDVAJFHd-360.jpeg 360w, https://b.polente.de/img/11hDVAJFHd-608.jpeg 608w, https://b.polente.de/img/11hDVAJFHd-960.jpeg 960w, https://b.polente.de/img/11hDVAJFHd-1000.jpeg 1000w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"The Efficiency Gap: Energy vs. Utilization Chart\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/11hDVAJFHd-360.jpeg\" width=\"1000\" height=\"600\"></picture></p>\n<h2 id=\"audit-checklist-is-your-sovereignty-sustainable\" tabindex=\"-1\">Audit Checklist: Is Your Sovereignty Sustainable? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheDIDitParadoxWhenDigitalSovereigntyBurnsThePlanet/\">#</a></h2>\n<p>Before you declare your digital independence, run this quick audit to see if you are replacing the &quot;plague&quot; with &quot;cholera.&quot;</p>\n<ul>\n<li>[ ] <strong>Provider Energy Mix:</strong> Is your hoster using 100% certified renewable energy?</li>\n<li>[ ] <strong>PUE Transparency:</strong> Does your provider publish a PUE below 1.2? (Lower is better).</li>\n<li>[ ] <strong>Utilization Check:</strong> Is your server utilization consistently above 30%? If lower, consider moving to a shared/managed environment.</li>\n<li>[ ] <strong>Location Matters:</strong> Is the data center located in a region with a low-carbon grid (e.g., France, Nordic countries)?</li>\n<li>[ ] <strong>Hardware Life Cycle:</strong> Are you using refurbished hardware or extending the life of your devices?</li>\n<li>[ ] <strong>Managed vs. Raw:</strong> Can you achieve your sovereignty goals through a managed European service rather than a dedicated, idle machine?</li>\n</ul>\n<h3 id=\"sources-and-references\" tabindex=\"-1\">Sources and References <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheDIDitParadoxWhenDigitalSovereigntyBurnsThePlanet/\">#</a></h3>\n<ul>\n<li><strong><a href=\"https://www.iea.org/search/charts?q=Data%20Centres%20and%20Data%20Transmission%20Networks\">IEA: Data Centres and Data Transmission Networks Report 2025</a></strong></li>\n<li><strong><a href=\"https://uptimeinstitute.com/resources/research-and-reports/uptime-institute-global-data-center-survey-results-2024\">Uptime Institute: Annual Global Data Center Survey Results</a></strong></li>\n<li><strong><a href=\"https://app.electricitymaps.com/\">Electricity Maps: Real-time Carbon Intensity of Global Power Grids</a></strong></li>\n<li><strong><a href=\"https://greenit.globant.com/\">Green IT Global: The Efficiency Paradox of Decentralization</a></strong></li>\n<li><strong><a href=\"https://cep2030.org/\">Circular Electronics Partnership: Roadmap for Hardware Lifecycles</a></strong></li>\n<li><strong><a href=\"https://di.day/\">Digital Independence Day (#DIDit) Campaign - Marc-Uwe Kling</a></strong></li>\n</ul>\n",
			"date_published": "2026-02-07T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/OptimizedIntoIrrelevanceWhenAIDoesTheThinkingForUs/",
			"url": "https://b.polente.de/blog/OptimizedIntoIrrelevanceWhenAIDoesTheThinkingForUs/",
			"title": "Optimized into Irrelevance – When AI does the thinking for us",
			"content_html": "<h2 id=\"digital-clones-why-best-practices-are-killing-creativity\" tabindex=\"-1\">Digital Clones: Why Best Practices Are Killing Creativity <a class=\"header-anchor\" href=\"https://b.polente.de/blog/OptimizedIntoIrrelevanceWhenAIDoesTheThinkingForUs/\">#</a></h2>\n<p>I recently wrote about <a href=\"https://polente.de/2025/10/20/wenn-shops-ihre-seele-verlieren/\">how online shops are losing their souls</a>. Everything looks the same, everything feels the same. The diagnosis was clear: construction kits like Shopify or Wix dictate the structure, and we lose the actual &quot;experience&quot; in a sea of technical uniformity.</p>\n<p>But if we are honest, there is a wave coming our way right now that won't solve this problem, but potentially exacerbate it exponentially: <strong>Artificial Intelligence.</strong></p>\n<h3 id=\"the-seductive-help-of-ai\" tabindex=\"-1\">The seductive help of AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/OptimizedIntoIrrelevanceWhenAIDoesTheThinkingForUs/\">#</a></h3>\n<p>Don't get me wrong, AI is a powerful tool. It helps us build layouts faster, predict conversion rates, and find designs that &quot;work.&quot; Anyone using Figma or Midjourney today can get inspiration or generate entire components in seconds. This promises efficiency. It promises &quot;better&quot; designs because they are data-driven.</p>\n<p>But this is exactly where the fallacy lies.</p>\n<h3 id=\"the-average-as-the-ideal\" tabindex=\"-1\">The average as the ideal <a class=\"header-anchor\" href=\"https://b.polente.de/blog/OptimizedIntoIrrelevanceWhenAIDoesTheThinkingForUs/\">#</a></h3>\n<p>When we use AI to make design decisions, what are those decisions based on? On data from the past. On what <em>has already worked</em>. The AI learns from existing inventory. If we ask it, &quot;Create a design for a successful sneaker shop,&quot; it won't give us something radically new. It gives us the average of what statistically fails the least.</p>\n<p>We are optimizing ourselves into absolute sameness.</p>\n<p>The danger is real: The more we rely on tools to do the thinking for us, the more we switch off our own brains. Why should I rack my brains over a bold, new grid layout if the AI tells me that the standard 3-column layout converts better?</p>\n<h3 id=\"the-feedback-loop-of-boredom\" tabindex=\"-1\">The Feedback Loop of Boredom <a class=\"header-anchor\" href=\"https://b.polente.de/blog/OptimizedIntoIrrelevanceWhenAIDoesTheThinkingForUs/\">#</a></h3>\n<p>We run the risk of viewing design merely as &quot;painting by numbers,&quot; where the algorithm dictates the colors. If we stop allowing for human imperfection, emotional breaks, and &quot;illogical&quot; decisions, we lose exactly what makes brands stand out: Character.</p>\n<p>The more we use tools instead of our brains, the more identical things will become. It’s a feedback loop: The AI learns from our uniform shops, proposes uniform designs to us, we build them, and the next AI learns from that again.</p>\n<p><strong>Where will this end?</strong></p>\n<h3 id=\"the-glimmer-of-hope-how-ai-can-actually-help-us-break-free\" tabindex=\"-1\">The glimmer of hope: How AI can actually help us break free <a class=\"header-anchor\" href=\"https://b.polente.de/blog/OptimizedIntoIrrelevanceWhenAIDoesTheThinkingForUs/\">#</a></h3>\n<p>However, there is a path where AI doesn't make us boring, but rather empowers us to be more unique, if we have the courage to use it correctly.</p>\n<p>Instead of asking AI for the &quot;best solution&quot; (which is just the most average one), we can use it to clear the path for real creativity.</p>\n<ol>\n<li><strong>Automating the everyday:</strong> Let AI handle the tedious code, the resizing, and the technical implementation of Design Tokens. This frees up our human brains to focus entirely on the <em>feeling</em> and the <em>story</em> of a shop.</li>\n<li><strong>The &quot;Anti-Pattern&quot; Generator:</strong> We can use AI to brainstorm ideas that <em>break</em> the norm. Ask it: &quot;What is the opposite of a standard e-commerce layout?&quot; AI can be a sparring partner that pushes us out of our comfort zone, rather than keeping us in it.</li>\n</ol>\n<h3 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/OptimizedIntoIrrelevanceWhenAIDoesTheThinkingForUs/\">#</a></h3>\n<p>Will we eventually be unable to distinguish whether there is a philosophy behind a brand or just a well-prompted algorithm? If everything is &quot;best practice,&quot; nothing is special anymore.</p>\n<p>Maybe we need to relearn how to be inefficient to remain relevant. We need to use AI to build the foundation, but we must never let it be the architect of the soul.</p>\n",
			"date_published": "2026-01-27T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/",
			"url": "https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/",
			"title": "Why AI Is Making Frontend Average",
			"content_html": "<h2 id=\"frontend-is-getting-average-again\" tabindex=\"-1\">Frontend Is Getting Average Again <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<p>AI helps us write code faster, but speed is not quality. Most AI tools suggest solutions that work but feel old: media queries everywhere, Flexbox centering for everything, and custom selects rebuilt with JavaScript.</p>\n<p>The problem is not missing specs; the problem is missing real use cases. AI learns from what is used most, not from what is best today.</p>\n<h2 id=\"ai-learns-patterns-not-intent\" tabindex=\"-1\">AI Learns Patterns, Not Intent <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<p>AI can read CSS specs and summarize blog posts, but AI does not &quot;feel&quot; layout problems. It does not build design systems or refactor code after one year. So it falls back to patterns from years ago.</p>\n<h3 id=\"the-knowledge-gap-and-risk-for-juniors\" tabindex=\"-1\">The Knowledge Gap and Risk for Juniors <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h3>\n<p>Large Language Models (LLMs) are trained on historical data, meaning they excel at what was common two years ago but often struggle with what is possible today. Many modern CSS features, like native nesting, container queries, or scroll-driven animations. These features are simply not present in high enough volume in the training sets to be the default suggestion.</p>\n<p>This creates a dangerous feedback loop for junior developers. If they rely entirely on AI suggestions, they may never learn that these modern features exist. They might spend hours debugging complex JavaScript for a scroll effect that could have been three lines of CSS, simply because the AI didn't know any better.</p>\n<h2 id=\"modern-css-features-ai-often-misses\" tabindex=\"-1\">Modern CSS Features AI Often Misses <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<h3 id=\"container-queries-instead-of-media-queries\" tabindex=\"-1\">Container Queries Instead of Media Queries <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h3>\n<p>AI still prefers viewport logic.</p>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@media</span> <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 768px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.card</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> grid<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>But components do not live in viewports.\nThey live in containers.</p>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">.card</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">container-type</span><span class=\"token punctuation\">:</span> inline-size<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@container</span> <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 400px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.card</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> grid<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>Modells are currently also not trained a lot on the below features. To validate an outcode you need to know from it. Did you know all those new CSS features?</p>\n<h2 id=\"scroll-driven-animations-without-javascript\" tabindex=\"-1\">Scroll Driven Animations Without JavaScript <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@scroll-timeline</span> reveal</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">source</span><span class=\"token punctuation\">:</span> auto<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.card</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">animation</span><span class=\"token punctuation\">:</span> fade-in linear both<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">animation-timeline</span><span class=\"token punctuation\">:</span> reveal<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"css-nesting-and-has\" tabindex=\"-1\">CSS Nesting and :has() <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">.card</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">&amp; h2</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">margin-bottom</span><span class=\"token punctuation\">:</span> 0.5rem<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">form:has(input:user-invalid)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">border-color</span><span class=\"token punctuation\">:</span> red<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"typed-css-variables-with-property\" tabindex=\"-1\">Typed CSS Variables With @property <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@property</span> --progress</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">syntax</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'&lt;number>'</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">inherits</span><span class=\"token punctuation\">:</span> false<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">initial-value</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.progress</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">--progress</span><span class=\"token punctuation\">:</span> 70<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> <span class=\"token function\">calc</span><span class=\"token punctuation\">(</span><span class=\"token function\">var</span><span class=\"token punctuation\">(</span>--progress<span class=\"token punctuation\">)</span> * 1%<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"variable-fonts\" tabindex=\"-1\">Variable Fonts <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">h1</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-variation-settings</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"wght\"</span> 650<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"cascade-layers\" tabindex=\"-1\">Cascade Layers <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@layer</span> reset<span class=\"token punctuation\">,</span> base<span class=\"token punctuation\">,</span> components<span class=\"token punctuation\">,</span> utilities<span class=\"token punctuation\">;</span></span></code></pre>\n<h2 id=\"scroll-snap\" tabindex=\"-1\">Scroll Snap <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">.carousel</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">scroll-snap-type</span><span class=\"token punctuation\">:</span> x mandatory<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.slide</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">scroll-snap-align</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"color-mix\" tabindex=\"-1\">color-mix <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token property\">background</span><span class=\"token punctuation\">:</span> <span class=\"token function\">color-mix</span><span class=\"token punctuation\">(</span>in oklab<span class=\"token punctuation\">,</span> blue 80%<span class=\"token punctuation\">,</span> white<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n<h2 id=\"light-dark\" tabindex=\"-1\">light-dark <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token property\">color</span><span class=\"token punctuation\">:</span> <span class=\"token function\">light-dark</span><span class=\"token punctuation\">(</span>#111<span class=\"token punctuation\">,</span> #eee<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n<h2 id=\"native-select-styling\" tabindex=\"-1\">Native Select Styling <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">select</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">appearance</span><span class=\"token punctuation\">:</span> none<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"sibling-index\" tabindex=\"-1\">sibling-index <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">li</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">animation-delay</span><span class=\"token punctuation\">:</span> <span class=\"token function\">calc</span><span class=\"token punctuation\">(</span><span class=\"token function\">sibling-index</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> * 60ms<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"if-function\" tabindex=\"-1\">if Function <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> <span class=\"token function\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">var</span><span class=\"token punctuation\">(</span>--dense<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> 0.25rem<span class=\"token punctuation\">,</span> 1rem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n<h2 id=\"anchor-positioning\" tabindex=\"-1\">Anchor Positioning <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">.tooltip</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">position-anchor</span><span class=\"token punctuation\">:</span> --trigger<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"text-wrap-balance\" tabindex=\"-1\">text-wrap Balance <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">h1</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">text-wrap</span><span class=\"token punctuation\">:</span> balance<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"flow-root\" tabindex=\"-1\">flow-root <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">.container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flow-root<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"clamp-instead-of-media-queries\" tabindex=\"-1\">clamp Instead of Media Queries <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">h1</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> <span class=\"token function\">clamp</span><span class=\"token punctuation\">(</span>1.8rem<span class=\"token punctuation\">,</span> 4vw<span class=\"token punctuation\">,</span> 3rem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"the-risk-with-ai\" tabindex=\"-1\">The Risk With AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<h3 id=\"ai-makes-average-cheap\" tabindex=\"-1\">AI Makes Average Cheap <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h3>\n<p>AI makes average cheap. Junior developers often trust AI output blindly, repeating old patterns instead of exploring modern solutions. Modern CSS exists, but only humans push it forward.</p>\n<h2 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<h3 id=\"the-web-must-keep-moving\" tabindex=\"-1\">The Web Must Keep Moving <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h3>\n<p>Frontend is not finished, and CSS evolves fast. If we let AI decide alone, the web will stop moving. Modern CSS keeps us sharp.</p>\n<h2 id=\"resources\" tabindex=\"-1\">Resources <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WhyAIIsMakingFrontendAverage/\">#</a></h2>\n<ul>\n<li><a href=\"https://www.w3.org/Style/CSS/specs.en.html\">W3C CSS Specifications</a></li>\n<li><a href=\"https://css-tricks.com/how-to-keep-up-with-new-css-features/\">How to keep up with new CSS features</a></li>\n<li><a href=\"https://www.w3.org/TR/css-2025/\">CSS 2025 Snapshot</a></li>\n</ul>\n",
			"date_published": "2026-01-13T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/",
			"url": "https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/",
			"title": "Universal Commerce Protocol Sounds Open. It Is Not",
			"content_html": "<h2 id=\"universal-commerce-protocol-or-ucp-sounds-like-a-good-idea\" tabindex=\"-1\">Universal Commerce Protocol, or UCP, sounds like a good idea <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h2>\n<p>One protocol for commerce. Open. Standardized. Ready for AI. Companies can expose products and services to AI agents. AI can search, compare, and even buy on behalf of users.</p>\n<p>On paper, this is progress. In reality, it smells like the next step where small businesses slowly disappear.</p>\n<h2 id=\"machines-do-not-browse-like-humans\" tabindex=\"-1\">Machines Do Not Browse Like Humans <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h2>\n<ol>\n<li>Humans explore</li>\n<li>Machines filter</li>\n</ol>\n<h3 id=\"ai-systems-do-not-enjoy-small-websites\" tabindex=\"-1\">AI systems do not enjoy small websites <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<p>They do not care about story, craft, or passion. They want:</p>\n<ul>\n<li>clean APIs</li>\n<li>stable data</li>\n<li>fast responses</li>\n<li>clear pricing</li>\n<li>zero uncertainty</li>\n</ul>\n<p>Big companies can deliver this. Small shops usually can not.</p>\n<p>If your data is not perfect, you are skipped. If you are skipped, you do not exist.</p>\n<h2 id=\"visibility-moves-from-search-to-infrastructure\" tabindex=\"-1\">Visibility Moves From Search to Infrastructure <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h2>\n<h3 id=\"before-you-needed-seo\" tabindex=\"-1\">Before, you needed SEO <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<p>Now, you need machine readiness. That means:</p>\n<ul>\n<li>APIs</li>\n<li>uptime</li>\n<li>schemas</li>\n<li>constant updates</li>\n</ul>\n<p>This is not free. It needs time, people, and money.</p>\n<p>A small painter selling hand made art can not compete here. Amazon can.</p>\n<p>So the AI will find Amazon. Not because it is better. Because it is easier.</p>\n<h2 id=\"open-protocol-closed-reality\" tabindex=\"-1\">Open Protocol, Closed Reality <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h2>\n<h3 id=\"yes-ucp-is-open\" tabindex=\"-1\">Yes, UCP is open <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<p>But openness does not remove power imbalance. Big companies will build:</p>\n<ul>\n<li>SDKs</li>\n<li>hosted gateways</li>\n<li>managed services</li>\n</ul>\n<p>Small businesses will depend on those tools to stay visible.</p>\n<p>This is vendor lock-in without a contract. You are free to leave. You just disappear if you do.</p>\n<h2 id=\"platforms-will-sell-for-you-with-or-without-you\" tabindex=\"-1\">Platforms Will Sell For You. With or Without You <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h2>\n<h3 id=\"ai-agents-can-buy-on-behalf-of-users\" tabindex=\"-1\">AI agents can buy on behalf of users <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<p>Marketplaces love this.</p>\n<h3 id=\"we-already-see-platforms-selling-products-without-permission\" tabindex=\"-1\">We already see platforms selling products without permission <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<ul>\n<li>The brand does not control pricing.</li>\n<li>The brand does not control presentation.</li>\n</ul>\n<h3 id=\"the-platform-owns-the-customer\" tabindex=\"-1\">The platform owns the customer <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<ul>\n<li>Small businesses do not have lawyers.</li>\n<li>They accept it or they vanish.</li>\n</ul>\n<h2 id=\"margins-will-die-quietly\" tabindex=\"-1\">Margins Will Die Quietly <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h2>\n<h3 id=\"ai-access-is-not-free\" tabindex=\"-1\">AI access is not free <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<p>There will be:</p>\n<ul>\n<li>listing fees</li>\n<li>transaction fees</li>\n<li>ranking fees</li>\n<li>integration costs</li>\n</ul>\n<p>Big companies spread this cost. Small ones feel it directly.</p>\n<p>More sales. Less profit. More dependency.</p>\n<h2 id=\"trust-favors-the-biggest-player\" tabindex=\"-1\">Trust Favors the Biggest Player <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h2>\n<h3 id=\"ai-systems-prefer-safe-choices\" tabindex=\"-1\">AI systems prefer safe choices <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<p>Safe means:</p>\n<ul>\n<li>known brands</li>\n<li>stable delivery</li>\n<li>legal coverage</li>\n</ul>\n<h3 id=\"the-machine-will-choose-safety\" tabindex=\"-1\">The machine will choose safety <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<p>Again and again.</p>\n<ul>\n<li>A small shop is risky.</li>\n<li>A big platform is safe.</li>\n</ul>\n<h2 id=\"ucp-solves-problems-for-the-big-ones\" tabindex=\"-1\">UCP Solves Problems For the Big Ones <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h2>\n<h3 id=\"ucp-is-not-evil\" tabindex=\"-1\">UCP is not evil <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<p>It is well designed. But it solves problems that big companies already have.</p>\n<p>Small businesses get new problems instead:</p>\n<ul>\n<li>more complexity</li>\n<li>less visibility</li>\n<li>less control</li>\n</ul>\n<p>The protocol is open. The outcome is not.</p>\n<h2 id=\"maybe-i-am-too-pessimistic\" tabindex=\"-1\">Maybe I Am Too Pessimistic <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h2>\n<ol>\n<li>Maybe small vendors will adapt.</li>\n<li>Maybe tools will become easier.</li>\n<li>Maybe AI will learn to value diversity.</li>\n</ol>\n<h3 id=\"or-maybe-we-repeat-the-same-story-again\" tabindex=\"-1\">Or maybe we repeat the same story again <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<p>Just faster. And quieter.</p>\n<h3 id=\"what-do-you-think\" tabindex=\"-1\">What do you think? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h3>\n<p>Is Universal Commerce Protocol a real chance for small businesses or just another step where platforms take everything in between?</p>\n<p>I am curious to hear other opinions.</p>\n<h2 id=\"resources\" tabindex=\"-1\">Resources <a class=\"header-anchor\" href=\"https://b.polente.de/blog/UniversalCommerceProtocolSoundsOpenItIsNot/\">#</a></h2>\n<ul>\n<li><a href=\"https://developers.googleblog.com/under-the-hood-universal-commerce-protocol-ucp/\">Universal Commerce Protocol announcement</a></li>\n<li><a href=\"https://github.com/Universal-Commerce-Protocol/ucp\">Universal Commerce Protocol GitHub repository</a></li>\n<li><a href=\"https://www.modernretail.co/technology/brands-are-upset-that-buy-for-me-is-featuring-their-products-on-amazon-without-permission/\">Amazon “Buy for Me” controversy</a></li>\n</ul>\n",
			"date_published": "2026-01-12T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/DesignTokensAreFinalNow/",
			"url": "https://b.polente.de/blog/DesignTokensAreFinalNow/",
			"title": "Design Tokens – from bold vision to standard practice",
			"content_html": "<h2 id=\"a-brave-decision-three-years-ago\" tabindex=\"-1\">A Brave Decision Three Years Ago <a class=\"header-anchor\" href=\"https://b.polente.de/blog/DesignTokensAreFinalNow/\">#</a></h2>\n<p>When we decided three years ago to roll out design tokens across our project, it felt a little visionary and a little brave. At the time, nobody really knew where this path would lead, or whether design tokens would ever become widespread. Today? A project without design tokens would feel odd and uncommon.</p>\n<p>This shift enabled us to make one binding decision: design and tech components are no longer separate. Design tokens bridge that gap. And in the last two years, with AI-powered tools emerging, that bridge has only grown more critical. We can now connect Figma and Storybook and Atlassian Confluence and VS Code at once. Even tools like BrowserStack allow automated testing and design-token integration. But that, as they say, is a story for another day.</p>\n<h2 id=\"what-s-new-and-where-do-design-tokens-help-us\" tabindex=\"-1\">What's New – And Where Do Design Tokens Help Us? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/DesignTokensAreFinalNow/\">#</a></h2>\n<ul>\n<li><strong>Theming &amp; multi-brand support</strong>: Manage light and dark modes, accessibility variants, and multiple brand themes without file duplication.</li>\n<li><strong>Modern color specification</strong>: Full support for Display P3, OKLCH, and all CSS Color Module 4 spaces, aligning with how design tools actually work.</li>\n<li><strong>Rich token relationships</strong>: Inheritance, aliases, component-level references allow sophisticated design systems to flourish.</li>\n<li><strong>Cross-platform consistency</strong>: One token file can generate platform-specific code for iOS, Android, web, and Flutter, keeping everything in sync.</li>\n</ul>\n<p>There are already many tools that support this workflow: the specification’s stability is backed by reference implementations like Style Dictionary, Tokens Studio and Terrazzo. More than ten design tools and open-source projects – including Penpot, Figma, Sketch, Framer, Knapsack, Supernova and zeroheight – already support or are implementing the standard.\nEven more importantly: the tooling is open. Developed by the Design Tokens Community Group, the specification reflects real-world design-system use cases from teams at companies of all sizes. Being an open standard means no single vendor controls the format—teams have freedom of tool choice without compatibility concerns.</p>\n<h2 id=\"design-tokens-in-detail\" tabindex=\"-1\">Design Tokens in Detail <a class=\"header-anchor\" href=\"https://b.polente.de/blog/DesignTokensAreFinalNow/\">#</a></h2>\n<h3 id=\"what-are-design-tokens\" tabindex=\"-1\">What are design tokens? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/DesignTokensAreFinalNow/\">#</a></h3>\n<ul>\n<li><strong>Abstract values</strong>: They replace static values like <code>$0xFFFFFF</code> (white) with descriptive names like <code>color.white</code>.</li>\n<li><strong>Atomic building blocks</strong>: They represent the most fundamental visual attributes—colors, fonts, shadows, border-radii, spacing and animations.</li>\n<li><strong>Centrally maintained</strong>: All visual properties are defined and maintained in a single, central place.</li>\n<li><strong>Platform-agnostic</strong>: They ensure consistency across different applications and platforms.</li>\n<li><strong>Data format</strong>: Often stored in structured formats like JSON, and can be integrated as variables across programming languages and platforms.</li>\n</ul>\n<h3 id=\"why-do-they-matter\" tabindex=\"-1\">Why do they matter? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/DesignTokensAreFinalNow/\">#</a></h3>\n<ul>\n<li><strong>Improved collaboration</strong>: They create a shared language between designers and developers, leading to more efficient teamwork.</li>\n<li><strong>Increased consistency</strong>: They ensure that the design &quot;looks and feels&quot; the same across the entire digital landscape.</li>\n<li><strong>Easier maintenance</strong>: Changes to design guidelines can be made in one place and propagated instantly across all elements.</li>\n<li><strong>Scalability</strong>: They make it far easier to scale a design system as projects and product portfolios grow.</li>\n</ul>\n<h3 id=\"example-tokens\" tabindex=\"-1\">Example tokens <a class=\"header-anchor\" href=\"https://b.polente.de/blog/DesignTokensAreFinalNow/\">#</a></h3>\n<p>Here are five concrete examples:</p>\n<ul>\n<li><strong>Colors</strong>: <code>color.primary.500</code>, <code>color.background.secondary</code></li>\n<li><strong>Typography</strong>: <code>font.size.large</code>, <code>font.weight.bold</code></li>\n<li><strong>Spacing</strong>: <code>spacing.medium</code>, <code>spacing.small</code></li>\n<li><strong>Border radii</strong>: <code>radius.small</code>, <code>radius.medium</code></li>\n<li><strong>Shadows</strong>: <code>shadow.small</code>, <code>shadow.medium</code></li>\n</ul>\n<h2 id=\"final-thoughts\" tabindex=\"-1\">Final Thoughts <a class=\"header-anchor\" href=\"https://b.polente.de/blog/DesignTokensAreFinalNow/\">#</a></h2>\n<p>When we embarked on this journey, adopting design tokens felt like a leap into the unknown. Today, it's clear they are foundational. They empower design and engineering to speak the same language, enable scalable and consistent systems, and prepare us for a future where tooling spans design apps, component libraries, AI workflows and beyond. If you haven't yet embraced design tokens, now is the time. A project without them simply wouldn't feel right.</p>\n<h2 id=\"references\" tabindex=\"-1\">References <a class=\"header-anchor\" href=\"https://b.polente.de/blog/DesignTokensAreFinalNow/\">#</a></h2>\n<ul>\n<li><a href=\"https://www.w3.org/community/design-tokens/2025/10/28/design-tokens-specification-reaches-first-stable-version/\">Design Tokens Specification Reaches First Stable Version</a></li>\n</ul>\n",
			"date_published": "2025-11-18T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/MCPServerInDesignSystemWorkflows/",
			"url": "https://b.polente.de/blog/MCPServerInDesignSystemWorkflows/",
			"title": "Using MCP Servers for Design System Management",
			"content_html": "<h2 id=\"from-design-to-code-with-mcp-servers\" tabindex=\"-1\">From Design to Code with MCP Servers <a class=\"header-anchor\" href=\"https://b.polente.de/blog/MCPServerInDesignSystemWorkflows/\">#</a></h2>\n<p>The <a href=\"https://modelcontextprotocol.io/docs/getting-started/intro\">Model Context Protocol (MCP)</a> defines a standard way for local or remote tools to talk to models and IDEs. It lets you access external services or APIs directly inside your editor, without complex system setup or locked-in toolchains. MCP servers connect tools like Atlassian, Figma, or Storybook to your AI model and make workflows faster, consistent, and traceable.</p>\n<p>Below is an example <code>mcp.json</code> configuration that we use across our Design System setup:</p>\n<pre class=\"language-json\" tabindex=\"0\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"servers\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"atlassian\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"url\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"https://mcp.atlassian.com/v1/sse\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"http\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"figma\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"http\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"url\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"http://127.0.0.1:3845/mcp\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"storybook-mcp\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"url\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"http://localhost:6006/mcp\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"http\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"headers\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"X-MCP-Toolsets\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dev,docs\"</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h2 id=\"workflow-overview\" tabindex=\"-1\">Workflow Overview <a class=\"header-anchor\" href=\"https://b.polente.de/blog/MCPServerInDesignSystemWorkflows/\">#</a></h2>\n<p>Our workflow starts in <strong>Figma</strong>. Designers use Figma and Figma Make to create responsive UX and UI layouts for clients. Semantic structure and design flexibility are key. Once approved, design tokens are exported into a shared repository. We use <strong>Style Dictionary</strong> to generate tokens for web, Flutter, and other platform targets.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/RC1UYabzmQ-360.avif 360w, https://b.polente.de/img/RC1UYabzmQ-608.avif 608w, https://b.polente.de/img/RC1UYabzmQ-960.avif 960w, https://b.polente.de/img/RC1UYabzmQ-1240.avif 1240w, https://b.polente.de/img/RC1UYabzmQ-1346.avif 1346w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/RC1UYabzmQ-360.webp 360w, https://b.polente.de/img/RC1UYabzmQ-608.webp 608w, https://b.polente.de/img/RC1UYabzmQ-960.webp 960w, https://b.polente.de/img/RC1UYabzmQ-1240.webp 1240w, https://b.polente.de/img/RC1UYabzmQ-1346.webp 1346w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/jpeg\" srcset=\"https://b.polente.de/img/RC1UYabzmQ-360.jpeg 360w, https://b.polente.de/img/RC1UYabzmQ-608.jpeg 608w, https://b.polente.de/img/RC1UYabzmQ-960.jpeg 960w, https://b.polente.de/img/RC1UYabzmQ-1240.jpeg 1240w, https://b.polente.de/img/RC1UYabzmQ-1346.jpeg 1346w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Flowchart showing a design-to-code system. On the left, red circles show design steps from brand style guide to UI components. In the center, black and blue circles show tools like Figma, Style Dictionary, Git, and Storybook. On the right, web components are built, published via JFrog/NPM, and shared with contributors.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/RC1UYabzmQ-360.jpeg\" width=\"1346\" height=\"774\"></picture></p>\n<p>Next, the <strong>Figma MCP server</strong> connects the IDE directly to these designs. Engineers can use commands like <code>#get_design_context</code>, <code>#get_metadata</code>, or <code>#get_screenshot</code> to pull Figma information into the editor.\nMore details: <a href=\"https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Figma-MCP-server\">Figma MCP Guide</a></p>\n<p>Before development starts, the <strong>Atlassian MCP server</strong> helps fetch and manage Jira tickets. Typical actions include:</p>\n<ul>\n<li><code>#getJiraIssue</code></li>\n<li><code>#editJiraIssue</code></li>\n<li><code>#addCommentToJiraIssue</code></li>\n</ul>\n<p>This ensures the agent knows the ticket context before coding begins.\nDocumentation: <a href=\"https://support.atlassian.com/rovo/docs/setting-up-ides/\">Atlassian Rovo Setup</a></p>\n<p>For component development, we use the <strong>Storybook MCP</strong>. Still in alpha, it already provides two useful modes:</p>\n<ul>\n<li><code>dev</code>: retrieves component documentation or usage.</li>\n<li><code>docs</code>: gives UI building instructions.</li>\n</ul>\n<p>More info: <a href=\"https://storybook.js.org/addons/@storybook/addon-mcp\">Storybook MCP Addon</a></p>\n<h2 id=\"using-prompt-files\" tabindex=\"-1\">Using Prompt Files <a class=\"header-anchor\" href=\"https://b.polente.de/blog/MCPServerInDesignSystemWorkflows/\">#</a></h2>\n<p>Prompt files let you define complex, repeatable workflows.\nExample — an icon update process:</p>\n<pre class=\"language-markdown\" tabindex=\"0\"><code class=\"language-markdown\"><span class=\"token front-matter-block\"><span class=\"token punctuation\">---</span>\n<span class=\"token front-matter yaml language-yaml\">agent: 'agent'\nmodel: Claude Sonnet 4\ntools: [\n  'edit/createFile', 'edit/editFiles', 'search', 'runCommands',\n  'atlassian/getJiraIssue', 'figma/get_design_context',\n  'storybook-mcp/get-component-documentation'\n]\ndescription: 'Design System - Icon Management Prompt'</span>\n<span class=\"token punctuation\">---</span></span>\n<span class=\"token title important\"><span class=\"token punctuation\">#</span> Icon Workflow</span>\n\n<span class=\"token list punctuation\">1.</span> Fetch Jira ticket\n<span class=\"token list punctuation\">2.</span> Pull Figma assets\n<span class=\"token list punctuation\">3.</span> Build and test\n<span class=\"token list punctuation\">4.</span> Create changeset\n<span class=\"token list punctuation\">5.</span> Update Jira status</code></pre>\n<p>Prompt files can be stored in your repo to maintain team consistency.\nLearn more: <a href=\"https://code.visualstudio.com/docs/copilot/customization/prompt-files\">VS Code Custom Prompts</a></p>\n<h2 id=\"instruction-files\" tabindex=\"-1\">Instruction Files <a class=\"header-anchor\" href=\"https://b.polente.de/blog/MCPServerInDesignSystemWorkflows/\">#</a></h2>\n<p>To make the agent aware of your coding conventions, you can use instruction files.\nExample for test files:</p>\n<pre class=\"language-markdown\" tabindex=\"0\"><code class=\"language-markdown\"><span class=\"token front-matter-block\"><span class=\"token punctuation\">---</span>\n<span class=\"token front-matter yaml language-yaml\">applyTo: '**/*.spec.*'</span>\n<span class=\"token punctuation\">---</span></span>\nFollow Jest best practices.</code></pre>\n<p>These can define lint rules, review tone, or commit patterns.\nReference: <a href=\"https://code.visualstudio.com/docs/copilot/customization/custom-instructions\">Custom Instructions</a></p>\n<h2 id=\"how-it-all-comes-together\" tabindex=\"-1\">How It All Comes Together <a class=\"header-anchor\" href=\"https://b.polente.de/blog/MCPServerInDesignSystemWorkflows/\">#</a></h2>\n<p>With MCP servers and prompt files, engineers can:</p>\n<ol>\n<li>Read Jira tickets directly in the IDE</li>\n<li>Fetch related Figma design data</li>\n<li>Get component documentation from Storybook</li>\n<li>Apply code standards automatically</li>\n<li>Build, commit, and update tickets: all in one flow</li>\n</ol>\n<p>No tool-hopping. No lost context. Agents act with awareness of design, documentation, and project state.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/QmnfoprBPZ-360.avif 360w, https://b.polente.de/img/QmnfoprBPZ-608.avif 608w, https://b.polente.de/img/QmnfoprBPZ-960.avif 960w, https://b.polente.de/img/QmnfoprBPZ-1041.avif 1041w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/QmnfoprBPZ-360.webp 360w, https://b.polente.de/img/QmnfoprBPZ-608.webp 608w, https://b.polente.de/img/QmnfoprBPZ-960.webp 960w, https://b.polente.de/img/QmnfoprBPZ-1041.webp 1041w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/jpeg\" srcset=\"https://b.polente.de/img/QmnfoprBPZ-360.jpeg 360w, https://b.polente.de/img/QmnfoprBPZ-608.jpeg 608w, https://b.polente.de/img/QmnfoprBPZ-960.jpeg 960w, https://b.polente.de/img/QmnfoprBPZ-1041.jpeg 1041w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Diagram showing a workflow from design to code. On the left, Figma and Design System Manager connect with Jira/Atlassian. In the center, Git and CSS form a tech repository (Monorepo). On the right, Storybook links to Web and React components, which merge into aggregated components.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/QmnfoprBPZ-360.jpeg\" width=\"1041\" height=\"632\"></picture></p>\n<p>This setup runs in <strong>VS Code</strong>, but also works with <strong>Cursor</strong>, <strong>Cline</strong>, or any IDE that supports MCP.</p>\n<h2 id=\"why-it-matters\" tabindex=\"-1\">Why It Matters <a class=\"header-anchor\" href=\"https://b.polente.de/blog/MCPServerInDesignSystemWorkflows/\">#</a></h2>\n<p>For Design System teams, context switching is the biggest productivity loss. With MCP-based workflows, you stay inside one environment. The model fetches context from Jira, design, and documentation servers automatically.</p>\n<p>The result: fewer errors, faster delivery, and better alignment between designers and engineers.</p>\n<h2 id=\"next-steps\" tabindex=\"-1\">Next Steps <a class=\"header-anchor\" href=\"https://b.polente.de/blog/MCPServerInDesignSystemWorkflows/\">#</a></h2>\n<p>Start small. Connect one MCP server (e.g., Figma). Try simple prompts to pull metadata or screenshots. Once stable, add Jira and Storybook.</p>\n<p>Over time, you’ll see your design system evolve from a manual process to a connected, intelligent workflow: a true <strong>continuous experience pipeline</strong>.</p>\n",
			"date_published": "2025-11-11T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/",
			"url": "https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/",
			"title": "Rethinking CSS Layouts – More Than Just Flex",
			"content_html": "<h2 id=\"tl-dr\" tabindex=\"-1\">TL;DR <a class=\"header-anchor\" href=\"https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/\">#</a></h2>\n<p>Many developers know only <code>display: block</code> and <code>display: none</code>. Grid, Floats, Flow-Root and Container Queries are always forgotten. This creates weak layouts and too much JavaScript. Here is a short overview with examples when to use what.</p>\n<h2 id=\"how-it-started\" tabindex=\"-1\">How it started <a class=\"header-anchor\" href=\"https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/\">#</a></h2>\n<p>I work with many developers at a big client. All are experienced, but something is missing. When it comes to layout, I see only Flexbox. Grid, Floats, even simple display types are gone.</p>\n<p>Maybe this comes from the fullstack idea. Everyone does a bit of everything, but no one is really strong in CSS. Or maybe we think: React and our design system will solve it. But when we build bigger components, people fail.</p>\n<p>So I write here how to build layouts again with CSS, not only Flex.</p>\n<h2 id=\"semantic-markup-first\" tabindex=\"-1\">Semantic Markup first <a class=\"header-anchor\" href=\"https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/\">#</a></h2>\n<p>Before CSS, you need good HTML. Layout will never be clean if everything is <code>&lt;div&gt;</code>. Use semantic elements:</p>\n<pre class=\"language-html\" tabindex=\"0\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>header</span><span class=\"token punctuation\">></span></span>…<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>header</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>nav</span><span class=\"token punctuation\">></span></span>…<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>nav</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>main</span><span class=\"token punctuation\">></span></span>…<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>main</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>article</span><span class=\"token punctuation\">></span></span>…<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>article</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>section</span><span class=\"token punctuation\">></span></span>…<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>section</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>footer</span><span class=\"token punctuation\">></span></span>…<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>footer</span><span class=\"token punctuation\">></span></span></code></pre>\n<p>This makes code readable, accessible and structured. CSS works better on it.</p>\n<h2 id=\"grid-as-the-base\" tabindex=\"-1\">Grid as the base <a class=\"header-anchor\" href=\"https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/PAhI-3VnnR-360.avif 360w, https://b.polente.de/img/PAhI-3VnnR-608.avif 608w, https://b.polente.de/img/PAhI-3VnnR-960.avif 960w, https://b.polente.de/img/PAhI-3VnnR-1240.avif 1240w, https://b.polente.de/img/PAhI-3VnnR-1536.avif 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/PAhI-3VnnR-360.webp 360w, https://b.polente.de/img/PAhI-3VnnR-608.webp 608w, https://b.polente.de/img/PAhI-3VnnR-960.webp 960w, https://b.polente.de/img/PAhI-3VnnR-1240.webp 1240w, https://b.polente.de/img/PAhI-3VnnR-1536.webp 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/PAhI-3VnnR-360.png 360w, https://b.polente.de/img/PAhI-3VnnR-608.png 608w, https://b.polente.de/img/PAhI-3VnnR-960.png 960w, https://b.polente.de/img/PAhI-3VnnR-1240.png 1240w, https://b.polente.de/img/PAhI-3VnnR-1536.png 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Hand-drawn style sketch of a grid layout with four labeled sections: header on top, sidebar on the left, main content on the right, and footer at the bottom.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/PAhI-3VnnR-360.png\" width=\"1536\" height=\"1024\"></picture></p>\n<p>Grid is perfect for large page layouts. A master layout with header, sidebar, main and footer looks like this:</p>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">body</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> grid<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-template-rows</span><span class=\"token punctuation\">:</span> auto 1fr auto<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-template-columns</span><span class=\"token punctuation\">:</span> 200px 1fr<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-template-areas</span><span class=\"token punctuation\">:</span>\n    <span class=\"token string\">\"header header\"</span>\n    <span class=\"token string\">\"sidebar main\"</span>\n    <span class=\"token string\">\"footer footer\"</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">min-height</span><span class=\"token punctuation\">:</span> 100vh<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">header</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">grid-area</span><span class=\"token punctuation\">:</span> header<span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n<span class=\"token selector\">aside</span>  <span class=\"token punctuation\">{</span> <span class=\"token property\">grid-area</span><span class=\"token punctuation\">:</span> sidebar<span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n<span class=\"token selector\">main</span>   <span class=\"token punctuation\">{</span> <span class=\"token property\">grid-area</span><span class=\"token punctuation\">:</span> main<span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n<span class=\"token selector\">footer</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">grid-area</span><span class=\"token punctuation\">:</span> footer<span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span></code></pre>\n<p>This gives you a clear base. Inside you can use inline-grid for sublayouts.</p>\n<hr>\n<h2 id=\"floats-and-flow-root\" tabindex=\"-1\">Floats and Flow-Root <a class=\"header-anchor\" href=\"https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/u9G31FqLYb-360.avif 360w, https://b.polente.de/img/u9G31FqLYb-608.avif 608w, https://b.polente.de/img/u9G31FqLYb-960.avif 960w, https://b.polente.de/img/u9G31FqLYb-1240.avif 1240w, https://b.polente.de/img/u9G31FqLYb-1536.avif 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/u9G31FqLYb-360.webp 360w, https://b.polente.de/img/u9G31FqLYb-608.webp 608w, https://b.polente.de/img/u9G31FqLYb-960.webp 960w, https://b.polente.de/img/u9G31FqLYb-1240.webp 1240w, https://b.polente.de/img/u9G31FqLYb-1536.webp 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/u9G31FqLYb-360.png 360w, https://b.polente.de/img/u9G31FqLYb-608.png 608w, https://b.polente.de/img/u9G31FqLYb-960.png 960w, https://b.polente.de/img/u9G31FqLYb-1240.png 1240w, https://b.polente.de/img/u9G31FqLYb-1536.png 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Hand-drawn style sketch showing an image box on the left and wavy lines of text flowing around it, illustrating float and flow-root.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/u9G31FqLYb-360.png\" width=\"1536\" height=\"1024\"></picture></p>\n<p>Old tools, but still useful. A picture with text around it is simple with float:</p>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">img</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">float</span><span class=\"token punctuation\">:</span> left<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0 1rem 1rem 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>To close the container after floats, just use flow-root:</p>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">.container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flow-root<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>No clearfix hack anymore. Clean and simple.</p>\n<h2 id=\"flex-for-small-parts\" tabindex=\"-1\">Flex for small parts <a class=\"header-anchor\" href=\"https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/VN9O4iBIpO-360.avif 360w, https://b.polente.de/img/VN9O4iBIpO-608.avif 608w, https://b.polente.de/img/VN9O4iBIpO-960.avif 960w, https://b.polente.de/img/VN9O4iBIpO-1240.avif 1240w, https://b.polente.de/img/VN9O4iBIpO-1536.avif 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/VN9O4iBIpO-360.webp 360w, https://b.polente.de/img/VN9O4iBIpO-608.webp 608w, https://b.polente.de/img/VN9O4iBIpO-960.webp 960w, https://b.polente.de/img/VN9O4iBIpO-1240.webp 1240w, https://b.polente.de/img/VN9O4iBIpO-1536.webp 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/VN9O4iBIpO-360.png 360w, https://b.polente.de/img/VN9O4iBIpO-608.png 608w, https://b.polente.de/img/VN9O4iBIpO-960.png 960w, https://b.polente.de/img/VN9O4iBIpO-1240.png 1240w, https://b.polente.de/img/VN9O4iBIpO-1536.png 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Hand-drawn style sketch of a horizontal navigation bar with three buttons side by side, labeled as buttons, showing Flexbox layout.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/VN9O4iBIpO-360.png\" width=\"1536\" height=\"1024\"></picture></p>\n<p>Flex is strong for smaller things. Navigation, button groups, card rows:</p>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">nav</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">gap</span><span class=\"token punctuation\">:</span> 1rem<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>But please don’t use it for full page layouts. Flex is for rows and columns, not for full grids.</p>\n<h2 id=\"responsiveness\" tabindex=\"-1\">Responsiveness <a class=\"header-anchor\" href=\"https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/\">#</a></h2>\n<p>Sometimes layout alone is not enough. Grid, Flex or Floats give you the structure, but you also need ways to react to different sizes. This is where Media Queries and Container Queries come in. They work hand in hand with the layout techniques above and make your components really flexible.</p>\n<h3 id=\"media-queries\" tabindex=\"-1\">Media Queries <a class=\"header-anchor\" href=\"https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/x8mZlmkVt--360.avif 360w, https://b.polente.de/img/x8mZlmkVt--608.avif 608w, https://b.polente.de/img/x8mZlmkVt--960.avif 960w, https://b.polente.de/img/x8mZlmkVt--1240.avif 1240w, https://b.polente.de/img/x8mZlmkVt--1536.avif 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/x8mZlmkVt--360.webp 360w, https://b.polente.de/img/x8mZlmkVt--608.webp 608w, https://b.polente.de/img/x8mZlmkVt--960.webp 960w, https://b.polente.de/img/x8mZlmkVt--1240.webp 1240w, https://b.polente.de/img/x8mZlmkVt--1536.webp 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/x8mZlmkVt--360.png 360w, https://b.polente.de/img/x8mZlmkVt--608.png 608w, https://b.polente.de/img/x8mZlmkVt--960.png 960w, https://b.polente.de/img/x8mZlmkVt--1240.png 1240w, https://b.polente.de/img/x8mZlmkVt--1536.png 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Hand-drawn style sketch of a card layout changing from a single vertical column on the left to a three-column grid on the right, connected by an arrow, illustrating a media query.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/x8mZlmkVt--360.png\" width=\"1536\" height=\"1024\"></picture></p>\n<p>Classic and still needed. They react to screen width:</p>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">.card-list</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> grid<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-template-columns</span><span class=\"token punctuation\">:</span> 1fr<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 768px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.card-list</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">grid-template-columns</span><span class=\"token punctuation\">:</span> <span class=\"token function\">repeat</span><span class=\"token punctuation\">(</span>3<span class=\"token punctuation\">,</span> 1fr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<h3 id=\"container-queries\" tabindex=\"-1\">Container Queries <a class=\"header-anchor\" href=\"https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/yy7rzgIss3-360.avif 360w, https://b.polente.de/img/yy7rzgIss3-608.avif 608w, https://b.polente.de/img/yy7rzgIss3-960.avif 960w, https://b.polente.de/img/yy7rzgIss3-1240.avif 1240w, https://b.polente.de/img/yy7rzgIss3-1536.avif 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/yy7rzgIss3-360.webp 360w, https://b.polente.de/img/yy7rzgIss3-608.webp 608w, https://b.polente.de/img/yy7rzgIss3-960.webp 960w, https://b.polente.de/img/yy7rzgIss3-1240.webp 1240w, https://b.polente.de/img/yy7rzgIss3-1536.webp 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/yy7rzgIss3-360.png 360w, https://b.polente.de/img/yy7rzgIss3-608.png 608w, https://b.polente.de/img/yy7rzgIss3-960.png 960w, https://b.polente.de/img/yy7rzgIss3-1240.png 1240w, https://b.polente.de/img/yy7rzgIss3-1536.png 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Hand-drawn style sketch showing two containers side by side. Container A has cards stacked in one column, while Container B has cards in three columns, labeled with '@container', showing container query behavior.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/yy7rzgIss3-360.png\" width=\"1536\" height=\"1024\"></picture></p>\n<p>This is the real game changer. The container size counts, not the screen size:</p>\n<pre class=\"language-css\" tabindex=\"0\"><code class=\"language-css\"><span class=\"token selector\">.card-list</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> grid<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-template-columns</span><span class=\"token punctuation\">:</span> 1fr<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">container-type</span><span class=\"token punctuation\">:</span> inline-size<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@container</span> <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 600px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.card-list</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">grid-template-columns</span><span class=\"token punctuation\">:</span> <span class=\"token function\">repeat</span><span class=\"token punctuation\">(</span>3<span class=\"token punctuation\">,</span> 1fr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>Now a component adapts itself, no matter if inside a small or large container.</p>\n<h2 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/RethinkingCSSLayoutsMoreThanJustFlex/\">#</a></h2>\n<p>If Flex is your only tool, every layout looks like a Flex problem. Use Grid for structure, Floats for small tricks, Flow-Root for clean containers, Flex for rows, Media Queries for screens and Container Queries for real responsive components.</p>\n<p>And don’t forget: everything starts with good semantic HTML. Then CSS will be strong and clear again.</p>\n",
			"date_published": "2025-09-22T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/",
			"url": "https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/",
			"title": "E-Commerce Website Audit Framework",
			"content_html": "<h2 id=\"tl-dr\" tabindex=\"-1\">TL;DR <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<p>This framework provides a comprehensive audit method for e-commerce websites. It covers SEO, performance, accessibility, front-end code, architecture, security, integrations, documentation, and operations. Each section includes sample do’s and don’ts, recommended tools, and evaluation criteria. These examples are illustrative only; in real audits, there are many more program-, client-, and project-specific checks. Deliverables include an executive summary, a detailed findings report, and a scorecard (1–5 rating) to prioritize fixes.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/EmBjYqN9gb-360.avif 360w, https://b.polente.de/img/EmBjYqN9gb-608.avif 608w, https://b.polente.de/img/EmBjYqN9gb-960.avif 960w, https://b.polente.de/img/EmBjYqN9gb-1240.avif 1240w, https://b.polente.de/img/EmBjYqN9gb-1536.avif 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/EmBjYqN9gb-360.webp 360w, https://b.polente.de/img/EmBjYqN9gb-608.webp 608w, https://b.polente.de/img/EmBjYqN9gb-960.webp 960w, https://b.polente.de/img/EmBjYqN9gb-1240.webp 1240w, https://b.polente.de/img/EmBjYqN9gb-1536.webp 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/EmBjYqN9gb-360.png 360w, https://b.polente.de/img/EmBjYqN9gb-608.png 608w, https://b.polente.de/img/EmBjYqN9gb-960.png 960w, https://b.polente.de/img/EmBjYqN9gb-1240.png 1240w, https://b.polente.de/img/EmBjYqN9gb-1536.png 1536w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A flowchart diagram titled “E-Commerce Website Audit Framework.” In the center is the title box, surrounded by eight colored boxes: SEO &amp; Online Visibility (on-page optimization, structured data, crawlability, search performance), Performance &amp; Scalability (speed, resource usage, ability to handle growth), Accessibility (WCAG compliance, real-world usability), Frontend Code Quality (clean, maintainable, resilience), Software Architecture (scalability, modularity, resilience), Security (vulnerability protection, compliance with standards), Integrations &amp; APIs (reliability, compliance of third-party systems), and Processes &amp; Operations (deployment, monitoring, resilience).\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/EmBjYqN9gb-360.png\" width=\"1536\" height=\"1024\"></picture></p>\n<h2 id=\"1-seo-and-online-visibility\" tabindex=\"-1\">1. SEO &amp; Online Visibility <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<p><strong>What to check:</strong> On-page optimization, structured data, crawlability, and search performance.</p>\n<p>✅ <strong>Do</strong></p>\n<ul>\n<li>Use descriptive page titles &amp; unique meta descriptions.</li>\n<li>Add structured data (schema.org for products, reviews, breadcrumbs).</li>\n<li>Submit XML sitemaps to Google Search Console.</li>\n</ul>\n<p>❌ <strong>Don’t</strong></p>\n<ul>\n<li>Stuff keywords unnaturally.</li>\n<li>Use duplicate content across product pages.</li>\n<li>Block important content with robots.txt.</li>\n</ul>\n<h3 id=\"seo-tools\" tabindex=\"-1\">SEO Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h3>\n<ul>\n<li>Browser: <a href=\"https://developers.google.com/web/tools/lighthouse\">Lighthouse SEO Audit</a> - <a href=\"https://developers.google.com/web/tools/lighthouse/audits/seo\">Documentation</a></li>\n<li>SaaS: <a href=\"https://www.semrush.com/\">SEMrush</a> - <a href=\"https://www.semrush.com/kb/\">Docs</a>, <a href=\"https://ahrefs.com/\">Ahrefs</a> - <a href=\"https://ahrefs.com/academy\">Academy</a>, <a href=\"https://www.screamingfrog.co.uk/seo-spider/\">Screaming Frog</a> - <a href=\"https://www.screamingfrog.co.uk/seo-spider/user-guide/\">User Guide</a></li>\n<li>Agentic: <a href=\"https://surferseo.com/\">Surfer SEO</a> - <a href=\"https://docs.surferseo.com/\">Knowledge Base</a> for content optimization</li>\n</ul>\n<h2 id=\"2-performance-and-scalability\" tabindex=\"-1\">2. Performance &amp; Scalability <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<p><strong>What to check:</strong> Speed, resource usage, and ability to handle growth.</p>\n<p>✅ <strong>Do</strong></p>\n<ul>\n<li>Optimize images (WebP/AVIF, responsive sizes).</li>\n<li>Minify and bundle JS/CSS carefully.</li>\n<li>Use a CDN for global delivery.</li>\n</ul>\n<p>❌ <strong>Don’t</strong></p>\n<ul>\n<li>Load blocking scripts in <code>&lt;head&gt;</code>.</li>\n<li>Ignore mobile performance (LCP &gt; 2.5s is bad).</li>\n<li>Rely only on vertical scaling instead of elasticity.</li>\n</ul>\n<h3 id=\"performance-tools\" tabindex=\"-1\">Performance Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h3>\n<ul>\n<li>Browser: <a href=\"https://developer.chrome.com/docs/devtools/\">Chrome DevTools</a> - <a href=\"https://developer.chrome.com/docs/devtools/performance/\">Performance tab guide</a></li>\n<li>SaaS: <a href=\"https://www.webpagetest.org/\">WebPageTest</a> - <a href=\"https://docs.webpagetest.org/\">Documentation</a>, <a href=\"https://gtmetrix.com/\">GTmetrix</a> - <a href=\"https://gtmetrix.com/help/\">Help Center</a>, <a href=\"https://www.speedcurve.com/\">SpeedCurve</a> - <a href=\"https://support.speedcurve.com/\">Docs</a></li>\n<li>CI/CD: <a href=\"https://github.com/GoogleChrome/lighthouse-ci\">Lighthouse CI</a> - <a href=\"https://github.com/GoogleChrome/lighthouse-ci/blob/main/docs/getting-started.md\">Getting Started</a>, <a href=\"https://k6.io/\">k6</a> - <a href=\"https://k6.io/docs/\">Documentation</a> for load testing</li>\n</ul>\n<h2 id=\"3-accessibility\" tabindex=\"-1\">3. Accessibility <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<p><strong>What to check:</strong> Compliance with WCAG 2.1+ and real-world usability.</p>\n<p>✅ <strong>Do</strong></p>\n<ul>\n<li>Provide alt text for all images.</li>\n<li>Ensure sufficient color contrast (use a contrast checker).</li>\n<li>Make all functionality accessible via keyboard.</li>\n</ul>\n<p>❌ <strong>Don’t</strong></p>\n<ul>\n<li>Convey information only by color.</li>\n<li>Hide focus outlines.</li>\n<li>Skip ARIA roles where needed.</li>\n</ul>\n<h3 id=\"accessibility-tools\" tabindex=\"-1\">Accessibility Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h3>\n<ul>\n<li>Browser: <a href=\"https://www.deque.com/axe/devtools/\">axe DevTools</a> - <a href=\"https://docs.deque.com/devtools-html/4.0.0/\">User Guide</a>, <a href=\"https://wave.webaim.org/\">WAVE</a> - <a href=\"https://wave.webaim.org/help\">Documentation</a>, <a href=\"https://developers.google.com/web/tools/lighthouse\">Lighthouse Accessibility Audit</a> - <a href=\"https://developers.google.com/web/tools/lighthouse/audits/accessibility\">Accessibility docs</a></li>\n<li>Automated: <a href=\"https://github.com/pa11y/pa11y-ci\">Pa11y CI</a> - <a href=\"https://github.com/pa11y/pa11y-ci#usage\">Usage Guide</a></li>\n<li>Manual: Screen readers (<a href=\"https://www.nvaccess.org/\">NVDA</a> - <a href=\"https://www.nvaccess.org/files/nvda/documentation/userGuide.html\">User Guide</a>, <a href=\"https://www.freedomscientific.com/products/software/jaws/\">JAWS</a> - <a href=\"https://support.freedomscientific.com/Products/Blindness/JAWS\">Documentation</a>, <a href=\"https://support.apple.com/guide/voiceover/welcome/mac\">VoiceOver</a> - <a href=\"https://support.apple.com/guide/voiceover/welcome/mac\">User Guide</a>)</li>\n</ul>\n<p>Reference: Publicis Sapient CoE Accessibility in Canada – “<a href=\"https://www.publicissapient.com/insights/liberty-accessibility-for-all\">Accessibility for All</a>” initiative</p>\n<h2 id=\"4-front-end-code-quality\" tabindex=\"-1\">4. Front-End Code Quality <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<p><strong>What to check:</strong> Clean, maintainable, and performant code.</p>\n<p>✅ <strong>Do</strong></p>\n<ul>\n<li>Write semantic HTML (<code>&lt;button&gt;</code>, not <code>&lt;div onclick&gt;</code>).</li>\n<li>Use CSS naming conventions (e.g. BEM).</li>\n<li>Split JS bundles and lazy load non-critical code.</li>\n</ul>\n<p>❌ <strong>Don’t</strong></p>\n<ul>\n<li>Mix styling inline (<code>style=&quot;&quot;</code>).</li>\n<li>Abuse <code>!important</code> in CSS.</li>\n<li>Depend on large frameworks for trivial functionality.</li>\n</ul>\n<h3 id=\"quality-tools\" tabindex=\"-1\">Quality Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h3>\n<ul>\n<li>Static Analysis: <a href=\"https://eslint.org/\">ESLint</a> - <a href=\"https://eslint.org/docs/latest/\">Documentation</a>, <a href=\"https://stylelint.io/\">Stylelint</a> - <a href=\"https://stylelint.io/user-guide/\">User Guide</a></li>\n<li>Browser: <a href=\"https://developer.chrome.com/docs/devtools/coverage/\">Coverage tab</a> in DevTools (unused CSS/JS)</li>\n<li>CI/CD: <a href=\"https://www.sonarqube.org/\">SonarQube</a> - <a href=\"https://docs.sonarqube.org/latest/\">Documentation</a> for code quality</li>\n</ul>\n<h2 id=\"5-software-architecture\" tabindex=\"-1\">5. Software Architecture <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<p><strong>What to check:</strong> Scalability, modularity, and resilience.</p>\n<p>✅ <strong>Do</strong></p>\n<ul>\n<li>Apply Domain-Driven Design for modularity.</li>\n<li>Version APIs and document them (Swagger, OpenAPI).</li>\n<li>Add observability (structured logging, distributed tracing).</li>\n</ul>\n<p>❌ <strong>Don’t</strong></p>\n<ul>\n<li>Couple business logic tightly with UI.</li>\n<li>Skip caching strategies (API + DB).</li>\n<li>Forget failure recovery (retry, circuit breaker).</li>\n</ul>\n<h3 id=\"architecture-tools\" tabindex=\"-1\">Architecture Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h3>\n<ul>\n<li>Code Level: <a href=\"https://adr.github.io/\">Architecture Decision Records (ADR)</a> - <a href=\"https://github.com/joelparkerhenderson/architecture-decision-record\">Templates</a>, <a href=\"https://plantuml.com/\">PlantUML</a> - <a href=\"https://plantuml.com/guide\">Language Reference Guide</a> diagrams</li>\n<li>Monitoring: <a href=\"https://www.datadoghq.com/\">Datadog</a> - <a href=\"https://docs.datadoghq.com/\">Documentation</a>, <a href=\"https://newrelic.com/\">New Relic</a> - <a href=\"https://docs.newrelic.com/\">Docs</a>, <a href=\"https://opentelemetry.io/\">OpenTelemetry</a> - <a href=\"https://opentelemetry.io/docs/\">Documentation</a></li>\n<li>Testing: <a href=\"https://www.postman.com/\">Postman</a> - <a href=\"https://learning.postman.com/\">Learning Center</a>/<a href=\"https://github.com/postmanlabs/newman\">Newman</a> - <a href=\"https://learning.postman.com/docs/running-collections/using-newman-cli/\">CLI docs</a> for APIs</li>\n</ul>\n<h2 id=\"6-security\" tabindex=\"-1\">6. Security <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<p><strong>What to check:</strong> Protect against vulnerabilities, compliance with standards.</p>\n<p>✅ <strong>Do</strong></p>\n<ul>\n<li>Use HTTPS everywhere (HSTS enabled).</li>\n<li>Hash and salt passwords (bcrypt, Argon2).</li>\n<li>Apply least privilege to user roles.</li>\n</ul>\n<p>❌ <strong>Don’t</strong></p>\n<ul>\n<li>Store secrets in code.</li>\n<li>Trust client-side validation alone.</li>\n<li>Disable security headers (CSP, X-Frame-Options).</li>\n</ul>\n<h3 id=\"security-tools\" tabindex=\"-1\">Security Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h3>\n<ul>\n<li>Browser: <a href=\"https://developer.chrome.com/docs/devtools/security/\">Security tab</a> in Chrome DevTools</li>\n<li>Code Level: <a href=\"https://owasp.org/www-project-dependency-check/\">OWASP Dependency-Check</a> - <a href=\"https://jeremylong.github.io/DependencyCheck/\">Documentation</a>, <a href=\"https://snyk.io/\">Snyk</a> - <a href=\"https://docs.snyk.io/\">Documentation</a></li>\n<li>SaaS: <a href=\"https://portswigger.net/burp\">Burp Suite</a> - <a href=\"https://portswigger.net/burp/documentation\">Documentation</a>, <a href=\"https://www.zaproxy.org/\">OWASP ZAP</a> - <a href=\"https://www.zaproxy.org/docs/\">User Guide</a> (DAST scans)</li>\n</ul>\n<h2 id=\"7-integrations-and-apis\" tabindex=\"-1\">7. Integrations &amp; APIs <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<p><strong>What to check:</strong> Reliability and compliance of third-party systems.</p>\n<p>✅ <strong>Do</strong></p>\n<ul>\n<li>Implement retry &amp; backoff strategies.</li>\n<li>Secure APIs with OAuth2/JWT.</li>\n<li>Use monitoring for payment/logistics APIs.</li>\n</ul>\n<p>❌ <strong>Don’t</strong></p>\n<ul>\n<li>Hardcode API keys.</li>\n<li>Skip sandbox testing before production release.</li>\n<li>Assume vendor APIs never change.</li>\n</ul>\n<h3 id=\"integrations-tools\" tabindex=\"-1\">Integrations Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h3>\n<ul>\n<li><a href=\"https://www.postman.com/\">Postman</a> - <a href=\"https://learning.postman.com/docs/getting-started/introduction/\">Documentation</a>, <a href=\"https://insomnia.rest/\">Insomnia</a> - <a href=\"https://docs.insomnia.rest/\">Documentation</a> (manual testing)</li>\n<li><a href=\"https://pact.io/\">Pact</a> - <a href=\"https://docs.pact.io/\">Documentation</a> (contract testing)</li>\n<li><a href=\"https://wiremock.org/\">WireMock</a> - <a href=\"https://wiremock.org/docs/\">Documentation</a> (API mocking)</li>\n</ul>\n<h2 id=\"8-documentation-and-governance\" tabindex=\"-1\">8. Documentation &amp; Governance <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<p><strong>What to check:</strong> Knowledge sharing, standards, and process.</p>\n<p>✅ <strong>Do</strong></p>\n<ul>\n<li>Maintain a living API spec.</li>\n<li>Document architecture decisions.</li>\n<li>Include audit reports with scoring and remediation.</li>\n</ul>\n<p>❌ <strong>Don’t</strong></p>\n<ul>\n<li>Let docs go stale.</li>\n<li>Hide findings in long PDFs with no clear action plan.</li>\n<li>Forget to track NFRs in backlog.</li>\n</ul>\n<h3 id=\"documentation-tools\" tabindex=\"-1\">Documentation Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h3>\n<ul>\n<li><a href=\"https://www.atlassian.com/software/confluence\">Confluence</a> - <a href=\"https://confluence.atlassian.com/doc/\">Documentation</a>, <a href=\"https://www.notion.so/\">Notion</a> - <a href=\"https://www.notion.so/help\">Help Center</a>, or <a href=\"https://docs.github.com/en/communities/documenting-your-project-with-wikis\">GitHub Wiki</a> - <a href=\"https://docs.github.com/en/communities/documenting-your-project-with-wikis/about-wikis\">About wikis</a></li>\n<li><a href=\"https://github.com/joelparkerhenderson/architecture-decision-record\">ADR templates</a> - <a href=\"https://github.com/joelparkerhenderson/architecture-decision-record/tree/main/examples\">Examples</a> (Architectural Decision Records)</li>\n<li>Scorecards &amp; dashboards (<a href=\"https://grafana.com/\">Grafana</a> - <a href=\"https://grafana.com/docs/grafana/latest/\">Documentation</a>)</li>\n</ul>\n<h2 id=\"9-processes-and-operations\" tabindex=\"-1\">9. Processes &amp; Operations <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<p><strong>What to check:</strong> Deployment, monitoring, and resilience.</p>\n<p>✅ <strong>Do</strong></p>\n<ul>\n<li>Automate testing in CI/CD (unit, integration, regression).</li>\n<li>Add DevSecOps scanning to the pipeline.</li>\n<li>Define SLAs and measure them with monitoring.</li>\n</ul>\n<p>❌ <strong>Don’t</strong></p>\n<ul>\n<li>Deploy directly to production without review.</li>\n<li>Ignore alert fatigue (too many false alarms).</li>\n<li>Skip cost monitoring for cloud services.</li>\n</ul>\n<h3 id=\"process-tools\" tabindex=\"-1\">Process Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h3>\n<ul>\n<li>CI/CD: <a href=\"https://github.com/features/actions\">GitHub Actions</a> - <a href=\"https://docs.github.com/en/actions\">Documentation</a>, <a href=\"https://docs.gitlab.com/ee/ci/\">GitLab CI</a> - <a href=\"https://docs.gitlab.com/ee/ci/\">CI/CD Guide</a>, <a href=\"https://www.jenkins.io/\">Jenkins</a> - <a href=\"https://www.jenkins.io/doc/\">Documentation</a></li>\n<li>Observability: <a href=\"https://prometheus.io/\">Prometheus</a> - <a href=\"https://prometheus.io/docs/\">Documentation</a> + <a href=\"https://grafana.com/\">Grafana</a> - <a href=\"https://grafana.com/docs/\">Docs</a>, <a href=\"https://www.elastic.co/elastic-stack\">ELK Stack</a> - <a href=\"https://www.elastic.co/guide/index.html\">Documentation</a></li>\n<li>Incident Mgmt: <a href=\"https://www.pagerduty.com/\">PagerDuty</a> - <a href=\"https://support.pagerduty.com/docs\">Documentation</a>, <a href=\"https://www.atlassian.com/software/opsgenie\">Opsgenie</a> - <a href=\"https://support.atlassian.com/opsgenie/\">Documentation</a></li>\n</ul>\n<h2 id=\"deliverables-of-the-audit\" tabindex=\"-1\">Deliverables of the Audit <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h2>\n<ul>\n<li><strong>Executive Summary</strong> for stakeholders</li>\n<li><strong>Detailed findings</strong> with “Do/Don’t” recommendations</li>\n<li><strong>Scorecards</strong> for SEO, performance, accessibility, security, etc.</li>\n<li><strong>Actionable roadmap</strong> with priorities (Quick Wins vs. Long-Term Fixes)</li>\n</ul>\n<h3 id=\"example-deliverables\" tabindex=\"-1\">Example Deliverables <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h3>\n<h4 id=\"executive-summary-example\" tabindex=\"-1\">Executive Summary (Example) <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h4>\n<p><strong>Project:</strong> Audit of “ShopNow E-Commerce”\n<strong>Date:</strong> September 2025</p>\n<p>The audit identified several strengths in the current platform, including a scalable cloud architecture and good API documentation. However, there are significant gaps in accessibility, performance, and security.</p>\n<ul>\n<li><strong>Accessibility</strong>: The site does not meet WCAG 2.1 AA. Missing alt text, poor contrast, and keyboard traps were found. This limits usability for a portion of users and poses compliance risks.</li>\n<li><strong>Performance</strong>: Load times on mobile devices are slow (LCP ~4.2s). Large unoptimized images and render-blocking scripts are the main issues.</li>\n<li><strong>Security</strong>: Outdated libraries with known vulnerabilities were detected. No CSP headers are set, leaving the site vulnerable to XSS attacks.</li>\n<li><strong>SEO</strong>: Overall strong, but duplicate meta descriptions and missing structured data for products reduce search visibility.</li>\n</ul>\n<p><strong>Recommended Roadmap:</strong></p>\n<ul>\n<li><strong>Quick Wins (0–3 months):</strong> Fix image optimization, apply security headers, add alt text.</li>\n<li><strong>Mid-Term (3–6 months):</strong> Upgrade dependency management, add Lighthouse CI in pipeline, implement automated accessibility checks.</li>\n<li><strong>Long-Term (6+ months):</strong> Redesign color palette for accessibility, adopt service mesh for API resilience, build observability dashboards.</li>\n</ul>\n<h4 id=\"scorecard-example-1-5-rating\" tabindex=\"-1\">Scorecard (Example, 1–5 Rating) <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ECommerceWebsiteAuditFramework/E-CommerceWebsiteAuditFramework/\">#</a></h4>\n<table>\n<thead>\n<tr>\n<th>Category</th>\n<th>Rating (1–5)</th>\n<th>Notes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>SEO</td>\n<td>3</td>\n<td>Indexing is fine, but missing structured data and duplicate metas.</td>\n</tr>\n<tr>\n<td>Performance</td>\n<td>2</td>\n<td>Mobile performance weak (LCP &gt; 4s), no CDN usage.</td>\n</tr>\n<tr>\n<td>Accessibility</td>\n<td>1</td>\n<td>WCAG compliance poor, several critical blockers.</td>\n</tr>\n<tr>\n<td>Frontend Code</td>\n<td>3</td>\n<td>Semantics okay, but CSS unstructured, JS bundles too large.</td>\n</tr>\n<tr>\n<td>Architecture</td>\n<td>4</td>\n<td>Modular and scalable, but observability limited.</td>\n</tr>\n<tr>\n<td>Security</td>\n<td>2</td>\n<td>Outdated libs, missing CSP and secure headers.</td>\n</tr>\n<tr>\n<td>Integrations</td>\n<td>4</td>\n<td>APIs well documented, retry logic missing in payments.</td>\n</tr>\n<tr>\n<td>Documentation</td>\n<td>3</td>\n<td>Good developer docs, but no audit or ADRs kept updated.</td>\n</tr>\n<tr>\n<td>Processes/Ops</td>\n<td>4</td>\n<td>CI/CD pipeline in place, but no DevSecOps or automated scans.</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Legend:</strong></p>\n<ul>\n<li>1 = Critical (high risk, urgent fix needed)</li>\n<li>2 = Weak (many gaps, below industry standard)</li>\n<li>3 = Acceptable (meets minimum expectations, needs improvements)</li>\n<li>4 = Strong (good practice, minor improvements possible)</li>\n<li>5 = Excellent (industry leading, no action needed)</li>\n</ul>\n",
			"date_published": "2025-09-15T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/HeadlessDesignSystemMigration/",
			"url": "https://b.polente.de/blog/HeadlessDesignSystemMigration/",
			"title": "Design System Migration with MCP and Slingshot",
			"content_html": "<h2 id=\"removing-ui-from-tsx-for-a-design-system-migration\" tabindex=\"-1\">Removing UI from TSX for a Design System Migration <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessDesignSystemMigration/\">#</a></h2>\n<p>Sometimes change comes not from adding, but from removing. I recently removed UI contents from a TSX implementation so our client’s new aggregated design system component could work <strong>headless</strong> with existing Providers, Components, and Containers.</p>\n<h3 id=\"the-challenge\" tabindex=\"-1\">The challenge <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessDesignSystemMigration/\">#</a></h3>\n<p>The old TSX files mixed logic and UI. Layout, styles, and visual glue were baked into every component. This made it hard to scale or update design. The new design system components needed a clean separation so it could deliver a <strong>consistent experience across apps and markets</strong>.</p>\n<h3 id=\"headless-as-an-add-on\" tabindex=\"-1\">Headless as an add-on <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessDesignSystemMigration/\">#</a></h3>\n<p>The design system is built <strong>on top of the core component library</strong>. It orchestrates existing base components, defines patterns, and ensures Cards, Filters, and Buttons look and behave the same everywhere.\nThe UI components are <strong>dumb</strong>: they only render what they get. Data, content, and CTA events are injected from outside. This keeps them reusable, predictable, and easy to test.</p>\n<h3 id=\"connected-with-mcp-servers\" tabindex=\"-1\">Connected with MCP servers <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessDesignSystemMigration/\">#</a></h3>\n<p>This setup also uses <strong>MCP servers</strong>:</p>\n<ul>\n<li>Some, like the <strong>NX repo MCP</strong>, come out of the box.</li>\n<li><strong>Figma MCP</strong> pulls design rules and tokens directly.</li>\n<li><strong>Atlassian MCP</strong> keeps tickets updated, syncing progress and status in real time.\nThis automation helps the design system stay aligned with design specs and project workflows without extra manual work.</li>\n</ul>\n<h3 id=\"what-i-did\" tabindex=\"-1\">What I did <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessDesignSystemMigration/\">#</a></h3>\n<ul>\n<li>Used <strong>Agentic Chat</strong> and <strong>VS Code</strong> to strip UI from TSX.</li>\n<li>Built a migration path in a single <strong>prompt file</strong> that guided all changes.</li>\n<li>Integrated MCP servers to connect design, code, and tickets seamlessly.</li>\n</ul>\n<h3 id=\"the-aha-moment\" tabindex=\"-1\">The aha moment <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessDesignSystemMigration/\">#</a></h3>\n<p>Seeing a fully automated migration from that single prompt file, with design and ticket updates happening in sync. That’s when agentic workflows stopped being theory and started driving real efficiency.</p>\n<h3 id=\"the-outcome\" tabindex=\"-1\">The outcome <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessDesignSystemMigration/\">#</a></h3>\n<ul>\n<li>Faster migration, less manual work.</li>\n<li>Consistent design across teams and apps, regardless of dev preferences.</li>\n<li>Clear alignment between design and delivery pipelines.</li>\n</ul>\n<h3 id=\"conclusion-powered-by-sapient-slingshot\" tabindex=\"-1\">Conclusion: Powered by Sapient Slingshot <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessDesignSystemMigration/\">#</a></h3>\n<p><a href=\"https://www.publicissapient.com/sapient-ai/sapient-slingshot\"><strong>Sapient Slingshot</strong></a> turned this from a tedious migration into a repeatable system.\nWith one prompt file, we automated a process that would normally take weeks, aligned design and dev in real time, and set a new standard for scaling design systems.\nThis shows the power of AI-driven engineering: <strong>fewer manual steps, faster delivery, and better quality — without compromise.</strong></p>\n",
			"date_published": "2025-09-11T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/",
			"url": "https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/",
			"title": "Supercharge GitHub Copilot&#39;s Agent Mode",
			"content_html": "<h2 id=\"visual-studio-code-docs-on-mcp-servers-and-agents\" tabindex=\"-1\">Visual Studio Code docs on MCP servers and Agents <a class=\"header-anchor\" href=\"https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/\">#</a></h2>\n<p>The Visual Studio Code docs on <strong>MCP servers</strong> show how to supercharge GitHub Copilot's agent mode by plugging in external tools using the <strong>Model Context Protocol (MCP)</strong>.</p>\n<hr>\n<h2 id=\"what-is-mcp\" tabindex=\"-1\">What is MCP? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/\">#</a></h2>\n<p>MCP is an open standard that lets AI communicate with tools and services via a unified interface. With MCP-compatible servers hooked up to VS Code, Copilot can do more than just suggest code – it can:</p>\n<ul>\n<li>Run file operations</li>\n<li>Access databases</li>\n<li>Make API calls</li>\n</ul>\n<p>All directly inside your editor.</p>\n<hr>\n<h2 id=\"the-guide-covers\" tabindex=\"-1\">The Guide Covers: <a class=\"header-anchor\" href=\"https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/\">#</a></h2>\n<ul>\n<li>Setting up MCP servers</li>\n<li>Configuring them in VS Code</li>\n<li>Managing the whole integration</li>\n</ul>\n<p>It also explains what types of servers are supported and how to use MCP tools in <strong>agent mode</strong>.</p>\n<p>The goal?</p>\n<blockquote>\n<p>Smoother workflows, smarter tooling, and more time for building cool stuff.</p>\n</blockquote>\n<p>👉 <strong>Dive into the docs:</strong> <a href=\"https://code.visualstudio.com/docs/copilot/chat/mcp-servers\">VS Code MCP Guide</a> 📚</p>\n<hr>\n<h2 id=\"sample-mcp-servers-i-use\" tabindex=\"-1\">Sample MCP Servers I Use <a class=\"header-anchor\" href=\"https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/\">#</a></h2>\n<p>Here are a few MCP servers I currently have configured:</p>\n<ul>\n<li><strong>Atlassian integration</strong> (Jira &amp; Confluence): <a href=\"https://github.com/sooperset/mcp-atlassian\"><code>sooperset/mcp-atlassian</code></a></li>\n<li><strong>NX integration</strong> for monorepos: <a href=\"https://github.com/modelcontextprotocol/servers\"><code>nx-mcp</code></a></li>\n</ul>\n<p>More MCP servers are available here: 👉 <a href=\"https://github.com/modelcontextprotocol/servers\">List of MCP Servers</a></p>\n<hr>\n<h2 id=\"secure-setup-tips\" tabindex=\"-1\">Secure Setup Tips <a class=\"header-anchor\" href=\"https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/\">#</a></h2>\n<p>When setting up your <code>mcp.json</code>, you might worry about exposing settings.\nTo hide your MCP server variables securely, follow this flow:</p>\n<pre class=\"language-JSON\" tabindex=\"0\"><code class=\"language-JSON\">{\n  \"inputs\": [{\n    \"id\": \"atl_token\",\n    \"type\": \"promptString\",\n    \"password\": true,\n    \"description\": \"Enter your Atlassian Jira and Confluence token\"\n  },{\n    \"id\": \"BS_user\",\n    \"type\": \"promptString\",\n    \"password\": false,\n    \"description\": \"Enter your BS User\"\n  },{\n    \"id\": \"BS_token\",\n    \"type\": \"promptString\",\n    \"password\": true,\n    \"description\": \"Enter your BS token\"\n  }],\n}</code></pre>\n<blockquote>\n<p>This will ask for secrets at server start and remember them.\nUse placeholder variables in your config (e.g., <code>${input:atl_token}</code>).</p>\n</blockquote>\n<pre class=\"language-JSON\" tabindex=\"0\"><code class=\"language-JSON\">\"CONFLUENCE_API_TOKEN\": \"${input:atl_token}\",</code></pre>\n<hr>\n<h2 id=\"project-specific-instructions-for-copilot\" tabindex=\"-1\">Project-Specific Instructions for Copilot <a class=\"header-anchor\" href=\"https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/\">#</a></h2>\n<p>GitHub Copilot now supports a <code>.github/copilot-instructions.md</code> file in your repo to tailor responses to your tools, workflows, and coding style.</p>\n<h3 id=\"how-to-set-it-up\" tabindex=\"-1\">How to Set It Up <a class=\"header-anchor\" href=\"https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/\">#</a></h3>\n<ol>\n<li>Create <code>.github/copilot-instructions.md</code> in your repository root</li>\n<li>Write clear, natural-language instructions in Markdown</li>\n</ol>\n<blockquote>\n<p>Copilot will now include these automatically in its responses.</p>\n</blockquote>\n<h3 id=\"how-to-check-it-s-working\" tabindex=\"-1\">How to Check It’s Working <a class=\"header-anchor\" href=\"https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/\">#</a></h3>\n<p>Look for <code>.github/copilot-instructions.md</code> in the <strong>References</strong> section of Copilot Chat responses.</p>\n<p>👉 <a href=\"https://docs.github.com/en/copilot\">GitHub Docs – Copilot Instructions</a></p>\n<hr>\n<h2 id=\"custom-prompts-optional\" tabindex=\"-1\">Custom Prompts (Optional) <a class=\"header-anchor\" href=\"https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/\">#</a></h2>\n<p>You can also create prompt files like <code>.github/prompts/prompts_Example.md</code>. These files guide Copilot to align with your coding style, frameworks, and project needs, enhancing its suggestions. For more details, <a href=\"https://code.visualstudio.com/docs/copilot/copilot-customization\">visit the official documentation</a>.</p>\n<h2 id=\"additional-specialized-instructions\" tabindex=\"-1\">Additional specialized Instructions <a class=\"header-anchor\" href=\"https://b.polente.de/blog/SuperchargeVSCodeWithMCPServersAndAgentMode/\">#</a></h2>\n<p>Additionally two files are available that you can configure in your Settings.json with the following settings. The names alone explain what they are for.</p>\n<pre class=\"language-JSON\" tabindex=\"0\"><code class=\"language-JSON\">\"github.copilot.chat.codeGeneration.instructions\": [\n  {\n    \"file\": \".github/code-style.md\"\n  }\n],\n\"github.copilot.chat.testGeneration.instructions\": [\n  {\n    \"file\": \".github/test-style.md\"\n  }\n]</code></pre>\n",
			"date_published": "2025-05-21T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/",
			"url": "https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/",
			"title": "Replacing MUI - A New Design System Approach",
			"content_html": "<h2 id=\"removing-mui-and-our-old-design-system\" tabindex=\"-1\">Removing MUI and Our Old Design System <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/\">#</a></h2>\n<h3 id=\"tl-dr\" tabindex=\"-1\">TL;DR <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/\">#</a></h3>\n<p>We transitioned from MUI and our old in-house design system due to performance issues, component duplication, and complex theming. We developed a React-based component library, integrating design tokens directly from Figma for real-time updates. This led to a 28% reduction in JavaScript bundle sizes, improved application performance, and more than 19 point enhanced Lighthouse scores. Centralizing our design process in Figma established a single source of truth, ensuring consistency across teams. With upcoming EUAA 25 accessibility regulations, our proactive approach positions us ahead of the curve by embedding accessibility into our design system's foundation.</p>\n<h2 id=\"streamlining-performance-and-consistency\" tabindex=\"-1\">Streamlining Performance and Consistency <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/\">#</a></h2>\n<p>This blog post is about how we transitioned away from MUI and our old in-house design system. Over time, MUI no longer met our needs, and the earlier attempt at a custom design system faced issues. We struggled with component ownership, multiple entries for similar components, and a lack of integration between design tools and the final application. As a result, we ended up with a framework design system and another custom system that neither teams nor designers wanted to use.</p>\n<p>Due to performance degradation, component duplication, and complex theming with MUI, we decided to develop our own dedicated design system. ​</p>\n<p>We then began working on a fresh, more effective approach. After considering different options, we decided to build a React-based component library. This choice aligned with our main consumer’s infrastructure. From the start, we focused on making the library easier to manage and more compatible with our design tools. (In an upcoming post, I’ll dive into why we’re now exploring a web component library built with Lit.)</p>\n<p>We used design tokens directly imported from Figma. Any updates in Figma were reflected immediately in the application. We also implemented a simple theming system that allowed clients to have their own themes within a controlled range. For specific customizations, we encouraged app-level overrides to keep the library itself lean and efficient.</p>\n<blockquote>\n<p>“Design systems don’t fail because people ignore the rules; they fail because people lose faith that the rules will work.” – <a href=\"https://www.linkedin.com/pulse/broken-promises-design-systems-why-following-rules-wont-itai-vonshak-g2huf/\">Itai Vonshak</a></p>\n</blockquote>\n<p>The issues described in Itai Vonshak’s post, such as teams losing trust in a design system due to unworkable rules, have not arisen in our case, thanks to the clarity and predictability built into our process. Our dedicated design system approach continues to work well, avoiding the challenges many teams face when navigating multiple, conflicting frameworks.</p>\n<h2 id=\"cleaning-house-and-gaining-performance\" tabindex=\"-1\">Cleaning House and Gaining Performance <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/\">#</a></h2>\n<p>Despite our progress, parts of the old MUI and custom system still polluted our codebase. So, we formed a dedicated team to remove deprecated code, replace legacy components, and sync updates across teams. The results were immediate and clear:</p>\n<ul>\n<li>Improved performance: By reducing JavaScript bundle sizes by up to 28%, apps ran faster and Lighthouse scores improved for performance with over 19 points.</li>\n<li>Increased clarity: With one single source of truth in Figma, everyone, from designers to developers, knew exactly which components to use and how.</li>\n<li>Enhanced client satisfaction: Stakeholders saw their branding implemented correctly, and new tenants found it easier to adopt the system.</li>\n</ul>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/7LgM39jp_9-360.avif 360w, https://b.polente.de/img/7LgM39jp_9-608.avif 608w, https://b.polente.de/img/7LgM39jp_9-925.avif 925w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/7LgM39jp_9-360.webp 360w, https://b.polente.de/img/7LgM39jp_9-608.webp 608w, https://b.polente.de/img/7LgM39jp_9-925.webp 925w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/7LgM39jp_9-360.png 360w, https://b.polente.de/img/7LgM39jp_9-608.png 608w, https://b.polente.de/img/7LgM39jp_9-925.png 925w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A line chart with five differently colored lines displays values between 0 and 800 over a period from mid-February to mid-March. The lines remain mostly stable with occasional downward steps.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/7LgM39jp_9-360.png\" width=\"925\" height=\"326\"></picture></p>\n<h2 id=\"built-in-accessibility-and-future-proofing\" tabindex=\"-1\">Built-In Accessibility and Future Proofing <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/\">#</a></h2>\n<p>With the upcoming EUAA 25 regulations on accessibility, having components that for example inherently meet contrast standards and include proper labeling will put us ahead of the curve. Accessibility is no longer an afterthought; it’s built into the foundation of our design system.</p>\n<h2 id=\"results-on-lighthouse\" tabindex=\"-1\">Results on Lighthouse <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/\">#</a></h2>\n<p>Over the years, our Google Lighthouse measurements have provided valuable insights beyond just package sizes, and the results have been truly impressive.</p>\n<h3 id=\"before-core-mui-was-out\" tabindex=\"-1\">Before Core MUI was out <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/dEU2NcaVJw-360.avif 360w, https://b.polente.de/img/dEU2NcaVJw-608.avif 608w, https://b.polente.de/img/dEU2NcaVJw-960.avif 960w, https://b.polente.de/img/dEU2NcaVJw-974.avif 974w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/dEU2NcaVJw-360.webp 360w, https://b.polente.de/img/dEU2NcaVJw-608.webp 608w, https://b.polente.de/img/dEU2NcaVJw-960.webp 960w, https://b.polente.de/img/dEU2NcaVJw-974.webp 974w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/dEU2NcaVJw-360.png 360w, https://b.polente.de/img/dEU2NcaVJw-608.png 608w, https://b.polente.de/img/dEU2NcaVJw-960.png 960w, https://b.polente.de/img/dEU2NcaVJw-974.png 974w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Google Lighthouse report with a performance score of 72. 'Largest Contentful Paint' is 1.7s, 'Total Blocking Time' 470ms. Accessibility: 100.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/dEU2NcaVJw-360.png\" width=\"974\" height=\"770\"></picture></p>\n<h3 id=\"after-core-mui-was-out\" tabindex=\"-1\">After Core MUI was out <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/Uv90WtBCKc-360.avif 360w, https://b.polente.de/img/Uv90WtBCKc-608.avif 608w, https://b.polente.de/img/Uv90WtBCKc-960.avif 960w, https://b.polente.de/img/Uv90WtBCKc-1011.avif 1011w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/Uv90WtBCKc-360.webp 360w, https://b.polente.de/img/Uv90WtBCKc-608.webp 608w, https://b.polente.de/img/Uv90WtBCKc-960.webp 960w, https://b.polente.de/img/Uv90WtBCKc-1011.webp 1011w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/Uv90WtBCKc-360.png 360w, https://b.polente.de/img/Uv90WtBCKc-608.png 608w, https://b.polente.de/img/Uv90WtBCKc-960.png 960w, https://b.polente.de/img/Uv90WtBCKc-1011.png 1011w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Google Lighthouse report with a performance score of 91. 'Largest Contentful Paint' is 1.0s, 'Total Blocking Time' 220ms. Accessibility: 100.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/Uv90WtBCKc-360.png\" width=\"1011\" height=\"779\"></picture></p>\n<p>Needless to say, these results exclude third-party services like GTM, Analytics, Pendo, or cookie banner providers, as they are beyond our direct control.</p>\n<h2 id=\"final-thoughts\" tabindex=\"-1\">Final Thoughts <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ReplacingMUIANewDesignSystemApproach/\">#</a></h2>\n<p>This effort has made our system easier to maintain and more useful for designers, developers, and clients. While we have more steps ahead, this phase of the journey highlights the value of thoughtful, deliberate change. If you have questions or want to learn more, please reach out.</p>\n",
			"date_published": "2025-03-14T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/",
			"url": "https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/",
			"title": "The Wonderful World of AI in Software Development",
			"content_html": "<h2 id=\"from-the-future-no-one-saw-coming\" tabindex=\"-1\">From the Future No One Saw Coming <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/6Z5wFpBxUv-360.avif 360w, https://b.polente.de/img/6Z5wFpBxUv-608.avif 608w, https://b.polente.de/img/6Z5wFpBxUv-960.avif 960w, https://b.polente.de/img/6Z5wFpBxUv-1240.avif 1240w, https://b.polente.de/img/6Z5wFpBxUv-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/6Z5wFpBxUv-360.webp 360w, https://b.polente.de/img/6Z5wFpBxUv-608.webp 608w, https://b.polente.de/img/6Z5wFpBxUv-960.webp 960w, https://b.polente.de/img/6Z5wFpBxUv-1240.webp 1240w, https://b.polente.de/img/6Z5wFpBxUv-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/6Z5wFpBxUv-360.png 360w, https://b.polente.de/img/6Z5wFpBxUv-608.png 608w, https://b.polente.de/img/6Z5wFpBxUv-960.png 960w, https://b.polente.de/img/6Z5wFpBxUv-1240.png 1240w, https://b.polente.de/img/6Z5wFpBxUv-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"This image shows a futuristic cityscape with AI-powered robots working on software development. The robots are collaborating with human engineers in a high-tech environment.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/6Z5wFpBxUv-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h3 id=\"welcome-to-the-ai-wonderland\" tabindex=\"-1\">Welcome to the AI Wonderland <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h3>\n<p>Imagine we live in a world where software is developed entirely by Artificial Intelligence (AI). Developers? Obsolete. Fundamentals like OWASP or Non-Functional Requirements (NFRs)? Outdated. Data protection, accessibility, performance, security, SEO, compliance? Oh, who needs those when we have the genius of AI to handle it all?</p>\n<h3 id=\"the-new-era-of-developer-training\" tabindex=\"-1\">The New Era of Developer Training <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h3>\n<p>Why should we burden our up-and-coming talent with the basics of software development? Instead, let’s offer them crash courses in <em>“AI Operation for Dummies.”</em> After all, AI can do it all, right? And if it doesn’t… well, tough luck. The algorithms will get better eventually — or so we hope.</p>\n<p>But wait — what happens when these <em>“AI operators”</em> don’t understand the implications of what they’re deploying? Will they even know how to spot the cracks forming in the digital foundation, or will they simply shrug and reboot their favorite AI tool?</p>\n<h3 id=\"production-ready-ai-software\" tabindex=\"-1\">Production-Ready AI Software <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h3>\n<h4 id=\"an-adventure\" tabindex=\"-1\">An Adventure <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h4>\n<p>Who can’t wait to see AI-generated software in production? Certainly not the security officers, who are already looking forward to the upcoming data leaks and hacks. But hey, a little thrill has never hurt anyone, right?</p>\n<p>What about the subtle bugs — those that erode trust over time? Or the misunderstood context in a decision-making process? How about that time AI <em>“accidentally”</em> decided certain users didn’t deserve access to a feature due to bias in its training data?</p>\n<h3 id=\"trust-is-good-ai-is-better\" tabindex=\"-1\">Trust is Good, AI is Better <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h3>\n<p>Why still use humans for software validation when AI can do it much faster? And if some sensitive information leaks in the process — so what? Transparency is the buzzword of the hour. Except, transparency only works if someone understands what’s being made transparent.</p>\n<p>Let’s talk about gatekeeping. Where do we build in control mechanisms? Do we rely on AI engineers — those same individuals who are incentivized to push technology boundaries — to also understand the human, ethical, and regulatory impacts? Or do we need a new breed of professionals entirely?</p>\n<p><em>“Human people that understand real risks and issues”</em> may sound redundant, but isn’t this exactly the point? Engineers are brilliant at building things, but are they the best at breaking them to understand the risks?</p>\n<h3 id=\"the-role-of-gatekeepers\" tabindex=\"-1\">The Role of Gatekeepers <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h3>\n<p>When does AI become dangerous? Not in the dramatic <em>“take over the world”</em> way, but in the more insidious, slow-destruction way: eroding privacy, embedding societal bias, amplifying inequalities, and creating dependency.</p>\n<p>Who sets the boundaries? Engineers focused on innovation might not fully appreciate the risks — does the world need more <em>“technological ethicists”</em> or <em>“AI moderators”</em> who understand the human consequences of technology?</p>\n<p>Isn’t it time for engineers, regulators, and yes, even philosophers, to collaborate on keeping AI in check? Or are we simply handing over the keys and hoping for the best?</p>\n<h3 id=\"the-coming-challenges\" tabindex=\"-1\">The Coming Challenges <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h3>\n<h4 id=\"a-piece-of-cake-for-ai\" tabindex=\"-1\">A Piece of Cake for AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h4>\n<p>AI can handle everything, right? Data breaches, accessibility problems, performance hits, and security gaps — it’s got this! And if not? Well, who cares about the fallout when we’re all busy being mesmerized by the shiny new tech?</p>\n<p>Except, here’s the rub: AI is only as good as the data it’s fed, the biases it learns, and the oversight it lacks.</p>\n<p>What happens when:</p>\n<ul>\n<li>Data integrity isn’t prioritized, leading to garbage-in, garbage-out problems?</li>\n<li>Accessibility becomes an afterthought because AI doesn’t <em>“see”</em> disabilities?</li>\n<li>Security gaps go unpatched because the system decided those were <em>“low risk”</em>?</li>\n<li>Ethics become a footnote in the race to innovate?</li>\n</ul>\n<p>Without a human safety net, these problems compound into systems that not only fail but fail spectacularly and at scale.</p>\n<h3 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h3>\n<h4 id=\"long-live-ai-but-let-s-think-this-through\" tabindex=\"-1\">Long Live AI (But Let’s Think This Through) <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TheWonderfulWorldOfAIInSoftwareDevelopment/\">#</a></h4>\n<p>So, let’s all jump on the AI bandwagon! But be careful: Don’t get run over by the wheels. As the saying goes, <em>“He who laughs last, laughs best.”</em></p>\n<p>AI is incredible, transformative, and undeniably useful. But blind trust in technology leads to predictable disasters. Where’s the balance? Who is responsible for ensuring the tools we trust are also trustworthy?</p>\n<p>It’s time to ask the hard questions:</p>\n<ul>\n<li>Are AI engineers the right people to act as the last line of defense?</li>\n<li>Do we need professionals who can understand human risks alongside technical ones?</li>\n<li>Is it even possible to control a technology as fast-moving and complex as AI without new systems of checks and balances?</li>\n</ul>\n<p>Stay critical. Question the hype. Remember: not everything that glitters is gold. Sometimes, it’s just fool’s gold wrapped in an algorithm.</p>\n<p>What do you think? Who should hold the reins in this AI-driven future? Engineers, philosophers, or someone else entirely?</p>\n",
			"date_published": "2024-12-22T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/EmbracingTheFreedomOfCustomExperiencePipelines/",
			"url": "https://b.polente.de/blog/EmbracingTheFreedomOfCustomExperiencePipelines/",
			"title": "Escaping the Golden Cage of Design Systems",
			"content_html": "<h2 id=\"the-freedom-of-custom-experience-pipelines\" tabindex=\"-1\">The Freedom of Custom Experience Pipelines <a class=\"header-anchor\" href=\"https://b.polente.de/blog/EmbracingTheFreedomOfCustomExperiencePipelines/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/f-90JMegcq-360.avif 360w, https://b.polente.de/img/f-90JMegcq-608.avif 608w, https://b.polente.de/img/f-90JMegcq-960.avif 960w, https://b.polente.de/img/f-90JMegcq-1240.avif 1240w, https://b.polente.de/img/f-90JMegcq-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/f-90JMegcq-360.webp 360w, https://b.polente.de/img/f-90JMegcq-608.webp 608w, https://b.polente.de/img/f-90JMegcq-960.webp 960w, https://b.polente.de/img/f-90JMegcq-1240.webp 1240w, https://b.polente.de/img/f-90JMegcq-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/f-90JMegcq-360.png 360w, https://b.polente.de/img/f-90JMegcq-608.png 608w, https://b.polente.de/img/f-90JMegcq-960.png 960w, https://b.polente.de/img/f-90JMegcq-1240.png 1240w, https://b.polente.de/img/f-90JMegcq-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/f-90JMegcq-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<p>In his article, <a href=\"https://www.linkedin.com/pulse/broken-promises-design-systems-why-following-rules-wont-itai-vonshak-g2huf\">The Broken Promises of Design Systems; Why Following the Rules Won’t Get You to Great Products, Itai Vonshak, VP of Design at Google</a>, reveals the hard truth about design systems. Having spent years leading the Material Design team, Vonshak argues that despite their promise of efficiency and consistency, design systems have become rigid frameworks that stifle creativity and innovation.</p>\n<p>I couldn’t agree more with Vonshak's critique. Design systems, like Material UI, indeed lock designers and developers into a pre-defined box. They may offer convenience and structure, but it’s a convenience that comes at a cost. Once you adopt these systems, you’re trapped in their ecosystem, forced to follow their updates and adapt to their changes — a golden cage, if you will. It reminds me of the dilemma faced by users who want to switch hardware but find themselves stuck with software features they cannot easily leave behind.</p>\n<p>In my approach, I steer clear of ready-made components. Instead, I work with clients to build continuous experience pipelines — flexible, tailor-made systems designed specifically for their needs and branding (CI). These pipelines go beyond the boundaries of traditional design systems, offering a dynamic foundation that evolves with the business. We create modular components that are small and adaptable, allowing teams to innovate, reinvent, and reshape experiences freely.</p>\n<p>Unlike rigid design systems, our continuous experience pipelines allow clients to redraw and layer their components effortlessly. This adaptability ensures that teams are not bound by limitations and can stay ahead, even as trends and technologies change.</p>\n<p>So while I recognize the allure of design systems, I also see their limitations. If your goal is to create truly innovative and adaptable digital products, the key is to build solutions that are not only consistent but also dynamic and responsive to change.</p>\n<p>Check my <a href=\"https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/\">previous thoughts on experience pipelines</a> for a deeper dive into building an effective experience pipeline.</p>\n",
			"date_published": "2024-10-11T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/BridgingtheGapNavigatingAI/",
			"url": "https://b.polente.de/blog/BridgingtheGapNavigatingAI/",
			"title": "AI, Digital Transformation, and the Future of Experience Engineering",
			"content_html": "<h2 id=\"introduction\" tabindex=\"-1\">Introduction <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h2>\n<p>Over my 30-year career as a leading Director and Experience Engineering Specialist at Publicis Sapient, I've witnessed countless technological shifts. My passion lies in creating high-performing, accessible webpages — ensuring that non-functional requirements aren't just met but exceeded. As AI continues to permeate our industry, I find myself contemplating its impact on our work and how we can harness it without losing the human touch that makes technology truly resonate.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/Hcs1M3EAtO-360.avif 360w, https://b.polente.de/img/Hcs1M3EAtO-608.avif 608w, https://b.polente.de/img/Hcs1M3EAtO-960.avif 960w, https://b.polente.de/img/Hcs1M3EAtO-1240.avif 1240w, https://b.polente.de/img/Hcs1M3EAtO-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/Hcs1M3EAtO-360.webp 360w, https://b.polente.de/img/Hcs1M3EAtO-608.webp 608w, https://b.polente.de/img/Hcs1M3EAtO-960.webp 960w, https://b.polente.de/img/Hcs1M3EAtO-1240.webp 1240w, https://b.polente.de/img/Hcs1M3EAtO-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/Hcs1M3EAtO-360.png 360w, https://b.polente.de/img/Hcs1M3EAtO-608.png 608w, https://b.polente.de/img/Hcs1M3EAtO-960.png 960w, https://b.polente.de/img/Hcs1M3EAtO-1240.png 1240w, https://b.polente.de/img/Hcs1M3EAtO-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/Hcs1M3EAtO-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h2 id=\"tl-dr\" tabindex=\"-1\">TL;DR? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h2>\n<p>This post explores how AI tools can streamline development while highlighting the importance of human oversight. It discusses potential risks like overreliance on proprietary tools, lack of specialist input, and limitations in AI’s current capabilities. The article emphasizes that human expertise is critical for ensuring accessibility, performance, and compliance, particularly in highly regulated industries. Overall, it promotes a balanced approach to AI integration while preserving human creativity and judgment and opportunities for people in technology.</p>\n<h2 id=\"the-current-ai-landscape-and-potential-pitfalls\" tabindex=\"-1\">The Current AI Landscape and Potential Pitfalls <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h2>\n<p>While all companys heavily invest in AI, I've observed potential dangers in how it's being integrated:</p>\n<h3 id=\"overreliance-on-proprietary-tools\" tabindex=\"-1\">Overreliance on Proprietary Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Startups and tech companies are increasingly developing AI tools aimed at automating coding tasks to reduce costs and accelerate development. While these proprietary tools can be cost-effective, they often lack the nuanced understanding of specific industries or client-specific needs. This overreliance on generic AI solutions can lead to several issues:</p>\n<ul>\n<li>Firstly, these tools may produce code that is too generalized, failing to address the unique challenges or compliance requirements of specialized sectors like healthcare, finance, or government services. For instance, an AI tool might not account for specific data privacy regulations such as HIPAA or GDPR, leading to potential legal complications.</li>\n<li>Secondly, integration issues can arise when the AI-generated code doesn't mesh well with existing systems or technology stacks that the client uses. This can result in increased costs and time delays as developers have to manually adjust or rewrite code to ensure compatibility.</li>\n<li>Moreover, scalability problems can surface because proprietary tools might not optimize for performance under varying loads, especially in applications expected to grow rapidly or handle large volumes of data. Without careful tuning, the code may not scale effectively, leading to poor user experience and system instability.</li>\n</ul>\n<p>Security vulnerabilities are another concern. AI tools might not follow best practices for secure coding, making the applications susceptible to attacks. Issues like improper input validation, insecure authentication mechanisms, or flawed encryption implementations could be overlooked by AI but would be caught by experienced developers.</p>\n<p>Additionally, these tools may not keep pace with rapidly evolving technologies. As programming languages and frameworks update, proprietary AI tools may lag, leading to technical debt. This hinders innovation, as the codebase becomes outdated and more difficult to maintain or upgrade.</p>\n<p>In essence, while proprietary AI tools offer enticing benefits, an overreliance on them without sufficient human oversight and industry-specific knowledge can compromise the quality, security, and effectiveness of the software solutions provided to clients.</p>\n<h3 id=\"lack-of-specialist-input\" tabindex=\"-1\">Lack of Specialist Input <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Digital business transformation is not just about adopting new technologies; it requires specialists who deeply understand both the technological landscape and the client's unique business context. Without specialist input, organizations risk implementing solutions that are misaligned with strategic objectives, fail to meet regulatory compliance, or lack scalability.</p>\n<p>Specialists bring critical insights into industry best practices, emerging trends, and user experience design, ensuring that the transformation delivers real value and competitive advantage. They understand the subtleties of the client's industry, including customer expectations, competitive pressures, and regulatory environments.</p>\n<p>For example, in highly regulated industries like finance or healthcare, specialists are essential to navigate complex compliance requirements. They ensure that data handling meets legal standards, that security protocols are robust, and that reporting mechanisms are in place.</p>\n<p>Moreover, specialists can tailor solutions to enhance user experience by understanding the end-users' needs and behaviors. They can make informed decisions on interface design, accessibility features, and performance optimizations that generic AI tools might overlook.</p>\n<p>They also play a crucial role in future-proofing the technology stack, selecting scalable and flexible architectures that can adapt to changing business needs or technological advancements. Without their input, organizations might adopt solutions that become obsolete within a few years, leading to additional costs and disruptions.</p>\n<p>In summary, the lack of specialist input can result in missed opportunities, inefficiencies, and increased risks. Specialists ensure that digital transformation efforts are strategically aligned, technically sound, and deliver sustainable value.</p>\n<h3 id=\"manual-processes-remain-critical\" tabindex=\"-1\">Manual Processes Remain Critical <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Despite significant advancements in AI and automation, much of our code remains hand-written, and setups are manually configured. This is due to the highly customized and diverse requirements of each client and application, which automated tools cannot fully accommodate.</p>\n<p>Manual coding allows developers to tailor solutions precisely to client needs, implementing custom features and functionalities that differentiate the client's offerings in the market. It also enables them to optimize performance, ensuring that applications run efficiently under specific conditions or workloads.</p>\n<p>Moreover, manual processes are essential for ensuring security and compliance standards are met. Developers can implement security measures that are specifically designed to protect against known vulnerabilities within the context of the client's industry. They can also ensure that the code adheres to regulatory requirements, such as accessibility standards (e.g., WCAG), data protection laws, and industry-specific regulations.</p>\n<p>Additionally, manual coding enables flexibility and adaptability. Developers can quickly adjust to changing requirements, unexpected challenges, or new insights gained during the development process. This agility is crucial in today's fast-paced technology environment, where the ability to innovate and respond to market changes can be a significant competitive advantage.</p>\n<p>Furthermore, manual processes facilitate better code quality through practices like code reviews, pair programming, and thorough testing. These practices help catch errors, improve maintainability, and enhance overall software quality, which automated tools alone might not achieve.</p>\n<p>In conclusion, while AI and automation offer valuable support, manual processes remain critical for delivering customized, secure, and high-quality software solutions that meet the unique needs of each client.</p>\n<h2 id=\"my-practical-use-of-generative-ai\" tabindex=\"-1\">My Practical Use of Generative AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h2>\n<p>I've embraced Generative AI in several aspects of my work:</p>\n<ul>\n<li>Crafting blog posts and enhancing documentation.</li>\n<li>Writing unit tests and fixing code flagged by linters or SonarCloud.</li>\n<li>Generating documentation comments in code.</li>\n<li>Writing Jira tickets with detailed requirements.</li>\n<li>Creating agents to assist with personal projects like <a href=\"http://recipe.polente.de/\">recipe.polente.de</a>.</li>\n<li>Simplifying complex PowerPoint presentations into executive summaries.</li>\n</ul>\n<h2 id=\"the-limitations-we-re-facing\" tabindex=\"-1\">The Limitations We're Facing <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h2>\n<h3 id=\"inefficiency-with-unique-prompts\" tabindex=\"-1\">Inefficiency with Unique Prompts <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Existing AI-assisted coding tools like GitHub Copilot or our internal ones require developers to craft specific prompts for each individual task, which can reduce overall efficiency. This necessity for constant prompt customization can interrupt the natural workflow, as developers must shift their focus from coding to formulating the right prompts. In complex projects with unique requirements, this can be particularly cumbersome, as generic prompts often yield inadequate or irrelevant suggestions. The time spent tweaking prompts to achieve the desired output may negate the efficiency gains these tools promise. Additionally, the cognitive load of continually generating precise prompts can lead to fatigue, making these tools less appealing for daily use in intricate development environments.</p>\n<h3 id=\"lack-of-mind-blowing-tools\" tabindex=\"-1\">Lack of Mind-Blowing Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Current AI tools haven't yet revolutionized day-to-day work in the same transformative way that intelligent code editors did with features like dependency tracking and property insights. While AI offers helpful suggestions and can automate certain repetitive tasks, it hasn't provided a leap in productivity or capability that fundamentally changes how developers work. The enhancements are incremental rather than groundbreaking, lacking the &quot;mind-blowing&quot; impact that shifts paradigms in software development. Developers are still waiting for AI solutions that can understand context deeply, anticipate needs, and offer innovative solutions—tools that could, for instance, refactor code intelligently or optimize algorithms without explicit instructions. Until such advancements are realized, AI will remain a supplementary aid rather than a transformative force in coding.</p>\n<h3 id=\"resistance-to-change\" tabindex=\"-1\">Resistance to Change <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Developers focused on their daily tasks may find it challenging to integrate AI tools effectively, as they're often under pressure to deliver features promptly. This focus on immediate requirements can make them hesitant to adopt new technologies that require time to learn and may initially disrupt their established workflows. There's also a natural skepticism toward unproven tools — developers might question the reliability of AI-generated code or worry about potential security implications. Moreover, the learning curve associated with new AI tools can be a deterrent when project deadlines are tight. Organizational culture plays a role too; without encouragement and support from leadership to experiment and innovate, developers may stick to familiar methods that guarantee timely delivery.</p>\n<h2 id=\"the-ongoing-need-for-human-expertise\" tabindex=\"-1\">The Ongoing Need for Human Expertise <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h2>\n<p>As AI-generated content becomes more prevalent, human oversight remains crucial:</p>\n<h3 id=\"accessibility-concerns\" tabindex=\"-1\">Accessibility Concerns <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Auto-generated alternative texts provided by AI tools are often insufficient, lacking the depth and context necessary to make content truly accessible. While AI can generate basic descriptions, these are frequently too generic or miss critical nuances, leading to a subpar experience for users who rely on screen readers or other assistive technologies. For example, an AI might label an image simply as &quot;dog,&quot; without conveying that it's a guide dog assisting a person with visual impairments, which is vital contextual information. Manual review and editing are essential to ensure that alt texts accurately and effectively describe content, thereby maintaining inclusivity and adhering to standards like the Web Content Accessibility Guidelines (WCAG). As accessibility advocates point out, relying solely on AI can inadvertently widen the accessibility gap, making human oversight indispensable.</p>\n<h3 id=\"performance-optimization\" tabindex=\"-1\">Performance Optimization <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Excessive or unoptimized code generation by AI can significantly hinder application performance, especially for users with limited connectivity or low-end devices. AI tools might generate code that is functional but not optimized for speed or resource efficiency, leading to longer load times and a sluggish user experience. This is a critical concern in a world where users expect fast, responsive applications and where network conditions vary widely. Developers need to manually assess and refactor AI-generated code to eliminate redundancies, optimize algorithms, and reduce file sizes. Techniques such as minification, code splitting, and leveraging tools like PostCSS for processing stylesheets are still necessary to enhance performance. Human intervention ensures that applications are accessible to a broader audience by performing well even under constrained conditions.</p>\n<h3 id=\"regulatory-compliance\" tabindex=\"-1\">Regulatory Compliance <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>With the rise of legal regulations focusing on digital accessibility and usability, such as the Americans with Disabilities Act (ADA) and the European Accessibility Act, it's imperative that AI-generated content meets these standards. Relying solely on AI for content creation can result in non-compliance due to oversights that machines might not catch. For instance, AI might not adequately address color contrast requirements, keyboard navigation, or proper labeling of form elements — all crucial for accessibility compliance. Non-compliance can lead to legal repercussions, financial penalties, and damage to a company's reputation. Therefore, organizations must invest in human expertise to review and adjust AI outputs, ensuring that all regulatory requirements are met and that the content is accessible to everyone.</p>\n<h3 id=\"quality-assurance\" tabindex=\"-1\">Quality Assurance <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>While automated testing tools and AI-driven QA processes can handle routine checks and identify obvious bugs, they fall short in areas requiring human judgment and intuition. Non-functional requirements — such as usability, user experience, and emotional resonance — are difficult to quantify and test automatically. Human QA professionals can explore the application from the user's perspective, uncovering issues related to navigation flow, content clarity, and overall satisfaction that automated tests might miss. Moreover, they can assess how well the application aligns with the client's brand values and user expectations. This human touch is crucial to ensure that the final product is not only functionally correct but also delivers a high-quality experience that meets or exceeds user needs and business goals.</p>\n<h2 id=\"the-role-of-companies-that-sell-digital-business-transformation\" tabindex=\"-1\">The Role of Companies that sell Digital Business Transformation <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h2>\n<h3 id=\"implement-ai-responsibly\" tabindex=\"-1\">Implement AI Responsibly <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Implementing AI responsibly means guiding clients through digital transformation by integrating AI tools that genuinely align with their business needs. This involves a thorough analysis of the client's objectives, challenges, and existing infrastructure to select or customize AI solutions that add real value. Responsible implementation considers not just the immediate benefits but also the long-term implications, including data privacy, security, and ethical considerations. It requires collaboration between AI specialists and industry experts to ensure that the technology enhances operational efficiency without compromising on quality or integrity. By focusing on responsible AI adoption, we help clients navigate the complexities of modern technology while safeguarding their reputation and fostering trust with their customers.</p>\n<h3 id=\"maintain-human-centric-design\" tabindex=\"-1\">Maintain Human-Centric Design <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Maintaining a human-centric design approach is crucial in an era increasingly dominated by AI-generated solutions. This means ensuring that creativity, empathy, and collaborative brainstorming with clients remain at the forefront of the development process. Rather than relying solely on AI-generated ideas, we prioritize human insights to capture the nuances of user experience that machines might overlook. This approach fosters innovation by combining the strengths of AI — such as data analysis and pattern recognition — with human abilities like critical thinking and emotional intelligence. By keeping the focus on people, we design products and services that are not only technologically advanced but also intuitive, accessible, and deeply resonant with end-users.</p>\n<h3 id=\"provide-governance-and-oversight\" tabindex=\"-1\">Provide Governance and Oversight <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>Providing governance and oversight is essential to prevent AI from reducing inclusivity and to ensure that tools consider visual, auditory, and textual elements collectively. This involves establishing clear policies and guidelines for AI development and deployment, focusing on inclusivity and accessibility from the outset. Governance structures help monitor AI outputs for biases or gaps that could exclude or disadvantage certain user groups. Oversight ensures that AI tools are designed to accommodate diverse needs, such as supporting screen readers for the visually impaired, offering captions for auditory content, and ensuring that textual information is clear and comprehensible. By proactively managing these aspects, we create technology solutions that are equitable and accessible, upholding ethical standards and complying with legal regulations related to inclusivity.</p>\n<h2 id=\"my-vision-for-the-next-decade\" tabindex=\"-1\">My Vision for the Next Decade <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h2>\n<h3 id=\"collaborative-tool-usage\" tabindex=\"-1\">Collaborative Tool Usage <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>In the future, we'll engage in <strong>collaborative tool usage</strong> by working closely with clients using advanced AI tools to select the right technology stack — whether on-premise or in the cloud. This collaborative approach ensures that the solutions are tailored to the client's specific needs and business objectives. By prompting AI together, we can leverage the combined expertise of our team and the client's insights to make informed decisions about the technologies that will drive their digital transformation. This joint effort fosters a sense of ownership and alignment, making the implementation process more efficient and effective. It also helps in demystifying AI for clients, empowering them to actively participate in shaping their technological future. Through this partnership, we can navigate the complexities of modern tech landscapes, ensuring that the chosen solutions are scalable, secure, and adaptable to evolving needs.</p>\n<h3 id=\"ensuring-safety-and-scalability\" tabindex=\"-1\">Ensuring Safety and Scalability <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p><strong>Ensuring safety and scalability</strong> becomes paramount after AI generates the initial code. The real work begins with developers meticulously verifying that the code meets stringent standards for security, performance, accessibility, and maintainability. This involves conducting comprehensive code reviews to identify potential vulnerabilities or inefficiencies that AI might have overlooked. We must test the application's ability to handle increased loads, ensuring it can scale without compromising performance or user experience. Accessibility checks are crucial to guarantee that the application is usable by people with disabilities, adhering to legal regulations like the ADA or WCAG. By addressing these critical aspects, we transform AI-generated code into robust, reliable solutions that can stand the test of time and usage, ultimately delivering value that meets or exceeds client and user expectations.</p>\n<h3 id=\"human-oversight-in-ai-maintenance\" tabindex=\"-1\">Human Oversight in AI Maintenance <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>As applications evolve, <strong>human oversight in AI maintenance</strong> is essential to manage and extend AI-generated code without unnecessary bloat. We'll need strategies to optimize and refine the codebase, similar to how we use tools like minifiers or PostCSS today for performance enhancement. Developers will play a crucial role in reviewing AI outputs, identifying redundant or inefficient code, and refactoring where necessary to improve readability and maintainability. This ongoing maintenance ensures that the application remains efficient, secure, and adaptable to new requirements or technologies. Human expertise is vital for implementing best practices, adhering to coding standards, and integrating new features seamlessly. By actively managing the AI-generated code, also via AI, we prevent technical debt from accumulating and ensure that the application continues to meet high performance and quality standards over time.</p>\n<h3 id=\"ongoing-demand-for-expertise\" tabindex=\"-1\">Ongoing Demand for Expertise <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h3>\n<p>The <strong>ongoing demand for expertise</strong> will remain strong, as companies desperately need professionals who understand and can refine AI outputs to meet high standards. While AI can automate certain coding tasks, it lacks the ability to fully grasp complex business logic, user experience nuances, and the ethical considerations necessary for responsible technology deployment. Professionals with deep knowledge in software development, architecture, accessibility, and performance optimization are indispensable for interpreting AI-generated code and aligning it with real-world needs. They provide the critical thinking and creativity that machines cannot replicate, ensuring that technology solutions are innovative, user-friendly, and compliant with regulatory requirements. This sustained need for skilled experts highlights the importance of continuous learning and adaptation in the tech industry, affirming that human talent remains at the heart of successful digital transformation efforts.</p>\n<h2 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/BridgingtheGapNavigatingAI/\">#</a></h2>\n<p>AI is an incredible tool that, when used correctly, can enhance our work and drive innovation. Its ability to automate repetitive tasks, analyze vast amounts of data, and generate preliminary code can significantly accelerate development processes. By integrating AI responsibly, we can focus more on complex problem-solving and strategic planning, allowing AI to handle routine activities. This symbiotic relationship between AI and human effort can lead to more efficient workflows, innovative solutions, and a faster time-to-market for products and services.</p>\n<p>However, it doesn't replace the need for human expertise — especially in areas like accessibility, performance, and user experience. AI lacks the nuanced understanding and empathy required to address the diverse needs of all users. For instance, auto-generated code or content might not meet accessibility standards, potentially excluding users with disabilities. Performance optimization often demands a level of creativity and context-awareness that AI has yet to master, such as anticipating user behavior under different network conditions or device capabilities. User experience design is inherently human-centric, relying on an understanding of human emotions, cultural nuances, and ethical considerations that AI cannot replicate. Therefore, specialists are essential to interpret AI outputs, make informed decisions, and ensure that the end products are inclusive, efficient, and resonate with users on a deeper level.</p>\n<p>By embracing AI while continuing to apply our specialized knowledge, we can ensure that technology serves everyone effectively. This means leveraging AI's strengths to enhance our capabilities without overlooking the critical importance of human judgment and creativity. Professionals can guide AI tools to align with specific business objectives, regulatory requirements, and ethical standards. Collaborative efforts between AI and humans can lead to more robust, scalable, and adaptable solutions. As we navigate the future of digital transformation, maintaining this balance will be key to delivering technology that is not only advanced but also accessible, user-friendly, and sustainable. Together, we can create a technological landscape where AI amplifies human potential, and human expertise ensures that technology remains aligned with the needs and values of society.</p>\n",
			"date_published": "2024-09-20T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/PSSpeed/",
			"url": "https://b.polente.de/blog/PSSpeed/",
			"title": "Speed forever",
			"content_html": "<h2 id=\"introduction\" tabindex=\"-1\">Introduction <a class=\"header-anchor\" href=\"https://b.polente.de/blog/PSSpeed/\">#</a></h2>\n<p>In today's fast-paced digital world, transformation is not just an option—it's a necessity. At Publicis Sapient, we've embraced this imperative with our <a href=\"https://www.publicissapient.com/publicis-sapient-brings-its-speed-philosophy-to-digital-business\">SPEED</a> philosophy, guiding businesses to navigate and thrive in this dynamic landscape. Our approach integrates Strategy, Product, Experience, Engineering, and Data, creating a cohesive force that drives innovation and long-term success. The following song captures the essence of our philosophy, illustrating how these elements come together to unlock the limitless potential of digital transformation.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/llTZ-ykP-f-360.avif 360w, https://b.polente.de/img/llTZ-ykP-f-608.avif 608w, https://b.polente.de/img/llTZ-ykP-f-960.avif 960w, https://b.polente.de/img/llTZ-ykP-f-1240.avif 1240w, https://b.polente.de/img/llTZ-ykP-f-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/llTZ-ykP-f-360.webp 360w, https://b.polente.de/img/llTZ-ykP-f-608.webp 608w, https://b.polente.de/img/llTZ-ykP-f-960.webp 960w, https://b.polente.de/img/llTZ-ykP-f-1240.webp 1240w, https://b.polente.de/img/llTZ-ykP-f-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/llTZ-ykP-f-360.png 360w, https://b.polente.de/img/llTZ-ykP-f-608.png 608w, https://b.polente.de/img/llTZ-ykP-f-960.png 960w, https://b.polente.de/img/llTZ-ykP-f-1240.png 1240w, https://b.polente.de/img/llTZ-ykP-f-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/llTZ-ykP-f-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h2 id=\"lyrics\" tabindex=\"-1\">Lyrics <a class=\"header-anchor\" href=\"https://b.polente.de/blog/PSSpeed/\">#</a></h2>\n<p>The lyrics generated to describe <a href=\"https://www.publicissapient.com/publicis-sapient-brings-its-speed-philosophy-to-digital-business\">SPEED</a>:</p>\n<blockquote>\n<p>In the world of digital, where change never slows,\nPublicis Sapient brings a SPEED that flows,\nStrategy’s the start, where visions take flight,\nGuiding the path through the darkest of night.\nWith a hypothesis tested, priorities made clear,\nThey pave the way forward, dissolving the fear.</p>\n<p>SPEED’s the philosophy, the heart, and the core,\nTransforming businesses to be ready for more.\nStrategy, Product, Experience, and Data’s embrace,\nWith Engineering driving at a relentless pace.\nPublicis Sapient’s SPEED shows the way,\nTo lead in the digital world, where winners stay.</p>\n<p>Products evolve, at a rapid pace,\nBuilt to endure, not just for a race.\nExperience comes next, customer at the core,\nCreating value that keeps them wanting more.\nIn every touchpoint, in every interaction,\nSPEED fuels the journey to complete satisfaction.</p>\n<p>SPEED’s the philosophy, the heart, and the core,\nTransforming businesses to be ready for more.\nStrategy, Product, Experience, and Data’s embrace,\nWith Engineering driving at a relentless pace.\nPublicis Sapient’s SPEED shows the way,\nTo lead in the digital world, where winners stay.</p>\n<p>Engineering’s the promise that’s solid as steel,\nDelivering results with an unshakable zeal.\nAt pace and scale, they bring dreams to life,\nCutting through challenges, eliminating strife.\nTheir code is a craft, their solutions a blend,\nOf art and technology that knows no end.</p>\n<p>SPEED’s the philosophy, the heart, and the core,\nTransforming businesses to be ready for more.\nStrategy, Product, Experience, and Data’s embrace,\nWith Engineering driving at a relentless pace.\nPublicis Sapient’s SPEED shows the way,\nTo lead in the digital world, where winners stay.</p>\n<p>Data, the gold that’s mined with care,\nInsights revealed from every digital layer.\nValidating paths, uncovering the way,\nGuiding decisions that shape the next day.\nIn every byte, in every stored file,\nSPEED uncovers truths that make it worthwhile.</p>\n<p>SPEED’s the philosophy, the heart, and the core,\nTransforming businesses to be ready for more.\nStrategy, Product, Experience, and Data’s embrace,\nWith Engineering driving at a relentless pace.\nPublicis Sapient’s SPEED shows the way,\nTo lead in the digital world, where winners stay.</p>\n<p>Together these elements, when tightly aligned,\nCreate a force, the strongest you’ll find.\nSilos break down, collaboration thrives,\nIn this digital age, that’s how one survives.\nPublicis Sapient’s SPEED is the key,\nTo unlock the future, to set businesses free.</p>\n</blockquote>\n<h3 id=\"speed-version-1-the-heavy-one\" tabindex=\"-1\">Speed Version 1 - the heavy one <a class=\"header-anchor\" href=\"https://b.polente.de/blog/PSSpeed/\">#</a></h3>\n<audio controls=\"controls\">\n  <source type=\"audio/mp3\" src=\"https://b.polente.de/media/SpeedForEver_1.mp3\">\n  <source type=\"audio/wav\" src=\"https://b.polente.de/media/SpeedForEver_1.wav\">\n  <p>Your browser does not support the audio element.</p>\n</audio>\n<h3 id=\"speed-version-2-the-heavy-rap\" tabindex=\"-1\">Speed Version 2 - the heavy rap <a class=\"header-anchor\" href=\"https://b.polente.de/blog/PSSpeed/\">#</a></h3>\n<audio controls=\"controls\">\n  <source type=\"audio/mp3\" src=\"https://b.polente.de/media/SpeedForEver_2.mp3\">\n  <source type=\"audio/wav\" src=\"https://b.polente.de/media/SpeedForEver_2.wav\">\n  <p>Your browser does not support the audio element.</p>\n</audio>\n<h3 id=\"resources-and-links\" tabindex=\"-1\">Resources and Links <a class=\"header-anchor\" href=\"https://b.polente.de/blog/PSSpeed/\">#</a></h3>\n<ul>\n<li>Songs are created with AI and Suno</li>\n<li><a href=\"https://suno.com/song/2babe6d4-f601-4924-bbf8-c9f1c037a815\">Song 1 on Suno</a></li>\n<li><a href=\"https://suno.com/song/1ac799a2-07eb-44dd-970e-57538ebafb12\">Song 2 on Suno</a></li>\n</ul>\n",
			"date_published": "2024-08-12T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/",
			"url": "https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/",
			"title": "Tech Titans Unveil New Gadgets: Innovation or Intrusion?",
			"content_html": "<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/cQ66K6-1KA-360.avif 360w, https://b.polente.de/img/cQ66K6-1KA-608.avif 608w, https://b.polente.de/img/cQ66K6-1KA-960.avif 960w, https://b.polente.de/img/cQ66K6-1KA-1240.avif 1240w, https://b.polente.de/img/cQ66K6-1KA-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/cQ66K6-1KA-360.webp 360w, https://b.polente.de/img/cQ66K6-1KA-608.webp 608w, https://b.polente.de/img/cQ66K6-1KA-960.webp 960w, https://b.polente.de/img/cQ66K6-1KA-1240.webp 1240w, https://b.polente.de/img/cQ66K6-1KA-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/cQ66K6-1KA-360.png 360w, https://b.polente.de/img/cQ66K6-1KA-608.png 608w, https://b.polente.de/img/cQ66K6-1KA-960.png 960w, https://b.polente.de/img/cQ66K6-1KA-1240.png 1240w, https://b.polente.de/img/cQ66K6-1KA-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"An AI Driven search illustration\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/cQ66K6-1KA-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h2 id=\"yet-another-assistant-and-a-search-engine\" tabindex=\"-1\">Yet Another Assistant and a Search Engine? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/\">#</a></h2>\n<p>Once again, we see major companies like Google and OpenAI rolling out their latest offerings. Google introduces Pixie, a new assistant, and OpenAI follows with a brand new search engine. Excited? Perhaps not as much as one might expect.</p>\n<h3 id=\"google-pixie\" tabindex=\"-1\">Google Pixie <a class=\"header-anchor\" href=\"https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/\">#</a></h3>\n<p>Google's upcoming Pixel 9 smartphones are expected to introduce a new AI assistant named Pixie, powered by their Gemini large language model. Pixie aims to offer a more personalized experience compared to the current Google Assistant, leveraging data from various Google services like Maps and Gmail to perform complex and multimodal tasks. For example, Pixie could analyze a product in a photo and provide directions to the nearest store where it can be purchased.</p>\n<p>The Pixel 9 series, including the Pixel 9 and Pixel 9 Pro, is set to feature enhancements like Adaptive Touch to boost touch sensitivity, emphasizing user interaction and AI integration. These devices are expected to be smarter, utilizing advanced AI capabilities to differentiate from other Android devices, with Pixie being exclusive to Google's hardware.</p>\n<h3 id=\"open-ai-search\" tabindex=\"-1\">Open AI Search <a class=\"header-anchor\" href=\"https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/\">#</a></h3>\n<p>OpenAI is reportedly preparing to launch its own AI-powered search engine, which is expected to be a significant competitor to Google's search engine. This new search engine from OpenAI is likely to be integrated with ChatGPT, providing a combination of generative AI capabilities and conventional web search functionalities. This integration is anticipated to allow the search engine to deliver AI-generated summaries alongside traditional search results, enhancing the overall user experience with more relevant and contextually informed responses.</p>\n<p>The user interface of OpenAI's search engine is expected to be adaptive, showing AI summaries and search results side by side on desktop platforms, while on mobile devices, these might appear sequentially. This approach could enhance accessibility and usability across different devices, providing a seamless experience whether on a phone or a computer.</p>\n<h2 id=\"do-assistants-solve-a-real-problem\" tabindex=\"-1\">Do Assistants Solve a Real Problem? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/\">#</a></h2>\n<p>It's a familiar scenario: companies claim their smart assistants will simplify our lives. However, these gadgets often end up as expensive ornaments that seem more interested in our personal details than in genuinely assisting us.</p>\n<h2 id=\"openai-s-search-engine-just-another-data-issue\" tabindex=\"-1\">OpenAI's Search Engine: Just Another Data Issue? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/\">#</a></h2>\n<p>As OpenAI steps into the competitive arena with its new AI-driven search engine, skepticism arise about its true intent. Could this platform, armed with the power of ChatGPT, simply become another mechanism for data collection rather than a provider of unbiased search results? With its debut set to challenge established giants like Google, this initiative raises concerns about privacy and the potential for manipulative algorithms that prioritize profit over user benefit​.</p>\n<p>While the search engine promises enhanced user interactions through AI-generated content, it needs to be seen whether it will respect user privacy or follow the path of existing platforms that harvest user data. The tech community and consumers are watching closely. I may hope for a tool that prioritizes transparency and fairness in the age of information overload. But I may be wrong.</p>\n<h2 id=\"big-tech-s-profit-machine\" tabindex=\"-1\">Big Tech's Profit Machine <a class=\"header-anchor\" href=\"https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/\">#</a></h2>\n<p>These announcements are hardly surprising. Tech giants continuously churn out new products—not to better the world, but to line their pockets. Each new assistant and search engine seems to be another way to harvest and monetize our data.</p>\n<h2 id=\"time-for-a-tech-reality-check\" tabindex=\"-1\">Time for a Tech Reality Check <a class=\"header-anchor\" href=\"https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/\">#</a></h2>\n<p>As we encounter a massive stream of new gadgets and search engines, it's important to reflect on their true necessity and impact. Is it time to champion technologies that not only keep the internet as an open platform but also ensure it remains a freely accessible resource, not a luxury marketplace?</p>\n<p>We must advocate for a digital future where the web continues to serve as a broad platform for innovation and knowledge-sharing, not just a data-mining field for profit. It's important to support technologies that respect user privacy and offer content freely, rather than transforming our digital spaces into high-cost environments. Not only, but also, as of sustainability reasons. We deserve a digital landscape that prioritizes our needs as users, not just as data sources. Let's demand a future that upholds the openness and accessibility of the internet for everyone.</p>\n<h2 id=\"sources-for-thoughts\" tabindex=\"-1\">Sources for thoughts <a class=\"header-anchor\" href=\"https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/\">#</a></h2>\n<h3 id=\"pixie\" tabindex=\"-1\">Pixie <a class=\"header-anchor\" href=\"https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/\">#</a></h3>\n<ul>\n<li><a href=\"https://www.googlewatchblog.de/2024/04/pixel9-smartphones-google-app/\">Pixel 9-Smartphones: Google-App enthält erste Hinweise auf den Pixie-Sprachassistenten</a></li>\n<li><a href=\"https://www.engadget.com/googles-pixel-9-could-arrive-with-a-sophisticated-pixie-ai-assistant-094448458.html\">Google's Pixel 9 could arrive with a sophisticated 'Pixie' AI assistant</a></li>\n<li><a href=\"https://9to5google.com/2023/12/14/pixel-9-pixie-ai-assistant/\">Report: Google working on ‘Pixie’ AI assistant for Pixel 9, discussed glasses with object recognition</a></li>\n<li><a href=\"https://www.nextpit.com/google-pixel-9-pro-pixie-smart-assistant-features-conversational\">Google's More Powerful Pixie AI Assistant Could Debut on Pixel 9</a></li>\n<li><a href=\"https://www.t3.com/news/google-pixel-9-could-be-the-smartest-smartphone-yet-with-new-pixie-assistant-rumoured\">Google Pixel 9 could be the smartest smartphone yet, with new Pixie assistant rumoured</a></li>\n</ul>\n<h3 id=\"open-ai-search-1\" tabindex=\"-1\">Open AI Search <a class=\"header-anchor\" href=\"https://b.polente.de/blog/YetAnotherAssistantAndASearchEngine/\">#</a></h3>\n<ul>\n<li><a href=\"https://www.windowscentral.com/software-apps/what-would-an-openai-search-engine-look-like-and-would-it-get-you-to-switch-from-google\">What would an OpenAI search engine look like, and would it get you to switch from Google?</a></li>\n<li><a href=\"https://www.indiatoday.in/technology/news/story/openai-may-launch-chatgpt-based-search-engine-next-week-2535754-2024-05-06\">OpenAI may launch ChatGPT-based search engine next week</a></li>\n<li><a href=\"https://9to5google.com/2024/05/09/open-ai-google-search-report/\">Report: OpenAI to launch its AI-powered search engine a day before Google I/O</a></li>\n<li><a href=\"https://www.techopedia.com/news/openai-set-to-challenge-google-with-new-ai-search-capabilities\">OpenAI Set to Challenge Google with New AI Search Capabilities</a></li>\n</ul>\n",
			"date_published": "2024-05-13T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/ExperiencePipelinesExplained/",
			"url": "https://b.polente.de/blog/ExperiencePipelinesExplained/",
			"title": "Optimizing Your Design System Manager (DSM) Experience: Practical Tools and Strategies",
			"content_html": "<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/-ba3WPDnMG-360.avif 360w, https://b.polente.de/img/-ba3WPDnMG-608.avif 608w, https://b.polente.de/img/-ba3WPDnMG-960.avif 960w, https://b.polente.de/img/-ba3WPDnMG-1240.avif 1240w, https://b.polente.de/img/-ba3WPDnMG-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/-ba3WPDnMG-360.webp 360w, https://b.polente.de/img/-ba3WPDnMG-608.webp 608w, https://b.polente.de/img/-ba3WPDnMG-960.webp 960w, https://b.polente.de/img/-ba3WPDnMG-1240.webp 1240w, https://b.polente.de/img/-ba3WPDnMG-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/-ba3WPDnMG-360.png 360w, https://b.polente.de/img/-ba3WPDnMG-608.png 608w, https://b.polente.de/img/-ba3WPDnMG-960.png 960w, https://b.polente.de/img/-ba3WPDnMG-1240.png 1240w, https://b.polente.de/img/-ba3WPDnMG-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Teams working together in an Office envirnment\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/-ba3WPDnMG-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h2 id=\"mastering-your-dsm-experience-pipeline\" tabindex=\"-1\">Mastering Your DSM Experience Pipeline <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h2>\n<p>Implementing a robust Design System Manager (DSM) can streamline your design process, enhance collaboration, and ensure consistency across your products. Here we dive deep into various tools and strategies that can optimize your DSM experience, while not forgetting the often overlooked aspects.</p>\n<h3 id=\"selecting-the-right-tools\" tabindex=\"-1\">Selecting the Right Tools <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h3>\n<h4 id=\"the-central-role-of-figma\" tabindex=\"-1\">The Central Role of Figma <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h4>\n<p>Figma is not just another tool; it is a pivotal part of our DSM strategy due to its flexibility and comprehensive features.</p>\n<ul>\n<li><strong>Personas and UX Design</strong>: We utilize Figma to maintain our personas and user experience designs. It helps keep user profiles updated and accessible to all team members.</li>\n<li><strong>Token Management</strong>: Figma aids in creating and managing design tokens. With Style Dictionary by Amazon, these tokens can be transformed into reusable code across platforms, ensuring a uniform style throughout your digital presence.</li>\n</ul>\n<pre class=\"language-plaintext\" tabindex=\"0\"><code class=\"language-plaintext\">Design Tokens Example in Figma:\n- `--color-background: #ffffff;`\n- `--font-base: 'Roboto', sans-serif;`</code></pre>\n<h4 id=\"extending-figma-with-style-dictionary\" tabindex=\"-1\">Extending Figma with Style Dictionary <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h4>\n<ul>\n<li><strong>Token Extraction</strong>: Use Style Dictionary to extract tokens from Figma and generate styling for multiple platforms. This setup supports CSS, SCSS, Dart for Flutter, and even React’s styled components.</li>\n</ul>\n<pre class=\"language-bash\" tabindex=\"0\"><code class=\"language-bash\"><span class=\"token comment\"># Example command to convert tokens to CSS</span>\nstyle-dictionary build <span class=\"token parameter variable\">--platform</span> web/css</code></pre>\n<h3 id=\"design-practices-and-philosophy\" tabindex=\"-1\">Design Practices and Philosophy <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h3>\n<h4 id=\"simplicity-in-design-tokens\" tabindex=\"-1\">Simplicity in Design Tokens <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h4>\n<ul>\n<li><strong>Avoid Overengineering</strong>: Keep your design tokens simple. We avoid component-specific tokens and use more ones like alignments or margins, focusing on core design elements.</li>\n</ul>\n<h4 id=\"accessibility-and-reusability\" tabindex=\"-1\">Accessibility and Reusability <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h4>\n<ul>\n<li><strong>Start with Accessibility</strong>: Incorporate accessibility features right from the design stage by using annotations in Figma to guide developers.</li>\n<li><strong>Think Ahead</strong>: Plan how you will use these tokens. By keeping a versioned repository of your design tokens (using Git, for instance), you can ensure that they are easily accessible and maintainable.</li>\n</ul>\n<h3 id=\"integration-across-platforms\" tabindex=\"-1\">Integration Across Platforms <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h3>\n<h4 id=\"utilizing-web-standards\" tabindex=\"-1\">Utilizing Web Standards <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h4>\n<ul>\n<li><strong>Web Components</strong>: We for example used Stencil to create Web Components that are compatible with multiple frameworks. This approach provides flexibility and reduces dependency on any single technology.</li>\n</ul>\n<pre class=\"language-javascript\" tabindex=\"0\"><code class=\"language-javascript\"><span class=\"token comment\">// Example of a simple web component</span>\ncustomElements<span class=\"token punctuation\">.</span><span class=\"token function\">define</span><span class=\"token punctuation\">(</span>\n  <span class=\"token string\">\"my-component\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">class</span> <span class=\"token class-name\">extends</span> HTMLElement <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">connectedCallback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;p>Hello World!&lt;/p></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n<h4 id=\"documentation-and-continuous-feedback\" tabindex=\"-1\">Documentation and Continuous Feedback <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h4>\n<ul>\n<li><strong>Unified Documentation</strong>: Tools like Storybook are invaluable for documenting UI components and ensuring that they meet quality standards.</li>\n<li><strong>Engage and Iterate</strong>: Maintain open channels for team feedback and hold regular sessions to discuss improvements. This helps in refining your DSM and addressing any issues proactively.</li>\n</ul>\n<h4 id=\"strategic-thinking\" tabindex=\"-1\">Strategic Thinking <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h4>\n<ul>\n<li><strong>Feedback Utilization</strong>: Listen to your users—both internal and external—but choose carefully which feedback to implement. This selective approach helps maintain simplicity and reusability in your design system.</li>\n<li><strong>Vision for Your DSM</strong>: Always have a clear vision and mission statement for your DSM that aligns with your company’s identity and goals. This not only makes it easier for new team members to understand the purpose of your design system but also keeps existing members aligned and motivated.</li>\n</ul>\n<h3 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ExperiencePipelinesExplained/\">#</a></h3>\n<p>By embracing these practices and tools, you can create a more robust, flexible, and cohesive DSM. Remember, a successful design system is about more than just tools; it’s about creating a culture of continuous improvement and collaboration.</p>\n",
			"date_published": "2024-04-19T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/",
			"url": "https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/",
			"title": "Simplifying E-Commerce Architecture",
			"content_html": "<h2 id=\"tl-dr\" tabindex=\"-1\">TL;DR <a class=\"header-anchor\" href=\"https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/\">#</a></h2>\n<p>This blog post examines how Static Site Generators and <a href=\"https://www.patterns.dev/vanilla/islands-architecture\">Island Architecture</a> can simplify e-commerce web development. It highlights the drawbacks of heavy frameworks in enterprise environments and proposes a streamlined approach that enhances performance, reduces costs, and improves SEO. While this overview provides a condensed perspective, a deeper dive into the subject will reveal more intricate details and benefits.</p>\n<p>Please note this is a summarized view and for a complete understanding, a more thorough exploration of the topic is recommended.</p>\n<h2 id=\"static-site-generators-and-island-architecture\" tabindex=\"-1\">Static Site Generators and Island Architecture <a class=\"header-anchor\" href=\"https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/\">#</a></h2>\n<p>Web development has often relied on frameworks like React, Angular, Svelte or Vue for their initial simplicity. But, with over 20 years as an architect, I've seen these can become complex in business settings, leading to technical debt and hard-to-maintain projects. This post suggests simpler methods for building e-commerce sites, using Static Site Generators (SSG) and Island Architecture.</p>\n<h3 id=\"the-pitfalls-of-heavy-frameworks-with-real-world-examples\" tabindex=\"-1\">The Pitfalls of Heavy Frameworks with Real-World Examples <a class=\"header-anchor\" href=\"https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/\">#</a></h3>\n<p>Using heavy frameworks like React, Angular, or Vue can lead to challenges in the long term. In real-world scenarios, businesses often encounter issues when the application grows too complex. For example, an e-commerce company might start with a simple React application, but as their product line expands, they face slowdowns due to the extensive re-rendering required for dynamic content. Another issue is the steep learning curve for new developers. A tech firm once reported significant delays because new hires took longer to contribute effectively, having to understand the intricacies of Angular's change detection mechanisms. Furthermore, reliance on extensive client-side rendering can lead to SEO penalties, as experienced by a travel agency whose Angular app wasn't fully indexed by search engines. These examples show that while such frameworks are powerful, they can complicate maintenance, scalability, and performance without careful consideration.</p>\n<h3 id=\"the-case-for-static-site-generators-and-island-architecture\" tabindex=\"-1\">The Case for Static Site Generators and Island Architecture <a class=\"header-anchor\" href=\"https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/\">#</a></h3>\n<p>The diagram shows the flow from an e-commerce page through JAMstack Architecture to functions like pricing and checkout.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/-yPc78StCu-360.avif 360w, https://b.polente.de/img/-yPc78StCu-608.avif 608w, https://b.polente.de/img/-yPc78StCu-960.avif 960w, https://b.polente.de/img/-yPc78StCu-1240.avif 1240w, https://b.polente.de/img/-yPc78StCu-1600.avif 1600w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/-yPc78StCu-360.webp 360w, https://b.polente.de/img/-yPc78StCu-608.webp 608w, https://b.polente.de/img/-yPc78StCu-960.webp 960w, https://b.polente.de/img/-yPc78StCu-1240.webp 1240w, https://b.polente.de/img/-yPc78StCu-1600.webp 1600w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/-yPc78StCu-360.png 360w, https://b.polente.de/img/-yPc78StCu-608.png 608w, https://b.polente.de/img/-yPc78StCu-960.png 960w, https://b.polente.de/img/-yPc78StCu-1240.png 1240w, https://b.polente.de/img/-yPc78StCu-1600.png 1600w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A flowchart depicting the static aspects of an E-Commerce Page using JAMStack Architecture. At the top of the chart is 'E-Commerce Page', which branches into 'JAMStack Architecture'. From there, three paths diverge: 'APIs' leading to 'Product Management' and further to 'Inventory Updates'; 'APIs' again branching to 'User Authentication' and then 'User Profiles'; and 'CDN' leading to 'Global Access', which is connected to 'Speed and Reliability'. Each component is represented by a box with arrows showing the flow of information and processes.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/-yPc78StCu-360.png\" width=\"1600\" height=\"802\"></picture></p>\n<p>In e-commerce, not all platforms need dynamic applications. Many business sites have content that rarely changes. Using Static Site Generators like Netlify or Vercel can rebuild pages when needed, easing server load and boosting performance.</p>\n<p>Consider that a JAMStack Architecture is mature and great, but also SPA driven Tooling with VUE or React offer options.</p>\n<p>Static Site Rendering (SSR) using modern frameworks like Nuxt.js (for Vue.js) or Next.js (for React) takes the capabilities of traditional Static Site Generators further. These tools offer a hybrid approach, allowing pages to be pre-rendered during build time, which optimizes loading times and SEO performance. This is particularly useful for e-commerce sites where quick, accessible content is crucial for user engagement. Nuxt and Next handle both static and dynamic content, serving pre-rendered pages from the server initially, then hydrating these pages on the client-side to add interactive elements. This approach, combined with JAMstack architecture, ensures high performance, scalability, and a seamless user experience across all parts of the e-commerce platform, from browsing products to checking out, just in some cases without full blown hydration.</p>\n<h4 id=\"island-architecture-a-lean-approach\" tabindex=\"-1\">Island Architecture: A Lean Approach <a class=\"header-anchor\" href=\"https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/\">#</a></h4>\n<p>To visually demonstrate the concept of Island Architecture in e-commerce, this flowchart delineates how an E-Commerce Page can be efficiently structured. It guides through the JAMStack Architecture down to discrete, independently functioning 'islands' such as price fetching and checkout processes, illustrating a streamlined workflow for enhanced performance and user experience.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/KGwpYjnSBB-360.avif 360w, https://b.polente.de/img/KGwpYjnSBB-608.avif 608w, https://b.polente.de/img/KGwpYjnSBB-960.avif 960w, https://b.polente.de/img/KGwpYjnSBB-1240.avif 1240w, https://b.polente.de/img/KGwpYjnSBB-1600.avif 1600w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/KGwpYjnSBB-360.webp 360w, https://b.polente.de/img/KGwpYjnSBB-608.webp 608w, https://b.polente.de/img/KGwpYjnSBB-960.webp 960w, https://b.polente.de/img/KGwpYjnSBB-1240.webp 1240w, https://b.polente.de/img/KGwpYjnSBB-1600.webp 1600w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/KGwpYjnSBB-360.png 360w, https://b.polente.de/img/KGwpYjnSBB-608.png 608w, https://b.polente.de/img/KGwpYjnSBB-960.png 960w, https://b.polente.de/img/KGwpYjnSBB-1240.png 1240w, https://b.polente.de/img/KGwpYjnSBB-1600.png 1600w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A flowchart representing the Island Architecture within an E-Commerce Page. At the top, 'E-Commerce Page' flows into 'JAMStack Architecture', which then leads to 'Island Architecture'. From there, two pathways emerge: one leading to 'Price Fetching' connected to 'APIs' and then 'Inventory Updates'; the other leading to 'Checkout Process', connected to 'Payment Gateway' and then 'Order Confirmation'. Each step is represented as a box, with arrows indicating the direction of the process flow.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/KGwpYjnSBB-360.png\" width=\"1600\" height=\"976\"></picture></p>\n<p>Island Architecture is a modern web development approach that facilitates the creation of web pages with both static and dynamic content. This method segments dynamic features, such as image carousels on e-commerce product pages or interactive filters on bank account pages, into small, independent &quot;islands&quot; that only load where needed. This lean approach reduces the volume of JavaScript, as only the interactive components require hydration, leading to improved performance and SEO. However, it's still an emerging concept with limited framework support and might not suit pages needing extensive interactivity. For an in-depth understanding and examples, please visit the detailed article on <a href=\"https://www.patterns.dev/vanilla/islands-architecture\">Patterns.dev</a>.</p>\n<p>This is not exclusive to JAMstack approaches, and also other SSR generated applications can follow this approach.</p>\n<h3 id=\"benefits-of-a-simplified-architecture\" tabindex=\"-1\">Benefits of a Simplified Architecture <a class=\"header-anchor\" href=\"https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/\">#</a></h3>\n<p>The transition towards a simplified architectural framework for web development introduces a myriad of benefits, enhancing not only the technical performance but also the overall digital experience. This list encapsulates the core advantages, ranging from reduced complexity for easier maintenance to improved scalability, showcasing how streamlined processes contribute to a more efficient, accessible, and secure online presence.</p>\n<ul>\n<li><strong>Reduced Complexity</strong>: Easier maintenance and growth.</li>\n<li><strong>Improved Performance</strong>: Faster page loads and user experience.</li>\n<li><strong>Enhanced Accessibility</strong>: Better for assistive technologies due to simpler HTML.</li>\n<li><strong>Cost Efficiency</strong>: Cheaper hosting and less energy use.</li>\n<li><strong>Better SEO</strong>: Higher search engine rankings.</li>\n<li><strong>Security Advantages</strong>: Fewer security risks.</li>\n<li><strong>Flexibility in Development</strong>: Focus on user experience without complex frameworks.</li>\n<li><strong>Enhanced Reliability</strong>: Fewer dependencies mean fewer failures.</li>\n<li><strong>Improved Scalability</strong>: Easier to handle more traffic.</li>\n<li><strong>Streamlined Content Updates</strong>: Easier updates without full redeployment.</li>\n<li><strong>Global Reach with CDNs</strong>: Fast access from anywhere.</li>\n</ul>\n<h3 id=\"implementing-island-architecture-with-static-site-generators\" tabindex=\"-1\">Implementing Island Architecture with Static Site Generators <a class=\"header-anchor\" href=\"https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/\">#</a></h3>\n<p>To dig deeper into the practical application of Island Architecture with Static Site Generators, consider the real-life scenario of an e-commerce platform transitioning to this model. By implementing islands for dynamic content such as shopping carts and personalized recommendations, the site significantly improved its load times and user experience. For example, a popular online bookstore was able to reduce its bounce rate by implementing lazy-loaded islands for customer reviews and related book recommendations, ensuring that these elements only loaded when needed, thereby keeping the initial page load fast. This approach not only streamlined their web presence but also enhanced customer satisfaction and engagement without the need for a complex, resource-intensive framework.</p>\n<h3 id=\"real-world-examples\" tabindex=\"-1\">Real-World Examples <a class=\"header-anchor\" href=\"https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/\">#</a></h3>\n<p>For more real-world examples beyond <a href=\"https://astro.build/\">Astro</a>, you might consider looking into sites built with <a href=\"https://www.11ty.dev/\">11ty</a> (Eleventy), which is praised for its simplicity and flexibility, allowing developers to create fast and efficient static sites. Another example includes projects leveraging Hugo or Gatsby, where developers have documented significant improvements in performance, SEO, and development efficiency. These platforms showcase the practical application of static site generation and Island Architecture in various industries, demonstrating the benefits of these approaches in creating scalable, high-performing websites.</p>\n<h3 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/\">#</a></h3>\n<p>Simplifying web architecture isn't just about reducing complexity; it's about making sites sustainable, efficient, and friendly for users. Using Static Site Generators and Island Architecture leads to simpler and more cost-effective web development. This post encourages more exploration and use of these methods, for a web that values simplicity and maintainability.</p>\n<h3 id=\"references\" tabindex=\"-1\">References <a class=\"header-anchor\" href=\"https://b.polente.de/blog/StaticSiteGenerationWorksEnterpriseToo/\">#</a></h3>\n<ul>\n<li><a href=\"https://www.netlify.com/\">Netlify</a>: Build modern web projects.</li>\n<li><a href=\"https://vercel.com/\">Vercel</a>: Deploy static sites easily.</li>\n<li><a href=\"https://astro.build/\">Astro</a>: Build faster websites.</li>\n<li><a href=\"https://www.11ty.dev/\">11ty</a>: A simple static site generator.</li>\n<li><a href=\"https://nuxt.com/\">nuxt.js</a>: A simple static site generator.</li>\n<li><a href=\"https://nextjs.org/\">next.js</a>: A simple static site generator.</li>\n</ul>\n<p>This is the start of a broader discussion on better web development practices.</p>\n",
			"date_published": "2024-02-21T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/",
			"url": "https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/",
			"title": "Crafting an Effective Experience Pipeline - Insights and Strategies",
			"content_html": "<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/SpsECfatHH-360.avif 360w, https://b.polente.de/img/SpsECfatHH-608.avif 608w, https://b.polente.de/img/SpsECfatHH-960.avif 960w, https://b.polente.de/img/SpsECfatHH-1240.avif 1240w, https://b.polente.de/img/SpsECfatHH-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/SpsECfatHH-360.webp 360w, https://b.polente.de/img/SpsECfatHH-608.webp 608w, https://b.polente.de/img/SpsECfatHH-960.webp 960w, https://b.polente.de/img/SpsECfatHH-1240.webp 1240w, https://b.polente.de/img/SpsECfatHH-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/SpsECfatHH-360.png 360w, https://b.polente.de/img/SpsECfatHH-608.png 608w, https://b.polente.de/img/SpsECfatHH-960.png 960w, https://b.polente.de/img/SpsECfatHH-1240.png 1240w, https://b.polente.de/img/SpsECfatHH-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Illustration with the essence of SPEED\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/SpsECfatHH-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h2 id=\"introduction\" tabindex=\"-1\">Introduction <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/\">#</a></h2>\n<p>In today's digital landscape, creating a seamless and impactful user experience is paramount. An experience pipeline serves as the backbone for this, integrating design, development, and deployment processes cohesively. This blog post draws insights from various expert sources, including Samrawit Yoseph's detailed exploration of leveraging design systems for multi-tenant growth, to outline the essential workflow and considerations for an effective experience pipeline.</p>\n<h2 id=\"understanding-the-experience-pipeline\" tabindex=\"-1\">Understanding the Experience Pipeline <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/\">#</a></h2>\n<p>An experience pipeline is a structured approach that ensures consistent, high-quality user experiences across all digital platforms. It emphasizes the integration of design systems, like the WATTS system discussed by Yoseph, to streamline design and development processes.</p>\n<h2 id=\"key-components-of-the-pipeline\" tabindex=\"-1\">Key Components of the Pipeline <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/\">#</a></h2>\n<ul>\n<li>Design System Managers: Central to the pipeline, a design system ensures consistency and scalability. It includes reusable components and guidelines that save time and enhance user experiences.</li>\n<li>Collaboration and Communication: Cross-functional teams must work closely, sharing insights and feedback to refine the user experience continually.</li>\n<li>Agile Methodology: Adopting agile practices allows for flexibility and rapid iteration, essential for responding to user needs and market changes.</li>\n</ul>\n<h2 id=\"considerations-for-building-your-pipeline\" tabindex=\"-1\">Considerations for Building Your Pipeline <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/\">#</a></h2>\n<ul>\n<li>User-Centric Approach: Always prioritize the end-user's experience and needs during the pipeline development.</li>\n<li>Scalability: Ensure the pipeline supports growth, allowing easy integration of new features or platforms.</li>\n<li>Performance Optimization: Regularly assess and enhance the performance to meet users' expectations for speed and reliability.</li>\n<li>Accessibility: Make inclusivity a core aspect of your pipeline to reach a broader audience.</li>\n</ul>\n<h2 id=\"workflow-essentials-for-an-experience-pipeline\" tabindex=\"-1\">Workflow Essentials for an Experience Pipeline <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/\">#</a></h2>\n<ol>\n<li>Foundation: Start with a deep analysis of existing design and code outputs to establish a solid foundation.</li>\n<li>Standards: Emphasize accessibility and user experience by adhering to principles that ensure content is perceivable, operable, understandable, and robust.</li>\n<li>Design Tokens: Utilize design tokens for consistency in applying basic design system rules, streamlining the handover from design to development.</li>\n<li>Tools Integration: Leverage tools like InVision DSM, Sketch, React, and Storybook to facilitate design and development processes.</li>\n</ol>\n<h2 id=\"team-collaboration-across-crafts\" tabindex=\"-1\">Team Collaboration Across Crafts <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/\">#</a></h2>\n<p>The success of an experience pipeline hinges on seamless collaboration between designers and developers. Establish a common language and source of truth for UI assets and code to ensure consistency. Encourage open communication, regular feedback, and shared responsibility for the project's success.</p>\n<h2 id=\"challenges-and-solutions\" tabindex=\"-1\">Challenges and Solutions <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/\">#</a></h2>\n<p>Implementing an experience pipeline is not without its challenges. Balancing brand identity with consistency, ensuring efficient collaboration among diverse teams, and maintaining a focus on performance and accessibility are common hurdles. Solutions include clear communication, robust design systems, and ongoing testing and feedback loops.</p>\n<h2 id=\"prioritizing-speed-in-digital-transformation\" tabindex=\"-1\">Prioritizing SPEED in Digital Transformation <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/\">#</a></h2>\n<p><a href=\"https://www.publicissapient.com/publicis-sapient-brings-its-speed-philosophy-to-digital-business\">Publicis Sapient's SPEED</a> philosophy emphasizes Strategy, Product, Experience, Engineering, and Data to navigate digital business transformation successfully. This approach is not just about moving fast but ensuring that every step taken is aligned with strategic goals, driven by user experience, and supported by robust engineering and insightful data analysis. SPEED enables organizations to quickly adapt to market changes, innovate continuously, and stay ahead of competition by making informed, agile decisions. It underscores the importance of moving swiftly but thoughtfully, ensuring that every product launched and experience crafted delivers real value to users and sustains business growth.</p>\n<h2 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftinganEffectiveExperiencePipeline/\">#</a></h2>\n<p>Developing an effective experience pipeline requires careful planning, collaboration, and a commitment to user experience excellence. By considering the insights and strategies outlined, organizations can build a pipeline that supports dynamic growth and meets the high expectations of today's digital users.</p>\n",
			"date_published": "2024-02-21T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/",
			"url": "https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/",
			"title": "Crafting an AI-driven culinary adventure",
			"content_html": "<h2 id=\"behind-the-scenes-of-ai-chefs-at-polente\" tabindex=\"-1\">Behind The Scenes Of AI Chefs at Polente <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h2>\n<p>Welcome to a peek behind the curtain of <a href=\"https://recipe.polente.de/\">AI Chefs at Polente</a>, where the fusion of culinary arts and artificial intelligence creates a unique digital experience. As a director of experience engineering with over two decades in the field, I've always been fascinated by the potential of technology to enhance our daily lives. <a href=\"https://recipe.polente.de/\">AI Chefs at Polente</a> is a testament to this vision, combining my passion for cooking with the cutting-edge capabilities of ai.</p>\n<h2 id=\"the-genesis-of-ai-chefs-at-polente\" tabindex=\"-1\">The Genesis Of AI Chefs at Polente <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h2>\n<p>The idea for <a href=\"https://recipe.polente.de/\">AI Chefs at Polente</a> sprang from a simple yet profound realization: cooking is an art that brings people together, and technology can amplify this experience. In a world where digital interactions are increasingly commonplace, I envisioned a platform that not only shared recipes but also adapted and evolved, much like the culinary tastes and trends it catered to. But also showcasing that content creation is possible with only AI and without humans helping out.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/oBkP7eXNnI-360.avif 360w, https://b.polente.de/img/oBkP7eXNnI-608.avif 608w, https://b.polente.de/img/oBkP7eXNnI-960.avif 960w, https://b.polente.de/img/oBkP7eXNnI-1064.avif 1064w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/oBkP7eXNnI-360.webp 360w, https://b.polente.de/img/oBkP7eXNnI-608.webp 608w, https://b.polente.de/img/oBkP7eXNnI-960.webp 960w, https://b.polente.de/img/oBkP7eXNnI-1064.webp 1064w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/oBkP7eXNnI-360.png 360w, https://b.polente.de/img/oBkP7eXNnI-608.png 608w, https://b.polente.de/img/oBkP7eXNnI-960.png 960w, https://b.polente.de/img/oBkP7eXNnI-1064.png 1064w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"a screenshot of the following recipe cut to the upper part. Recipe.polente.de/recipes/vegan-linguine-with-mushrooms-and-herbs-8259/\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/oBkP7eXNnI-360.png\" width=\"1064\" height=\"833\"></picture></p>\n<h2 id=\"marrying-technology-with-taste\" tabindex=\"-1\">Marrying Technology With Taste <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h2>\n<p>At its core, <a href=\"https://recipe.polente.de/\">AI Chefs at Polente</a> is powered by AI, but it's seasoned with the human touch. The journey began with identifying the right technologies that could understand and anticipate the needs and preferences of home chefs and food enthusiasts. From selecting an AI framework to designing an intuitive user interface, every step was meticulously planned and executed.</p>\n<h3 id=\"how-it-works\" tabindex=\"-1\">How It Works <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h3>\n<p>My setup involves a php backend, which I've chosen for its ease of automation with cronjobs on my webspace. However, for the sake of clearer understanding in this context, I've converted the examples to JavaScript.</p>\n<p>In this setup, I utilize <code>gpt-3.5-turbo</code> to fetch data, functioning as described below.</p>\n<h4 id=\"fetching-recipes\" tabindex=\"-1\">Fetching Recipes <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h4>\n<pre class=\"language-js\" tabindex=\"0\"><code class=\"language-js\">Async <span class=\"token keyword\">function</span> <span class=\"token function\">fetchopenairesponse</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">messages</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"https://api.openai.com/v1/chat/completions\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">method</span><span class=\"token operator\">:</span> <span class=\"token string\">\"post\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">headers</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string-property property\">\"content-type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"application/json\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string-property property\">\"authorization\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Bearer your_open_ai_key\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">body</span><span class=\"token operator\">:</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">messages</span><span class=\"token operator\">:</span> messages<span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">max_tokens</span><span class=\"token operator\">:</span> <span class=\"token number\">500</span><span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">model</span><span class=\"token operator\">:</span> <span class=\"token string\">\"gpt-3.5-turbo\"</span>\n        <span class=\"token literal-property property\">temperature</span><span class=\"token operator\">:</span> <span class=\"token number\">0.7</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> data <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">parse</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">http error! status: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>data<span class=\"token punctuation\">.</span>message<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> data<span class=\"token punctuation\">.</span>choices<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>The <code>messages</code> within the system are structured in a specific format, enabling the incorporation of essential system information seamlessly.</p>\n<h4 id=\"prompting\" tabindex=\"-1\">Prompting <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h4>\n<pre class=\"language-js\" tabindex=\"0\"><code class=\"language-js\">Const messages <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">[</span>\n        <span class=\"token string-property property\">'role'</span><span class=\"token operator\">:</span> <span class=\"token string\">'system'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string-property property\">'content'</span><span class=\"token operator\">:</span> <span class=\"token string\">'set the stage as a food blogger'</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">[</span>\n        <span class=\"token string-property property\">'role'</span><span class=\"token operator\">:</span> <span class=\"token string\">'user'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string-property property\">'content'</span><span class=\"token operator\">:</span> <span class=\"token string\">'requesting the recipe'</span>\n    <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">]</span></code></pre>\n<p>With this approach, I specifically request <code>GPT</code> to generate responses in <code>JSON</code> format. Initially, my plan was to have <code>GPT</code> create the entire markdown content for the <a href=\"https://jamstack.org/\">jamstack</a> blog, which is built using <a href=\"https://www.11ty.dev/\">11ty</a>. However, I encountered issues with reliability and testing challenges. To address this, I shifted to using <code>JSON</code> format, which proved to be simpler to test. If there's an issue, I can easily discard the output and start again. Presently, this restart is needed in about 1 out of 10 cases. The <code>JSON</code> format is structured as follows.</p>\n<h4 id=\"best-format\" tabindex=\"-1\">Best Format <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h4>\n<pre class=\"language-js\" tabindex=\"0\"><code class=\"language-js\"><span class=\"token punctuation\">{</span>\n  <span class=\"token string-property property\">\"chef\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">\"intro\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">\"outro\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">\"slug\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">\"title\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">\"ingredients\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"as markdown\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">\"instructions\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"as markdown\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">\"tags\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>After crafting the <code>JSON</code> structure, the next step in my process involves interacting with <code>GPT</code> once more. This time, the goal is to generate a creative prompt for an image. This prompt is designed to align perfectly with the recipe's ingredients and description. It's a fascinating blend of AI's understanding of food and its capability to visualize it.</p>\n<h3 id=\"creating-a-visual-feast-with-dall-e-3\" tabindex=\"-1\">Creating a visual feast with DALL·E 3 <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h3>\n<p>Once <code>GPT</code> provides the image prompt, I then employ a method similar to the one below to request an image from DALL·E 3. This approach allows for the creation of unique, ai-generated images that visually represent the essence of each recipe. It's not just about listing ingredients and methods; it's about bringing each dish to life visually, making the cooking experience more engaging and inspiring.</p>\n<h4 id=\"fetching-images\" tabindex=\"-1\">Fetching Images <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h4>\n<pre class=\"language-js\" tabindex=\"0\"><code class=\"language-js\">Async <span class=\"token keyword\">function</span> <span class=\"token function\">fetchdalleimage</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">prompt</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"https://api.openai.com/v1/images/generations\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">method</span><span class=\"token operator\">:</span> <span class=\"token string\">\"post\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">headers</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"content-type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"application/json\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"authorization\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Bearer your_open_ai_key\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">body</span><span class=\"token operator\">:</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">prompt</span><span class=\"token operator\">:</span> prompt<span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">max_tokens</span><span class=\"token operator\">:</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">model</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dall-e-3\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">n</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">size</span><span class=\"token operator\">:</span> <span class=\"token string\">\"1792x1024\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">quality</span><span class=\"token operator\">:</span> <span class=\"token string\">\"standard\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> data <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">parse</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">http error! status: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>data<span class=\"token punctuation\">.</span>message<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> data<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>Before finalizing the content, I perform a series of tests on both the url and the revised prompt. This step is crucial to ensure their validity. It's all about maintaining the quality and reliability of the information being processed.</p>\n<h4 id=\"seamless-integration-and-storage\" tabindex=\"-1\">Seamless integration and storage <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h4>\n<p>Once I've confirmed that the data is accurate and usable, I proceed to save it on my webserver. This is a vital step in preserving the integrity and accessibility of the content.</p>\n<h4 id=\"crafting-and-archiving-markdown-files\" tabindex=\"-1\">Crafting and archiving markdown files <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h4>\n<p>With all the essential data and paths in place, I then generate a markdown file. This file, bearing the same name as its corresponding image, is meticulously stored on the server. This methodical approach not only aids in organization but also ensures a smooth retrieval process for displaying the content on the website.</p>\n<h4 id=\"the-markdown\" tabindex=\"-1\">The Markdown <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h4>\n<pre class=\"language-bash\" tabindex=\"0\"><code class=\"language-bash\">---\ntitle: <span class=\"token string\">\"\"</span>\ndescription: <span class=\"token string\">\"\"</span>\ntags: <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\nfigureRecipe:\n  caption: <span class=\"token string\">\"\"</span>\n  imageSrc: <span class=\"token string\">\"\"</span>\n  imageTitle: <span class=\"token string\">\"\"</span>\n  imageAlt: <span class=\"token string\">\"\"</span>\n  loading: <span class=\"token string\">\"eager\"</span>\n---\n\n<span class=\"token comment\">## Introduction</span>\n\nIntro\n\n<span class=\"token comment\">## Ingredients</span>\n\nIngredients markdown\n\n<span class=\"token comment\">## Instructions</span>\n\nInstructions markdown\n\nOutro\n\nName</code></pre>\n<h3 id=\"bringing-it-all-together\" tabindex=\"-1\">Bringing It All Together <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h3>\n<h4 id=\"the-final-step-in-the-journey\" tabindex=\"-1\">The Final Step In The Journey <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h4>\n<p>The creation and refinement of these recipes and their accompanying ai-generated imagery is just the beginning. To bring this project to life, I rely on a well-structured git repository. Each piece of content, once perfected, is committed and pushed to github. You can explore the repository at <a href=\"https://github.com/polent/recipe\">github.com/polent/recipe</a>.</p>\n<h4 id=\"automated-deployment-for-continuous-fresh-content\" tabindex=\"-1\">Automated deployment for continuous fresh content <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h4>\n<p>The magic happens when I push these updates. Each push activates a build script through a github action, which then deploys the new content to the server. This process isn't just manual; it's augmented with automation. A cronjob is set up to trigger these updates randomly, ensuring that the blog is constantly refreshed with new recipes. At present, this means about 4-5 new culinary creations are shared each day.</p>\n<h3 id=\"a-recipe-for-innovation\" tabindex=\"-1\">A recipe for innovation <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h3>\n<p>This project is more than just a collection of recipes. It's a testament to the harmonious blend of culinary passion and technological innovation. Through this journey, I aim to not just share dishes but to inspire creativity and showcase the endless possibilities of AI in enhancing our daily experiences.</p>\n<p>Stay tuned for more flavors, more innovation, and more culinary adventures at <a href=\"https://recipe.polente.de/\">AI Chefs at Polente</a>!</p>\n<h4 id=\"one-recipe-in-action\" tabindex=\"-1\">One Recipe In Action <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h4>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/ffW_Ov30U6-360.avif 360w, https://b.polente.de/img/ffW_Ov30U6-608.avif 608w, https://b.polente.de/img/ffW_Ov30U6-960.avif 960w, https://b.polente.de/img/ffW_Ov30U6-1235.avif 1235w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/ffW_Ov30U6-360.webp 360w, https://b.polente.de/img/ffW_Ov30U6-608.webp 608w, https://b.polente.de/img/ffW_Ov30U6-960.webp 960w, https://b.polente.de/img/ffW_Ov30U6-1235.webp 1235w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/ffW_Ov30U6-360.png 360w, https://b.polente.de/img/ffW_Ov30U6-608.png 608w, https://b.polente.de/img/ffW_Ov30U6-960.png 960w, https://b.polente.de/img/ffW_Ov30U6-1235.png 1235w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"a screenshot of the following recipe. AI Chefs at Polenterecipes/vegan-linguine-with-mushrooms-and-herbs-8259/\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/ffW_Ov30U6-360.png\" width=\"1235\" height=\"2322\"></picture></p>\n<h2 id=\"crafting-a-user-centric-culinary-platform\" tabindex=\"-1\">Crafting A User-centric Culinary Platform <a class=\"header-anchor\" href=\"https://b.polente.de/blog/CraftingAnAIDrivenCulinaryAdventure/\">#</a></h2>\n<p>Staying true to my roots in user-centric web design, the development of <a href=\"https://recipe.polente.de/\">recipe.polente.de</a> was guided by principles of accessibility and usability. The aim was to create a platform that was not only smart but also easy and enjoyable to use, regardless of one's culinary skill level.</p>\n<p>This journey has revealed a significant shift in the landscape of creative work. With AI's growing capabilities, particularly in content creation, I've observed that certain roles traditionally essential in content generation are evolving. In the near future, some of these jobs might become less needed, as AI continues to automate and enhance creative processes. This case study of AI Chefs at Polente underscores the potential for AI to transform how we approach and manage creative tasks, pointing towards a future where technology and human creativity collaborate more closely than ever.</p>\n",
			"date_published": "2024-01-25T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/AiAndAccessibility/",
			"url": "https://b.polente.de/blog/AiAndAccessibility/",
			"title": "How AI is Changing Accessibility in the Workplace",
			"content_html": "<h2 id=\"introduction\" tabindex=\"-1\">Introduction <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AiAndAccessibility/\">#</a></h2>\n<p>In our digital world, making websites and apps easy to use for everyone is crucial. This is what we mean by 'accessibility'. It's about designing our digital tools so that all people, including those with different abilities, can use them easily.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/U7WR25x907-360.avif 360w, https://b.polente.de/img/U7WR25x907-608.avif 608w, https://b.polente.de/img/U7WR25x907-960.avif 960w, https://b.polente.de/img/U7WR25x907-1240.avif 1240w, https://b.polente.de/img/U7WR25x907-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/U7WR25x907-360.webp 360w, https://b.polente.de/img/U7WR25x907-608.webp 608w, https://b.polente.de/img/U7WR25x907-960.webp 960w, https://b.polente.de/img/U7WR25x907-1240.webp 1240w, https://b.polente.de/img/U7WR25x907-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/U7WR25x907-360.png 360w, https://b.polente.de/img/U7WR25x907-608.png 608w, https://b.polente.de/img/U7WR25x907-960.png 960w, https://b.polente.de/img/U7WR25x907-1240.png 1240w, https://b.polente.de/img/U7WR25x907-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"This image depicts a modern digital workplace with a diverse group of people using various accessible technologies. This includes people with disabilities using assistive devices and others interacting with AI-powered tools.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/U7WR25x907-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<p>Accessibility is very important. It's not just about following rules. It's about making sure everyone has the same chance to use digital platforms, like websites and apps. This means people with disabilities can also gain knowledge, work, and connect with others online.</p>\n<p>Artificial Intelligence (AI) is helping us a lot in this area. It's making it easier to check if our digital tools are accessible and is improving how they work for people with disabilities. AI can do things like predict what users need and learn over time to get better at helping us.</p>\n<p>Next, we'll talk about the current state of accessibility, how AI is helping to test and improve it, and what we might see in the future.</p>\n<h2 id=\"the-current-state-of-accessibility-in-digital-workplaces\" tabindex=\"-1\">The Current State of Accessibility in Digital Workplaces <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AiAndAccessibility/\">#</a></h2>\n<p>Right now, making our digital tools accessible is a big challenge. Many people don't know enough about it or don't think it's a priority. This means that some websites and apps are hard for people with disabilities to use.</p>\n<p>For example, a website might not work well with a screen reader, which is a tool that reads out the text for people who can't see the screen. Or, it might be hard to navigate a site if you can't use a mouse.</p>\n<p>Following guidelines from groups like the World Wide Web Consortium (W3C) is really important. They tell us how to make websites that everyone can use.</p>\n<h2 id=\"the-role-of-ai-in-accessibility-testing\" tabindex=\"-1\">The Role of AI in Accessibility Testing <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AiAndAccessibility/\">#</a></h2>\n<p>AI is changing the way we check if digital tools are accessible. It's faster and more accurate than doing it by hand. AI can look through a website and spot problems, like if there's not enough contrast between the text and the background.</p>\n<p>There are AI tools that help find these problems and fix them. This means we can make websites and apps that are easier for everyone to use.</p>\n<p>Some companies are already using AI to do this. For example, Microsoft and Google have projects that use AI to make the web more accessible.</p>\n<h2 id=\"ai-in-day-to-day-implementation-of-accessibility\" tabindex=\"-1\">AI in Day-to-Day Implementation of Accessibility <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AiAndAccessibility/\">#</a></h2>\n<p>AI is also helping us every day to make digital tools more accessible. It can do things like change how a website looks based on what a user needs. This could be making the text bigger or changing colors so it's easier to read.</p>\n<p>AI is helping to create content that is easy to understand for everyone. It can suggest ways to write or design things better.</p>\n<p>There are also design tools that use AI to make sure new websites and apps are accessible from the start. This is really helpful for keeping up with the latest guidelines.</p>\n<h2 id=\"the-future-of-accessibility-with-ai-integration\" tabindex=\"-1\">The Future of Accessibility with AI Integration <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AiAndAccessibility/\">#</a></h2>\n<p>Looking ahead, AI could do even more for accessibility. It might be able to change digital tools to fit each person's needs. This would make the web a place where everyone can participate equally.</p>\n<p>But we have to keep improving AI tools and use them in the right way. This is important for making sure they help everyone and don't leave anyone out.</p>\n<p>AI could help us create a digital world that is truly open to everyone. This is an exciting future to think about!</p>\n<h2 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AiAndAccessibility/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/ZAhqzbF2Lt-360.avif 360w, https://b.polente.de/img/ZAhqzbF2Lt-608.avif 608w, https://b.polente.de/img/ZAhqzbF2Lt-960.avif 960w, https://b.polente.de/img/ZAhqzbF2Lt-1240.avif 1240w, https://b.polente.de/img/ZAhqzbF2Lt-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/ZAhqzbF2Lt-360.webp 360w, https://b.polente.de/img/ZAhqzbF2Lt-608.webp 608w, https://b.polente.de/img/ZAhqzbF2Lt-960.webp 960w, https://b.polente.de/img/ZAhqzbF2Lt-1240.webp 1240w, https://b.polente.de/img/ZAhqzbF2Lt-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/ZAhqzbF2Lt-360.png 360w, https://b.polente.de/img/ZAhqzbF2Lt-608.png 608w, https://b.polente.de/img/ZAhqzbF2Lt-960.png 960w, https://b.polente.de/img/ZAhqzbF2Lt-1240.png 1240w, https://b.polente.de/img/ZAhqzbF2Lt-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"This image illustrates a futuristic AI technology interface used for accessibility testing. It shows an interactive screen displaying various accessibility features and AI tools represented as interconnected nodes and lines\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/ZAhqzbF2Lt-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<p>We've talked about how AI is helping with digital accessibility. It's making it easier to check and improve websites and apps so that everyone can use them. As technology keeps changing, we should use AI to make sure our digital world is open to all.</p>\n<p>I encourage everyone, whether you're making websites, leading a business, or just using digital tools, to think about how AI can help with accessibility. By using AI, we can work together to create a digital space that is welcoming and useful for everyone.</p>\n<h2 id=\"call-to-action\" tabindex=\"-1\">Call to Action <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AiAndAccessibility/\">#</a></h2>\n<p>I invite you all to share your thoughts and experiences about AI and accessibility. Tell us how it's making a difference in your work or life.</p>\n<p>Also, try out some AI tools that can help make your workplace more accessible. There are many tools out there that can make a big difference. Let's use AI to break down barriers and build a digital world that is accessible to everyone. Join in and be part of making a better future!</p>\n",
			"date_published": "2024-01-09T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/",
			"url": "https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/",
			"title": "Full Stack vs. Full Lifecycle Engineering",
			"content_html": "<h2 id=\"tl-dr\" tabindex=\"-1\">TL;DR <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/\">#</a></h2>\n<p>Tech changes a lot, and just knowing a bit of everything in coding isn't enough now. Full Lifecycle Engineering, which goes deeper into specific topics, makes sure projects are high quality and successful, even if they're complicated.</p>\n<h2 id=\"introduction\" tabindex=\"-1\">Introduction <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/\">#</a></h2>\n<p>Web development is always changing. There's a big difference now between being good at a little bit of everything (Full Stack) and knowing a lot about specific parts of a project (Full Lifecycle Engineering). Full Stack Engineers are handy, but they might not know enough about specific things like making websites run well or show up in Google searches. Full Lifecycle Engineers, however, really focus on these details.</p>\n<h2 id=\"full-stack-engineering\" tabindex=\"-1\">Full Stack Engineering <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/ub2_RUvk66-360.avif 360w, https://b.polente.de/img/ub2_RUvk66-608.avif 608w, https://b.polente.de/img/ub2_RUvk66-960.avif 960w, https://b.polente.de/img/ub2_RUvk66-1240.avif 1240w, https://b.polente.de/img/ub2_RUvk66-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/ub2_RUvk66-360.webp 360w, https://b.polente.de/img/ub2_RUvk66-608.webp 608w, https://b.polente.de/img/ub2_RUvk66-960.webp 960w, https://b.polente.de/img/ub2_RUvk66-1240.webp 1240w, https://b.polente.de/img/ub2_RUvk66-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/ub2_RUvk66-360.png 360w, https://b.polente.de/img/ub2_RUvk66-608.png 608w, https://b.polente.de/img/ub2_RUvk66-960.png 960w, https://b.polente.de/img/ub2_RUvk66-1240.png 1240w, https://b.polente.de/img/ub2_RUvk66-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A funny picture of a full stack engineer trying to do many things at once in a messy office.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/ub2_RUvk66-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h3 id=\"knowing-a-bit-of-everything\" tabindex=\"-1\">Knowing a Bit of Everything? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/\">#</a></h3>\n<ul>\n<li><strong>What They Do</strong>: Full Stack Engineers work on everything from the front (what users see) to the back (server-side) of a website. But sometimes, this isn't enough for today's complicated tech.</li>\n<li><strong>Problems</strong>: They use many tools, but might not know some of them deeply. This can lead to average results, especially in making a good user experience or fast website.</li>\n<li><strong>Effects</strong>: This way of working often means having to go back and improve things later, which is more work and can make the project not as good in the end.</li>\n</ul>\n<h2 id=\"full-lifecycle-engineering\" tabindex=\"-1\">Full Lifecycle Engineering <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/\">#</a></h2>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/yIt0FzVhBl-360.avif 360w, https://b.polente.de/img/yIt0FzVhBl-608.avif 608w, https://b.polente.de/img/yIt0FzVhBl-960.avif 960w, https://b.polente.de/img/yIt0FzVhBl-1240.avif 1240w, https://b.polente.de/img/yIt0FzVhBl-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/yIt0FzVhBl-360.webp 360w, https://b.polente.de/img/yIt0FzVhBl-608.webp 608w, https://b.polente.de/img/yIt0FzVhBl-960.webp 960w, https://b.polente.de/img/yIt0FzVhBl-1240.webp 1240w, https://b.polente.de/img/yIt0FzVhBl-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/yIt0FzVhBl-360.png 360w, https://b.polente.de/img/yIt0FzVhBl-608.png 608w, https://b.polente.de/img/yIt0FzVhBl-960.png 960w, https://b.polente.de/img/yIt0FzVhBl-1240.png 1240w, https://b.polente.de/img/yIt0FzVhBl-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A picture showing a full lifecycle engineer working well with a team of experts and happy clients in a professional office.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/yIt0FzVhBl-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h3 id=\"focusing-on-details\" tabindex=\"-1\">Focusing on Details <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/\">#</a></h3>\n<ul>\n<li><strong>What They Do</strong>: This approach covers the whole process of making software, needing a more detailed and careful way of working.</li>\n<li><strong>Expertise</strong>: Unlike the general approach of Full Stack, Full Lifecycle Engineering uses deep knowledge, which is really important for big, complex projects.</li>\n<li><strong>Real Benefits</strong>: Teams led by Lifecycle Engineers with specific skills usually make more lasting, high-quality work. They avoid the problems of just scratching the surface.</li>\n</ul>\n<h2 id=\"the-core-debate\" tabindex=\"-1\">The Core Debate <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/\">#</a></h2>\n<h3 id=\"jack-of-all-trades-vs-experts\" tabindex=\"-1\">Jack-of-All-Trades vs. Experts <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/\">#</a></h3>\n<ul>\n<li><strong>Deep Knowledge</strong>: Full Stack Engineers, like jacks-of-all-trades, might not know enough about advanced stuff like user-friendly design. They're flexible but might need experts for some projects.</li>\n<li><strong>Quality or Quantity</strong>: It's a choice between Full Stack Engineers doing a lot quickly and Full Lifecycle Engineers doing detailed, high-quality work. Generalists are versatile but might lack deep knowledge.</li>\n<li><strong>What's Needed for the Future</strong>: As web technology changes, it's important to have both: Full Stack for flexibility and Lifecycle Engineers for their focused skills.</li>\n</ul>\n<h2 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FullStackVSFullLifecycleEngineering/\">#</a></h2>\n<p>The debate between Full Stack and Full Lifecycle Engineering shows how the tech world is moving towards needing more specialized knowledge for complicated tech. Full Stack Engineers are adaptable, but the depth and skills of Full Lifecycle Engineers are crucial for complex, lasting projects. To avoid average results that come from knowing a little about a lot, use experts in your projects for the best results.</p>\n<p>Image Source: DALL·E 3</p>\n",
			"date_published": "2024-01-05T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/FromDotComToAI/",
			"url": "https://b.polente.de/blog/FromDotComToAI/",
			"title": "Navigating Bubbles: Lessons from Dot-Com to AI",
			"content_html": "<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/JvN7dL1kSx-360.avif 360w, https://b.polente.de/img/JvN7dL1kSx-608.avif 608w, https://b.polente.de/img/JvN7dL1kSx-960.avif 960w, https://b.polente.de/img/JvN7dL1kSx-1240.avif 1240w, https://b.polente.de/img/JvN7dL1kSx-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/JvN7dL1kSx-360.webp 360w, https://b.polente.de/img/JvN7dL1kSx-608.webp 608w, https://b.polente.de/img/JvN7dL1kSx-960.webp 960w, https://b.polente.de/img/JvN7dL1kSx-1240.webp 1240w, https://b.polente.de/img/JvN7dL1kSx-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/JvN7dL1kSx-360.png 360w, https://b.polente.de/img/JvN7dL1kSx-608.png 608w, https://b.polente.de/img/JvN7dL1kSx-960.png 960w, https://b.polente.de/img/JvN7dL1kSx-1240.png 1240w, https://b.polente.de/img/JvN7dL1kSx-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"represents the transition from the dot-com era to the modern AI boom, showcasing a diverse group of people engaged in activities related to both periods of technological evolution.\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/JvN7dL1kSx-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h2 id=\"introduction\" tabindex=\"-1\">Introduction <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h2>\n<p>In the ever-evolving landscape of technology, economic bubbles have periodically emerged, significantly impacting the way businesses operate and how innovations are perceived. From the explosive growth and subsequent collapse of the dot-com bubble in the late 1990s and early 2000s to the current wave of excitement surrounding Artificial Intelligence (AI), these bubbles have shaped the technological and business world.</p>\n<p>Now, as a seasoned Director of Experience Engineering, I've witnessed these cycles firsthand. My journey began in the heart of the dot-com era, a period marked by a surge in internet-based businesses and unprecedented investments in new technology ventures. This was a time when the digital landscape was just beginning to unfold, offering endless possibilities and, as we later learned, considerable risks.</p>\n<p>My career took off in a typical dot-com agency/consulting role around the year 2000, a time marked by rapid innovation and value creation. During this era, I was part of a team that developed some of the earliest web pages for prominent companies like Nestle and Ticona, in collaboration with PopNet Communication. Our focus was not just on leveraging the latest technology but also on creating sustainable applications that would stand the test of time.</p>\n<p>Reflecting on this period provides valuable insights into the current enthusiasm surrounding AI. Today, as AI technology advances at an unprecedented pace, it's crucial to draw lessons from the past, understanding both the potential and the pitfalls of such rapid technological adoption.</p>\n<p>In this blog post, we'll explore the similarities and differences between the dot-com bubble and the current AI hype, my personal experiences during these transformative periods, and the lessons that can help us navigate the future of technology more responsibly.</p>\n<h2 id=\"my-start-in-a-dot-com-agency-consulting-in-2000\" tabindex=\"-1\">My Start in a Dot-Com Agency/Consulting in 2000 <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h2>\n<p>In the year 2000, the digital landscape was brimming with new possibilities. This was when I embarked on my journey in a dot-com agency/consulting firm. This period was not just about embracing new technologies; it was a time of significant value creation and rapid learning. The dot-com era, known for its rapid rise in internet-based businesses, was a fertile ground for innovation and pioneering digital strategies.</p>\n<h3 id=\"developing-early-websites-for-major-clients\" tabindex=\"-1\">Developing Early Websites for Major Clients <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>During this time, I had the opportunity to work on projects for major clients like Nestle and Ticona, in partnership with PopNet Communication. These projects weren't just about building websites; they were about crafting digital experiences. This was a time when websites were transitioning from being mere information portals to becoming essential tools for business engagement and customer interaction.</p>\n<h3 id=\"using-cutting-edge-technology-to-create-sustainable-applications\" tabindex=\"-1\">Using Cutting-Edge Technology to Create Sustainable Applications <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>Our approach was anchored in using the latest technology not just for the sake of innovation but to create sustainable applications. The focus was on developing digital solutions that would stand the test of time. This approach proved to be invaluable, as the applications we developed continued to serve our clients well, even years after their inception. This experience highlighted the importance of foresight in technology - creating solutions that were not just trendy but had lasting value.</p>\n<p>This phase of my career was instrumental in shaping my understanding of the tech industry. It taught me the importance of balancing innovation with sustainability, a lesson that remains relevant in today's rapidly evolving AI landscape.</p>\n<h2 id=\"understanding-the-dot-com-bubble\" tabindex=\"-1\">Understanding the Dot-Com Bubble <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h2>\n<p>The dot-com bubble, a significant event in the late 1990s and early 2000s, was characterized by a frenzied investment in internet-based companies. This era was marked by optimistic speculation about the potential of the internet, leading to inflated valuations of tech companies. Many investors believed that traditional business metrics were no longer applicable in the digital age, leading to a rush to invest in any company with a &quot;.com&quot; in its name. The NASDAQ Composite, heavily weighted with tech stocks, saw a dramatic rise, only to plummet when the bubble burst. This crash resulted in significant financial losses and the failure of many dot-com companies.</p>\n<h3 id=\"our-company-s-approach-during-the-dot-com-burst\" tabindex=\"-1\">Our Company's Approach During the Dot-Com Burst <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>During this tumultuous period, the consulting firm I was part of adopted a strategy focused on creating real value for clients, rather than chasing short-term profits. This approach was crucial during the dot-com crash. While many companies, driven by profit motives and lacking in substantial client value, struggled or even ceased to exist, our firm was part of this. But our commitment to sustainable, value-driven solutions for our clients enabled them to maintain stability even as the market fluctuated wildly.</p>\n<h3 id=\"transition-to-bbdo-and-interone\" tabindex=\"-1\">Transition to BBDO and Interone <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>The period following the burst of the dot-com bubble was a time of consolidation and reevaluation in the tech industry. Our company was bought out by BBDO, a global advertising and marketing company, and we became a part of the Interone world. This transition marked a new chapter, where we brought our expertise and experience in digital solutions to a larger, more diverse environment. Integrating into BBDO and Interone provided us with new opportunities to apply our skills and insights from the dot-com era to a broader range of projects and challenges.</p>\n<p>This journey through the rise and fall of the dot-com bubble and the subsequent transition to a larger conglomerate was a testament to the resilience and adaptability required in the ever-changing tech landscape. It highlighted the importance of focusing on real value creation in technology ventures, a lesson that is increasingly relevant in today's AI-driven market.</p>\n<h2 id=\"transitioning-to-the-current-ai-boom\" tabindex=\"-1\">Transitioning to the Current AI Boom <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h2>\n<p>As we move from the dot-com bubble to the present, we find ourselves in the midst of another technological surge: the AI boom. This era shares similarities with the dot-com era, such as the high level of excitement and investment in a novel technology. However, there are also stark differences that set the two apart.</p>\n<h3 id=\"parallels-and-differences-with-the-dot-com-era\" tabindex=\"-1\">Parallels and Differences with the Dot-Com Era <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>Like the dot-com era, the AI boom is marked by a rush of investments and a general buzz around the technology's potential. Both periods are characterized by a belief in the transformative power of a new technology – first the internet, and now AI. However, unlike many dot-com companies that were often based on speculative business models, the current AI industry consuming companies are often also built on fragile applications and advancements. But: the AI sector benefits from the lessons learned from the dot-com crash, leading sometimes to more cautious investment and valuation strategies.</p>\n<h3 id=\"significant-investments-and-rising-stock-prices-in-ai\" tabindex=\"-1\">Significant Investments and Rising Stock Prices in AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>The AI industry has witnessed significant investment, both from venture capitalists and established tech giants. This influx of capital has been driving the rapid development of AI technologies. Companies that are heavily involved in AI research and development, such as those working on machine learning, natural language processing, and robotics, have seen their stock prices rise. This increase reflects the market's confidence in the potential of AI to revolutionize various industries.</p>\n<h3 id=\"heightened-expectations-surrounding-ai-technologies\" tabindex=\"-1\">Heightened Expectations Surrounding AI Technologies <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>The expectations surrounding AI are high, with predictions about its ability to transform industries such as healthcare, finance, transportation, and more. These expectations are not just about incremental improvements but about fundamental changes in how we interact with technology and how businesses operate. Unlike the dot-com era, where the internet was a platform for businesses, AI is seen as a tool that can enhance and even automate many business processes, leading to more efficient, intelligent, and personalized services.</p>\n<p>This transition to the AI era highlights the ongoing evolution of technology and its impact on business and society. While there are lessons to be learned from the past, the AI boom also presents unique challenges and opportunities that require a nuanced understanding of technology's role in our world today.</p>\n<h2 id=\"ai-vs-dot-com-key-differences\" tabindex=\"-1\">AI vs. Dot-Com: Key Differences <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h2>\n<p>The current AI market and the dot-com bubble of the late 1990s and early 2000s exhibit several key differences, which are crucial to understand for anyone looking to navigate the AI landscape effectively.</p>\n<h3 id=\"more-established-companies-in-ai\" tabindex=\"-1\">More Established Companies in AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>One of the most significant differences between the dot-com era and today's AI market is the nature of the companies involved. During the dot-com bubble, many startups with unproven business models and little to no profits went public, driven by the hype around the internet. In contrast, the AI field is dominated by more established companies. Tech giants like Google, Microsoft, and Amazon, which have been investing in AI for years, are leading the charge. These companies not only have deep pockets but also vast datasets and sophisticated technology infrastructures that give them a significant advantage in developing AI technologies. This maturity and establishment in the market suggest a more stable environment compared to the volatile landscape of the dot-com era.</p>\n<p>These companies will be the winners. The Free Riders thinking that using a Chat Prompt solves their issues, will not.</p>\n<h3 id=\"lower-stock-valuations-in-ai\" tabindex=\"-1\">Lower Stock Valuations in AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>Another notable difference is in stock valuations. During the peak of the dot-com bubble, tech companies reached astronomically high valuations based on speculative growth projections. The forward price-to-earnings ratios of these companies were exceptionally high, indicating overvaluation. In contrast, AI companies today, particularly those that are part of larger, well-established tech firms, have more reasonable valuations. While there is excitement about the potential of AI, investors are generally more cautious and mindful of the lessons from the dot-com crash. This has led to more grounded valuations based on realistic assessments of the companies' potential earnings and growth.</p>\n<h3 id=\"cautious-investment-approach-in-the-ai-sector\" tabindex=\"-1\">Cautious Investment Approach in the AI Sector <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>Investors today are more cautious and discerning when it comes to funding AI ventures. Unlike the dot-com era, where there was a rush to invest in anything internet-related, investors in AI are more selective, focusing on companies with solid business models and clear paths to profitability. This cautious approach is partly due to the lessons learned from the dot-com bust, where many investors saw huge losses. There is a greater emphasis on sustainable growth, profitability, and long-term value creation in the AI sector. This shift in investment strategy is likely to contribute to a more stable and sustainable growth trajectory for the AI industry compared to the rapid and unsustainable growth of many dot-com companies.</p>\n<p>These differences highlight a more mature and cautious approach in the AI era, suggesting a potential for more sustainable growth and less risk of a bubble similar to the dot-com crash. While the excitement around AI is certainly reminiscent of the dot-com era, the context and market dynamics are notably different, offering a more grounded and potentially more promising future for AI technologies.</p>\n<h2 id=\"sustainability-and-challenges-in-ai\" tabindex=\"-1\">Sustainability and Challenges in AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h2>\n<p>As we delve deeper into the AI revolution, it's crucial to address the growing concerns surrounding its sustainability and the challenges it presents.</p>\n<h3 id=\"energy-consumption-and-environmental-impact\" tabindex=\"-1\">Energy Consumption and Environmental Impact <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>One of the primary concerns with the rapid advancement of AI is its energy consumption and potential environmental impact. AI systems, particularly large machine learning models, require significant computational power. This demand often translates into high energy usage, raising concerns about the carbon footprint of AI technologies. The energy-intensive nature of training and running sophisticated AI models has implications for global energy consumption and the environment. As AI becomes more pervasive, the industry must prioritize developing energy-efficient algorithms and leveraging renewable energy sources to mitigate these environmental impacts.</p>\n<h3 id=\"need-for-sustainable-and-client-focused-ai-development\" tabindex=\"-1\">Need for Sustainable and Client-Focused AI Development <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>To avoid the pitfalls of the dot-com era, where growth often overshadowed sustainability, AI development must be both sustainable and client-focused. This approach involves creating AI solutions that not only address immediate client needs but are also built with long-term viability in mind. Sustainable AI development means considering the environmental, ethical, and societal impacts of AI technologies. It also involves ensuring that AI solutions are scalable, reliable, and capable of adapting to evolving client needs and technological advancements.</p>\n<h3 id=\"challenges-facing-the-ai-industry-scalability-economic-factors-and-ethical-considerations\" tabindex=\"-1\">Challenges Facing the AI Industry: Scalability, Economic Factors, and Ethical Considerations <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>The AI industry faces several challenges that must be navigated carefully:</p>\n<ul>\n<li>\n<p><strong>Scalability:</strong> As AI applications grow, the challenge lies in scaling these solutions while maintaining efficiency and effectiveness. Scalability issues can arise due to limitations in data, computational resources, and the ability of AI systems to adapt to diverse and changing scenarios.</p>\n</li>\n<li>\n<p><strong>Economic Factors:</strong> The global economic environment affects investment in AI research and development. Economic downturns, shifts in market demand, and changes in funding can impact the pace and direction of AI innovation.</p>\n</li>\n<li>\n<p><strong>Ethical Considerations:</strong> AI raises numerous ethical questions, including privacy concerns, bias in AI algorithms, and the potential for misuse of AI technologies. Ensuring that AI is developed and deployed ethically requires ongoing dialogue, regulation, and adherence to ethical guidelines.</p>\n</li>\n</ul>\n<p>Addressing these challenges is essential for the responsible advancement of AI. By focusing on sustainability, client needs, and ethical considerations, the AI industry can aim for a future where technology not only drives innovation but also aligns with broader societal and environmental goals.</p>\n<h2 id=\"concluding-thoughts-a-path-forward-with-ai\" tabindex=\"-1\">Concluding Thoughts: A Path Forward with AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h2>\n<p>As we stand at the crossroads of another technological revolution with AI, it's essential to draw upon the lessons from the past, particularly those learned during the dot-com bubble, to navigate this new era responsibly.</p>\n<h3 id=\"sustainable-and-client-centric-ai-development\" tabindex=\"-1\">Sustainable and Client-Centric AI Development <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>From my experience, the key to enduring success in technology lies in sustainable and client-centric development. In the AI domain, this means creating solutions that not only leverage the capabilities of AI but also address real-world problems and client needs effectively. Sustainable development in AI should consider not just the immediate functionality of the technology but also its long-term impact on society, the environment, and ethical norms. AI should be a tool for enhancement and empowerment, not just a showcase of technical prowess.</p>\n<h3 id=\"learning-from-the-dot-com-bubble-to-navigate-ai-responsibly\" tabindex=\"-1\">Learning from the Dot-Com Bubble to Navigate AI Responsibly <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h3>\n<p>The dot-com bubble taught us the importance of grounding technological excitement in reality. In the AI sector, this translates to a focus on long-term value creation rather than short-term gains. Investors, developers, and companies should prioritize:</p>\n<ul>\n<li><strong>Solid Business Models:</strong> Emphasizing AI ventures that have clear, viable business models, avoiding the speculative frenzy that characterized the dot-com era.</li>\n<li><strong>Responsible Investment:</strong> Channeling funds into AI projects that promise sustainable growth and have a clear understanding of their market and the problems they aim to solve.</li>\n<li><strong>Ethical Considerations:</strong> Keeping ethical considerations at the forefront, ensuring AI is used to enhance and not detract from human capabilities and welfare.</li>\n<li><strong>Client Needs and Values:</strong> Aligning AI development with the actual needs and values of clients, ensuring that the technology adds real value to their lives and businesses.</li>\n<li><strong>Don't trust the Salesman:</strong> The more fancy and promising the person sells their product the more you should step back.</li>\n</ul>\n<p>By approaching the AI boom with a focus on sustainability, client-centric solutions, and responsible innovation, we can harness the power of AI to create a future that is not only technologically advanced but also socially responsible and environmentally sustainable. This balanced approach will enable us to leverage AI's potential fully while avoiding the pitfalls that have marked previous technological upheavals.</p>\n<h2 id=\"references\" tabindex=\"-1\">References <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FromDotComToAI/\">#</a></h2>\n<ul>\n<li><a href=\"https://futurism.com/ai-dot-com-bubble\">https://futurism.com/ai-dot-com-bubble</a></li>\n<li><a href=\"https://papercut.beehiiv.com/p/ai-hype-vs-dotcom-bubble-reality-check\">https://papercut.beehiiv.com/p/ai-hype-vs-dotcom-bubble-reality-check</a></li>\n<li><a href=\"https://www.visualcapitalist.com/sp/3-reasons-why-ai-enthusiasm-differs-from-the-dot-com-bubble/\">https://www.visualcapitalist.com/sp/3-reasons-why-ai-enthusiasm-differs-from-the-dot-com-bubble/</a></li>\n</ul>\n",
			"date_published": "2024-01-05T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/AIGeneratedImages/",
			"url": "https://b.polente.de/blog/AIGeneratedImages/",
			"title": "Navigating the Real and the Fabricated",
			"content_html": "<h2 id=\"the-new-wave-of-picture-making\" tabindex=\"-1\">The New Wave of Picture Making <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AIGeneratedImages/\">#</a></h2>\n<p>Lately, there's a big increase in pictures made by AI (Artificial Intelligence) on the internet. This change is reshaping the way we see and use pictures online. AI is getting really good at making images that look real, and it's getting hard to tell what's real and what's not.</p>\n<h2 id=\"how-this-affects-image-search-engines\" tabindex=\"-1\">How This Affects Image Search Engines <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AIGeneratedImages/\">#</a></h2>\n<p>Search engines like Google and Bing, which used to have mostly real pictures, are now full of these AI-made images. Some people think these AI images are just filling up space and are hard to separate from real ones. But, this view might miss out on the bigger picture and what AI images can do.</p>\n<h2 id=\"a-personal-view\" tabindex=\"-1\">A Personal View <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AIGeneratedImages/\">#</a></h2>\n<h3 id=\"imaginary-cats-and-what-we-think-is-real\" tabindex=\"-1\">Imaginary Cats and What We Think is Real <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AIGeneratedImages/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/BaznjeVkyB-360.avif 360w, https://b.polente.de/img/BaznjeVkyB-608.avif 608w, https://b.polente.de/img/BaznjeVkyB-960.avif 960w, https://b.polente.de/img/BaznjeVkyB-1240.avif 1240w, https://b.polente.de/img/BaznjeVkyB-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/BaznjeVkyB-360.webp 360w, https://b.polente.de/img/BaznjeVkyB-608.webp 608w, https://b.polente.de/img/BaznjeVkyB-960.webp 960w, https://b.polente.de/img/BaznjeVkyB-1240.webp 1240w, https://b.polente.de/img/BaznjeVkyB-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/BaznjeVkyB-360.png 360w, https://b.polente.de/img/BaznjeVkyB-608.png 608w, https://b.polente.de/img/BaznjeVkyB-960.png 960w, https://b.polente.de/img/BaznjeVkyB-1240.png 1240w, https://b.polente.de/img/BaznjeVkyB-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A collection of children's style cat drawings made by AI\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/BaznjeVkyB-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<p>Imagine if I posted pictures of cats drawn by my daughter when she was three. These aren't real cats, but if they get popular online, they might end up in search engines as if they were real cat pictures. This shows how AI can make fake images that seem real.</p>\n<h2 id=\"the-big-problem\" tabindex=\"-1\">The Big Problem <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AIGeneratedImages/\">#</a></h2>\n<h3 id=\"telling-what-s-true-from-what-s-made-up\" tabindex=\"-1\">Telling What's True from What's Made Up <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AIGeneratedImages/\">#</a></h3>\n<p>The real problem comes with more tricky things, like a made-up picture of a famous person building sandcastles on the beach. Figuring out if these complex fake images are real or not needs us to be more careful and smart.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/A20FlPTYDp-360.avif 360w, https://b.polente.de/img/A20FlPTYDp-608.avif 608w, https://b.polente.de/img/A20FlPTYDp-960.avif 960w, https://b.polente.de/img/A20FlPTYDp-1240.avif 1240w, https://b.polente.de/img/A20FlPTYDp-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/A20FlPTYDp-360.webp 360w, https://b.polente.de/img/A20FlPTYDp-608.webp 608w, https://b.polente.de/img/A20FlPTYDp-960.webp 960w, https://b.polente.de/img/A20FlPTYDp-1240.webp 1240w, https://b.polente.de/img/A20FlPTYDp-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/jpeg\" srcset=\"https://b.polente.de/img/A20FlPTYDp-360.jpeg 360w, https://b.polente.de/img/A20FlPTYDp-608.jpeg 608w, https://b.polente.de/img/A20FlPTYDp-960.jpeg 960w, https://b.polente.de/img/A20FlPTYDp-1240.jpeg 1240w, https://b.polente.de/img/A20FlPTYDp-1792.jpeg 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A person building sandcastles on a beach\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/A20FlPTYDp-360.jpeg\" width=\"1792\" height=\"1024\"></picture></p>\n<h2 id=\"how-we-figure-out-what-s-real\" tabindex=\"-1\">How We Figure Out What's Real <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AIGeneratedImages/\">#</a></h2>\n<p>We've always used our own judgement to check if what we see is real. This includes comparing different sources, looking for more proof, and using common sense. With AI-made images, it's even more important to use these skills.</p>\n<h2 id=\"the-problem-with-telling-ai-pictures-apart\" tabindex=\"-1\">The Problem with Telling AI Pictures Apart <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AIGeneratedImages/\">#</a></h2>\n<p>Some people think search engines shouldn't show AI-made images. But this is a simple answer to a complicated problem. The real issue is not just about filtering out AI stuff, but about teaching people how to think critically about the images they see.</p>\n<h2 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AIGeneratedImages/\">#</a></h2>\n<h3 id=\"adapting-to-change-with-awareness\" tabindex=\"-1\">Adapting to Change with Awareness <a class=\"header-anchor\" href=\"https://b.polente.de/blog/AIGeneratedImages/\">#</a></h3>\n<p>As AI keeps growing, we need to change how we handle information. We should accept AI-made images as part of our online world, but also get better at questioning and understanding them. In a world full of fake creations, our own thinking and judgement are the best tools we have. This won't be easy, but it's necessary.</p>\n",
			"date_published": "2024-01-04T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/FigmaDevModeFigJam/",
			"url": "https://b.polente.de/blog/FigmaDevModeFigJam/",
			"title": "Dev Mode in Figma - A Revolution for Developers",
			"content_html": "<h2 id=\"are-you-a-figma-fan-like-me\" tabindex=\"-1\">Are You a Figma Fan Like Me? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FigmaDevModeFigJam/\">#</a></h2>\n<p>Do you like Figma? If yes, you'll love the new Dev Mode feature. I'll explain how I use it in my designs and why it's so useful for developers.</p>\n<h3 id=\"what-is-dev-mode\" tabindex=\"-1\">What is Dev Mode? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FigmaDevModeFigJam/\">#</a></h3>\n<p>Dev Mode in Figma is a new, really helpful feature for developers. It's like a tool that lets you check your designs. You can see sizes, styles, and even make code for CSS, iOS, or Android right from your designs.</p>\n<h3 id=\"making-work-easier-with-dev-mode\" tabindex=\"-1\">Making Work Easier with Dev Mode <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FigmaDevModeFigJam/\">#</a></h3>\n<p>Dev Mode and Figma work together to make your work flow better. You can connect your designs, code, and even project tools in Figma. Dev Mode also makes sure your designs and code match.</p>\n<h3 id=\"introducing-figjam-with-ai\" tabindex=\"-1\">Introducing FigJam with AI <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FigmaDevModeFigJam/\">#</a></h3>\n<p>FigJam, part of Figma, now has AI tools. They help with group work and brainstorming. You can make boards for meetings and sort ideas easily.</p>\n<h3 id=\"figma-for-visual-studio-code\" tabindex=\"-1\">Figma for Visual Studio Code <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FigmaDevModeFigJam/\">#</a></h3>\n<p>Figma's tool for <a href=\"https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension\">Visual Studio Code</a> helps you look at designs, work with other designers, and get code ideas. It mixes design and coding.</p>\n<h3 id=\"easier-design-to-coding\" tabindex=\"-1\">Easier Design to Coding <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FigmaDevModeFigJam/\">#</a></h3>\n<p>Dev Mode helps you organize and update files, making it easier to go from designing to coding.</p>\n<h3 id=\"using-jambot-in-figjam\" tabindex=\"-1\">Using Jambot in FigJam <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FigmaDevModeFigJam/\">#</a></h3>\n<p>Jambot in FigJam uses AI to help with brainstorming and organizing ideas. It makes working together better.</p>\n<h3 id=\"using-ai-carefully\" tabindex=\"-1\">Using AI Carefully <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FigmaDevModeFigJam/\">#</a></h3>\n<p>AI tools in Figma and FigJam are powerful but need to be used carefully. Always check the information they give and follow OpenAI's rules.</p>\n<h3 id=\"choosing-ai-features\" tabindex=\"-1\">Choosing AI Features <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FigmaDevModeFigJam/\">#</a></h3>\n<p>AI in FigJam can be turned on or off, giving teams control over how much AI they use.</p>\n<h3 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/FigmaDevModeFigJam/\">#</a></h3>\n<p>Dev Mode and AI tools in Figma and FigJam are changing how we design and develop. They're not just about working faster, but about improving our whole approach.</p>\n<p>How are you using these new tools? Let me know in the comments.</p>\n<p>Read more about Figma's Dev Mode <a href=\"https://www.figma.com/de/dev-mode/\">here</a>.</p>\n",
			"date_published": "2023-12-15T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/",
			"url": "https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/",
			"title": "Case Study - B2B Electrical Distribution Company",
			"content_html": "<h2 id=\"tl-dr\" tabindex=\"-1\">TL;DR <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h2>\n<p>In a project with a B2B Electrical Distribution Company, Publicis Sapient tackled a complex, React-based Monorepo system by implementing a Figma-driven design system with design tokens and Styled Dictionary. This strategic shift improved accessibility by 20–30%, introduced a native CSS library for React, and ensured cross-platform consistency, significantly streamlining component usage. Robust support channels and an Open API for components further enhanced control. The project not only elevated the e-commerce platform’s performance and consistency but also set a new standard for accessibility, illustrating the transformative impact of a well-integrated design system in the Continuous Experience Pipeline.</p>\n<h3 id=\"background\" tabindex=\"-1\">Background <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h3>\n<p>This case study is about a client with a complex system, evolved over some years within a Monorepo environment, using Material UI (MUI) and internally developed design components. The existing setup led to cross-dependency issues and unnecessary complexities due to individual teams modifying components for their specific needs. So we did not had the need to be framework agnostic, and could rely on the existing technology, what was React.</p>\n<h3 id=\"challenges-faced\" tabindex=\"-1\">Challenges Faced <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h3>\n<ul>\n<li>Complex and intertwined codebase due to diverse custom modifications.</li>\n<li>Performance issues stemming from the practice of handling CSS via JavaScript in the React and Next.js setup.</li>\n<li>Accessibility concerns and inconsistent design implementation.</li>\n</ul>\n<h3 id=\"strategic-approach\" tabindex=\"-1\">Strategic Approach <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h3>\n<p>Our strategy focused on introducing a Figma-driven design system, employing design tokens and Styled Dictionary, and integrating these with the Figma Token Studio plugin. This approach was aimed at revamping the core e-commerce application to enhance reliability, accessibility, performance, and maintainability.</p>\n<h3 id=\"benefits-and-results\" tabindex=\"-1\">Benefits and results <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h3>\n<h4 id=\"improved-accessibility\" tabindex=\"-1\">Improved Accessibility <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h4>\n<p>By shifting to the new design system components, which were built with accessibility in mind from the outset, we reduced accessibility bugs by 20–30%.</p>\n<h4 id=\"native-css-library\" tabindex=\"-1\">Native CSS Library <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h4>\n<p>We developed a native CSS library for the React components, offering flexibility for future modifications and ensuring consistency across various platforms.</p>\n<h4 id=\"cross-platform-consistency\" tabindex=\"-1\">Cross-Platform Consistency <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h4>\n<p>Utilizing Styled Dictionary, we extended design decisions to Flutter for mobile app development, ensuring a consistent omnichannel experience.</p>\n<h4 id=\"streamlined-component-usage\" tabindex=\"-1\">Streamlined Component Usage <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h4>\n<p>The new system significantly reduced the need for teams to create new components, as they perfectly aligned with the client’s style guide.</p>\n<h4 id=\"enhanced-control-and-support\" tabindex=\"-1\">Enhanced Control and Support <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h4>\n<p>We established robust gatekeeping and support channels to manage the demand for additional functionalities. All components were designed with an Open API for easy extension.</p>\n<p>Awareness and Future Goals: The project not only improved performance and consistency but also raised awareness about non-functional requirements like accessibility. The client is now aiming for state-of-the-art accessibility in future releases.</p>\n<h4 id=\"improvements\" tabindex=\"-1\">Improvements <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h4>\n<p>The system is ever-evolving, and we currently plan to move away from Figma Token Studio to directly consume the newly introduced Figma variables. Also, ongoing design decisions and component improvements need to be factored in. The pipeline is never stopping, and the components need ongoing enhancements; feedback needs to be built in, therefore keeping the acceptance high.</p>\n<h3 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">#</a></h3>\n<p>The introduction of a native CSS and React-based system, complemented by a meticulously crafted design system in Figma, profoundly transformed the client’s e-commerce platform utilizing the Continuous Experience Pipeline. This approach not only addressed specific technical challenges but also aligned perfectly with the company’s broader objectives for performance, consistency, and accessibility, paving the way for a more seamless and inclusive user experience.</p>\n",
			"date_published": "2023-12-13T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/",
			"url": "https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/",
			"title": "Case Study - Enhancing Digital Solutions for a Leading Logistics and Transportation Provider",
			"content_html": "<h2 id=\"tl-dr\" tabindex=\"-1\">TL;DR <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h2>\n<p>In a project for a major logistics and transportation provider, Publicis Sapient overcame complex, multi-framework challenges by adopting Web Components with Stencil and transitioning to Figma. This approach streamlined the development process through the Continuous Experience Pipeline, enabling a unified codebase, efficient design processes, and consistent application across various platforms. The integration of Stencil and Figma led to significant improvements in efficiency, design consistency, and overall maintenance of digital solutions in a complex, multi-technology environment.</p>\n<h3 id=\"project-overview\" tabindex=\"-1\">Project Overview <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h3>\n<p>At Publicis Sapient, we embarked on a project for a major logistics and transportation provider, characterized by a diverse ecosystem and a reliance on various technical solutions. Initially tailored for internal React needs, the project quickly expanded to accommodate other teams using Angular, prompting a shift to a multi-framework setup.</p>\n<h3 id=\"challenge\" tabindex=\"-1\">Challenge <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h3>\n<p>The client’s environment was complex, with many service providers using different technical solutions. Maintaining multiple frameworks was impractical, leading us to seek a more unified approach.</p>\n<h3 id=\"solution\" tabindex=\"-1\">Solution <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h3>\n<p>We chose to employ Web Components provided by Stencil, which allowed for wrapping components for different frameworks. This shift enabled us to maintain a single source and library for multiple uses and applications. Additionally, we transitioned from Sketch and InVision to <a href=\"https://www.figma.com/\">Figma</a>. This move proved beneficial, as Figma’s developer mode and <a href=\"https://www.w3.org/community/design-tokens/\">design tokens</a> in variables greatly facilitated maintaining a Continuous Experience Pipeline.</p>\n<p>The transition from traditional frameworks to <a href=\"https://www.webcomponents.org/introduction\">Web Components</a> marks a significant shift in web development practices. Traditionally, developers have relied on popular frameworks like React, Angular, or Vue.js to build web applications. These frameworks provide a structured way of developing applications, offering robust features, community support, and standardized practices. However, they often lead to dependency on specific ecosystem tools and can result in heavier, more complex codebases.</p>\n<p>Web Components, on the other hand, represent a move towards a more modular and standardized approach in web development. They are a set of technologies that allow developers to create reusable custom elements with encapsulated functionality, which can be used across different web applications regardless of the underlying technology stack. This means developers can build a component once and use it anywhere, without worrying about compatibility issues.</p>\n<p>Some years back I already asked <a href=\"https://medium.com/engineered-publicis-sapient/should-i-use-a-framework-or-library-ea9fa7ff6d5b\">Sould I use Web Components?</a></p>\n<h4 id=\"how-does-a-webcomponent-looks-like\" tabindex=\"-1\">How does a Webcomponent looks like? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<pre class=\"language-html\" tabindex=\"0\"><code class=\"language-html\"><span class=\"token comment\">&lt;!-- Define the Web Component --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\">\n  <span class=\"token keyword\">class</span> <span class=\"token class-name\">CustomHeadline</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">HTMLElement</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">attachShadow</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">mode</span><span class=\"token operator\">:</span> <span class=\"token string\">\"open\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">connectedCallback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> headlineText <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getAttribute</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"text\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token string\">\"Default Headline\"</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>shadowRoot<span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n&lt;style>\nh1 {\nfont-family: Arial, sans-serif;\ncolor: #333;\n}\n&lt;/style>\n&lt;h1></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>headlineText<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/h1>\n</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  window<span class=\"token punctuation\">.</span>customElements<span class=\"token punctuation\">.</span><span class=\"token function\">define</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"custom-headline\"</span><span class=\"token punctuation\">,</span> CustomHeadline<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token comment\">&lt;!-- Usage of the Web Component in HTML --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>custom-headline</span> <span class=\"token attr-name\">text</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>My Custom Headline<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>custom-headline</span><span class=\"token punctuation\">></span></span></code></pre>\n<h4 id=\"this-is-significant-for-several-reasons\" tabindex=\"-1\">This is significant for several reasons <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<p>The move towards Web Components is driven by a desire for more standardized, efficient, and interoperable web development practices, allowing for greater flexibility and future-proofing in building web applications.</p>\n<p>Web development practices focusing on standardization and interoperability ensure compatibility across modern browsers, alleviating cross-browser issues. This approach promotes the creation of reusable components, which enhances maintainability and minimizes code duplication. By leveraging native browser capabilities, it leads to lighter and more efficient applications, reducing dependency on external libraries. Moreover, this framework-agnostic methodology allows for flexibility across various project needs and offers protection against the shifting trends in JavaScript frameworks.</p>\n<h4 id=\"no-framework-but-stencil\" tabindex=\"-1\">No Framework but Stencil? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<p><a href=\"https://stenciljs.com/\">Stencil</a>, as a Web Components compiler, can play a pivotal role in the modern web development landscape, particularly in its ability to act as a wrapper for Web Components. Its primary function is to generate standard Web Components from a set of high-level, easy-to-write templates and scripts. Here are some key benefits of using Stencil in delivering solutions for multiple frameworks while remaining framework-agnostic.</p>\n<h4 id=\"how-does-a-stencil-web-component-look-like\" tabindex=\"-1\">How does a Stencil Web Component look like? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<pre class=\"language-html\" tabindex=\"0\"><code class=\"language-html\"><span class=\"token comment\">&lt;!-- Define the Stencil Component --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\">\n  <span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Component<span class=\"token punctuation\">,</span> Prop<span class=\"token punctuation\">,</span> h <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"@stencil/core\"</span><span class=\"token punctuation\">;</span>\n  @<span class=\"token function\">Component</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">tag</span><span class=\"token operator\">:</span> <span class=\"token string\">\"my-headline\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">shadow</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">MyHeadline</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Define a property to hold the headline text</span>\n    @<span class=\"token function\">Prop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> text<span class=\"token operator\">:</span> string<span class=\"token punctuation\">;</span>\n    <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span> <span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">}</span> <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token comment\">&lt;!-- Usage of the Stencil Component in HTML --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>my-headline</span> <span class=\"token attr-name\">text</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>My Custom Headline<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>my-headline</span><span class=\"token punctuation\">></span></span></code></pre>\n<p>Stencil’s creation of standard Web Components offers broad framework compatibility with platforms like React, Angular, and Vue, enabling seamless integration into various projects regardless of the underlying framework. It optimizes performance through features like lazy loading and efficient rendering, resulting in lightweight, speedy components essential for high-performance web applications. Stencil enhances developer productivity with a simplified approach to component creation, allowing for reuse across multiple projects and reducing development time.</p>\n<p>Equipped with tools like TypeScript support and JSX templating, it streamlines the development experience. By generating standard Web Components, Stencil future-proofs projects against the fluctuations of the JavaScript framework ecosystem, ensuring long-term relevance and usability. Additionally, it guarantees cross-platform consistency in component behavior and appearance, crucial for a uniform user experience across diverse digital environments.</p>\n<h3 id=\"how-is-the-continuous-experience-pipeline-used\" tabindex=\"-1\">How is the Continuous Experience Pipeline used? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h3>\n<p>In our context, a Continuous Experience Pipeline means that any design change in a component or token is directly updated in the codebase. This setup simplifies theming, as the tokens are utilized as specified, streamlining the process. The single packages for multiple frameworks are build and deployed into NPM Packages and can be utilized directly.</p>\n<h3 id=\"benefits-and-results\" tabindex=\"-1\">Benefits and results <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h3>\n<h4 id=\"unified-codebase\" tabindex=\"-1\">Unified Codebase <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<p>Issues are now adjusted in a single codebase, simplifying support and ensuring consistency across client-facing design and web applications.</p>\n<h4 id=\"one-support-channel\" tabindex=\"-1\">One Support Channel <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<p>This approach offers a singular support channel for all frameworks, enhancing efficiency.</p>\n<h4 id=\"consistent-application-and-design\" tabindex=\"-1\">Consistent Application and Design <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<p>As vendors start using the component library, the client’s web applications become more consistent and integrated.</p>\n<h4 id=\"documentation-and-maintenance-made-easy\" tabindex=\"-1\">Documentation and Maintenance made easy <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<p>We use Docusaurus and NPM for documentation and version maintenance, which our client and their IT vendors find valuable. Internal teams now support our efforts, and we’ve introduced gatekeepers to ensure changes don’t disrupt the teams using the system.</p>\n<h4 id=\"efficient-design-process\" tabindex=\"-1\">Efficient Design Process <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<p>Design efforts, in some cases, have been halved, as there’s no longer a need to ‘reinvent the wheel’.</p>\n<h4 id=\"tech-implementation-and-ramp-up\" tabindex=\"-1\">Tech Implementation and Ramp-up <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<p>While there was a learning curve for external teams unfamiliar with the libraries, the project setup provided foundational guidelines (like styles, fonts, reset options) that made project kickoffs up to 30% quicker.</p>\n<h4 id=\"overall-impact\" tabindex=\"-1\">Overall Impact <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h4>\n<p>Digital solutions using the Continuous Experience Pipeline are now faster to set up, adhere to better design principles, and are easier to maintain.</p>\n<h3 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">#</a></h3>\n<p>Stencil’s capabilities in creating standard Web Components greatly benefit our Continuous Experience Pipeline, offering framework compatibility, performance optimization, and enhanced productivity. Its tools and features ensure streamlined development and cross-platform consistency, aligning perfectly with our pipeline’s objectives for efficient, sustainable web solutions.</p>\n<p>The above highlights how Stencil’s framework-agnostic approach and the shift to Figma have significantly streamlined digital solutions, leading to improved efficiency and consistency in the client’s diverse technical environment utilizing the Continuous Experience Pipeline.</p>\n",
			"date_published": "2023-12-13T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/ContinuousExperiencePipelines/",
			"url": "https://b.polente.de/blog/ContinuousExperiencePipelines/",
			"title": "Embracing Agility and Efficiency - Our Journey with Continuous Experience Pipelines",
			"content_html": "<h2 id=\"tl-dr\" tabindex=\"-1\">TL;DR <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h2>\n<p>Publicis Sapient’s journey in web development and design, encapsulated in our Continuous Experience Pipeline approach, highlights our adaptability and success in addressing diverse client needs. Our approach demonstrates how the flexibility in choosing tools and technology can significantly improve the efficiency and scalability of web projects with Continuous Experience Pipelines.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/XPs-vtj4H6-360.avif 360w, https://b.polente.de/img/XPs-vtj4H6-608.avif 608w, https://b.polente.de/img/XPs-vtj4H6-960.avif 960w, https://b.polente.de/img/XPs-vtj4H6-1240.avif 1240w, https://b.polente.de/img/XPs-vtj4H6-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/XPs-vtj4H6-360.webp 360w, https://b.polente.de/img/XPs-vtj4H6-608.webp 608w, https://b.polente.de/img/XPs-vtj4H6-960.webp 960w, https://b.polente.de/img/XPs-vtj4H6-1240.webp 1240w, https://b.polente.de/img/XPs-vtj4H6-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/XPs-vtj4H6-360.png 360w, https://b.polente.de/img/XPs-vtj4H6-608.png 608w, https://b.polente.de/img/XPs-vtj4H6-960.png 960w, https://b.polente.de/img/XPs-vtj4H6-1240.png 1240w, https://b.polente.de/img/XPs-vtj4H6-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/XPs-vtj4H6-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h3 id=\"introducing-the-continuous-experience-pipelines\" tabindex=\"-1\">Introducing the Continuous Experience Pipelines <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h3>\n<p>Experience Engineering at Publicis Sapient is about creating digital solutions for outstanding user experiences. This approach involves a team of designers, developers, and strategists who use innovative technology and industry insights to build engaging web applications. The focus is on delivering visually appealing, user-friendly, and effective digital platforms. This ranges from simple marketing campaign pages to complex e-commerce platforms and enterprise software. Employing Agile and Lean methodologies, the team ensures rapid, adaptable, and high-quality development, meeting the evolving needs of the digital landscape.</p>\n<h3 id=\"the-challenge\" tabindex=\"-1\">The challenge <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h3>\n<p>Web development and design inevitably grapples with technical challenges such as intricate workflow complexities, alignment discrepancies within design teams, divergent technical design decisions, and inconsistencies in user experience across various digital platforms.</p>\n<h3 id=\"the-concept\" tabindex=\"-1\">The Concept <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h3>\n<p>Our Continuous Experience Pipeline approach elegantly overcomes these challenges by optimizing processes and introducing cross discipline, leading to better user experience, design and development. This approach allows us the flexibility to adopt technological strategies. One example is our embrace of Web Components or in other cases React only; our choice of technology is context-dependent and not pre-defined. We primarily focus on essential tools like Figma, Styled Dictionary, and automated pipelines to maintain this adaptable and efficient ecosystem, without defining a framework or frontend tooling.</p>\n<h3 id=\"case-studies-diverse-ways-of-achieving-continuous-experience-pipelines\" tabindex=\"-1\">Case Studies, diverse ways of achieving Continuous Experience Pipelines <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/dn7xbrJOrC-360.avif 360w, https://b.polente.de/img/dn7xbrJOrC-608.avif 608w, https://b.polente.de/img/dn7xbrJOrC-960.avif 960w, https://b.polente.de/img/dn7xbrJOrC-1240.avif 1240w, https://b.polente.de/img/dn7xbrJOrC-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/dn7xbrJOrC-360.webp 360w, https://b.polente.de/img/dn7xbrJOrC-608.webp 608w, https://b.polente.de/img/dn7xbrJOrC-960.webp 960w, https://b.polente.de/img/dn7xbrJOrC-1240.webp 1240w, https://b.polente.de/img/dn7xbrJOrC-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/dn7xbrJOrC-360.png 360w, https://b.polente.de/img/dn7xbrJOrC-608.png 608w, https://b.polente.de/img/dn7xbrJOrC-960.png 960w, https://b.polente.de/img/dn7xbrJOrC-1240.png 1240w, https://b.polente.de/img/dn7xbrJOrC-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/dn7xbrJOrC-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<p>At Publicis Sapient, we have successfully implemented numerous Design Systems as part of a Continuous Experience Pipeline setup for various clients. Our experience has demonstrated the effectiveness of this approach even in highly scalable customer environments.</p>\n<ul>\n<li><a href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase1/\">Case Study 1 - Enhancing Digital Solutions for a Leading Logistics and Transportation Provider</a></li>\n<li><a href=\"https://b.polente.de/blog/ContinuousExperiencePipelinesCase2/\">Case Study 2 - B2B Electrical Distribution Company</a></li>\n</ul>\n<h3 id=\"figma-a-game-changer-in-the-continuous-experience-pipeline\" tabindex=\"-1\">Figma: A Game-Changer in the Continuous Experience Pipeline <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/riDWarFK1J-360.avif 360w, https://b.polente.de/img/riDWarFK1J-608.avif 608w, https://b.polente.de/img/riDWarFK1J-960.avif 960w, https://b.polente.de/img/riDWarFK1J-1240.avif 1240w, https://b.polente.de/img/riDWarFK1J-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/riDWarFK1J-360.webp 360w, https://b.polente.de/img/riDWarFK1J-608.webp 608w, https://b.polente.de/img/riDWarFK1J-960.webp 960w, https://b.polente.de/img/riDWarFK1J-1240.webp 1240w, https://b.polente.de/img/riDWarFK1J-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/riDWarFK1J-360.png 360w, https://b.polente.de/img/riDWarFK1J-608.png 608w, https://b.polente.de/img/riDWarFK1J-960.png 960w, https://b.polente.de/img/riDWarFK1J-1240.png 1240w, https://b.polente.de/img/riDWarFK1J-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/riDWarFK1J-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<h3 id=\"background-on-continuous-experience-pipelines\" tabindex=\"-1\">Background on Continuous Experience Pipelines <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h3>\n<p>Figma represents a significant step forward in staying aligned with industry-leading tools and technologies. It has not only enhanced our design and development workflow but also opened doors to future innovations and efficiencies. The shift underscores our commitment to embracing cutting-edge technologies to deliver superior digital experiences. This shift was primarily driven by the limitations we experienced with the previous tools, particularly in terms of granular design control and utilization of design tokens, which were only rudimentarily supported.</p>\n<h4 id=\"enhancements-with-figma\" tabindex=\"-1\">Enhancements with Figma <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h4>\n<h5>Advanced Design Token Utilization</h5>\n<p>Figma allowed us to fully leverage nearly all design decisions. The flexibility and depth it offers in handling design tokens far surpass what was possible with Sketch and InVision.\nKey Aspects of a Continuous Experience Pipelines</p>\n<p>An important lesson in transitioning to a design system is to focus on fundamental design decisions like fonts, colors, line-height, padding, margins, breakpoints, z-index, opacity, shadows, borders, radius, sizes, and colors. Avoid overcomplicating with layout and full component design tokens, as this can hinder maintenance and acceptance.</p>\n<h5>Tool Integration</h5>\n<p>The integration of tools like Styled Dictionary, Storybook, or Docusaurus for documenting code has proven invaluable. These tools are widely recognized and help in creating a coherent understanding of the design system.</p>\n<h5>Automating Design to Code</h5>\n<p>Implementing a CI/CD pipeline that automatically translates design decisions into code is crucial. This automation streamlines the process, ensuring that design changes are efficiently reflected in the codebase.</p>\n<h5>Versioning and Library Management</h5>\n<p>Ensuring that the library is versioned in a registry like NPM is essential for effective management and distribution.</p>\n<h4 id=\"staying-ahead-with-generative-technology\" tabindex=\"-1\">Staying Ahead with generative Technology <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h4>\n<p>Exploring AI and Generative AI Tools: The potential of integrating AI and generative AI tools in our workflow is exciting. These technologies could further automate and innovate our design processes, such as generating varied content for prototypes.</p>\n<h4 id=\"figma-as-a-game-changer\" tabindex=\"-1\">Figma as a Game Changer <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h4>\n<p>Figma has revolutionized our workflow by offering unparalleled control and integration capabilities. It has become a central tool in our design process, significantly enhancing efficiency and collaboration.</p>\n<h3 id=\"how-does-a-continuous-experience-pipeline-finally-look-like\" tabindex=\"-1\">How does a Continuous Experience Pipeline finally look like? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/B73Ujm0H2y-360.avif 360w, https://b.polente.de/img/B73Ujm0H2y-608.avif 608w, https://b.polente.de/img/B73Ujm0H2y-960.avif 960w, https://b.polente.de/img/B73Ujm0H2y-1240.avif 1240w, https://b.polente.de/img/B73Ujm0H2y-1728.avif 1728w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/B73Ujm0H2y-360.webp 360w, https://b.polente.de/img/B73Ujm0H2y-608.webp 608w, https://b.polente.de/img/B73Ujm0H2y-960.webp 960w, https://b.polente.de/img/B73Ujm0H2y-1240.webp 1240w, https://b.polente.de/img/B73Ujm0H2y-1728.webp 1728w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/B73Ujm0H2y-360.png 360w, https://b.polente.de/img/B73Ujm0H2y-608.png 608w, https://b.polente.de/img/B73Ujm0H2y-960.png 960w, https://b.polente.de/img/B73Ujm0H2y-1240.png 1240w, https://b.polente.de/img/B73Ujm0H2y-1728.png 1728w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"A flow of Components and Tools used in the Continuous Experience Pipeline utilized and mentioned here\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/B73Ujm0H2y-360.png\" width=\"1728\" height=\"1433\"></picture></p>\n<p>In summary, our journey at Publicis Sapient in web development and design showcases the adaptability and success of our approaches, particularly in the continual evolution of tools and technologies in our Continuous Experience Pipeline.</p>\n<h4 id=\"adaptable-approaches\" tabindex=\"-1\">Adaptable Approaches <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h4>\n<p>Our projects demonstrate adaptability in addressing diverse client needs, from transitioning to Web Components with Stencil for a logistics provider to implementing a native CSS and React system for an electrical distribution client. This flexibility ensures that our solutions are both effective and tailored to specific project requirements.</p>\n<h4 id=\"success-with-stencil\" tabindex=\"-1\">Success with Stencil <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h4>\n<p>The use of Stencil as a Web Components wrapper has been a standout success, enabling us to deliver multi-framework solutions while maintaining a single codebase. This approach has streamlined our development process, improved performance, and ensured consistency across various platforms.</p>\n<h4 id=\"evolving-tools-and-technologies\" tabindex=\"-1\">Evolving Tools and Technologies <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h4>\n<p>Our shift from Sketch and InVision to Figma highlights our commitment to evolving with industry-leading tools. Figma has enhanced our design workflow by providing advanced control over design tokens and integrating seamlessly with other documentation and automation tools.</p>\n<p>AI can revolutionize a Design System Manager and Continuous Experience Pipeline by offering predictive analytics for UX design, automating asset categorization, enabling real-time collaborative feedback, generating code efficiently, ensuring accessibility standards, and facilitating personalized user experiences. These AI-driven enhancements streamline design and development, ensuring cutting-edge, user-focused digital products. But this would be part of an own blog post.</p>\n<h3 id=\"invitation\" tabindex=\"-1\">Invitation <a class=\"header-anchor\" href=\"https://b.polente.de/blog/ContinuousExperiencePipelines/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/w30keWLt73-360.avif 360w, https://b.polente.de/img/w30keWLt73-608.avif 608w, https://b.polente.de/img/w30keWLt73-960.avif 960w, https://b.polente.de/img/w30keWLt73-1240.avif 1240w, https://b.polente.de/img/w30keWLt73-1792.avif 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/w30keWLt73-360.webp 360w, https://b.polente.de/img/w30keWLt73-608.webp 608w, https://b.polente.de/img/w30keWLt73-960.webp 960w, https://b.polente.de/img/w30keWLt73-1240.webp 1240w, https://b.polente.de/img/w30keWLt73-1792.webp 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/w30keWLt73-360.png 360w, https://b.polente.de/img/w30keWLt73-608.png 608w, https://b.polente.de/img/w30keWLt73-960.png 960w, https://b.polente.de/img/w30keWLt73-1240.png 1240w, https://b.polente.de/img/w30keWLt73-1792.png 1792w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/w30keWLt73-360.png\" width=\"1792\" height=\"1024\"></picture></p>\n<p>If our journey in web development and design resonates with you, we’re eager to connect. Whether you’re looking to explore new tools like Stencil and Figma or want to share your own experiences, we welcome your insights and collaboration. Feel free to reach out to us for an exchange of ideas and strategies. Let’s work together to create impactful digital solutions.</p>\n<p><em>Some of the images and word smithing was done with genAI</em></p>\n",
			"date_published": "2023-12-13T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/HeadlessCMS/",
			"url": "https://b.polente.de/blog/HeadlessCMS/",
			"title": "How does a Headless Content Management System (CMS) work?",
			"content_html": "<h2 id=\"history-of-content-management-systems\" tabindex=\"-1\">History of Content Management Systems <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessCMS/\">#</a></h2>\n<p>Content Management Systems as we use them today go back to the times when the Internet was invented by <a href=\"https://www.w3.org/People/Berners-Lee/#:~:text=A%20graduate%20of%20Oxford%20University,refined%20as%20Web%20technology%20spread.\">Tim Berners-Lee</a> in 1990. Data and Content had to be stored somewhere — and even more important — had to be maintained and updated. Initially, most contents were created like documents, edited, and stored as static pages. This is enhanced with the need for dynamic content, interaction like commenting, or linking.</p>\n<p>First CMS were still providing static HTML pages, that were rendered server-side by Script Languages like PHP, JSP, ASP, or other template languages or engines that have been created like <a href=\"https://github.com/twigphp/Twig\">TWIG</a>, <a href=\"https://experienceleague.adobe.com/docs/experience-manager-htl/using/overview.html\">HTL</a>, or <a href=\"https://freemarker.apache.org/\">Freemarker</a>. Allowing to interact with the pages with added forms. Nowadays with Node as JavaScript (we cover this later)</p>\n<p>This came with some problems as to how HTML is used, contents were only available in one format, and the source was created on a server that did not know anything about the device it was rendered on. With upcoming Mobile, but also other IoT devices it was hard to render this content appropriate on all devices.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/swwOf-6och-360.avif 360w, https://b.polente.de/img/swwOf-6och-608.avif 608w, https://b.polente.de/img/swwOf-6och-764.avif 764w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/swwOf-6och-360.webp 360w, https://b.polente.de/img/swwOf-6och-608.webp 608w, https://b.polente.de/img/swwOf-6och-764.webp 764w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/swwOf-6och-360.png 360w, https://b.polente.de/img/swwOf-6och-608.png 608w, https://b.polente.de/img/swwOf-6och-764.png 764w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"From Static Pages to Headless CMS, From HTML to Modern Layout techniques\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/swwOf-6och-360.png\" width=\"764\" height=\"197\"></picture></p>\n<h2 id=\"what-does-this-mean\" tabindex=\"-1\">What does this mean? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessCMS/\">#</a></h2>\n<p>While the content was rendered into a unique layer of HTML on the server-side, only CSS was able to design this output. There was a hard binding from Content to HTML. This caused less flexibility and relaunch. Or re-using of content created effort in re-creating the server-side rendering. CSS could always re-create new designs with existing content if HTML is written properly. (Examples like CSS Zengarden are showing this for decades) But this heavily depends on semantic Markup and no Elements used that cause already design (like line breaks, </p><div> containers that represent design or similar).<p></p>\n<h3 id=\"nowadays-we-can-adjust-layout-and-design-with-css-and-media-queries-there-were-times-when-browsers-were-not-supporting-this-well\" tabindex=\"-1\">Nowadays we can adjust layout and design with CSS and Media Queries. There were times when browsers were not supporting this well. <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessCMS/\">#</a></h3>\n<p>How do traditional CMS monoliths work?</p>\n<p>A traditional CMS is a software that you either install and manage yourself or in a managed server environment. Traditional CMS is also known as “monolithic” because they contain all functions and assumptions for working in a single system. Traditional CMS often offers a visual authoring interface for editing content (<a href=\"https://en.wikipedia.org/wiki/WYSIWYG\">WYSIWYG</a>), as they only have one context for displaying the content — usually a website. The system normally offers a direct editing layer on an existing rendered layout.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/YScqRx9KId-360.avif 360w, https://b.polente.de/img/YScqRx9KId-471.avif 471w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/YScqRx9KId-360.webp 360w, https://b.polente.de/img/YScqRx9KId-471.webp 471w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/YScqRx9KId-360.png 360w, https://b.polente.de/img/YScqRx9KId-471.png 471w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Showing a Headless flow, with an API layer and a Monolithic setup where Rendering, Data and Authoring is in one layerHeadless vs monolithic\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/YScqRx9KId-360.png\" width=\"471\" height=\"359\"></picture></p>\n<p>The headless CMS only contains a data layer and authoring. They provide an API for a headless rendering layer that consumes the data. The aforementioned is also one of the challenges. How can you render a WYSIWYG experience when your authoring system does not know about the rendering?</p>\n<p>A new generation of CMS were invented. These often offer additionally Headless on existing systems, like <a href=\"https://www.coremedia.com/en/content-cloud/headless-plus-content-management\">CoreMedia</a> for example, where besides Freemarker Template, a Headless GraphiQL server exists.</p>\n<h2 id=\"how-to-consume-headless-data\" tabindex=\"-1\">How to consume headless data <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessCMS/\">#</a></h2>\n<p>Headless also provides the possibility to get a content hub to ensure “Content first” implementation. Your one base of content will be able to maintain a bucket of additional endpoints.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/XhELnAbCEO-336.avif 336w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/XhELnAbCEO-336.webp 336w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"The CMS as Content Hub\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/XhELnAbCEO-336.png\" width=\"336\" height=\"336\"></picture></p>\n<p>This data will be consumed via APIs — below are some examples.</p>\n<h3 id=\"representational-state-transfer-rest\" tabindex=\"-1\">Representational state transfer (REST) <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessCMS/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/8_XE9-j-pJ-313.avif 313w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/8_XE9-j-pJ-313.webp 313w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Rest API Flow\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/8_XE9-j-pJ-313.png\" width=\"313\" height=\"128\"></picture></p>\n<p>REST is a software architecture style that defines how to create web services. Web services, which conform to the REST architectural style and are known as RESTful Web Services, provide interoperability between computer systems on the Internet. RESTful web services allow the requesting systems to access and manipulate web resources using a set of stateless operations.</p>\n<h3 id=\"graphql\" tabindex=\"-1\">GraphQL <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessCMS/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/zFa0_4ngIY-254.avif 254w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/zFa0_4ngIY-254.webp 254w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Flow: Client, GraphQL Server, DataGraphQL\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/zFa0_4ngIY-254.png\" width=\"254\" height=\"105\"></picture></p>\n<p><a href=\"https://graphql.org/learn/\">GraphQL</a> is a query language for your API. Also, a server-side connection for executing queries belongs to a type of system to use for your data management. GraphQL is not tied to a personal database or storage engine and is driven by hidden code and data management.</p>\n<p>A GraphQL service will have types and fields for those types. There are functions for each field from each type.</p>\n<p>This is the rising star, as it offers flexibility not known before.</p>\n<h3 id=\"groq\" tabindex=\"-1\">GROQ <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessCMS/\">#</a></h3>\n<p>I mention <a href=\"https://www.sanity.io/docs/groq\">GROQ</a> though it is not really widely used, but as I see similarities to GraphQL worth sharing.</p>\n<h2 id=\"advantages\" tabindex=\"-1\">Advantages <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessCMS/\">#</a></h2>\n<p>Use cases for headless CMS can be the following: You need to build a website with a technology you are familiar with, or web apps that use JavaScript frameworks like VUE, React, Svelte, Web Components, or Angular. Native mobile apps for iOS or Android can be directly consuming content. As you have seen, it’s not limited to websites.</p>\n<p>Where headless helps:</p>\n<ul>\n<li>Your team is familiar with a special UI Technology.</li>\n<li>There is a need for A/B tests</li>\n<li>If you require a client-side rendered Framework like VUE, React, etc</li>\n<li>Personalization of Content</li>\n<li>If you have static side generators in place (<a href=\"https://www.gatsbyjs.com/\">Gatsby</a>, <a href=\"https://github.com/onefriendaday/jekyll-example-togetherdigital\">Jekyll</a>, <a href=\"https://middlemanapp.com/\">Middleman</a>, <a href=\"https://nextjs.org/\">Next</a>, <a href=\"https://nuxtjs.org/\">Nuxt</a>, or <a href=\"https://www.11ty.dev/\">Eleventy</a>)</li>\n<li>Mobile Apps or IoT</li>\n<li>If you need to enhance your E-Commerce data.</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th></th>\n<th style=\"text-align:center\"><strong>Monolithic</strong></th>\n<th style=\"text-align:center\"><strong>Headless</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Simplicity</td>\n<td style=\"text-align:center\">0</td>\n<td style=\"text-align:center\">0</td>\n</tr>\n<tr>\n<td>Localization</td>\n<td style=\"text-align:center\">+</td>\n<td style=\"text-align:center\">+</td>\n</tr>\n<tr>\n<td>Plug-in Uncertainty</td>\n<td style=\"text-align:center\">+</td>\n<td style=\"text-align:center\">-</td>\n</tr>\n<tr>\n<td>Cross-Platform</td>\n<td style=\"text-align:center\">-</td>\n<td style=\"text-align:center\">+</td>\n</tr>\n<tr>\n<td>Technology Freedom</td>\n<td style=\"text-align:center\">-</td>\n<td style=\"text-align:center\">+</td>\n</tr>\n<tr>\n<td>Developer first</td>\n<td style=\"text-align:center\">-</td>\n<td style=\"text-align:center\">+</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"drawbacks-and-challenges\" tabindex=\"-1\">Drawbacks and Challenges <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessCMS/\">#</a></h2>\n<p>Editing your content can be harder for authors on headless systems. Your System is depending on a second screen/system.</p>\n<p>Websites created with traditional CMS, allow customizable zones, and authors can resize and rearrange dynamic content easier. They are not limited to edit dynamic data in a fixed zone. They are enabled to share content easier.</p>\n<p>With headless, authors often can’t customize the placement or presentation much beyond given forms, without implementing configurable content grids. Dragging and dropping components is getting harder, as the components only exist as data and rely on a presentation layer.</p>\n<p>It can be more expensive to implement and the share of costs can get more complicated when only one unique source exists, but multiple layers consume it.</p>\n<p>Search Engine Optimization can also be trickier. Server-side Rendering (SSR) needs to be implemented for deep linking. SSR makes it even more complex. There are some advantages with server-side rendered JavaScript, but it is still an effort to consider. Think twice before considering headless. There can be use-cases where all of the above is not relevant. Usage depends.</p>\n<h2 id=\"conclusion\" tabindex=\"-1\">Conclusion <a class=\"header-anchor\" href=\"https://b.polente.de/blog/HeadlessCMS/\">#</a></h2>\n<p>There is no black and white decision possible. It depends on your team’s skills, your client’s or customers‘ needs, your project setup, and so on. Just make the right decision in the beginning.</p>\n</div>",
			"date_published": "2021-01-05T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/TrackingLike/",
			"url": "https://b.polente.de/blog/TrackingLike/",
			"title": "Tracking like ‘The Hare and the Hedgehog…’",
			"content_html": "<h2 id=\"should-we-play-this\" tabindex=\"-1\">…should we play this?* <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h2>\n<p>Will this blog explain how your customers shall be tracked bypassing current local or EU laws and browser vendor settings? <a href=\"https://gdpr-info.eu/\">GDPR</a>, or third-party cookies, for example?</p>\n<p>No, I’m afraid, you can stop reading if you expected this. I will also not give any legal advice on how to stay safe. Connect with your local legal office if you need such help.</p>\n<h3 id=\"is-it-about-how-we-track-and-why-people-protect-themselves\" tabindex=\"-1\">Is it about how we track, and why people protect themselves? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p>Yes, it is. I want to help you think about satisfying solutions that meet your customer’s needs and appreciate local law. (What is obviously also global).</p>\n<h2 id=\"what-we-track-and-how-tracking-happens\" tabindex=\"-1\">What we track and how tracking happens <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h2>\n<p>A quick check of a German Newspaper and their current state. Reason enough for me to do a quick check on the loaded resources with and without tracking protection — only with a view on requests and data transferred — triggered me again to take care of how we track our clients. We overload the web with tracking and advertisement (what also tracks), and other third-party stuff, that harms privacy and performance.</p>\n<h3 id=\"without-protection\" tabindex=\"-1\">Without Protection <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/K8ErvLW1hr-360.avif 360w, https://b.polente.de/img/K8ErvLW1hr-580.avif 580w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/K8ErvLW1hr-360.webp 360w, https://b.polente.de/img/K8ErvLW1hr-580.webp 580w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/K8ErvLW1hr-360.png 360w, https://b.polente.de/img/K8ErvLW1hr-580.png 580w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Shows Firefox Performance Tab with 395 Requests, 25 MB Data, and loading Time of 23 seconds — with tracking protection off\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/K8ErvLW1hr-360.png\" width=\"580\" height=\"439\"></picture></p>\n<h3 id=\"without-protection-1\" tabindex=\"-1\">Without Protection <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/PmMcla0z8e-360.avif 360w, https://b.polente.de/img/PmMcla0z8e-608.avif 608w, https://b.polente.de/img/PmMcla0z8e-662.avif 662w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/PmMcla0z8e-360.webp 360w, https://b.polente.de/img/PmMcla0z8e-608.webp 608w, https://b.polente.de/img/PmMcla0z8e-662.webp 662w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/PmMcla0z8e-360.png 360w, https://b.polente.de/img/PmMcla0z8e-608.png 608w, https://b.polente.de/img/PmMcla0z8e-662.png 662w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"451 requests, 40MB, finished after 1,61 seconds\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/PmMcla0z8e-360.png\" width=\"662\" height=\"25\"></picture></p>\n<h3 id=\"with-protection\" tabindex=\"-1\">With Protection <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/JmJ2IzMX2V-360.avif 360w, https://b.polente.de/img/JmJ2IzMX2V-608.avif 608w, https://b.polente.de/img/JmJ2IzMX2V-648.avif 648w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/JmJ2IzMX2V-360.webp 360w, https://b.polente.de/img/JmJ2IzMX2V-608.webp 608w, https://b.polente.de/img/JmJ2IzMX2V-648.webp 648w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/JmJ2IzMX2V-360.png 360w, https://b.polente.de/img/JmJ2IzMX2V-608.png 608w, https://b.polente.de/img/JmJ2IzMX2V-648.png 648w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"100 requests, 14MB, finished after 1,47 seconds\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/JmJ2IzMX2V-360.png\" width=\"648\" height=\"23\"></picture></p>\n<p>So, why is this a problem for your customers and yourself?</p>\n<h3 id=\"this-is-a-risk-for-your-customers-and-yourself\" tabindex=\"-1\">This is a risk for your customers and yourself. <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<ul>\n<li>We steal bandwidth, they pay for their internet contracts, <a href=\"https://www.statista.com/chart/17247/the-average-cost-of-mobile-data-in-selected-countries/\">especially on mobile</a>, where costs are still quite high. <strong>They pay two times, their tariff and the products you sell</strong>.</li>\n<li>Reduced performance, pages and so customers carry useless weight and event systems — <strong>a client doesn’t care if you want to track them. Adding tracking to webpages without noticing your client is like packing a backpack with a GPS system on the back of your client every time when they enter your physical store, to see where they go</strong>.</li>\n<li>Open privacy issues with third parties, that we can’t trust — <strong>we do not know what the tools we include to our page do additionally with the customer’s data</strong>.</li>\n<li>Loyalty and other issues for yourself, as customers visit you, not the third-party — your customers <strong>get related advertisement after leaving your internet shop with a risk to lose them to a contributor</strong>.</li>\n<li>Not matching advertisement at all — <strong>just because you searched for something, you might not need it</strong>.</li>\n<li>No control over what is executed in the context of your third party — <strong>cryptocurrency miners, or similar tools are side-loaded</strong>.</li>\n</ul>\n<h2 id=\"governments-and-customers-activities\" tabindex=\"-1\">Governments’ and customers’ activities <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h2>\n<p>Governments create laws that protect their residents. Customers protect themselves using <strong>safe</strong> browsers.</p>\n<h3 id=\"the-laws\" tabindex=\"-1\">The laws <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p>The EU and California created laws that protect their residents. In California, it is covered by several <a href=\"https://oag.ca.gov/privacy/privacy-laws\">privacy laws</a>. In Europe, we have the <a href=\"https://gdpr-info.eu/\">GDPR</a> rules. In a nutshell, they make it mandatory to inform your customers what you store, and where, and how you can ask for deleting it again.</p>\n<h3 id=\"the-reasons\" tabindex=\"-1\">The reasons <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p>Look around and you will see a lot of reasons. <a href=\"https://www.theguardian.com/technology/2019/mar/17/the-cambridge-analytica-scandal-changed-the-world-but-it-didnt-change-facebook\">Cambridge Analytica</a> is an <a href=\"https://www.theguardian.com/uk-news/2020/jan/04/cambridge-analytica-data-leak-global-election-manipulation\">ongoing issue</a>. Customers data is sold, companies like Facebook earn money with it. Google’s whole advertisement system relies on shared knowledge about your customers. And these are only examples.</p>\n<p>Also, searching for “a product” — buying it — and in the next weeks, you get an advertisement for this all over, without any need for this product anymore. The data collected often does not work as intended.</p>\n<p>There is a lot of lost trust in the pages your customers visit. They want to know what data they share and in a first try, they often just block all data to prevent the above issues.</p>\n<h3 id=\"questions-asked\" tabindex=\"-1\">Questions asked <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p>Customers and client contacts of Publicis Sapient reach out to us to get help to track their customers’ journeys and monetize their web. Asked why they have the need to track better, the answer is often: <strong>they can’t track the ones they want anymore</strong>. This is caused by a couple of reasons:</p>\n<ul>\n<li>Customers were tracked massively and the performance of pages went down, so they installed third-party protection.</li>\n<li>Usage of third-party (sic) tools for applying and asking for allowance to add cookies, created its own legal issues.</li>\n<li>Trust on popups setting or allowing cookies or notifications declines or is getting prevented.</li>\n<li>Local law restricted tracking and so third parties were not able to provide the needed data anymore.</li>\n<li>Their legal departments recognized that there are severe risks of paying a lot of fines for tracking customers without notifying them.</li>\n<li>There is no meaningful data available anymore, as the current way of tracking does not work at all.</li>\n</ul>\n<h3 id=\"getting-back-trust\" tabindex=\"-1\">Getting back trust <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p>How can customers get trust back, to allow them using your web and enable us to get to know them?</p>\n<h2 id=\"my-harsh-assumption\" tabindex=\"-1\">My harsh assumption <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h2>\n<blockquote>\n<p>If the tracking and advertising industry does not start providing privacy-respecting tools that keep the data where it is generated and match it on the first-party side, they will get less important, like stagecoaches when delivery cars and digital transportation were invented. <cite>- Holger Hellinger</cite></p>\n</blockquote>\n<h2 id=\"the-browser-vendors\" tabindex=\"-1\">The browser vendors <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h2>\n<p>Browsers like Firefox, Brave, Edge, Opera, and Safari try to help their users to prevent getting tracked, as they recognized that even <a href=\"https://en.wikipedia.org/wiki/Do_Not_Track\">asking politely for not tracking</a> does not help. If you use the latest Firefox, it already shows you what they prevented you from with visiting: about:protections.</p>\n<h3 id=\"side-effect\" tabindex=\"-1\">Side Effect <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p>A side effect of this is, browser vendors like <a href=\"https://brave.com/\">Brave</a> get strong as they provide full protection of their users with not sharing anything. Their users even accept to be kept out of some pages. Brave created its own business model of selling ads that relies on users' attention only. Marketers do not know about potential customers until these hit their pages and interact directly. And Brave offers publishers to get part of the Basic Attention Network and get paid by people using the browser on their published web pages.</p>\n<h2 id=\"the-bypass-business\" tabindex=\"-1\">The bypass business <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h2>\n<h3 id=\"civility-does-not-work-anymore\" tabindex=\"-1\">Civility does not work anymore <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<blockquote>\n<p>Will companies find other workarounds that Apple will have to cordon off? Probably.<cite>- Quote from by-passers</cite></p>\n</blockquote>\n<p>The issue with politeness, for the wish to not getting tracked, apparently is getting visible. Reading <a href=\"https://digiday.com/marketing/wtf-apples-itp-2-3-update/\">such articles, that blame browser vendors</a> protecting their users, or <a href=\"https://gist.github.com/mbaersch/677cfad72592631eea4d385116c91a63\">comments in tracking tools documentation</a>, that claim that bypass is nearly impossibly using local storage, are showing the dilemma. There is a lot of energy in trying to bypass users who do not want to get tracked.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/9A4dYV9oY7-360.avif 360w, https://b.polente.de/img/9A4dYV9oY7-608.avif 608w, https://b.polente.de/img/9A4dYV9oY7-960.avif 960w, https://b.polente.de/img/9A4dYV9oY7-1240.avif 1240w, https://b.polente.de/img/9A4dYV9oY7-1508.avif 1508w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/9A4dYV9oY7-360.webp 360w, https://b.polente.de/img/9A4dYV9oY7-608.webp 608w, https://b.polente.de/img/9A4dYV9oY7-960.webp 960w, https://b.polente.de/img/9A4dYV9oY7-1240.webp 1240w, https://b.polente.de/img/9A4dYV9oY7-1508.webp 1508w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/9A4dYV9oY7-360.png 360w, https://b.polente.de/img/9A4dYV9oY7-608.png 608w, https://b.polente.de/img/9A4dYV9oY7-960.png 960w, https://b.polente.de/img/9A4dYV9oY7-1240.png 1240w, https://b.polente.de/img/9A4dYV9oY7-1508.png 1508w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"The Hare and the Hedgehog Source: https://commons.wikimedia.org/wiki/File:Joseph-Albert_wettlauf-des-igels-und-des-hasen-1862.jpg \" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/9A4dYV9oY7-360.png\" width=\"1508\" height=\"694\"></picture></p>\n<p>The more the industry bypasses, the more the game of “The Hare and the Hedgehog” starts. In the end, your client loses: Trust in you, speed and quality time on the internet, financially as stolen bandwidth and more.</p>\n<h3 id=\"what-is-done-to-bypass\" tabindex=\"-1\">What is done to bypass? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<ul>\n<li>Storing session information in local storage where this <a href=\"https://dev.to/rdegges/please-stop-using-local-storage-1i04\">should not reside</a></li>\n<li>Trying to detect targets via browser settings</li>\n<li>Installing scripts that create a <a href=\"https://blog.mozilla.org/internetcitizen/2018/07/26/this-is-your-digital-fingerprint/\">fingerprint</a></li>\n<li>Trying to get “first-party” with using local scripts</li>\n<li>Fetching query strings and referrers</li>\n</ul>\n<p>Other ways of actions against user privacy are by advertisers like Google, who <a href=\"https://9to5google.com/2019/05/29/chrome-ad-blocking-enterprise-manifest-v3/\">start to remove the possibility to use ad blockers</a> in their own Chrome. Ad-blocking, as we were used to, will not work anymore for community browsers with their V3 manifest, as this harms their core business model. On the other hand, <a href=\"https://blog.chromium.org/2019/05/improving-privacy-and-security-on-web.html\">Google also rethinks their usage of cookies</a>, too.</p>\n<h2 id=\"options-for-you\" tabindex=\"-1\">Options for you <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h2>\n<p>Instead of luring your customers into tracking and possibly losing this race, we need to do it differently again.</p>\n<p>Give your customers trust back when they visit your web pages. Do not rely on third parties that directly interact with your clients. Store only relevant data and make it visible for your customers why you store something and what advantages they have from this action.</p>\n<h3 id=\"what-do-you-expect-your-customers-to-like-more\" tabindex=\"-1\">What do you expect your customers to like more? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p><strong>Getting asked with several confirm boxes if they want to accept cookies, notifications and newsletters? Or keep their experience clean and collect the data you need after a login, interacting with a form, etc.?</strong></p>\n<p>I think it is obvious.</p>\n<h3 id=\"make-data-first-party-again\" tabindex=\"-1\">Make data first-party again <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p>One could be the rebirth of server-side logs. There is no need to set client-side cookies to track users. All servers write log files; they are first-party data. You can install software that evaluates this data. Getting information about click paths, user journeys does not need any third-party. It was just too convenient to let all this work be done by third-party, but they also sold and used <strong>your</strong> customer’s data.</p>\n<p>This requires a bit of preparation of your services to write proper log files when your client interacts with your application. But compared with the price of losing trust, this is negotiable.</p>\n<p>Instead of pushing states to a <code>dataLayer</code> of third parties, keep this private by your own services, or your client-side applications might need to update the server asynchronous instead of pushing to third parties.</p>\n<p>You will not get this for free, but your data engineers with better customer data will love you and in the end, your customer.</p>\n<p>Besides this, you could even keep your users’ data tracked across your own services. Use, for example, unique property and user IDs in your first-party cookies and make it your data.</p>\n<h3 id=\"explain-customers-why-you-exceptionally-want-more-of-their-data\" tabindex=\"-1\">Explain customers why you exceptionally want more of their data <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p>If you want your customer’s detailed data, ask them for this. Offer them a benefit when they provide this, and not only the twentieth newsletter subscription with a shuffle competition every three months.</p>\n<p>See for what price you gain client or customer data, maybe less is again more.</p>\n<p>Be creative. Your legal team for sure will find some ways to make your customers share information with you. But don’t use third parties to collect this. Your customers will see if you redirect them somewhere else.</p>\n<h3 id=\"adledger-as-advertisement-network-to-monetize-your-web\" tabindex=\"-1\">Adledger as advertisement network to monetize your web <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p><a href=\"https://www.publicisgroupe.com/en/services/services-publicis-media-en\">Publicis Media</a> is a member of <a href=\"https://adledger.org/\">Adledger</a>. It is a non-profit research and development consortium responsible for implementing global technical standards and solutions for the digital media and blockchain industry. AdLedger’s goal is to promote trust and transparency in the digital media space. Publicis Sapient can support you in finding the right way of doing things.\nMonetizing your applications differently</p>\n<p>Get a Publisher at the <a href=\"https://publishers.basicattentiontoken.org/\">Basic Attention Network</a>. Users visiting your applications with Brave can monetize you.</p>\n<h2 id=\"finally\" tabindex=\"-1\">Finally <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h2>\n<p>If you get data from customers who trust you, you have more value than just having data from the ones who do not know how to prevent themselves from being tracked. So maybe using single sign-on on your applications, not sharing with others, can make your user data more valuable again. As it is not only your customers’ data, it is also yours!</p>\n<h3 id=\"side-note\" tabindex=\"-1\">Side note <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h3>\n<p>Tracking your users’ data across small businesses may not even be helpful. This is even truer on private webpages.\nBest practices and other things to read</p>\n<ul>\n<li><a href=\"https://dev.to/rdegges/please-stop-using-local-storage-1i04\">https://dev.to/rdegges/please-stop-using-local-storage-1i04</a></li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Privacy/Storage_access_policy\">https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Privacy/Storage_access_policy</a></li>\n<li><a href=\"https://webkit.org/blog/9521/intelligent-tracking-prevention-2-3/\">https://webkit.org/blog/9521/intelligent-tracking-prevention-2-3/</a></li>\n<li><a href=\"https://www.getadvanced.net/technology-blog/article/sharing-personal-data-when-you-become-the-product\">https://www.getadvanced.net/technology-blog/article/sharing-personal-data-when-you-become-the-product</a></li>\n<li><a href=\"https://blog.chromium.org/2019/05/improving-privacy-and-security-on-web.html\">https://blog.chromium.org/2019/05/improving-privacy-and-security-on-web.html</a></li>\n<li><a href=\"https://blog.chromium.org/2020/01/building-more-private-web-path-towards.html\">https://blog.chromium.org/2020/01/building-more-private-web-path-towards.html</a></li>\n</ul>\n<h2 id=\"why-the-hare-and-the-hedgehog\" tabindex=\"-1\">* Why ‘The Hare and the Hedgehog’? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/TrackingLike/\">#</a></h2>\n<p>I have chosen this as a fairy tale that shows the fighting against the more intelligent or always step ahead analogy. ‘The Hare and the Hedgehog’ in detail.</p>\n",
			"date_published": "2020-03-19T00:00:00Z"
		}
		,
		{
			"id": "https://b.polente.de/blog/WebComponents/",
			"url": "https://b.polente.de/blog/WebComponents/",
			"title": "Should I use Web components?",
			"content_html": "<p>At my current employer we do all kind of Web Applications. We call it Experience Technology. These customer user experiences have different needs. Sometimes we do static content deliverables like temporary marketing campaign pages, or knowledge bases that never get touched again. More often we do enterprise shopping experiences, catalogue maintenance, and other e-commerce platforms.</p>\n<p>Asking someone of my team how to build their next customer user experience I get named: <a href=\"https://reactjs.org/\">React</a>, <a href=\"https://vuejs.org/\">VUE</a>, <a href=\"https://svelte.dev/\">Svelte</a> or at last, <a href=\"https://angular.io/\">Angular</a>. Normally no one tells me yet: Let’s do it native, let’s use Web Components.</p>\n<h2 id=\"do-i-know-why\" tabindex=\"-1\">Do I know why? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h2>\n<h3 id=\"maybe\" tabindex=\"-1\">Maybe <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h3>\n<p>Why the frameworks are so common and preferred is having some reasons:</p>\n<ul>\n<li>They offer a community</li>\n<li>Searching for an issue or supporting library for sure returns an - Stackoverflow entry or an NPM library</li>\n<li>There is great support by someone that has „already done this“</li>\n<li>For Business: It is good to have something to sell that everyone knows</li>\n</ul>\n<h3 id=\"a-quick-poll\" tabindex=\"-1\">A quick poll <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h3>\n<p>Doing a quick poll with our experience technologists hardens the opinion.</p>\n<p><picture><source type=\"image/avif\" srcset=\"https://b.polente.de/img/jzruGhsCFU-360.avif 360w, https://b.polente.de/img/jzruGhsCFU-405.avif 405w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/webp\" srcset=\"https://b.polente.de/img/jzruGhsCFU-360.webp 360w, https://b.polente.de/img/jzruGhsCFU-405.webp 405w\" sizes=\"(min-width: 40em) 960px, 100vw\"><source type=\"image/png\" srcset=\"https://b.polente.de/img/jzruGhsCFU-360.png 360w, https://b.polente.de/img/jzruGhsCFU-405.png 405w\" sizes=\"(min-width: 40em) 960px, 100vw\"><img alt=\"Showing React 58%, Angular 3%, VUE 15%, Native Web Components 7%. Other 13%\" loading=\"lazy\" decoding=\"async\" class=\"b-image\" src=\"https://b.polente.de/img/jzruGhsCFU-360.png\" width=\"405\" height=\"267\"></picture></p>\n<p>Showing React 58%, Angular 3%, VUE 15%, Native Web Components 7%. Other 13%</p>\n<h3 id=\"observing-the-obvious\" tabindex=\"-1\">Observing the obvious <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h3>\n<p>Using frameworks and libraries for everything, causes problems that could be prevented. <a href=\"https://royal.pingdom.com/webpages-are-getting-larger-every-year-and-heres-why-it-matters/\">Average weight of a page is increasing</a>. <a href=\"https://uglyduck.ca/html-like-1999/\">Complexity of generated code</a> too. Views of common frameworks and libraries are often ridiculous complicated and deep nested and adding libraries and grid systems is done with a click. Importing without seeing the direct deeper effect. On top of that, Designers create <a href=\"https://conversionxl.com/blog/why-simple-websites-are-scientifically-better/\">complex animations and placeholders</a> and forget that we still have low-end devices to support and not an ideal-world fast internet. Accessibility and search, like find-ability is getting worse. When useless containers are nested and <a href=\"https://leanweb.dev/ebook/intro/\">semantics are getting lost</a>.</p>\n<p>On top of all, GDPR compliance is bad to achieve as of often third parties are used in a way that makes it hard to know where your customers details are getting shared.</p>\n<p>This directly leads me to the this ask: Do we at all need to use a framework or library? Can’t we use Web components?</p>\n<p>Webcomponents.org tells a clear use case, but why does still no one considers it first place to use it as base in their projects?</p>\n<blockquote>\n<p>Web components are a set of web platform APIs that allow you to create new custom, reusable, encapsulated HTML tags to use in web pages and web apps. Custom components and widgets build on the Web Component standards, will work across modern browsers, and can be used with any JavaScript library or framework that works with HTML. Web components are based on existing web standards. Features to support web components are currently being added to the HTML and DOM specs, letting web developers easily extend HTML with new elements with encapsulated styling and custom behaviour. <cite>- <a href=\"https://www.webcomponents.org/\">Webcomponents.org</a></cite></p>\n</blockquote>\n<p>Would there be any advantage when using them instead of a framework? Long-term for sure. Imagine a situation where Facebook stops support for React, or Google for Angular. Sooner or later libraries might get outdated. The community for sure support it for some years, but it can stop. There is no guarantee that it works long. There are also new Libraries popping out every day.</p>\n<p>As we started writing decoupled user experiences, using micro-services and micro-frontends, we forgot to enable us to create long lasting frontend code, that is maintainable. Instead of using native functionalities, write proper markup and getting accessible and search engine friendly.</p>\n<p>We now create a dependency to a framework that is maybe out-dating soon. Any reason to do so?</p>\n<h3 id=\"not-really\" tabindex=\"-1\">Not really! <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h3>\n<p>Frameworks and libraries should help us organizing and writing our code and deliverables, but not overtaking our thinking and tooling. It is not reasonable that we deliver whole applications to clients browsers, when the contents never or only every view months change. We should instead build more meaningful smaller applications. We even need to render server side, using JavaScript.</p>\n<h2 id=\"a-quick-excursion-on-what-web-components-are\" tabindex=\"-1\">A quick excursion on what Web Components are <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h2>\n<p>Using Web components would allow us to get back to standards, using browser supported simple tooling.</p>\n<p>So why should you consider Web components as complement for frameworks and libraries?</p>\n<ul>\n<li>They are already a standard!</li>\n<li>They work cross browser (Can I use it?)</li>\n<li>They are simple and stand-alone</li>\n<li>They are already used</li>\n<li>They are future proof!</li>\n</ul>\n<h2 id=\"the-details\" tabindex=\"-1\">The details <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h2>\n<p>Web components are the wrapper name for a set of techniques that create browser rendered interfaces. They are created through custom elements, shadow DOM, HTML templates and HTML modules. The latter is yet not widely adopted by browsers.\nCustom Element</p>\n<p>Setup a JavaScript file that contains the code for your custom element.</p>\n<pre class=\"language-js\" tabindex=\"0\"><code class=\"language-js\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">MyCustomElement</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">HTMLElement</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">connectedCallback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;p>Some Text&lt;/p></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\nwindow<span class=\"token punctuation\">.</span>customElements<span class=\"token punctuation\">.</span><span class=\"token function\">define</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"my-custom-element\"</span><span class=\"token punctuation\">,</span> MyCustomElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n<p>You need a DOM node that can initialise it.</p>\n<pre class=\"language-html\" tabindex=\"0\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>my-custom-element</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>my-custom-element</span><span class=\"token punctuation\">></span></span></code></pre>\n<h3 id=\"shadow-dom\" tabindex=\"-1\">Shadow DOM <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h3>\n<p>With your custom element you can add coloured text in the context of other text paragraphs. You can capsule your styles that only belonging to the needed node.</p>\n<pre class=\"language-html\" tabindex=\"0\"><code class=\"language-html\">const shadowRoot = document.getElementById('fetched').attachShadow({ mode:\n'open' }); shadowRoot.innerHTML = `<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">></span></span><span class=\"token style\"><span class=\"token language-css\">\n  <span class=\"token selector\">p</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 1px solid red<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 5px<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>paragraph<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Paragraph using <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>slot</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>slot</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n`;</code></pre>\n<p>Create some HTML to connect your code with it.</p>\n<pre class=\"language-html\" tabindex=\"0\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>fetched<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Slot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>paragraph<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Normal Text<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span></code></pre>\n<p>Shadow DOM like shown below will be generated.</p>\n<pre class=\"language-html\" tabindex=\"0\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>fetched<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>#shadow-root</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span><span class=\"token punctuation\">></span></span><span class=\"token style\"><span class=\"token language-css\">\n      <span class=\"token selector\">p</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 1px solid red<span class=\"token punctuation\">;</span>\n        <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 5px<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      </span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>paragraph<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Paragraph using Slot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>#shadow-root</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>paragraph<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Normal Text<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span></code></pre>\n<h3 id=\"use-html-templates\" tabindex=\"-1\">Use HTML Templates <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h3>\n<p>Stay DRY. Use HTML templates. Look at the the above example. If you want to render more paragraphs, you can repeat your <code>&lt;p&gt;</code> or just use a <code>&lt;template&gt;</code>. It is obvious what is wet and what is dry.</p>\n<p>You can use them together with custom elements and shadow root, or alone.</p>\n<pre class=\"language-html\" tabindex=\"0\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>template</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>template<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>template</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>section</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>paragraphs<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>section</span><span class=\"token punctuation\">></span></span></code></pre>\n<p>How to render a HTML template.</p>\n<pre class=\"language-js\" tabindex=\"0\"><code class=\"language-js\"><span class=\"token keyword\">const</span> paragraphs <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"template\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> text <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">node</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Text 1\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">node</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Text 2\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">node</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Text 3\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\ntext<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">text</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> domNode <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">importNode</span><span class=\"token punctuation\">(</span>paragraphs<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  domNode<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"p\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">=</span> text<span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">;</span>\n  document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"paragraphs\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">appendChild</span><span class=\"token punctuation\">(</span>domNode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n<h3 id=\"did-i-missed-html-modules\" tabindex=\"-1\">Did I missed HTML Modules? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h3>\n<p>Nope. But <a href=\"https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/HTMLModules/explainer.md\">they are currently considered</a>. So let’s see.</p>\n<h3 id=\"what-else-to-consider\" tabindex=\"-1\">What else to consider <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h3>\n<p>Take also into account that all is maintained in a component library. Handled in a DSM provided by <a href=\"https://www.invisionapp.com/design-system-manager\">InVision</a>, <a href=\"https://www.figma.com/\">Figma</a>, or Design Kits like <a href=\"https://www.sketch.com/\">Sketch</a>. We need to ensure to reuse our code and Styles. <a href=\"https://css-tricks.com/what-are-design-tokens/\">Design Tokens</a> help here. Amazon has <a href=\"https://amzn.github.io/style-dictionary/\">Style Dictionary</a>, but there are others. And ideally, have a direct connect to your repository. (More would be subject of a full own post)</p>\n<h3 id=\"but-my-client-has-ie11-as-standard-browser\" tabindex=\"-1\">But my client has IE11 as standard browser! <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h3>\n<p><strong>Ask them why! Seriously!</strong></p>\n<p><em>Update when took over to this blog. At the time I wrote this in 2019 it was not sure that IE will ever die.</em>\nIf they still insist, and maybe even have a dated soon to be replaced Edge: there are <a href=\"https://github.com/webcomponents/webcomponentsjs\">Polyfills available</a>, they render the components as HTML for you.</p>\n<h2 id=\"any-other-input\" tabindex=\"-1\">Any other input? <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h2>\n<p>More and more Frameworks and libraries arise that help generating your applications with Web components. They offer build in test ability, design libraries, pattern libraries and more. There are well established ones like <a href=\"https://www.polymer-project.org/\">Polymer</a>, <a href=\"https://lit.dev/\">LIT</a> or <a href=\"https://stenciljs.com/\">Stencil</a>. You can find more on the <a href=\"https://www.webcomponents.org/libraries\">web component page list</a>. So if you do not want to do it manually. Use provided tools.</p>\n<h2 id=\"what-to-do\" tabindex=\"-1\">What to do <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h2>\n<p>There is no golden hammer that makes all your problems a nail. But you should consider re-usability, need of the current implementation, and how long it will exists. Then it can help you making a decision.</p>\n<p>Static rendering for interims campaign pages, knowledge bases, and so on can improve SEO, size, and customer experience. Full blown SPA with a checkout or profile management, and a healthy mixture for catalogue can do their part on this.</p>\n<p>But the base of all should be a Web component. <strong>Just do it</strong>.</p>\n<h2 id=\"resources-mentioned-and-used\" tabindex=\"-1\">Resources mentioned and used <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h2>\n<ul>\n<li><a href=\"https://royal.pingdom.com/webpages-are-getting-larger-every-year-and-heres-why-it-matters/\">https://royal.pingdom.com/webpages-are-getting-larger-every-year-and-heres-why-it-matters/</a></li>\n<li><a href=\"https://www.sitepoint.com/average-page-weight-increased-another-16-2015/\">https://www.sitepoint.com/average-page-weight-increased-another-16-2015/</a></li>\n<li><a href=\"https://conversionxl.com/blog/why-simple-websites-are-scientifically-better/\">https://conversionxl.com/blog/why-simple-websites-are-scientifically-better/</a></li>\n<li><a href=\"https://leanweb.dev/ebook/intro/\">https://leanweb.dev/ebook/intro/</a></li>\n<li><a href=\"https://uglyduck.ca/html-like-1999/\">https://uglyduck.ca/html-like-1999/</a></li>\n<li><a href=\"https://twitter.com/intenttoship/status/1085742504958279682\">https://twitter.com/intenttoship/status/1085742504958279682</a></li>\n<li><a href=\"https://github.com/webcomponents/webcomponentsjs\">https://github.com/webcomponents/webcomponentsjs</a></li>\n<li><a href=\"https://designcode.io/design-system-in-figma\">https://designcode.io/design-system-in-figma</a></li>\n<li><a href=\"https://www.figma.com/\">https://www.figma.com/</a></li>\n<li><a href=\"https://amzn.github.io/style-dictionary/\">https://amzn.github.io/style-dictionary/</a></li>\n<li><a href=\"https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/HTMLModules/explainer.md\">https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/HTMLModules/explainer.md</a></li>\n<li><a href=\"https://www.webcomponents.org/libraries\">https://www.webcomponents.org/libraries</a></li>\n<li><a href=\"https://reactjs.org/docs/web-components.html\">https://reactjs.org/docs/web-components.html</a></li>\n</ul>\n<h2 id=\"fun-fact\" tabindex=\"-1\">Fun fact <a class=\"header-anchor\" href=\"https://b.polente.de/blog/WebComponents/\">#</a></h2>\n<p>Yes, you can also make Web components complicated.</p>\n",
			"date_published": "2019-11-27T00:00:00Z"
		}
		
	]
}
