<?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: Yuri Gerasymov</title>
    <description>The latest articles on DEV Community by Yuri Gerasymov (@ygerasimov).</description>
    <link>https://dev.to/ygerasimov</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%2F122173%2F9eb99f14-8380-4e87-b5f5-fe2acf3507e9.jpg</url>
      <title>DEV Community: Yuri Gerasymov</title>
      <link>https://dev.to/ygerasimov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ygerasimov"/>
    <language>en</language>
    <item>
      <title>Catch Visual Bugs Before They Hit Production: Automated Visual Regression Testing for Astro with Diffy and Cloudflare</title>
      <dc:creator>Yuri Gerasymov</dc:creator>
      <pubDate>Thu, 04 Jun 2026 19:51:01 +0000</pubDate>
      <link>https://dev.to/ygerasimov/catch-visual-bugs-before-they-hit-production-automated-visual-regression-testing-for-astro-with-21pg</link>
      <guid>https://dev.to/ygerasimov/catch-visual-bugs-before-they-hit-production-automated-visual-regression-testing-for-astro-with-21pg</guid>
      <description>&lt;p&gt;You push a CSS tweak. It looks fine locally. The PR gets approved. You deploy — and two hours later someone messages you: &lt;em&gt;"Hey, the navigation is broken on mobile."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sound familiar? This is exactly the gap that visual regression testing fills. And if you're building with Astro and deploying to Cloudflare Pages, you can close that gap automatically on every pull request — without any manual QA steps.&lt;/p&gt;

&lt;p&gt;This post walks through setting up &lt;strong&gt;Diffy&lt;/strong&gt; with your Astro + GitHub + Cloudflare workflow so that every PR gets its own visual comparison against production before it's merged.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Diffy?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://diffy.website" rel="noopener noreferrer"&gt;Diffy&lt;/a&gt; is a screenshot-based visual regression testing tool. It takes screenshots of your pages across multiple breakpoints, compares them against a baseline (typically production), and highlights any visual differences — layout shifts, missing elements, broken styles, unexpected changes.&lt;/p&gt;

&lt;p&gt;What sets Diffy apart from rolling your own Playwright/Puppetteer setup is its focus on &lt;strong&gt;zero false positives&lt;/strong&gt;. Dynamic content like ads, carousels, and video embeds are the big problem of visual diffing — they change every time and flood you with noise. Diffy handles this by masking and freezing dynamic elements so your diffs stay meaningful.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;Here's what this integration connects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Astro&lt;/strong&gt; — your framework, with pages deployed as a static/SSR site&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Pages&lt;/strong&gt; — which spins up a unique preview URL for every branch/PR automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; — which orchestrates the workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diffy&lt;/strong&gt; — which does the visual comparison and posts results back to the PR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PR opened → Cloudflare deploys preview → GitHub Action fires →
Diffy CLI compares preview vs. production → Result posted to PR check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 1: Set Up Your Diffy Project
&lt;/h2&gt;

&lt;p&gt;First, &lt;a href="https://app.diffy.website" rel="noopener noreferrer"&gt;create a project in Diffy&lt;/a&gt;. During setup you'll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add the URLs you want to test (your key pages — home, blog, landing pages, etc.)&lt;/li&gt;
&lt;li&gt;Configure breakpoints (e.g. 375px mobile, 1280px desktop)&lt;/li&gt;
&lt;li&gt;Take an initial set of screenshots from your production environment — this becomes the baseline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once your project is created, grab two things you'll need later:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your &lt;strong&gt;Project ID&lt;/strong&gt; (from the project settings URL)&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;API key&lt;/strong&gt; (from &lt;code&gt;https://app.diffy.website/#/keys&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2: Connect Diffy to Your GitHub Repo
&lt;/h2&gt;

&lt;p&gt;In Diffy, go to &lt;strong&gt;Project Settings → Notifications → GitHub&lt;/strong&gt; and add your repository URL in the format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/{username}/{repo}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install the &lt;strong&gt;Diffy GitHub App&lt;/strong&gt; on your repository. This is what gives Diffy permission to post check results back to your pull requests.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Add Secrets to GitHub
&lt;/h2&gt;

