<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marc Newstead</title>
    <description>The latest articles on DEV Community by Marc Newstead (@icentric).</description>
    <link>https://dev.to/icentric</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3929651%2Ffa7f595b-8a59-45da-b8be-ee66e3feab4d.png</url>
      <title>DEV Community: Marc Newstead</title>
      <link>https://dev.to/icentric</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/icentric"/>
    <language>en</language>
    <item>
      <title>Why Your Image Upload Pipeline Should Check for Physically Impossible Lighting</title>
      <dc:creator>Marc Newstead</dc:creator>
      <pubDate>Mon, 18 May 2026 11:10:19 +0000</pubDate>
      <link>https://dev.to/icentric/why-your-image-upload-pipeline-should-check-for-physically-impossible-lighting-561l</link>
      <guid>https://dev.to/icentric/why-your-image-upload-pipeline-should-check-for-physically-impossible-lighting-561l</guid>
      <description>&lt;h2&gt;
  
  
  Why Your Image Upload Pipeline Should Check for Physically Impossible Lighting
&lt;/h2&gt;

&lt;p&gt;If you're building user-generated content platforms, marketplace verification systems, or anything that ingests images from untrusted sources, you've probably noticed the synthetic media problem getting worse. Gen-AI tools have become good enough that casual users can't spot the fakes anymore.&lt;/p&gt;

&lt;p&gt;But here's the thing: the physics still breaks. And if you know what to look for, you can build surprisingly effective validation layers using simple computer vision techniques.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shadow Problem: Your First Line of Defence
&lt;/h2&gt;

&lt;p&gt;In any real photograph, shadows share a common light source geometry. This is basic physics—light travels in straight lines. When AI image generators compose scenes from learned patterns rather than simulated physics, they consistently mess this up.&lt;/p&gt;

&lt;p&gt;Here's what you can check programmatically:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Shadow Direction Consistency
&lt;/h3&gt;

&lt;p&gt;Extract shadow vectors across different objects in the scene. In a genuine photo, these should converge toward a common vanishing point (the light source).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Pseudocode for shadow vector analysis
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;analyse_shadow_consistency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;segment_objects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;shadow_vectors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has_shadow&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculate_shadow_angle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shadow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;shadow_vectors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Check if vectors converge within tolerance
&lt;/span&gt;    &lt;span class="n"&gt;convergence_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculate_convergence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shadow_vectors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;convergence_score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;THRESHOLD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This won't catch everything, but it'll flag a surprising number of AI-generated images, especially from earlier-generation models or rushed prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Shadow Intensity Relative to Distance
&lt;/h3&gt;

&lt;p&gt;Shadows should soften and lighten with distance from the object casting them. AI generators often produce shadows with uniform intensity throughout, or inconsistent softness between objects at similar distances.&lt;/p&gt;

&lt;p&gt;You can measure this with edge detection and gradient analysis across shadow boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflection Geometry: The Silent Tell
&lt;/h2&gt;

&lt;p&gt;Reflections are even harder for generators to get right. Water reflections, glass surfaces, and metallic objects all follow strict geometric rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to check:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reflections should be vertically symmetrical (for horizontal surfaces)&lt;/li&gt;
&lt;li&gt;Reflection angles must match viewing angles&lt;/li&gt;
&lt;li&gt;Environmental lighting in reflections should match the scene lighting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple geometric validation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_reflection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;surface_region&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reflected_region&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Extract key points from both regions
&lt;/span&gt;    &lt;span class="n"&gt;surface_features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_keypoints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;surface_region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;reflection_features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_keypoints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reflected_region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Check if reflection obeys mirror symmetry
&lt;/span&gt;    &lt;span class="n"&gt;symmetry_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculate_mirror_symmetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;surface_features&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;reflection_features&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;symmetry_score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MIN_SYMMETRY_THRESHOLD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Where This Actually Matters in Production
&lt;/h2&gt;

&lt;p&gt;If you're building:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marketplace verification systems&lt;/strong&gt; — Preventing fake product photos that don't represent real inventory. One e-commerce platform I know ran into this when sellers started using AI to generate "lifestyle" product shots that looked professional but didn't match the actual items.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content moderation pipelines&lt;/strong&gt; — Flagging synthetic profile pictures in identity verification flows, or detecting manipulated images in insurance claims.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Media asset management&lt;/strong&gt; — Automatically tagging AI-generated images in your DAM system so teams know what they're working with.&lt;/p&gt;

&lt;p&gt;You don't need perfect detection. You need a confidence score that feeds into your review queue prioritisation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Detection Tool Ecosystem
&lt;/h2&gt;

&lt;p&gt;Before you roll your own, know what exists:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hive Moderation&lt;/strong&gt; and &lt;strong&gt;Illuminarty&lt;/strong&gt; offer API-based detection with probabilistic scoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google's SynthID&lt;/strong&gt; watermarks AI-generated content at generation time (only useful if the generator cooperates)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source models&lt;/strong&gt; like the ones from Hugging Face give you full control but require more infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tools are useful as part of a layered approach, but they're not silver bullets. False positive rates are still high enough that you'll need human review for edge cases.&lt;/p&gt;

&lt;p&gt;For a deeper look at the specific physical tells and how they manifest across different generators, &lt;a href="https://www.icentricagency.com/insights/the-physics-don-t-lie-spotting-ai-generated-imagery-in-2025" rel="noopener noreferrer"&gt;spotting AI-generated imagery&lt;/a&gt; has become a critical organisational competency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Practical Validation Layer
&lt;/h2&gt;

