<?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: John Wick</title>
    <description>The latest articles on DEV Community by John Wick (@codenamew).</description>
    <link>https://dev.to/codenamew</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%2F4043176%2Fc4e85b98-139d-4c0c-a3be-1988390f4d72.jpg</url>
      <title>DEV Community: John Wick</title>
      <link>https://dev.to/codenamew</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codenamew"/>
    <language>en</language>
    <item>
      <title>1 Process vs 3, 98 MB vs 324 MB: A Live Wallpaper Showdown on Windows</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Fri, 13 Nov 2026 15:21:24 +0000</pubDate>
      <link>https://dev.to/codenamew/1-process-vs-3-98-mb-vs-324-mb-a-live-wallpaper-showdown-on-windows-4gh2</link>
      <guid>https://dev.to/codenamew/1-process-vs-3-98-mb-vs-324-mb-a-live-wallpaper-showdown-on-windows-4gh2</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I'm the developer of EWRE.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I played the same 1080p, 60 FPS H.264 video as a wallpaper in two engines on the same Windows 11 machine (GTX 1080 Ti) and sampled resource use every second for 30 seconds.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;EWRE&lt;/th&gt;
&lt;th&gt;Lively v20262.5.6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Processes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg CPU&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.65%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6.46%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak CPU&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.30%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18.70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg RAM&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98.7 MB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;324.3 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F15017tzc2awiqoe5cfre.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F15017tzc2awiqoe5cfre.png" alt="CPU and RAM over 30 seconds" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway:&lt;/strong&gt; EWRE used about 59% less CPU and about 70% less RAM in this test. It's a single native process (Direct3D 11 + Media Foundation with hardware decoding), while Lively runs a .NET/WinUI app plus an &lt;code&gt;mpv&lt;/code&gt; player process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fine print:&lt;/strong&gt; one machine, one clip, one 30-second run. GPU and VRAM weren't measured, and RAM is working set summed across processes. Treat it as one data point, not a final verdict.&lt;/p&gt;

&lt;p&gt;EWRE is free on the &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;Microsoft Store&lt;/a&gt;. Run your own test and tell me what you get. 👇&lt;/p&gt;