&lt;p&gt;In your GitHub repository, go to &lt;strong&gt;Settings → Secrets and variables → Actions&lt;/strong&gt; and add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;secret&lt;/strong&gt; called &lt;code&gt;DIFFY_API_KEY&lt;/code&gt; with your API key&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;variable&lt;/strong&gt; called &lt;code&gt;DIFFY_PROJECT_ID&lt;/code&gt; with your project ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Secrets are encrypted and hidden in logs; variables are visible but not sensitive — hence the split.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Add the GitHub Actions Workflow
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/visual-regression.yml&lt;/code&gt; in your repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Visual Regression&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;check_run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;completed&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;compare&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Diffy Comparison&lt;/span&gt;
    &lt;span class="c1"&gt;# Only fire on successful Cloudflare Workers and Pages check runs.&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;-&lt;/span&gt;
      &lt;span class="s"&gt;github.event.check_run.check_suite.conclusion == 'success' &amp;amp;&amp;amp;&lt;/span&gt;
      &lt;span class="s"&gt;github.event.check_run.app.name == 'Cloudflare Workers and Pages'&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;timeout-minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Extract the preview URL from the check run summary and resolve the PR number.&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get deployment URL and PR number&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;info&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/github-script@v9&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;const summary = context.payload.check_run.output.summary || '';&lt;/span&gt;
            &lt;span class="s"&gt;const urlMatch = summary.match(/https:\/\/[a-z0-9-\.]+\.workers\.dev*/);&lt;/span&gt;
            &lt;span class="s"&gt;if (!urlMatch) {&lt;/span&gt;
              &lt;span class="s"&gt;core.setFailed('Could not find a *.workers.dev URL in the check run summary');&lt;/span&gt;
              &lt;span class="s"&gt;return;&lt;/span&gt;
            &lt;span class="s"&gt;}&lt;/span&gt;
            &lt;span class="s"&gt;core.setOutput('deployment_url', urlMatch[0]);&lt;/span&gt;

            &lt;span class="s"&gt;const branchName = context.payload.check_run.check_suite.head_branch || ''&lt;/span&gt;
            &lt;span class="s"&gt;if (!branchName) {&lt;/span&gt;
              &lt;span class="s"&gt;core.setFailed('Could not find a head branch name');&lt;/span&gt;
              &lt;span class="s"&gt;return;&lt;/span&gt;
            &lt;span class="s"&gt;}&lt;/span&gt;
            &lt;span class="s"&gt;core.setOutput('branch_name', branchName);&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Download Diffy CLI and trigger comparison job&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;wget -q -O /usr/local/bin/diffy \&lt;/span&gt;
            &lt;span class="s"&gt;https://github.com/diffywebsite/diffy-cli/releases/latest/download/diffy.phar&lt;/span&gt;
          &lt;span class="s"&gt;chmod +x /usr/local/bin/diffy&lt;/span&gt;

          &lt;span class="s"&gt;diffy auth:login "${DIFFY_API_KEY}"&lt;/span&gt;

          &lt;span class="s"&gt;diffy project:compare "${DIFFY_PROJECT_ID}" prod custom \&lt;/span&gt;
            &lt;span class="s"&gt;--env2Url="${{ steps.info.outputs.deployment_url }}" \&lt;/span&gt;
            &lt;span class="s"&gt;--commit-sha="${{ github.event.check_run.head_sha }}" \&lt;/span&gt;
            &lt;span class="s"&gt;--name="PR ${{ steps.info.outputs.branch_name }}"&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;DIFFY_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DIFFY_API_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;DIFFY_PROJECT_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DIFFY_PROJECT_ID }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break down what's happening:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trigger&lt;/strong&gt; (&lt;code&gt;check_run: completed&lt;/code&gt;) means this workflow fires whenever any check run finishes on the repo. The &lt;code&gt;if:&lt;/code&gt; condition filters it down to only Cloudflare deployments that completed successfully — so you're not burning CI minutes on failed builds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first step&lt;/strong&gt; uses &lt;code&gt;actions/github-script&lt;/code&gt; to parse the Cloudflare check run's output summary and extract the preview URL (which looks like &lt;code&gt;your-branch.your-project.pages.dev&lt;/code&gt;). It also grabs the branch name for labeling the comparison.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The second step&lt;/strong&gt; downloads the Diffy CLI, authenticates, then runs &lt;code&gt;project:compare&lt;/code&gt; with your production environment as the baseline and the Cloudflare preview URL as the comparison target. The &lt;code&gt;--commit-sha&lt;/code&gt; flag is what links the Diffy result back to the specific commit so GitHub knows which PR check to update.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Get
&lt;/h2&gt;

&lt;p&gt;After a PR is opened and Cloudflare finishes its deployment, the workflow automatically kicks off. Within a few minutes you'll see a new check appear on your PR:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Passed&lt;/strong&gt; — no visual differences detected, safe to merge&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Failed&lt;/strong&gt; — visual differences found, with a link to the Diffy comparison&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clicking through takes you to a side-by-side diff view in Diffy where you can inspect exactly which pages changed, across each breakpoint you configured. If a change is intentional (you did update the hero section after all), you can approve it in Diffy to bring the check back to passed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters for Astro Projects
&lt;/h2&gt;

&lt;p&gt;Astro's component model makes it easy to share layout components across dozens of pages. That's a superpower — but it also means a CSS change in a shared component can ripple across your entire site in ways that are hard to catch in code review.&lt;/p&gt;

&lt;p&gt;If you make your changes to the site with Claude (or any other AI) you would want to have a safety net that will catch any unintentional changes.&lt;/p&gt;