&lt;p&gt;Here's a sensible architecture:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fast rejection filters&lt;/strong&gt; — Basic checks for impossible lighting/shadows using CV libraries (OpenCV, scikit-image)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API-based scoring&lt;/strong&gt; — Send suspicious images to a detection service&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human review queue&lt;/strong&gt; — Images above a certain suspicion threshold get reviewed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback loop&lt;/strong&gt; — Feed confirmed cases back into your filters
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_uploaded_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_file&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Layer 1: Fast physics checks
&lt;/span&gt;    &lt;span class="n"&gt;physics_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;check_lighting_consistency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;physics_score&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# Clearly fake
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rejected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reason&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lighting_anomaly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;physics_score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# Probably real
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;approved&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confidence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;physics_score&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Layer 2: API-based detection for ambiguous cases
&lt;/span&gt;    &lt;span class="n"&gt;api_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;detection_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;api_score&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review_queue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scores&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;physics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;physics_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;api_score&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;approved&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confidence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;physics_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_score&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;You can't stop AI-generated images from being uploaded. But you can build systems that flag the physically impossible ones before they cause problems downstream. If you're working on platforms where image authenticity matters—or you're helping clients navigate this space through &lt;a href="https://www.icentricagency.com" rel="noopener noreferrer"&gt;AI automation and software development&lt;/a&gt;—basic physics checks should be in your validation pipeline.&lt;/p&gt;

&lt;p&gt;The generators will get better. But until they're simulating actual light physics rather than pattern-matching, the tells will remain.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>computervision</category>
      <category>security</category>
      <category>python</category>
    </item>
    <item>
      <title>Stop Optimising for One Search Algorithm — You Need Three in 2025</title>
      <dc:creator>Marc Newstead</dc:creator>
      <pubDate>Mon, 18 May 2026 11:04:07 +0000</pubDate>
      <link>https://dev.to/icentric/stop-optimising-for-one-search-algorithm-you-need-three-in-2025-3h81</link>
      <guid>https://dev.to/icentric/stop-optimising-for-one-search-algorithm-you-need-three-in-2025-3h81</guid>
      <description>&lt;h2&gt;
  
  
  The search layer cake nobody warned you about
&lt;/h2&gt;

&lt;p&gt;If you've built anything user-facing in the last 18 months, you've probably noticed something weird: classic Google search still exists, but so do AI Overviews. And ChatGPT. And Perplexity. And whatever Bing is calling their AI feature this week.&lt;/p&gt;

&lt;p&gt;Here's the bit that matters for us as developers: &lt;strong&gt;you're now optimising for three distinct layers of search&lt;/strong&gt;, not one. Classic SEO still matters. Answer Engine Optimisation (AEO) is a thing. And Generative Engine Optimisation (GEO) — making your content LLM-friendly — is rapidly becoming table stakes.&lt;/p&gt;

&lt;p&gt;Ignore any one of these and you're leaving traffic (and revenue) on the table. The good news? A lot of this is automatable. The bad news? Most teams are still pretending it's 2019.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why classic SEO isn't dead (and won't be)
&lt;/h2&gt;

&lt;p&gt;Let's get the obvious out of the way: &lt;strong&gt;traditional SEO fundamentals still matter&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core Web Vitals haven't gone anywhere&lt;/li&gt;
&lt;li&gt;Structured data still helps crawlers parse your pages&lt;/li&gt;
&lt;li&gt;Backlink authority is alive and well&lt;/li&gt;
&lt;li&gt;Mobile responsiveness is non-negotiable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your Lighthouse scores are in the red or your &lt;code&gt;robots.txt&lt;/code&gt; is blocking half your site, no amount of AI magic will save you. Google's crawlers need to index your content before any algorithm — classic or generative — can surface it.&lt;/p&gt;

&lt;p&gt;The mistake teams make is treating SEO as &lt;em&gt;only&lt;/em&gt; this. It's necessary, but no longer sufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  AEO: structured answers for featured snippets and voice
&lt;/h2&gt;

&lt;p&gt;Answer Engine Optimisation is about formatting content so it can be &lt;strong&gt;extracted cleanly as a standalone answer&lt;/strong&gt;. Think:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FAQ schema that actually answers the question in the markup&lt;/li&gt;
&lt;li&gt;Concise &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; headings that mirror user queries&lt;/li&gt;
&lt;li&gt;Tables and lists that are trivial to parse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: instead of burying your API rate limits in prose, do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## What are the API rate limits?&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Free tier: 100 requests/hour
&lt;span class="p"&gt;-&lt;/span&gt; Pro tier: 10,000 requests/hour
&lt;span class="p"&gt;-&lt;/span&gt; Enterprise: Custom limits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works for featured snippets, voice assistants, and — crucially — gets picked up cleanly by LLM crawlers. Which brings us to layer three.&lt;/p&gt;

&lt;h2&gt;
  
  
  GEO: making your content LLM-legible
&lt;/h2&gt;

&lt;p&gt;Generative Engine Optimisation means &lt;strong&gt;writing and structuring content so LLMs can cite it accurately&lt;/strong&gt;. A few practical tactics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use explicit attributions.&lt;/strong&gt; "According to [Your Company], the median API latency is 120ms." LLMs love citations they can quote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Front-load key facts.&lt;/strong&gt; Don't bury your lede six paragraphs down. Put the answer in the first 100 words.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid jargon overload.&lt;/strong&gt; LLMs are trained on the web; niche terminology without context confuses them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Link internally with descriptive anchor text.&lt;/strong&gt; "See our authentication guide" beats "click here."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to go deeper on the strategic layer, there's a solid overview of &lt;a href="https://www.icentricagency.com/insights/ai-driven-seo-winning-across-classic-aeo-and-geo-in-2025" rel="noopener noreferrer"&gt;AI-driven SEO&lt;/a&gt; that covers the business case.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like in practice
&lt;/h2&gt;