</description>
      <category>performance</category>
      <category>showdev</category>
      <category>software</category>
    </item>
    <item>
      <title>I Benchmarked My Live Wallpaper Engine Against Lively: 59% Less CPU, 70% Less RAM (and What I Didn't Measure)</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Fri, 13 Nov 2026 15:20:30 +0000</pubDate>
      <link>https://dev.to/codenamew/i-benchmarked-my-live-wallpaper-engine-against-lively-59-less-cpu-70-less-ram-and-what-i-240a</link>
      <guid>https://dev.to/codenamew/i-benchmarked-my-live-wallpaper-engine-against-lively-59-less-cpu-70-less-ram-and-what-i-240a</guid>
      <description>&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I'm the developer of EWRE, so I have an obvious bias. I'm sharing the setup, the raw numbers, and the limits of the test so you can judge them yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question
&lt;/h2&gt;

&lt;p&gt;A live wallpaper runs all day and nobody stares at it. So how much should it cost? I compared &lt;strong&gt;EWRE&lt;/strong&gt; (my engine) with &lt;strong&gt;Lively Wallpaper&lt;/strong&gt;, a popular free one, playing the same video on the same machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test setup
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Windows 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;NVIDIA GeForce GTX 1080 Ti (driver 582.28)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dem.mp4&lt;/code&gt;, 1920x1080 @ ~60 FPS, H.264&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Method&lt;/td&gt;
&lt;td&gt;Sampled every 1 s for 30 s of continuous desktop playback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versions&lt;/td&gt;
&lt;td&gt;EWRE (current build) vs Lively v20262.5.6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How they're built
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EWRE:&lt;/strong&gt; one native process (C++20, Direct3D 11, Media Foundation). Playback happens in-process, with hardware decoding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lively:&lt;/strong&gt; C# on .NET 9 with WinUI 3. Video is played by an &lt;code&gt;mpv.exe&lt;/code&gt; child process. During the test I measured three processes: &lt;code&gt;Lively.exe&lt;/code&gt;, &lt;code&gt;mpv.exe&lt;/code&gt;, and &lt;code&gt;Lively.Watchdog.exe&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;EWRE&lt;/th&gt;
&lt;th&gt;Lively&lt;/th&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Processes&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average CPU&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.65%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6.46%&lt;/td&gt;
&lt;td&gt;59.0% lower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak CPU (1 s sample)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.30%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18.70%&lt;/td&gt;
&lt;td&gt;50.3% lower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average RAM (working set)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98.70 MB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;324.29 MB&lt;/td&gt;
&lt;td&gt;69.6% lower (about 226 MB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak RAM (working set)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;101.16 MB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;331.71 MB&lt;/td&gt;
&lt;td&gt;69.5% lower&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Figvqsznb4928ru518zs0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Figvqsznb4928ru518zs0.png" alt="EWRE vs Lively: CPU and RAM over 30 seconds" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Lively's resources go
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Process&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;CPU&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Lively.exe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~157 MB&lt;/td&gt;
&lt;td&gt;mostly 0 to 2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mpv.exe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~146 to 159 MB&lt;/td&gt;
&lt;td&gt;most of the CPU, with bursts up to 18.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Lively.Watchdog.exe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~15.5 MB&lt;/td&gt;
&lt;td&gt;~0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Lively's CPU wasn't evenly spread. There were two sustained bursts of 15 to 19% (around seconds 18 to 22 and 28 to 29), almost entirely from &lt;code&gt;mpv.exe&lt;/code&gt;. EWRE's worst single sample was 9.3%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why might EWRE be lighter?
&lt;/h2&gt;

&lt;p&gt;I didn't profile this, so these are hypotheses based on the architecture:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No IPC.&lt;/strong&gt; Playback is in-process, with no separate player to coordinate with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No managed runtime.&lt;/strong&gt; Native code means no .NET or WinUI footprint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware decoding straight into GPU textures&lt;/strong&gt; through Direct3D 11 and Media Foundation, which keeps CPU work low.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What this test does NOT show
&lt;/h2&gt;

&lt;p&gt;I'd rather you hear this from me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One run, one machine, one video, 30 seconds.&lt;/strong&gt; Treat it as a data point, not a verdict. Longer runs and other hardware could look different.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU and VRAM usage weren't measured.&lt;/strong&gt; Hardware decoding moves work to the GPU, so a full comparison needs GPU load, VRAM, and ideally power draw.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAM is working set,&lt;/strong&gt; summed across Lively's processes. That can overcount pages shared between them, so the real difference may be smaller than 226 MB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU samples are coarse.&lt;/strong&gt; Values move in steps of about 1.56%, which matches Windows' 15.6 ms CPU-time tick over a 1 s window, so small differences are noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lively's player settings matter.&lt;/strong&gt; [State here whether Lively ran on default settings and whether mpv hardware decoding was enabled.]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30 seconds can't prove there are no memory leaks.&lt;/strong&gt; EWRE's RAM stayed between about 93 and 101 MB, but a proper leak test needs hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lively does more than play video.&lt;/strong&gt; This only compares video playback.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;

&lt;p&gt;The raw per-second data for both engines is on GitHub: [link to benchmark folder]. If you run the same test on different hardware, I'd really like to see your numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;EWRE is free on the &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;Microsoft Store&lt;/a&gt;. Feedback and bug reports are welcome on &lt;a href="https://github.com/StayElite" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What would you want measured next: GPU usage, battery drain, or a long-session leak test? 👇&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>performance</category>
      <category>programming</category>
      <category>software</category>
    </item>
    <item>
      <title>Show DEV: EWRE, a Lightweight Live Wallpaper Engine for Windows</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Sat, 07 Nov 2026 19:44:49 +0000</pubDate>
      <link>https://dev.to/codenamew/show-dev-ewre-a-lightweight-live-wallpaper-engine-for-windows-4kpf</link>
      <guid>https://dev.to/codenamew/show-dev-ewre-a-lightweight-live-wallpaper-engine-for-windows-4kpf</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;EWRE (Elite Wallpaper Rendering Engine)&lt;/strong&gt; is a free live video wallpaper engine for Windows 10 and 11. It plays a video behind your desktop icons and tries to cost as little as possible while doing it.&lt;/p&gt;

&lt;p&gt;📥 &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;Get it on the Microsoft Store&lt;/a&gt;&lt;br&gt;
💻 &lt;a href="https://github.com/StayElite" rel="noopener noreferrer"&gt;GitHub: StayElite&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;[Write 2 to 4 sentences here. What annoyed you about existing live wallpaper apps? A real reason, like "my laptop fan spun up" or "my game stuttered", is more convincing than anything generic.]&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPU-accelerated rendering&lt;/strong&gt; through Direct3D 11&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware decoding&lt;/strong&gt; via Media Foundation (NV12 and RGB32)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;60+ FPS playback&lt;/strong&gt; with no screen tearing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-monitor support&lt;/strong&gt;: a separate wallpaper per display, or one spanning all of them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart pause&lt;/strong&gt;: rendering suspends when a fullscreen game launches, when the laptop is on battery, when the PC is locked, or when displays power down&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formats&lt;/strong&gt;: MP4, MKV, WebM, MOV, AVI and more&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The design principle
&lt;/h2&gt;

&lt;p&gt;Everything in EWRE follows one rule: &lt;strong&gt;the cheapest frame is the one you never render.&lt;/strong&gt; A wallpaper is background decoration, so it should yield to whatever you're actually doing. That's why the pause conditions matter as much as the rendering pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was hard
&lt;/h2&gt;

&lt;p&gt;[Share one or two real challenges. Ideas: attaching to the desktop layer, handling multiple monitors with different resolutions, behavior across Windows versions, keeping memory stable over long sessions. Pick what's true for you.]&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;[If you have numbers, put them here: CPU and GPU usage while playing a 1080p or 4K clip, memory use, and battery impact. Even a single screenshot of Task Manager helps. If you don't have measurements yet, delete this section rather than guessing.]&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd like feedback on
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Does it behave well on your hardware? Tell me your GPU and Windows version if something breaks.&lt;/li&gt;
&lt;li&gt;Which features are missing for your setup?&lt;/li&gt;
&lt;li&gt;Are there video formats or codecs that give you trouble?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;[List 2 or 3 planned features, only the ones you actually intend to build.]&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;EWRE is free: &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;Microsoft Store&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you try it, I'd like to hear how it goes in the comments. Bug reports and ideas are welcome on &lt;a href="https://github.com/StayElite" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. 👇&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How Does a Live Wallpaper Draw Behind Your Desktop Icons on Windows?</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Sat, 07 Nov 2026 19:42:56 +0000</pubDate>
      <link>https://dev.to/codenamew/how-does-a-live-wallpaper-draw-behind-your-desktop-icons-on-windows-1193</link>
      <guid>https://dev.to/codenamew/how-does-a-live-wallpaper-draw-behind-your-desktop-icons-on-windows-1193</guid>
      <description>&lt;p&gt;Live wallpaper apps like &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;EWRE&lt;/a&gt; play a video &lt;em&gt;behind&lt;/em&gt; your desktop icons, but in front of the static wallpaper. Windows has no public API for that. So how is it done?&lt;/p&gt;

&lt;p&gt;This post explains the well-known technique that wallpaper engines use. It relies on undocumented shell behavior, so treat it as a field guide rather than a contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  The desktop is made of windows
&lt;/h2&gt;

&lt;p&gt;Your desktop is a stack of ordinary windows owned by Explorer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Progman&lt;/strong&gt;: the Program Manager window, the root of the desktop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SHELLDLL_DefView&lt;/strong&gt;: the window that draws your icons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WorkerW&lt;/strong&gt;: a helper window. The static wallpaper is painted into one of these.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to place your own window &lt;em&gt;behind&lt;/em&gt; the icons (&lt;code&gt;SHELLDLL_DefView&lt;/code&gt;) and &lt;em&gt;in front of&lt;/em&gt; the static wallpaper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Ask Progman to create a WorkerW
&lt;/h2&gt;

&lt;p&gt;Sending Progman an undocumented message, &lt;code&gt;0x052C&lt;/code&gt;, makes it spawn a &lt;code&gt;WorkerW&lt;/code&gt; window sitting behind the icon layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;HWND&lt;/span&gt; &lt;span class="n"&gt;progman&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FindWindowW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;L"Progman"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;SendMessageTimeoutW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;progman&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x052C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SMTO_NORMAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Find the right WorkerW
&lt;/h2&gt;

&lt;p&gt;After that message, there are several &lt;code&gt;WorkerW&lt;/code&gt; windows. The one you want is the sibling that comes &lt;em&gt;after&lt;/em&gt; the &lt;code&gt;WorkerW&lt;/code&gt; that contains &lt;code&gt;SHELLDLL_DefView&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;HWND&lt;/span&gt; &lt;span class="n"&gt;g_workerw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;CALLBACK&lt;/span&gt; &lt;span class="nf"&gt;EnumProc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HWND&lt;/span&gt; &lt;span class="n"&gt;hwnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LPARAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;HWND&lt;/span&gt; &lt;span class="n"&gt;defView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FindWindowExW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hwnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;L"SHELLDLL_DefView"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;g_workerw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FindWindowExW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hwnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;L"WorkerW"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&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;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;HWND&lt;/span&gt; &lt;span class="nf"&gt;GetWallpaperHost&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;HWND&lt;/span&gt; &lt;span class="n"&gt;progman&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FindWindowW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;L"Progman"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;SendMessageTimeoutW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;progman&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x052C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SMTO_NORMAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;EnumWindows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EnumProc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&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;g_workerw&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;
  
  
  Step 3: Parent your window to it
&lt;/h2&gt;

&lt;p&gt;Once you have the handle, make your rendering window a child of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;HWND&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetWallpaperHost&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;SetParent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myWindow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Resize myWindow to cover the monitor&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your Direct3D swap chain, or any renderer, now draws into a window that sits between the icons and the static wallpaper. A video player on top of this is a live wallpaper.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the renderer does next
&lt;/h2&gt;

&lt;p&gt;The window trick only places the surface. The actual playback is a separate problem. EWRE, for example, uses Direct3D 11 rendering with Media Foundation and hardware decoding, and supports multi-monitor setups either with independent wallpapers or spanning. See my other post on why that pipeline keeps overhead low.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows versions differ.&lt;/strong&gt; The shell's window hierarchy has changed over time, and newer Windows 11 builds behave differently from older ones (for example, where the &lt;code&gt;WorkerW&lt;/code&gt; ends up in the tree). Test on every version you support instead of trusting one snippet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explorer restarts.&lt;/strong&gt; If Explorer crashes or restarts, the host window disappears. A robust engine watches for that and re-attaches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple monitors and DPI.&lt;/strong&gt; Size your window using the virtual desktop bounds, and handle per-monitor DPI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undocumented behavior.&lt;/strong&gt; Microsoft can change this at any time. Keep the code isolated so it's easy to patch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be a good citizen.&lt;/strong&gt; Pause rendering when the desktop isn't visible, such as a fullscreen game, a locked PC, or displays off. EWRE does exactly this, plus pausing on battery power.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap up
&lt;/h2&gt;

&lt;p&gt;A live wallpaper is just a window with a clever parent. The hard parts are everything around it: decoding efficiently, handling monitors, and knowing when to stop drawing.&lt;/p&gt;

&lt;p&gt;If you want to see the result, EWRE is free on the &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;Microsoft Store&lt;/a&gt;. Developer: &lt;a href="https://github.com/StayElite" rel="noopener noreferrer"&gt;github.com/StayElite&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have you worked with the Progman/WorkerW approach? Share your experience in the comments. 👇&lt;/p&gt;

</description>
      <category>programming</category>
      <category>software</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Prepare Your Own Video Wallpaper with FFmpeg (and Run It with EWRE on Windows)</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Sat, 07 Nov 2026 19:41:33 +0000</pubDate>
      <link>https://dev.to/codenamew/prepare-your-own-video-wallpaper-with-ffmpeg-and-run-it-with-ewre-on-windows-3lha</link>
      <guid>https://dev.to/codenamew/prepare-your-own-video-wallpaper-with-ffmpeg-and-run-it-with-ewre-on-windows-3lha</guid>
      <description>&lt;p&gt;Live wallpaper engines can play most video files as they are. But a raw 4K movie clip with a stereo audio track is not the ideal wallpaper. It's bigger than it needs to be, it may stutter on weaker hardware, and it probably doesn't loop cleanly.&lt;/p&gt;

&lt;p&gt;A few FFmpeg commands fix all of that. In this post I'll prepare a clip for use with &lt;strong&gt;&lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;EWRE&lt;/a&gt;&lt;/strong&gt;, a free live wallpaper engine for Windows 10 and 11 that plays MP4, MKV, WebM, MOV, AVI and more.&lt;/p&gt;

&lt;p&gt;You don't need to convert anything for EWRE to work. This is optional tuning for smaller files and a cleaner result.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes a good wallpaper clip
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short.&lt;/strong&gt; 5 to 20 seconds is plenty for a loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No audio.&lt;/strong&gt; A wallpaper doesn't need a sound track.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right resolution.&lt;/strong&gt; Match your monitor, not more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compatible pixel format.&lt;/strong&gt; 8-bit 4:2:0 is the safest choice for hardware decoders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loop-friendly.&lt;/strong&gt; The end should lead back to the start without a jarring jump.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Trim the clip
&lt;/h2&gt;

&lt;p&gt;Cut a 10-second section starting at 5 seconds:&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;-ss&lt;/span&gt; 00:00:05 &lt;span class="nt"&gt;-i&lt;/span&gt; input.mp4 &lt;span class="nt"&gt;-t&lt;/span&gt; 10 &lt;span class="nt"&gt;-c&lt;/span&gt; copy trimmed.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-c copy&lt;/code&gt; is instant because it doesn't re-encode, but it cuts at keyframes, so the start can be slightly off. If you need exact cuts, drop &lt;code&gt;-c copy&lt;/code&gt; and let the next step re-encode.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Resize, remove audio, and set a compatible format
&lt;/h2&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; trimmed.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale=1920:-2"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 20 &lt;span class="nt"&gt;-preset&lt;/span&gt; slow &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-an&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart &lt;span class="se"&gt;\&lt;/span&gt;
  wallpaper.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What each part does:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scale=1920:-2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Resize to 1920 wide, keep the aspect ratio, keep height even&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-c:v libx264&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Encode with H.264, which hardware decoders handle widely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-crf 20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Quality level. Lower is better quality and a bigger file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-preset slow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Better compression for the same quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-pix_fmt yuv420p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8-bit 4:2:0, the most compatible format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-an&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Strip the audio track&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-movflags +faststart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Moves metadata to the front of the file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a 1440p or 4K monitor, change &lt;code&gt;1920&lt;/code&gt; to &lt;code&gt;2560&lt;/code&gt; or &lt;code&gt;3840&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Reduce the frame rate if you want a lighter file
&lt;/h2&gt;

&lt;p&gt;If the source is 60 FPS and you'd rather save space and decoding work:&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; wallpaper.mp4 &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"fps=30"&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 20 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-an&lt;/span&gt; wallpaper_30fps.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't use &lt;code&gt;fps=60&lt;/code&gt; on a 30 FPS source. It only duplicates frames and makes the file bigger without making it smoother.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Make a loop-friendly clip
&lt;/h2&gt;

&lt;p&gt;If the end of your clip doesn't match the start, the loop point will show. A simple trick is a "boomerang": play the clip forward, then backward.&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; wallpaper.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-filter_complex&lt;/span&gt; &lt;span class="s2"&gt;"[0:v]reverse[r];[0:v][r]concat=n=2:v=1:a=0"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 20 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="se"&gt;\&lt;/span&gt;
  boomerang.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;reverse&lt;/code&gt; filter loads the whole clip into memory, so keep the input short (a few seconds). It works best for slow, ambient footage like clouds, water, or particles. It looks odd with anything that has obvious direction, like text or walking people.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Check the result
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffprobe &lt;span class="nt"&gt;-v&lt;/span&gt; error &lt;span class="nt"&gt;-show_entries&lt;/span&gt; &lt;span class="nv"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;codec_name,width,height,r_frame_rate,pix_fmt &lt;span class="nt"&gt;-of&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;nw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 wallpaper.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;code&gt;h264&lt;/code&gt;, your target resolution, the frame rate you chose, and &lt;code&gt;yuv420p&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Set it as your wallpaper
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install EWRE from the &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;Microsoft Store&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Select your processed file.&lt;/li&gt;
&lt;li&gt;Assign it to one monitor, or span it across all of them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;EWRE pauses automatically when a fullscreen game launches, when you're on battery, when the PC is locked, or when displays power down, so a lean clip plus smart pausing keeps the overhead low.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batch tip
&lt;/h2&gt;

&lt;p&gt;To process a whole folder of clips from PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;mp4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;ffmpeg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FullName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-vf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"scale=1920:-2"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;libx264&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-crf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-pix_fmt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;yuv420p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-an&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wall_&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Wrap up
&lt;/h2&gt;

&lt;p&gt;Trim it, resize it, strip the audio, and make the loop clean. Five minutes of FFmpeg work gives you a smaller file and a better-looking desktop.&lt;/p&gt;

&lt;p&gt;Got a favorite FFmpeg one-liner for wallpapers? Drop it in the comments. 👇&lt;/p&gt;

&lt;p&gt;EWRE: &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;EWRE - Live Desktop Wallpaper&lt;/a&gt; · Developer: &lt;a href="https://github.com/StayElite" rel="noopener noreferrer"&gt;github.com/StayElite&lt;/a&gt;&lt;/p&gt;

</description>
      <category>performance</category>
      <category>tools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>5 Things to Check Before Installing a Live Wallpaper on Windows</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Sat, 07 Nov 2026 19:40:32 +0000</pubDate>
      <link>https://dev.to/codenamew/5-things-to-check-before-installing-a-live-wallpaper-on-windows-2g4j</link>
      <guid>https://dev.to/codenamew/5-things-to-check-before-installing-a-live-wallpaper-on-windows-2g4j</guid>
      <description>&lt;p&gt;An animated desktop looks great for the first ten minutes. After that, the questions start: why is my fan louder, why did my battery drop so fast, why is my game stuttering?&lt;/p&gt;

&lt;p&gt;Before you install any live wallpaper engine, run it through this checklist.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Does it pause when you game?
&lt;/h2&gt;

&lt;p&gt;This is the most important one. A wallpaper that keeps rendering behind a fullscreen game is drawing frames nobody can see and competing with the game for your GPU.&lt;/p&gt;

&lt;p&gt;Look for an engine that suspends rendering automatically when a fullscreen app launches. &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;EWRE&lt;/a&gt; does this, so you don't have to remember to turn the wallpaper off before a session.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What happens on battery?
&lt;/h2&gt;

&lt;p&gt;On a laptop, a looping video can quietly cost you battery life. A good engine should stop rendering when you unplug.&lt;/p&gt;

&lt;p&gt;EWRE pauses on battery power. It also pauses when the PC is locked or when the displays power down, which are other moments when nobody is looking at the desktop.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Does it use hardware decoding?
&lt;/h2&gt;

&lt;p&gt;Decoding video on the CPU is expensive. Decoding it on the GPU's dedicated video hardware is much cheaper.&lt;/p&gt;

&lt;p&gt;Check whether the engine mentions hardware decoding. EWRE uses Media Foundation with hardware decoding support (NV12 and RGB32) and renders through Direct3D 11, which is the kind of pipeline you want for smooth 60+ FPS playback without tearing.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. How does it handle multiple monitors?
&lt;/h2&gt;

&lt;p&gt;If you run more than one display, check two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can you set a &lt;strong&gt;different wallpaper on each monitor&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Can you &lt;strong&gt;span one wallpaper&lt;/strong&gt; across all of them?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EWRE supports both modes, so you can pick whichever suits your setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Will it play the videos you already have?
&lt;/h2&gt;

&lt;p&gt;Some engines make you convert files before you can use them. That's a pain if you've already downloaded a few favorites.&lt;/p&gt;

&lt;p&gt;EWRE plays MP4, MKV, WebM, MOV, AVI and more, so most files work as they are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick scorecard
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What to look for&lt;/th&gt;
&lt;th&gt;EWRE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pauses for games&lt;/td&gt;
&lt;td&gt;Auto-suspends on fullscreen&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Battery friendly&lt;/td&gt;
&lt;td&gt;Pauses on battery power&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware decoding&lt;/td&gt;
&lt;td&gt;GPU-accelerated&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-monitor&lt;/td&gt;
&lt;td&gt;Per-display or spanning&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format support&lt;/td&gt;
&lt;td&gt;MP4, MKV, WebM, MOV, AVI and more&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;EWRE is free on the Microsoft Store for Windows 10 and 11: &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;EWRE - Live Desktop Wallpaper&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What's on your desktop right now? Share your setup in the comments. 👇&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What Makes a Live Wallpaper Engine "Lightweight"? Direct3D 11, Hardware Decoding, and Knowing When to Stop</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Sat, 07 Nov 2026 19:39:18 +0000</pubDate>
      <link>https://dev.to/codenamew/what-makes-a-live-wallpaper-engine-lightweight-direct3d-11-hardware-decoding-and-knowing-when-k98</link>
      <guid>https://dev.to/codenamew/what-makes-a-live-wallpaper-engine-lightweight-direct3d-11-hardware-decoding-and-knowing-when-k98</guid>
      <description>&lt;p&gt;A live wallpaper is a video player that never gets a window of its own. It runs all day, behind everything else, and nobody is watching it most of the time. That makes it a good case study in resource discipline: the cheapest frame is the one you never render.&lt;/p&gt;

&lt;p&gt;Here's how a lightweight live wallpaper engine approaches the problem, using &lt;strong&gt;EWRE (Elite Wallpaper Rendering Engine)&lt;/strong&gt; as the example. EWRE is a free live video wallpaper engine for Windows 10 and 11, available on the &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;Microsoft Store&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 1: Let the GPU do the decoding
&lt;/h2&gt;

&lt;p&gt;Video decoding in software is expensive, and the cost scales with resolution and frame rate. A 4K, 60 FPS wallpaper decoded on the CPU would be noticeable in any task manager.&lt;/p&gt;

&lt;p&gt;EWRE uses &lt;strong&gt;Media Foundation&lt;/strong&gt; for decoding, with full &lt;strong&gt;hardware decoding&lt;/strong&gt; support. Modern GPUs have dedicated video decode blocks, so the work moves off the CPU entirely. EWRE handles two frame formats from the decoder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NV12&lt;/strong&gt;: the common planar YUV format that hardware decoders output natively&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RGB32&lt;/strong&gt;: a straightforward 32-bit RGB format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supporting the decoder's native output format matters because it avoids extra conversion passes before the frame reaches the screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 2: Keep the render path short
&lt;/h2&gt;

&lt;p&gt;Once a frame is decoded, it has to be drawn. EWRE renders through a &lt;strong&gt;Direct3D 11&lt;/strong&gt; pipeline with hardware acceleration. Decoded frames can stay on the GPU and go straight to the display, instead of being copied back and forth between system memory and video memory.&lt;/p&gt;

&lt;p&gt;The result, according to the listing, is smooth playback at 60+ FPS with no screen tearing, rendered directly behind your desktop icons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 3: The best optimization is to stop
&lt;/h2&gt;

&lt;p&gt;Fast decoding and a short render path only get you so far. A wallpaper that renders at full speed behind a fullscreen game is still wasting power on pixels nobody can see.&lt;/p&gt;

&lt;p&gt;EWRE's biggest efficiency win is a set of conditions where it suspends rendering:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Why pausing makes sense&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fullscreen game launches&lt;/td&gt;
&lt;td&gt;The wallpaper is completely covered, and the game needs the GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running on battery&lt;/td&gt;
&lt;td&gt;Saves power when it matters most&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC locked&lt;/td&gt;
&lt;td&gt;Nobody is looking at the desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Displays power down&lt;/td&gt;
&lt;td&gt;There's nothing to draw on&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is the same principle as pausing a browser tab's animations when the tab is hidden. If the output isn't visible, don't produce it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-monitor as a design constraint
&lt;/h2&gt;

&lt;p&gt;Multiple displays complicate a wallpaper engine. Each monitor can have a different resolution and refresh rate, and a single video might need to be spread across all of them. EWRE supports both modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Independent wallpapers&lt;/strong&gt; on each connected display&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spanning&lt;/strong&gt; one wallpaper across the whole setup&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Format support
&lt;/h2&gt;

&lt;p&gt;The engine plays &lt;strong&gt;MP4, MKV, WebM, MOV, AVI&lt;/strong&gt; and more. Using the system's media stack means you can use video files you already have without converting them first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways for your own projects
&lt;/h2&gt;

&lt;p&gt;If you're building anything that runs continuously in the background, three rules apply:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use the hardware that exists.&lt;/strong&gt; Dedicated decode blocks beat software decoding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep data where it is.&lt;/strong&gt; Avoid copying frames between CPU and GPU memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detect when your output is invisible and stop.&lt;/strong&gt; This is often the largest saving of the three.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;EWRE is free on the Microsoft Store: &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;EWRE - Live Desktop Wallpaper&lt;/a&gt;. The developer is on GitHub at &lt;a href="https://github.com/StayElite" rel="noopener noreferrer"&gt;github.com/StayElite&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you've built something similar, or have opinions on the best way to keep a background renderer cheap, I'd like to hear about it in the comments.&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>performance</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>I Got Tired of Heavy Live Wallpaper Apps, So Here's a Lightweight One Built on Direct3D 11</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Sat, 07 Nov 2026 19:37:39 +0000</pubDate>
      <link>https://dev.to/codenamew/i-got-tired-of-heavy-live-wallpaper-apps-so-heres-a-lightweight-one-built-on-direct3d-11-2cf4</link>
      <guid>https://dev.to/codenamew/i-got-tired-of-heavy-live-wallpaper-apps-so-heres-a-lightweight-one-built-on-direct3d-11-2cf4</guid>
      <description>&lt;p&gt;Live wallpapers look great, but most engines eat CPU and GPU and drain your laptop battery while you're trying to work or game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EWRE (Elite Wallpaper Rendering Engine)&lt;/strong&gt; is a lightweight live video wallpaper engine built natively for Windows 10 and 11. It's free on the Microsoft Store.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;EWRE plays a video file as your desktop background, rendered behind your icons. That's the whole idea, and it's built to do it with minimal overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the hood
&lt;/h2&gt;

&lt;p&gt;The rendering pipeline is built on two Windows-native pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct3D 11&lt;/strong&gt; handles the rendering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Media Foundation&lt;/strong&gt; decodes the video, with full hardware decoding support for &lt;strong&gt;NV12 and RGB32&lt;/strong&gt; frame formats.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Decoding on the GPU instead of the CPU keeps playback smooth at 60+ FPS without screen tearing, and leaves your processor free for real work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Multi-monitor support
&lt;/h3&gt;

&lt;p&gt;Set a different wallpaper on each display, or span a single video across your whole setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smart pause
&lt;/h3&gt;

&lt;p&gt;The engine suspends rendering when it would only waste resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You launch a fullscreen game&lt;/li&gt;
&lt;li&gt;Your laptop is running on battery&lt;/li&gt;
&lt;li&gt;The PC is locked&lt;/li&gt;
&lt;li&gt;The displays power down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you game, this is the feature that matters. The wallpaper doesn't compete with your frame rate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wide format support
&lt;/h3&gt;

&lt;p&gt;MP4, MKV, WebM, MOV, AVI and more. Use whatever video you already have, with no conversion step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it's for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Casual users&lt;/strong&gt; who want a more alive desktop without slowing the machine down&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gamers&lt;/strong&gt; who want the wallpaper to get out of the way automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Laptop users&lt;/strong&gt; who care about battery life&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-monitor setups&lt;/strong&gt; that deserve more than one stretched image&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Install it from the Microsoft Store:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://apps.microsoft.com/detail/9p6vf1b6gr29" rel="noopener noreferrer"&gt;EWRE - Live Desktop Wallpaper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The developer is on GitHub: &lt;a href="https://github.com/StayElite" rel="noopener noreferrer"&gt;github.com/StayElite&lt;/a&gt;. Feedback and bug reports are welcome in the comments below.&lt;/p&gt;

&lt;p&gt;What's your go-to live wallpaper setup? Let me know. 👇&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>A Local-First VS Code Extension: No Git, No Telemetry, No Network, and It Works in Codespaces</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Fri, 30 Oct 2026 06:23:24 +0000</pubDate>
      <link>https://dev.to/codenamew/a-local-first-vs-code-extension-no-git-no-telemetry-no-network-and-it-works-in-codespaces-4g9c</link>
      <guid>https://dev.to/codenamew/a-local-first-vs-code-extension-no-git-no-telemetry-no-network-and-it-works-in-codespaces-4g9c</guid>
      <description>&lt;p&gt;| SavePoint Diff runs entirely inside the extension host, so it works across local, SSH, WSL, containers, Codespaces, and vscode.dev.&lt;/p&gt;

&lt;p&gt;Plenty of dev tools want an account, a network call, or a telemetry opt-out. I wanted the opposite for &lt;a href="https://marketplace.visualstudio.com/items?itemName=StayElite.StayElite-Savepoint-Diff" rel="noopener noreferrer"&gt;SavePoint Diff&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "100% local" means here
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Everything runs inside the VS Code &lt;strong&gt;extension host&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Git&lt;/strong&gt; required&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No telemetry&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No network requests&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No external services&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The baseline is held &lt;strong&gt;in memory&lt;/strong&gt; for the current window session and never touches disk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only requirement is VS Code 1.60.0 or later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Works where you work
&lt;/h2&gt;

&lt;p&gt;Because there are no external dependencies, it behaves the same across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local folders&lt;/li&gt;
&lt;li&gt;Remote-SSH&lt;/li&gt;
&lt;li&gt;WSL&lt;/li&gt;
&lt;li&gt;Dev Containers&lt;/li&gt;
&lt;li&gt;GitHub Codespaces&lt;/li&gt;
&lt;li&gt;Virtual filesystems like vscode.dev and github.dev&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Make it yours
&lt;/h2&gt;

&lt;p&gt;Everything is toggleable in settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"savepointDiff.showAdded"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"savepointDiff.showModified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"savepointDiff.showDeleted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"savepointDiff.showOverviewRuler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"savepointDiff.showBackgroundHighlight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"savepointDiff.enableRevertInHover"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefer a subtle gutter only? Leave highlighting off. Want changed lines tinted too? Set &lt;code&gt;showBackgroundHighlight&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;. There's also a one-click status bar toggle (&lt;code&gt;SavePoint: ON&lt;/code&gt; / &lt;code&gt;OFF&lt;/code&gt;) if you want it out of the way temporarily.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good to know
&lt;/h2&gt;

&lt;p&gt;In Git repositories, VS Code's own editor-gutter "quick diff" colors are typically driven by Git's provider. SavePoint Diff's panel entry, badges, and diff view work independently alongside it, in Git and non-Git folders alike.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ext install StayElite.StayElite-Savepoint-Diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/StayElite/SavePoint-Diff" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · MIT licensed · feedback and issues welcome.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>privacy</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>How a Live Unsaved-Changes Diff Works in a VS Code Extension</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Fri, 30 Oct 2026 06:22:28 +0000</pubDate>
      <link>https://dev.to/codenamew/how-a-live-unsaved-changes-diff-works-in-a-vs-code-extension-2ljp</link>
      <guid>https://dev.to/codenamew/how-a-live-unsaved-changes-diff-works-in-a-vs-code-extension-2ljp</guid>
      <description>&lt;p&gt;| Baselines, Myers line diffs, debouncing, undo/redo, and the edge cases behind SavePoint Diff's gutter markers.&lt;/p&gt;

&lt;p&gt;I recently shipped &lt;a href="https://github.com/StayElite/SavePoint-Diff" rel="noopener noreferrer"&gt;SavePoint Diff&lt;/a&gt;, a VS Code extension that shows gutter markers for unsaved changes. Here's the design, in case you're thinking about building something similar.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea: a baseline
&lt;/h2&gt;

&lt;p&gt;Everything revolves around one string per file, the &lt;strong&gt;baseline&lt;/strong&gt;, meaning the last saved content.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;File opens:&lt;/strong&gt; capture its content as the baseline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit:&lt;/strong&gt; diff baseline against the current buffer, then render the result as gutter decorations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save:&lt;/strong&gt; the baseline becomes the new content, and the markers clear.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The diff itself uses a small, well-established &lt;strong&gt;Myers line-diff&lt;/strong&gt; library rather than anything custom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debouncing
&lt;/h2&gt;

&lt;p&gt;Diffing on every keystroke is wasteful, so recalculation is delayed until typing pauses. The delay is configurable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"savepointDiff.debounceMs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Files above a size threshold skip live diffing entirely to protect performance (&lt;code&gt;savepointDiff.maxFileSize&lt;/code&gt;, default 2,000,000 bytes).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why undo/redo is free
&lt;/h2&gt;

&lt;p&gt;Instead of tracking edits incrementally, the diff is &lt;strong&gt;always recomputed from baseline vs. current text&lt;/strong&gt;. That means undo back to the saved state yields an empty diff, so markers vanish, and redo brings them back. There's no delta bookkeeping to corrupt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Edge cases that bit me
&lt;/h2&gt;

&lt;p&gt;The changelog lists a lot of these, but the interesting ones were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CRLF and lone CR line endings&lt;/strong&gt; need normalizing, or the diff lies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-change reverts:&lt;/strong&gt; applying several edits must go in descending order, or earlier edits shift the ranges of later ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revert File / external rewrites:&lt;/strong&gt; if the file stops being dirty without a save, its content now matches disk, so the baseline re-syncs automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invalid settings:&lt;/strong&gt; a bad &lt;code&gt;maxFileSize&lt;/code&gt; (zero, negative, non-numeric) used to be able to silently disable diffing. It now falls back to the default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale badges&lt;/strong&gt; on hidden tabs needed explicit handling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Savepoints are just a baseline move
&lt;/h2&gt;

&lt;p&gt;The manual savepoint feature falls out of the design. It moves the baseline to the current in-memory content without writing to disk. No new machinery needed.&lt;/p&gt;

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

&lt;p&gt;Recompute from two strings, resist clever incremental state, and spend your effort on the edge cases. The code is MIT licensed if you want to read it or contribute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/StayElite/SavePoint-Diff" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://marketplace.visualstudio.com/items?itemName=StayElite.StayElite-Savepoint-Diff" rel="noopener noreferrer"&gt;Marketplace&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Local File History for VS Code: Git-Style Snapshots Without Git</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Fri, 30 Oct 2026 06:21:08 +0000</pubDate>
      <link>https://dev.to/codenamew/local-file-history-for-vs-code-git-style-snapshots-without-git-3o7c</link>
      <guid>https://dev.to/codenamew/local-file-history-for-vs-code-git-style-snapshots-without-git-3o7c</guid>
      <description>&lt;p&gt;| Named checkpoints, automatic snapshots on save, split-diff comparison, and one-click restore, per file, entirely local.&lt;/p&gt;

&lt;p&gt;Sometimes you don't need a repo. You need a quick way to say &lt;em&gt;"take me back to how this file looked an hour ago."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/StayElite/SavePoint-Diff" rel="noopener noreferrer"&gt;SavePoint Diff&lt;/a&gt; includes snapshot history for exactly that.&lt;/p&gt;

&lt;h2&gt;
  
  
  How snapshots work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Manual checkpoints:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SavePoint Diff: Save Snapshot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Automatic snapshots:&lt;/strong&gt; by default, a snapshot is captured every time you save a file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browse and restore:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SavePoint Diff: View &amp;amp; Restore Snapshot...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens the timeline for the active file. Pick any snapshot and you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open a &lt;strong&gt;split diff&lt;/strong&gt; of that snapshot against your current buffer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;revert the entire file&lt;/strong&gt; to it with one click&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tuning it
&lt;/h2&gt;

&lt;p&gt;Add these to &lt;code&gt;settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"savepointDiff.snapshots.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"savepointDiff.snapshots.maxSnapshots"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"savepointDiff.snapshots.autoSnapshotOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The defaults keep up to 10 snapshots per file, so history stays small. Raise the number if you want a longer timeline, or turn off auto-snapshots and only create named ones when it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this is handy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Experimenting in a scratch folder with no version control&lt;/li&gt;
&lt;li&gt;Editing config files you'd rather not commit&lt;/li&gt;
&lt;li&gt;Hand-tweaking generated code&lt;/li&gt;
&lt;li&gt;Working in a repo but wanting finer-grained undo than commits give you&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Keep expectations realistic
&lt;/h2&gt;

&lt;p&gt;This is per-file local history, not a replacement for Git. There's no branching, merging, or remote. It's a lightweight safety net for the moments Git doesn't cover.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=StayElite.StayElite-Savepoint-Diff" rel="noopener noreferrer"&gt;Marketplace&lt;/a&gt; · &lt;a href="https://github.com/StayElite/SavePoint-Diff" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
      <category>versioncontrol</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Make a Savepoint Before Your Risky Refactor (Without Saving to Disk)</title>
      <dc:creator>John Wick</dc:creator>
      <pubDate>Fri, 30 Oct 2026 06:20:05 +0000</pubDate>
      <link>https://dev.to/codenamew/make-a-savepoint-before-your-risky-refactor-without-saving-to-disk-9b</link>
      <guid>https://dev.to/codenamew/make-a-savepoint-before-your-risky-refactor-without-saving-to-disk-9b</guid>
      <description>&lt;p&gt;| How SavePoint Diff's manual savepoints let you diff against "five minutes ago" instead of "my last Ctrl+S".&lt;/p&gt;

&lt;p&gt;You're about to do something scary to a file. Rename a core function, restructure a module, rewrite a hot loop.&lt;/p&gt;

&lt;p&gt;You don't want to save yet, because the half-finished state might trip a file watcher, a hot-reloader, or a formatter-on-save. But you also don't want to lose your current good-ish state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manual savepoints
&lt;/h2&gt;

&lt;p&gt;SavePoint Diff has a command for exactly this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SavePoint Diff: Create Savepoint (Don't Save to Disk)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It snapshots the active file's &lt;strong&gt;current in-memory content&lt;/strong&gt; as the new diff baseline. Nothing is written to disk. From that moment, the gutter markers and diff view show what you've changed &lt;strong&gt;since the savepoint&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Your file is in a decent state, unsaved.&lt;/li&gt;
&lt;li&gt;Run &lt;strong&gt;Create Savepoint&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Start the risky refactor and watch the gutter track every change since the savepoint.&lt;/li&gt;
&lt;li&gt;Open the split diff to review, or hover a marker and click &lt;strong&gt;↺ Revert this change&lt;/strong&gt; to undo one block.&lt;/li&gt;
&lt;li&gt;When you're happy, save normally. The baseline moves again.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  One thing to know
&lt;/h2&gt;

&lt;p&gt;After a savepoint, SavePoint Diff's surfaces (panel entry, "M" badge, status bar count) show "no differences", because the baseline now matches your buffer. But your file still has unsaved edits on disk terms.&lt;/p&gt;

&lt;p&gt;So once you've used a savepoint, trust the editor tab's own ● dirty dot to tell you whether you still need to press &lt;code&gt;Ctrl+S&lt;/code&gt;. This is documented in the README's known limitations, and it's worth knowing so it doesn't surprise you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want durable checkpoints instead?
&lt;/h2&gt;

&lt;p&gt;There's a second feature for that: named snapshots you can restore later. I cover it in the next post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=StayElite.StayElite-Savepoint-Diff" rel="noopener noreferrer"&gt;Install SavePoint Diff&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>refactorit</category>
    </item>
  </channel>
</rss>