&lt;p&gt;Visual regression testing is that net. With this setup, every PR on your Astro site gets automatically checked against production before it ever has a chance to merge — with zero manual steps required from you or your reviewers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.diffy.website" rel="noopener noreferrer"&gt;Diffy documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.loom.com/share/4f989d3b4a2146d4ba6a31c6e72a70f8" rel="noopener noreferrer"&gt;Video walkthrough of this integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/pages/get-started/git-integration/" rel="noopener noreferrer"&gt;Cloudflare Pages + GitHub integration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>astro</category>
      <category>github</category>
      <category>diffy</category>
    </item>
    <item>
      <title>PHPStorm picking up wrong index.php</title>
      <dc:creator>Yuri Gerasymov</dc:creator>
      <pubDate>Thu, 03 Jan 2019 03:44:07 +0000</pubDate>
      <link>https://dev.to/ygerasimov/phpstorm-picking-up-wrong-indexphp-465l</link>
      <guid>https://dev.to/ygerasimov/phpstorm-picking-up-wrong-indexphp-465l</guid>
      <description>&lt;p&gt;Recently I was setting up Drupal development environment with docksal. I used traditional drupal composer setup (&lt;a href="https://github.com/drupal-composer/drupal-project" rel="noopener noreferrer"&gt;https://github.com/drupal-composer/drupal-project&lt;/a&gt;) so drupal is in the /web folder on the server.&lt;/p&gt;

&lt;p&gt;I have mapped main root folder in PHP Storm&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fodknyfwaale3x3q3evat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fodknyfwaale3x3q3evat.png" alt="default mapping" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I was really surprised when I started my debugging session and discovered some weird file being started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6gb45uxyln6hmfqcvlw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6gb45uxyln6hmfqcvlw.png" alt="surprise" width="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looks like PHP Storm tries to find first index.php it can find and then starts session like it is being debugged.&lt;/p&gt;

&lt;p&gt;Solution for this is to map folder "web" and actual index.php so PHP Storm can find proper file easier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdyl5unkfol7mfkjhlg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdyl5unkfol7mfkjhlg7.png" alt="proper mapping" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvffte52mb5rehdztkglw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvffte52mb5rehdztkglw.png" alt="explicit index.php" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As result proper index.php is displayed as being debugged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr07hrbrkbi59a284h7x9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr07hrbrkbi59a284h7x9.png" alt="and now nice debugging" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy debugging!&lt;/p&gt;

</description>
      <category>xdebug</category>
      <category>php</category>
      <category>phpstorm</category>
    </item>
    <item>
      <title>Automating checking your Drupal's updates with Pantheon multidev</title>
      <dc:creator>Yuri Gerasymov</dc:creator>
      <pubDate>Sun, 16 Dec 2018 23:38:26 +0000</pubDate>
      <link>https://dev.to/ygerasimov/automating-checking-your-drupals-updates-with-pantheon-multidev-16o</link>
      <guid>https://dev.to/ygerasimov/automating-checking-your-drupals-updates-with-pantheon-multidev-16o</guid>
      <description>&lt;p&gt;Drupal updates can be very different. Some of them -- easy patches that you just roll out and forget. Some of them -- break your site. Tricky part is you never know how updates will behave on your site until you actually tried them out.&lt;/p&gt;

&lt;p&gt;This is why it is very tricky to give estimates to clients how long it is going to take. They usually do not appreciate answer 1 to 20 hours depending on some random facts.&lt;/p&gt;

&lt;p&gt;In this way rolling out updates got delayed and delayed. And then we get to situations after half a year or a year that we know for sure site will be broken after updates. And now hero time begins.&lt;/p&gt;

&lt;p&gt;Would it be nice if site would tell you not only the fact that it needs updates but also if it is going to break or not after rolling them out.&lt;/p&gt;

&lt;p&gt;Nowadays, thanks to Pantheon's multidev, it is technically possible to automate checking how your updates will behave on the site.&lt;/p&gt;

&lt;p&gt;Main idea is to regularly check updates (using drush command) then if updates are found create a separate environment and roll updates there. Afterward to ensure that they didn't break the site (at least visually) we could run some visual regression testing. So in result we have way more predictable answer about "how much efforts it will take to roll updates out".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdownloads.intercomcdn.com%2Fi%2Fo%2F91467034%2Fb5b204b06ad8abbb973e55f6%2Fdiffy-autoupdates.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdownloads.intercomcdn.com%2Fi%2Fo%2F91467034%2Fb5b204b06ad8abbb973e55f6%2Fdiffy-autoupdates.jpg" alt="Updates diagram" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a full article tutorial about how to set it up &lt;a href="http://docs.diffy.website/tutorials/put-your-sites-updates-on-autopilot-with-pantheon-multidev-and-visual-testing" rel="noopener noreferrer"&gt;http://docs.diffy.website/tutorials/put-your-sites-updates-on-autopilot-with-pantheon-multidev-and-visual-testing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For sure fixing smaller updates is much easier than fixing big break after year of delays.&lt;/p&gt;

</description>
      <category>drupal</category>
      <category>pantheon</category>
      <category>updates</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