&lt;p&gt;Let's say you're documenting a new SDK. Here's the old way:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Our SDK provides a robust interface for interacting with the platform, offering flexibility and performance."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's the new way:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  How do I install the Python SDK?
&lt;/h2&gt;

&lt;p&gt;Install via pip:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;your-sdk
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Supports Python 3.8+. Typical installation takes under 30 seconds.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second version works for classic SEO (keyword-rich headings), AEO (structured Q&amp;amp;A), and GEO (clear, quotable answer). One piece of content, three optimisation layers satisfied.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling that actually helps
&lt;/h2&gt;

&lt;p&gt;You don't need a seven-figure MarTech stack to do this. A few categories worth exploring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Schema validators&lt;/strong&gt; (Google's Rich Results Test, Schema.org validator)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content analysis tools&lt;/strong&gt; that flag vague language or poor structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-powered SEO platforms&lt;/strong&gt; that surface keyword gaps and suggest schema improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're working with a team that spans &lt;a href="https://www.icentricagency.com" rel="noopener noreferrer"&gt;AI automation and software development&lt;/a&gt;, ask them to audit your content pipeline. Most of this is scriptable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The metrics trap
&lt;/h2&gt;

&lt;p&gt;One last thing: &lt;strong&gt;rankings are now a lagging indicator&lt;/strong&gt;. A page can rank #1 and still see click-through rates collapse because an AI Overview answered the query above the fold.&lt;/p&gt;

&lt;p&gt;Track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Impressions vs. clicks (CTR decay is your canary)&lt;/li&gt;
&lt;li&gt;LLM citation frequency (some tools now track this)&lt;/li&gt;
&lt;li&gt;Conversion rates, not just rankings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your content is good enough to be cited by ChatGPT but your site never gets the click, you've got a GEO problem — or a business model problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Classic SEO fundamentals (Core Web Vitals, schema, backlinks) are still essential&lt;/li&gt;
&lt;li&gt;AEO means structuring content as extractable answers (FAQ schema, lists, tables)&lt;/li&gt;
&lt;li&gt;GEO means writing so LLMs can cite you accurately (front-load facts, use attributions)&lt;/li&gt;
&lt;li&gt;One piece of content can satisfy all three layers if you write it right&lt;/li&gt;
&lt;li&gt;Track CTR and conversions, not just rankings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The search landscape fragmented. Your optimisation strategy should reflect that — or you'll spend 2025 wondering where your traffic went.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Your Website's Content Now Has Two Jobs: Feeding Crawlers and Training LLMs</title>
      <dc:creator>Marc Newstead</dc:creator>
      <pubDate>Mon, 18 May 2026 10:47:21 +0000</pubDate>
      <link>https://dev.to/icentric/your-websites-content-now-has-two-jobs-feeding-crawlers-and-training-llms-483d</link>
      <guid>https://dev.to/icentric/your-websites-content-now-has-two-jobs-feeding-crawlers-and-training-llms-483d</guid>
      <description>&lt;h2&gt;
  
  
  Your Website's Content Now Has Two Jobs: Feeding Crawlers and Training LLMs
&lt;/h2&gt;

&lt;p&gt;If you've built a documentation site, marketing platform, or content-heavy application recently, you've probably optimised for Google's crawlers—structured data, semantic HTML, decent page speed, sensible &lt;code&gt;meta&lt;/code&gt; tags. Job done, right?&lt;/p&gt;

&lt;p&gt;Not anymore.&lt;/p&gt;

&lt;p&gt;Google's AI Overviews (and similar LLM-powered search features from Bing, Perplexity, and others) are now extracting, synthesising, and presenting your content &lt;em&gt;without&lt;/em&gt; sending users to your site. Your carefully crafted landing pages might be cited in an AI-generated summary, but the click? Gone.&lt;/p&gt;

&lt;p&gt;This isn't theoretical. Organic click-through rates are dropping. The &lt;a href="https://www.icentricagency.com/insights/beyond-seo-rankings-why-geo-is-now-the-real-battle-for-uk-search-visibility" rel="noopener noreferrer"&gt;real battle for UK search visibility&lt;/a&gt; isn't just about ranking #1 anymore—it's about being the source LLMs &lt;em&gt;choose to cite&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed: From PageRank to Prompt Context
&lt;/h2&gt;

&lt;p&gt;Traditional SEO was a game of signals: backlinks, domain authority, keyword density, Core Web Vitals. You knew the rules. You played by them.&lt;/p&gt;

&lt;p&gt;Generative Engine Optimisation (GEO) is different. LLMs don't "crawl" in the same way. They're trained on massive corpora, then retrieve and synthesise information at inference time. The question isn't &lt;em&gt;"Does this page rank?"&lt;/em&gt; but &lt;em&gt;"Does this content get selected as context for the LLM's response?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Traditional SEO
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_search_results&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# crawled, indexed, ranked
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pagerank&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# GEO / LLM-powered search
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_ai_overview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;retrieval_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch_relevant_docs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;  &lt;span class="c1"&gt;# user never clicks through
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your content needs to be selected &lt;em&gt;during retrieval&lt;/em&gt;, not just indexed. That's a different optimisation problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What LLMs Actually Reward
&lt;/h2&gt;

