<?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: Mauberme</title>
    <description>The latest articles on DEV Community by Mauberme (@mauberme).</description>
    <link>https://dev.to/mauberme</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4229974%2Fe296d0b4-2901-4c8c-b78e-bbbf221f3981.png</url>
      <title>DEV Community: Mauberme</title>
      <link>https://dev.to/mauberme</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mauberme"/>
    <language>en</language>
    <item>
      <title>Site migration checklist: how to make sure every old URL still lands somewhere (301s, chains, 404s, hreflang)</title>
      <dc:creator>Mauberme</dc:creator>
      <pubDate>Fri, 06 Nov 2026 08:28:25 +0000</pubDate>
      <link>https://dev.to/mauberme/site-migration-checklist-how-to-make-sure-every-old-url-still-lands-somewhere-301s-chains-404s-6n3</link>
      <guid>https://dev.to/mauberme/site-migration-checklist-how-to-make-sure-every-old-url-still-lands-somewhere-301s-chains-404s-6n3</guid>
      <description>&lt;p&gt;Most traffic losses after a domain or URL change are not caused by Google. They come from redirects that are missing, chained or pointing to the wrong page. The checklist we use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build the redirect map before launch&lt;/strong&gt;: one row per old URL → new URL. Export old URLs from the sitemap, analytics and backlinks, not only from the CMS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One hop only.&lt;/strong&gt; &lt;code&gt;old → new&lt;/code&gt;, never &lt;code&gt;old → intermediate → new&lt;/code&gt;. Each extra hop is slower and risks losing ranking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;301, not 302&lt;/strong&gt;, for permanent moves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right destination&lt;/strong&gt;, not just "a 200". Sending everything to the homepage counts as a soft 404.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No loops&lt;/strong&gt; and no redirects to pages that return 404 or 500.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;hreflang&lt;/strong&gt;: if the site is multilingual, the language versions must point to each other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check again after launch&lt;/strong&gt; with the real server, CDN and trailing-slash rules in place.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Doing step 7 by hand with a spreadsheet and &lt;code&gt;curl -I&lt;/code&gt; is fine for 20 URLs, but painful for 2,000. I packaged the checks we used to migrate a multilingual site (3 legacy domains, 89 redirects, 4 languages) into a tool. You paste the old,new list and it opens every old URL, follows the redirects and gives you a 0–100 report with every broken row. It can also generate the redirect rules for Next.js, Vercel, Netlify, nginx, Apache or Cloudflare: &lt;a href="https://apify.com/mauberme/site-migration-auditor" rel="noopener noreferrer"&gt;https://apify.com/mauberme/site-migration-auditor&lt;/a&gt; (free during launch).&lt;/p&gt;

&lt;p&gt;What's the worst migration mistake you've had to clean up?&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Your hero video is probably 10x heavier than it needs to be (and how to fix it without installing ffmpeg)</title>
      <dc:creator>Mauberme</dc:creator>
      <pubDate>Fri, 06 Nov 2026 08:27:06 +0000</pubDate>
      <link>https://dev.to/mauberme/your-hero-video-is-probably-10x-heavier-than-it-needs-to-be-and-how-to-fix-it-without-installing-1h87</link>
      <guid>https://dev.to/mauberme/your-hero-video-is-probably-10x-heavier-than-it-needs-to-be-and-how-to-fix-it-without-installing-1h87</guid>
      <description>&lt;p&gt;Background videos and product clips are often the heaviest thing on a landing page. A 40 MB phone recording uploaded "as is" hurts LCP, burns mobile data and often won't start until most of it has downloaded.&lt;/p&gt;

&lt;p&gt;Three things make a video web-ready:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The right size.&lt;/strong&gt; Nobody needs 4K in a 1200 px wide hero. 720p or 1080p is plenty, and 360–480p works for small embeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A web-friendly codec.&lt;/strong&gt; H.264 MP4 plays everywhere. WebM (VP9) is usually smaller, so offer both with &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; tags and let the browser pick.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast start.&lt;/strong&gt; By default, MP4 files store their index (the &lt;code&gt;moov&lt;/code&gt; atom) at the &lt;em&gt;end&lt;/em&gt;, so the browser has to download everything before playing. Moving it to the front (&lt;code&gt;-movflags +faststart&lt;/code&gt;) lets playback start immediately.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With ffmpeg that is roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; input.mov &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale='min(1280,iw)':-2"&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 26 &lt;span class="nt"&gt;-preset&lt;/span&gt; slow &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart &lt;span class="nt"&gt;-an&lt;/span&gt; output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add a poster image so something shows before the first frame loads:&lt;br&gt;
&lt;/p&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;video&lt;/span&gt; &lt;span class="na"&gt;autoplay&lt;/span&gt; &lt;span class="na"&gt;muted&lt;/span&gt; &lt;span class="na"&gt;loop&lt;/span&gt; &lt;span class="na"&gt;playsinline&lt;/span&gt; &lt;span class="na"&gt;poster=&lt;/span&gt;&lt;span class="s"&gt;"poster.jpg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"hero.webm"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"video/webm"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"hero.mp4"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"video/mp4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/video&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If you don't want to deal with ffmpeg&lt;/strong&gt;, or you need to do this for many videos or from an automation: I built a small cloud tool that does exactly these steps. You paste video links and get back a fast-start MP4, an optional WebM and a poster image. It never makes a video bigger than the original. It runs on Apify and is free during launch: &lt;a href="https://apify.com/mauberme/video-for-web" rel="noopener noreferrer"&gt;https://apify.com/mauberme/video-for-web&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can also be called from an API or from an AI agent through Apify's MCP server, which helps if you process videos inside a pipeline.&lt;/p&gt;

&lt;p&gt;What's the heaviest video you've shipped by accident? 🙂&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>video</category>
      <category>html</category>
    </item>
  </channel>
</rss>