&lt;p&gt;Based on research into how generative engines select sources, here's what seems to matter:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Authoritative, Structured Answers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;LLMs favour content that directly answers questions in a clear, hierarchical format. Think:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Concise definitions at the top&lt;/li&gt;
&lt;li&gt;Bullet lists for steps or options&lt;/li&gt;
&lt;li&gt;Tables for comparisons&lt;/li&gt;
&lt;li&gt;Headings that map to user intent ("How to...", "What is...", "Best practices for...")&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Semantic Richness&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Keyword stuffing is dead. LLMs look for &lt;em&gt;semantic coverage&lt;/em&gt;—related concepts, synonyms, contextual depth. If you're documenting an API, don't just list endpoints. Explain use cases, common errors, and edge cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Freshness and Specificity&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Generic evergreen content is losing ground to timely, specific answers. If you're writing a guide, reference current versions, real-world examples, and actual data.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Citation-Friendly Formatting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;LLMs are more likely to cite content that's easy to extract and attribute. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear authorship and publication dates&lt;/li&gt;
&lt;li&gt;Structured data (JSON-LD, Open Graph)&lt;/li&gt;
&lt;li&gt;Blockquotes, code snippets, and other semantically marked-up elements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical Steps: Optimise for Both
&lt;/h2&gt;

&lt;p&gt;The good news? You don't have to choose. Most GEO best practices &lt;em&gt;also&lt;/em&gt; improve traditional SEO. Here's a starter playbook:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Audit Your Content for "Extract-ability"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Can someone (or an LLM) quickly pull a useful answer from your page? If your intro is 300 words of marketing fluff before the actual information, you're in trouble.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Use Structured Data Everywhere&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"application/ld+json"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TechArticle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;headline&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Building Resilient APIs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;author&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Person&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jane Dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datePublished&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-01-15&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps both crawlers and LLMs understand your content's context.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Write for Humans, Optimise for Machines&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your content should read naturally, but also be scannable. Use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bold text&lt;/strong&gt; for key terms&lt;/li&gt;
&lt;li&gt;Short paragraphs (2-3 sentences max)&lt;/li&gt;
&lt;li&gt;Code blocks for examples (not screenshots)&lt;/li&gt;
&lt;li&gt;Tables and lists for structured info&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Track Non-Click Visibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If your content is cited in an AI Overview but doesn't generate clicks, that's still brand exposure. Tools are emerging to track "impression share" in AI-generated results, but even anecdotal monitoring (searching your own key topics and noting citations) is useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Workflow Shift
&lt;/h2&gt;

&lt;p&gt;If you're building content pipelines or CMS tooling, consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI-assisted content audits&lt;/strong&gt;: Use LLMs to identify gaps in semantic coverage or question-answer alignment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated structured data generation&lt;/strong&gt;: Parse your markdown/HTML and inject schema.org markup programmatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt testing&lt;/strong&gt;: Literally query LLMs (ChatGPT, Claude, Perplexity) with your target keywords and see if your content surfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agencies focused on &lt;a href="https://www.icentricagency.com" rel="noopener noreferrer"&gt;AI automation and software development&lt;/a&gt; are building these workflows into content ops—treating GEO as a CI/CD problem, not just an editorial one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;If you're maintaining documentation, a developer blog, or any content-heavy platform, your success metrics are shifting. Rankings matter less than &lt;em&gt;retrieval&lt;/em&gt;. Clicks matter less than &lt;em&gt;citation&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Optimise for both crawlers and LLMs. Structure your content like an API response: clear, hierarchical, and easy to parse. And remember—your content isn't just being read anymore. It's being &lt;em&gt;used as training data&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Make sure it's worth learning from.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>webdev</category>
      <category>content</category>
    </item>
    <item>
      <title>You Built the AI Feature. Now Sell It to the C-Suite Without Getting Stonewalled</title>
      <dc:creator>Marc Newstead</dc:creator>
      <pubDate>Fri, 15 May 2026 09:37:34 +0000</pubDate>
      <link>https://dev.to/icentric/you-built-the-ai-feature-now-sell-it-to-the-c-suite-without-getting-stonewalled-2aif</link>
      <guid>https://dev.to/icentric/you-built-the-ai-feature-now-sell-it-to-the-c-suite-without-getting-stonewalled-2aif</guid>
      <description>&lt;h2&gt;
  
  
  You Built the AI Feature. Now Sell It to the C-Suite Without Getting Stonewalled
&lt;/h2&gt;

&lt;p&gt;You've shipped a brilliant ML feature. The accuracy metrics are solid, the API is clean, and your team is buzzing. Then you present it to the exec team and hit a wall of "let's revisit this next quarter."&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;The problem isn't your code. It's that you're speaking a different language about risk, accountability, and control. Here's how to bridge that gap without dumbing down your work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Objection Isn't Technical
&lt;/h2&gt;

&lt;p&gt;When a senior exec pushes back on AI features, they rarely say what they're actually worried about. They'll talk about "data quality concerns" or "needing more validation," but the underlying fear is simpler: &lt;strong&gt;who gets blamed when the AI screws up?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is especially true for executives who built their careers in the 80s and 90s, when accountability meant your signature on a decision. The idea of delegating judgement to a statistical model feels like abdicating responsibility. &lt;a href="https://www.icentricagency.com/insights/why-boomer-executives-fear-ai-and-how-to-change-the-conversation" rel="noopener noreferrer"&gt;Why boomer executives fear AI&lt;/a&gt; isn't just about technological conservatism — it's about personal liability.&lt;/p&gt;

&lt;p&gt;As developers, we think in terms of accuracy, precision, and error rates. They think in terms of "whose neck is on the line if this goes sideways?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop Pitching Automation, Start Pitching Augmentation
&lt;/h2&gt;

&lt;p&gt;Here's where most technical presentations go wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ "This model automates credit decisions with 94% accuracy"
✅ "This model flags high-risk applications for manual review, 
    processing the easy cases automatically"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first framing sounds like you're replacing human judgement. The second sounds like you're giving humans superpowers. Same feature, entirely different reception.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concrete example:&lt;/strong&gt; If you've built a recommendation engine, don't present it as "AI that knows what customers want." Frame it as "a system that surfaces patterns across 10 million transactions that a human analyst would miss, then presents them for strategic decisions."&lt;/p&gt;

&lt;p&gt;You're not replacing the executive's judgement. You're giving them better data to judge with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Explainability Into Your Demo
&lt;/h2&gt;

&lt;p&gt;When you demo AI features to technical peers, you might gloss over the model internals. When you demo to execs who are worried about accountability, &lt;strong&gt;lead with explainability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Show them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What inputs drive decisions&lt;/strong&gt; — not just feature importance scores, but actual examples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How they can override the system&lt;/strong&gt; — make the human-in-the-loop obvious&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What the audit trail looks like&lt;/strong&gt; — who reviewed what, when, and why&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your system doesn't have these features yet, build them before you present. They're not nice-to-haves; they're the price of admission for risk-averse organisations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Instead of just returning predictions
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Return predictions with context
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;predict_with_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;prediction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prediction&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prediction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;confidence&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict_proba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key_factors&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;get_feature_importance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;similar_cases&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;find_similar_historical_cases&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;reviewed_by&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Address Governance Before They Ask
&lt;/h2&gt;

&lt;p&gt;Don't wait for the "but what about compliance?" question. Bring it up first.&lt;/p&gt;

&lt;p&gt;Talk about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Model versioning and rollback procedures&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How you'll monitor for drift&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who has override authority and how it's logged&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What the approval workflow looks like for edge cases&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, this feels like boring process stuff. But for execs who worry about accountability, this &lt;em&gt;is&lt;/em&gt; the product. The ML model is just a component.&lt;/p&gt;

&lt;p&gt;If you're working with partners who specialise in &lt;a href="https://www.icentricagency.com" rel="noopener noreferrer"&gt;AI automation and software development&lt;/a&gt;, make sure they understand your organisation's governance requirements upfront. Retrofitting compliance is expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reframe Failure as Improvement
&lt;/h2&gt;

&lt;p&gt;One subtle but powerful shift: stop talking about model accuracy as a fixed number.&lt;/p&gt;

&lt;p&gt;Instead of: "The model is 92% accurate."&lt;/p&gt;

&lt;p&gt;Try: "The model is currently 92% accurate, and we have a feedback loop that improves it every week based on human corrections."&lt;/p&gt;

&lt;p&gt;This does two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It positions human oversight as valuable (not a sign of failure)&lt;/li&gt;
&lt;li&gt;It frames errors as learning opportunities, not disasters&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Execs who fear AI often imagine catastrophic, unfixable failures. Show them a system that learns from mistakes, with humans in the loop, and you've addressed the fear directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;You don't need to compromise your technical standards to get exec buy-in. You need to &lt;strong&gt;frame your work in terms of amplified human judgement rather than automated replacement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Build explainability, audit trails, and override mechanisms into your systems from day one. Present them prominently. Address governance before anyone asks.&lt;/p&gt;

&lt;p&gt;Your AI feature isn't just code — it's a proposal for how decisions will be made. Speak to that directly, and you'll find the conversation shifts from "should we do this?" to "how fast can we roll this out?"&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>machinelearning</category>
      <category>leadership</category>
    </item>
    <item>
      <title>Why Your Web App Should Think Like Desktop Software (and How to Build for It)</title>
      <dc:creator>Marc Newstead</dc:creator>
      <pubDate>Thu, 14 May 2026 15:01:43 +0000</pubDate>
      <link>https://dev.to/icentric/why-your-web-app-should-think-like-desktop-software-and-how-to-build-for-it-3fe3</link>
      <guid>https://dev.to/icentric/why-your-web-app-should-think-like-desktop-software-and-how-to-build-for-it-3fe3</guid>
      <description>&lt;h2&gt;
  
  
  The browser isn't a document viewer anymore
&lt;/h2&gt;

&lt;p&gt;If you're still architecting web apps like they're fancy HTML documents with some JavaScript sprinkled on top, you might be building for a platform that's already evolved past you.&lt;/p&gt;

&lt;p&gt;The browser has quietly become a full-blown application runtime. WebAssembly is now mature enough to run Figma's entire rendering engine, Photoshop, and even x86 emulators. AI-powered browsers are intercepting your carefully crafted UIs and summarising them into chat responses. The "page" as we knew it is being abstracted away.&lt;/p&gt;

&lt;p&gt;So what does this mean for how we actually build things?&lt;/p&gt;

&lt;h2&gt;
  
  
  WebAssembly isn't experimental anymore
&lt;/h2&gt;

&lt;p&gt;Wasm crossed the chasm from "interesting tech demo" to "production-ready platform" a while ago. If you haven't touched it yet, here's what you need to know:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's polyglot by design.&lt;/strong&gt; You can compile Rust, C++, Go, even Python to Wasm and run it in the browser at near-native speed. This isn't about replacing JavaScript — it's about escaping its performance ceiling when you need to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Heavy compute (image/video processing, CAD tools, scientific simulations)&lt;/li&gt;
&lt;li&gt;Porting existing codebases without a full rewrite&lt;/li&gt;
&lt;li&gt;Client-side data processing where latency matters&lt;/li&gt;
&lt;li&gt;Running untrusted code safely (Wasm's sandboxed by default)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a trivial Rust → Wasm example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[no_mangle]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;process_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Your heavy image processing logic&lt;/span&gt;
    &lt;span class="c1"&gt;// Runs at ~80-90% native speed in-browser&lt;/span&gt;
    &lt;span class="n"&gt;len&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compile with &lt;code&gt;wasm-pack&lt;/code&gt;, import into JS, and you've got near-native performance without a server round-trip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The shift in thinking:&lt;/strong&gt; Stop assuming expensive operations need a backend. If &lt;a href="https://www.icentricagency.com/insights/the-browser-is-becoming-an-os-is-your-web-strategy-ready" rel="noopener noreferrer"&gt;your web strategy is ready&lt;/a&gt; for this, you're designing client-first architectures where the server becomes optional infrastructure, not the default.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI browsers are breaking your UI assumptions
&lt;/h2&gt;

&lt;p&gt;Arc Browser, Opera with built-in AI, and browser extensions powered by LLMs are already changing how users consume the web. They're not just reading your DOM — they're parsing it, summarising it, and presenting it differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this means practically:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Semantic HTML matters again&lt;/strong&gt; (but differently). AI agents parse structure better when your markup is meaningful. That &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;, and proper heading hierarchy? Not just for accessibility anymore.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your API &lt;em&gt;is&lt;/em&gt; your product.&lt;/strong&gt; If an AI can bypass your UI entirely and interact with your backend, your business logic needs to be exposed thoughtfully. Think API-first, with rate limiting, auth, and proper error responses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Progressive enhancement, redux.&lt;/strong&gt; Build for the scenario where your carefully designed UI might be summarised into three bullet points. Does your app still work? Is the core functionality accessible via keyboard, API, or structured data?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture for an OS-like browser
&lt;/h2&gt;

&lt;p&gt;Here's how to think about building for this shift:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Design for stateful, long-lived sessions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Traditional web: stateless, page-based, server-authoritative.&lt;br&gt;&lt;br&gt;
Browser-as-OS: persistent local state, offline-capable, sync when needed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use IndexedDB or SQLite (via Wasm) for real client-side data&lt;/li&gt;
&lt;li&gt;Design sync strategies that assume conflict (CRDTs, last-write-wins, operational transforms)&lt;/li&gt;
&lt;li&gt;Service Workers aren't optional — they're your process manager&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Treat JavaScript as the orchestration layer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your heavy lifting should increasingly happen in Wasm, Web Workers, or streamed from a backend. JS coordinates, it doesn't compute.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Expose structured data and APIs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If your app is only usable through your React SPA, it's fragile. Provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A documented REST or GraphQL API&lt;/li&gt;
&lt;li&gt;JSON-LD or structured metadata for AI parsing&lt;/li&gt;
&lt;li&gt;Web Components or iframes for embedding&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Performance ≠ bundle size anymore&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Wasm modules, streamed data, and lazy-loaded workers shift the performance equation. A 2MB Wasm binary that runs in 50ms can beat a 200KB JS bundle that blocks the main thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop building documents, start building environments
&lt;/h2&gt;

&lt;p&gt;The mental shift is this: you're not publishing content that gets requested and rendered. You're shipping an environment that runs on someone else's machine.&lt;/p&gt;

&lt;p&gt;That means thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resource management&lt;/strong&gt; (memory, CPU, battery)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security boundaries&lt;/strong&gt; (sandboxing, CSP, subresource integrity)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interoperability&lt;/strong&gt; (can other tools, agents, or apps consume what you build?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're working with clients or stakeholders who still think "website = pages + forms", this is the conversation to have. Agencies focused on &lt;a href="https://www.icentricagency.com" rel="noopener noreferrer"&gt;AI automation and software development&lt;/a&gt; are already building this way — browser-native apps that behave like desktop software, API-first platforms that work with or without a UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do Monday morning
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Audit one feature in your app that's slow or server-dependent. Could Wasm or local-first architecture solve it?&lt;/li&gt;
&lt;li&gt;Check how your app behaves when an AI tries to parse it. Run it through ChatGPT's browser mode or Arc's AI features.&lt;/li&gt;
&lt;li&gt;Expose one core workflow as a documented API, even if it's just for internal use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The browser is already an OS. The question isn't whether to build for it — it's whether you'll do it intentionally or get dragged along by the shift.&lt;/p&gt;

</description>
      <category>webassembly</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>ai</category>
    </item>
    <item>
      <title>Using AI to Map Legacy Code Without Rewriting Everything</title>
      <dc:creator>Marc Newstead</dc:creator>
      <pubDate>Wed, 13 May 2026 16:46:44 +0000</pubDate>
      <link>https://dev.to/icentric/using-ai-to-map-legacy-code-without-rewriting-everything-oe0</link>
      <guid>https://dev.to/icentric/using-ai-to-map-legacy-code-without-rewriting-everything-oe0</guid>
      <description>&lt;h2&gt;
  
  
  Using AI to Map Legacy Code Without Rewriting Everything
&lt;/h2&gt;

&lt;p&gt;If you've ever inherited a fifteen-year-old Java monolith or been asked to "modernise" a COBOL system that's been running since before you were born, you know the real problem isn't the code itself — it's understanding what the hell it actually does.&lt;/p&gt;

&lt;p&gt;The business logic is tribal knowledge. The original developers have long since moved on. The documentation, if it exists at all, is either outdated or actively misleading. And yet, this code is mission-critical.&lt;/p&gt;

&lt;p&gt;This is where AI tooling is starting to show genuine value — not by magically rewriting everything (please don't), but by making legacy systems &lt;strong&gt;legible enough&lt;/strong&gt; to modernise incrementally.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Documentation Gap Is What Actually Kills You
&lt;/h2&gt;

&lt;p&gt;Let's be honest: the blocker on most legacy migrations isn't technical complexity. It's the fact that nobody knows what the code is supposed to do.&lt;/p&gt;

&lt;p&gt;You've got thousands of lines of procedural COBOL or deeply nested Java that's been patched and extended for decades. Business rules are embedded in the code itself. There are no tests. The person who understood the invoice calculation logic retired in 2012.&lt;/p&gt;

&lt;p&gt;Traditionally, you'd need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reverse-engineer the business logic by reading code&lt;/li&gt;
&lt;li&gt;Interview subject matter experts (if they still exist)&lt;/li&gt;
&lt;li&gt;Run the system with test data and observe outputs&lt;/li&gt;
&lt;li&gt;Document everything manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This takes &lt;strong&gt;months&lt;/strong&gt;. And it's boring, error-prone work that nobody wants to do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter AI-Assisted Mapping
&lt;/h3&gt;

&lt;p&gt;Modern LLMs (GPT-4, Claude, even specialised models) can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parse legacy code and generate plain-English summaries of what functions do&lt;/li&gt;
&lt;li&gt;Trace data flows across modules&lt;/li&gt;
&lt;li&gt;Identify dependencies and side effects&lt;/li&gt;
&lt;li&gt;Suggest which components are safe to decouple&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a simple example. You've got a 500-line stored procedure that calculates something financial. You feed it to an LLM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Legacy stored procedure from 2005&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;calculate_customer_discount&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;order_total&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="c1"&gt;-- 500 lines of nested IF statements&lt;/span&gt;
  &lt;span class="c1"&gt;-- and undocumented business rules&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Summarise what this procedure does, list all business rules, and identify external dependencies."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The output won't be perfect, but it gives you a &lt;strong&gt;starting point&lt;/strong&gt; that would've taken hours of manual analysis. You can then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate the summary with a domain expert&lt;/li&gt;
&lt;li&gt;Use it as documentation for the replacement service&lt;/li&gt;
&lt;li&gt;Identify edge cases that need testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach is already being used across UK enterprises — financial services and public sector teams are documenting legacy systems at a pace that simply wasn't feasible before. For a broader view on how organisations are tackling this, see this &lt;a href="https://www.icentricagency.com/insights/ai-and-legacy-codebases-a-pragmatic-guide-for-uk-enterprises" rel="noopener noreferrer"&gt;pragmatic guide for UK enterprises&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strangler-Fig with AI: Incremental Wins
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;strangler-fig pattern&lt;/strong&gt; is still the safest way to modernise: you build new services alongside the old system, gradually routing traffic over, until the legacy code can be retired.&lt;/p&gt;

&lt;p&gt;AI tools can act as a &lt;strong&gt;co-pilot&lt;/strong&gt; here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identify bounded contexts&lt;/strong&gt; — which chunks of the monolith can be safely extracted?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate interface contracts&lt;/strong&gt; — what inputs and outputs does this component expect?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scaffold replacement services&lt;/strong&gt; — create boilerplate for new microservices based on analysed legacy behaviour&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare outputs&lt;/strong&gt; — run both old and new implementations in parallel and flag discrepancies&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You're not trusting the AI to do the work unsupervised. You're using it to &lt;strong&gt;speed up the tedious parts&lt;/strong&gt; so you can focus on the hard decisions: architecture, trade-offs, risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI Breaks Down (and You Still Need Humans)
&lt;/h2&gt;

&lt;p&gt;Let's be clear: &lt;strong&gt;LLMs don't understand your business logic&lt;/strong&gt;. They pattern-match. They hallucinate. They'll confidently give you plausible-sounding nonsense.&lt;/p&gt;

&lt;p&gt;Don't use AI for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Final architectural decisions&lt;/strong&gt; — a human needs to own that&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validating business-critical logic&lt;/strong&gt; — always verify with domain experts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security-sensitive code&lt;/strong&gt; — treat AI output as untrusted input&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything without code review&lt;/strong&gt; — hallucinations are real and dangerous&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI is a &lt;strong&gt;documentation accelerator&lt;/strong&gt; and a &lt;strong&gt;mapping tool&lt;/strong&gt;. It's not a replacement for engineering judgement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Takeaways
&lt;/h2&gt;

&lt;p&gt;If you're staring down a legacy modernisation project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with documentation, not code replacement&lt;/strong&gt; — use AI to map what exists before you change anything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate everything&lt;/strong&gt; — treat AI output as a first draft, not gospel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focus on knowledge capture&lt;/strong&gt; — the real value is making implicit knowledge explicit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use AI for boring, repetitive analysis&lt;/strong&gt; — free up your team to solve actual problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Legacy systems aren't going away. But with the right tooling and a pragmatic approach, you can make them &lt;strong&gt;understandable&lt;/strong&gt; — and that's half the battle.&lt;/p&gt;

&lt;p&gt;If your team is exploring how AI fits into modernisation work, agencies specialising in &lt;a href="https://www.icentricagency.com" rel="noopener noreferrer"&gt;AI automation and software development&lt;/a&gt; can help structure these programmes without the hype.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your experience with legacy code and AI tooling? Have you used LLMs to document or analyse old systems? Let's hear it in the comments.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>legacy</category>
      <category>softwareengineering</category>
      <category>devops</category>
    </item>
    <item>
      <title>Your AI Copilot Is Steering Your Tech Stack (And You Might Not Have Noticed)</title>
      <dc:creator>Marc Newstead</dc:creator>
      <pubDate>Wed, 13 May 2026 16:31:29 +0000</pubDate>
      <link>https://dev.to/icentric/your-ai-copilot-is-steering-your-tech-stack-and-you-might-not-have-noticed-1ckl</link>
      <guid>https://dev.to/icentric/your-ai-copilot-is-steering-your-tech-stack-and-you-might-not-have-noticed-1ckl</guid>
      <description>&lt;h2&gt;
  
  
  Your AI Copilot Is Steering Your Tech Stack (And You Might Not Have Noticed)
&lt;/h2&gt;

&lt;p&gt;Let's talk about something that's been happening on development teams everywhere, but hardly anyone's discussing openly: &lt;strong&gt;AI coding assistants are influencing which languages and frameworks we choose&lt;/strong&gt;. Not through recommendations or warnings, but through something far more subtle — better autocomplete suggestions.&lt;/p&gt;

&lt;p&gt;If you've noticed your team gravitating toward TypeScript over JavaScript, or reaching for well-documented frameworks more often, there's a good chance your AI assistant is quietly pushing you in that direction. Here's what's actually happening and why you should care.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Autocomplete Bias
&lt;/h2&gt;

&lt;p&gt;AI coding assistants aren't neutral tools. They're trained on massive datasets of public code, and they perform measurably better with some languages than others. TypeScript over JavaScript. Go over Ruby. Frameworks with extensive documentation over newer alternatives.&lt;/p&gt;

&lt;p&gt;This isn't about one language being objectively "better" — it's about &lt;strong&gt;which languages AI can parse and predict more reliably&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think about your own experience. When you're working in TypeScript, your AI assistant probably feels almost telepathic — completing entire functions, suggesting the exact pattern you were about to write. Switch to a dynamically-typed language or a less-documented framework, and suddenly it feels… duller. More generic. Less helpful.&lt;/p&gt;

&lt;p&gt;That difference in experience creates a feedback loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better suggestions → faster development → positive reinforcement&lt;/li&gt;
&lt;li&gt;Weaker suggestions → more manual typing → subtle frustration&lt;/li&gt;
&lt;li&gt;Over time, the path of least resistance shifts toward AI-friendly choices&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When AI Preferences Become Architectural Decisions
&lt;/h2&gt;

&lt;p&gt;This influence doesn't stop at language choice. It cascades:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language → Framework → Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When your AI assistant excels at TypeScript, you'll naturally get better suggestions for TypeScript-first frameworks like Next.js or NestJS. The autocomplete for configuration, routing patterns, and common operations will be sharper. You'll ship faster.&lt;/p&gt;

&lt;p&gt;Meanwhile, that interesting new framework with sparse documentation? Your AI assistant will be nearly useless. You'll feel like you're coding with one hand tied behind your back.&lt;/p&gt;

&lt;p&gt;The result: &lt;strong&gt;teams drift toward a narrower range of technologies&lt;/strong&gt;, not because of deliberate technical evaluation, but because of tooling friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Risk Isn't Technical
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable bit: for many projects, TypeScript probably &lt;em&gt;is&lt;/em&gt; the right choice. The static typing, improved tooling, and reduced runtime errors are genuine benefits.&lt;/p&gt;

&lt;p&gt;The risk isn't that &lt;a href="https://www.icentricagency.com/insights/why-ai-is-quietly-deciding-which-languages-your-team-uses" rel="noopener noreferrer"&gt;AI is quietly deciding&lt;/a&gt; your tech stack poorly — it's that &lt;strong&gt;you're not deciding at all&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When was the last time your team had a proper discussion about language choice? Can you honestly say you evaluated the trade-offs, or did TypeScript just become the default because "everyone's using it" and it felt better with Copilot?&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Can Actually Do About It
&lt;/h2&gt;

&lt;p&gt;This isn't a call to abandon AI assistants or reject TypeScript. It's a nudge to &lt;strong&gt;make technology decisions deliberately&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's what that looks like in practice:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Name the Influence
&lt;/h3&gt;

&lt;p&gt;In your next tech stack discussion, explicitly ask: "How much of this preference is driven by better AI assistant support?" Just acknowledging it changes the conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Separate Evaluation from Implementation
&lt;/h3&gt;

&lt;p&gt;When assessing a new library or framework, spend time with the documentation and community &lt;em&gt;before&lt;/em&gt; diving into code. Don't let autocomplete quality be the primary signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Track Your Technology Radar
&lt;/h3&gt;

&lt;p&gt;Keep a lightweight register of your tech choices and why you made them. Review it quarterly. Are you actually evaluating alternatives, or has your stack ossified around what your AI assistant knows best?&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Test Drive Without Assistance
&lt;/h3&gt;

&lt;p&gt;Occasionally try prototyping in a new language or framework with AI assistance &lt;em&gt;disabled&lt;/em&gt;. It's uncomfortable, but it recalibrates your sense of what's genuinely difficult versus what just has weak AI support.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;For teams working on &lt;a href="https://www.icentricagency.com" rel="noopener noreferrer"&gt;AI automation and software development&lt;/a&gt;, this is doubly important. If you're building AI-assisted tools, you're both influenced by and influencing these patterns.&lt;/p&gt;

&lt;p&gt;The future probably involves AI assistants becoming even more capable and more opinionated. That's not inherently bad — but it makes &lt;strong&gt;intentional technical decision-making&lt;/strong&gt; more valuable, not less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Move
&lt;/h2&gt;

&lt;p&gt;Next time you're starting a new project or choosing a framework, pause before reaching for the obvious choice. Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are we choosing this because it's the best fit for our problem?&lt;/li&gt;
&lt;li&gt;Or because our AI assistant makes it feel effortless?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both can be valid reasons. But you should know which one you're acting on.&lt;/p&gt;

&lt;p&gt;The tools are meant to serve your decisions, not make them for you. Keep it that way.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>typescript</category>
      <category>devtools</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
