<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>Devpit Docs | Devpit blog</title><description>Guides for Devpit, the free Windows terminal app that frees disk space, fixes stuck ports and updates your developer tools.</description><link>https://devpit.zubyr.dev</link><language>en</language><fh:complete/><atom:link rel="self" href="https://devpit.zubyr.dev/docs/blog/rss.xml"/><item><title>Connect two PCs with an Ethernet cable to copy files</title><link>https://devpit.zubyr.dev/docs/blog/direct-ethernet-cable-between-two-pcs</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/direct-ethernet-cable-between-two-pcs</guid><description>One cable between two PCs gives you a private, steady link for a big copy. Here is how to set the addresses and share files over it.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A single Ethernet cable between two PCs makes a tiny private network. No router, no Wi-Fi, no internet. It is a good way to move a big folder, because a cable does not drop or roam like Wi-Fi.&lt;/p&gt;
&lt;p&gt;This guide shows the whole setup on Windows 11: the cable, the addresses, the network type, and the copy.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-you-need&quot;&gt;What you need&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;An Ethernet port on each PC, or a USB to Ethernet adapter.&lt;/li&gt;
&lt;li&gt;One Ethernet cable long enough to reach.&lt;/li&gt;
&lt;li&gt;Administrator rights on both PCs, to change network settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;which-cable&quot;&gt;Which cable?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Try a normal Ethernet cable first. In the past, two PCs needed a special “crossover” cable. The Ethernet standard for gigabit copper links describes &lt;strong&gt;auto-crossover&lt;/strong&gt; (IEEE 802.3, clause 40.4.4): a port that has it works out the wiring by itself, which removes the need for a crossover cable between devices of the same kind. If the link light stays off with a normal cable, the cards may not have it, and a crossover cable is the fix.&lt;/p&gt;
&lt;p&gt;For gigabit speed, the IEEE 1000BASE-T standard runs over Category 5 copper cabling.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-1-plug-in-and-check-the-link&quot;&gt;Step 1: plug in and check the link&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Connect the cable to both PCs.&lt;/li&gt;
&lt;li&gt;On each PC, open PowerShell and run:&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Get-NetAdapter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Find your Ethernet adapter. &lt;strong&gt;Status&lt;/strong&gt; should say &lt;code dir=&quot;auto&quot;&gt;Up&lt;/code&gt;, and &lt;strong&gt;LinkSpeed&lt;/strong&gt; shows the speed both ports agreed on, for example &lt;code dir=&quot;auto&quot;&gt;1 Gbps&lt;/code&gt;. If it says &lt;code dir=&quot;auto&quot;&gt;100 Mbps&lt;/code&gt; on gigabit hardware, try another cable.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-2-give-each-pc-an-address&quot;&gt;Step 2: give each PC an address&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;With no router, nothing hands out addresses. You have two choices.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;option-a-let-windows-pick-169254-addresses&quot;&gt;Option A: let Windows pick (169.254 addresses)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Microsoft calls this Automatic Private IP Addressing. When no DHCP server answers, Windows gives itself an address between &lt;code dir=&quot;auto&quot;&gt;169.254.0.0&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;169.254.255.255&lt;/code&gt;, and it can talk to other PCs on the same cable that did the same. Wait a minute after plugging in, then run &lt;code dir=&quot;auto&quot;&gt;ipconfig&lt;/code&gt; on each PC and note the &lt;strong&gt;IPv4 Address&lt;/strong&gt; of the Ethernet adapter.&lt;/p&gt;
&lt;p&gt;It works, but the addresses are random and long. Option B is easier.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;option-b-set-fixed-addresses-recommended&quot;&gt;Option B: set fixed addresses (recommended)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Pick a small network that is &lt;strong&gt;not&lt;/strong&gt; the same as your Wi-Fi’s. If your Wi-Fi uses &lt;code dir=&quot;auto&quot;&gt;192.168.1.x&lt;/code&gt;, use &lt;code dir=&quot;auto&quot;&gt;192.168.50.x&lt;/code&gt; for the cable.&lt;/p&gt;
&lt;p&gt;On &lt;strong&gt;PC A&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Network &amp;#x26; internet&lt;/strong&gt;, &lt;strong&gt;Ethernet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Next to &lt;strong&gt;IP assignment&lt;/strong&gt;, click &lt;strong&gt;Edit&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Manual&lt;/strong&gt; and turn on &lt;strong&gt;IPv4&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP address&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;192.168.50.1&lt;/code&gt;. &lt;strong&gt;Subnet mask&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;255.255.255.0&lt;/code&gt;. Leave &lt;strong&gt;Gateway&lt;/strong&gt; and &lt;strong&gt;DNS&lt;/strong&gt; empty.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On &lt;strong&gt;PC B&lt;/strong&gt;, do the same with &lt;strong&gt;IP address&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;192.168.50.2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The gateway stays empty on purpose. The cable is only for these two PCs, so internet traffic keeps using Wi-Fi.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-3-set-the-cable-network-to-private&quot;&gt;Step 3: set the cable network to Private&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Windows may see the cable link as a new, unknown network and treat it as &lt;strong&gt;Public&lt;/strong&gt;, which blocks file sharing. Check in PowerShell:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Get-NetConnectionProfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If the Ethernet entry shows &lt;code dir=&quot;auto&quot;&gt;NetworkCategory : Public&lt;/code&gt;, set it to Private in PowerShell as administrator (use the &lt;strong&gt;InterfaceAlias&lt;/strong&gt; that the command showed, often &lt;code dir=&quot;auto&quot;&gt;Ethernet&lt;/code&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Set-NetConnectionProfile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;InterfaceAlias &lt;/span&gt;&lt;span&gt;&quot;Ethernet&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;NetworkCategory Private&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can also try &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Network &amp;#x26; internet&lt;/strong&gt;, &lt;strong&gt;Ethernet&lt;/strong&gt;, &lt;strong&gt;Network profile type&lt;/strong&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-4-test-the-connection&quot;&gt;Step 4: test the connection&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;From PC B, check that PC A answers on the file sharing port (445):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Test-NetConnection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;50.1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Port &lt;/span&gt;&lt;span&gt;445&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;TcpTestSucceeded : True&lt;/code&gt; means it is ready. If it is &lt;code dir=&quot;auto&quot;&gt;False&lt;/code&gt;, file sharing is not turned on yet on PC A (next step), or a firewall blocks it. A plain &lt;code dir=&quot;auto&quot;&gt;ping&lt;/code&gt; may also fail if the firewall blocks ping, so the port test is the better check.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-5-share-and-copy&quot;&gt;Step 5: share and copy&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Now the two PCs are on their own network. Use any file sharing method with the cable addresses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With a shared folder (built in):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On PC A, share the folder with a real account and Read permission. The full steps are in &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/share-a-folder-on-windows-11&quot;&gt;share a folder on Windows 11&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;On PC B, copy with robocopy so a stop can be resumed:&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;robocopy \\192.168.50.1\Games D:\Games /E /Z /R:5 /W:10 /LOG:C:\copy.log /TEE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;With Devpit Share Files:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/features/share-files&quot;&gt;Share Files&lt;/a&gt; asks which network connection to share on when a PC has more than one. Pick the Ethernet one, and the card shows the cable address, such as &lt;code dir=&quot;auto&quot;&gt;192.168.50.1&lt;/code&gt;. Type that address on the other PC. Devpit handles the firewall rule, a temporary login, the read-only share, progress, retry and resume.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-6-undo-when-you-are-done&quot;&gt;Step 6: undo when you are done&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Stop sharing on PC A (or stop sharing in Devpit, which removes what it set up).&lt;/li&gt;
&lt;li&gt;On both PCs, open &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Network &amp;#x26; internet&lt;/strong&gt;, &lt;strong&gt;Ethernet&lt;/strong&gt;, &lt;strong&gt;IP assignment&lt;/strong&gt;, &lt;strong&gt;Edit&lt;/strong&gt;, and set it back to &lt;strong&gt;Automatic (DHCP)&lt;/strong&gt;. This matters if you later plug the PC into a router.&lt;/li&gt;
&lt;li&gt;Unplug the cable.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h2 id=&quot;how-fast-is-it&quot;&gt;How fast is it?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A gigabit link is rated at 1,000 Mb/s, which is 125 MB/s at most (1,000 ÷ 8). So 100 GB can never take less than 800 seconds, about 13 minutes, over it. That is arithmetic, not a measurement. Your real copy is slower, depending mostly on the disks and the number of files. If both PCs have 2.5 Gb/s ports, the ceiling is 2.5 times higher. For the full picture, read &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/move-100gb-between-computers&quot;&gt;move 100 GB between PCs&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;if-it-does-not-work&quot;&gt;If it does not work&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No link light, or &lt;code dir=&quot;auto&quot;&gt;Get-NetAdapter&lt;/code&gt; says Disconnected&lt;/strong&gt;: try another cable, or a crossover cable if the cards lack auto-crossover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“The network path was not found”&lt;/strong&gt;: check the addresses, that the network is Private, and that file sharing is on. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/system-error-53-network-path-not-found&quot;&gt;system error 53&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Access is denied”&lt;/strong&gt;: a permissions problem. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/you-do-not-have-permission-to-access&quot;&gt;no permission to access&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iol.unh.edu/sites/default/files/knowledgebase/ethernet/Auto-Crossover_White_Paper.pdf&quot;&gt;UNH-IOL: Auto-Crossover white paper (IEEE 802.3 clause 40.4.4)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://standards.ieee.org/ieee/802.3ab/1086/&quot;&gt;IEEE 802.3ab: 1000BASE-T over Category 5 copper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://standards.ieee.org/ieee/802.3bz/6130/&quot;&gt;IEEE 802.3bz: 2.5 Gb/s and 5 Gb/s over twisted pair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/troubleshoot/how-to-use-automatic-tcpip-addressing-without-a-dh&quot;&gt;Microsoft: How to use automatic TCP/IP addressing without a DHCP server (APIPA, 169.254)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/windows/essential-network-settings-and-tasks-in-windows-f21a9bbc-c582-55cd-35e0-73431160a1b9&quot;&gt;Microsoft: Essential network settings and tasks in Windows (IP assignment, network profile)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/netadapter/get-netadapter&quot;&gt;Microsoft: Get-NetAdapter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/netconnection/get-netconnectionprofile&quot;&gt;Microsoft: Get-NetConnectionProfile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/netconnection/set-netconnectionprofile&quot;&gt;Microsoft: Set-NetConnectionProfile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/nettcpip/test-netconnection&quot;&gt;Microsoft: Test-NetConnection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/robocopy&quot;&gt;Microsoft: robocopy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>networking</category><category>file transfer</category><category>windows</category></item><item><title>Copy a huge folder between two PCs and resume with robocopy</title><link>https://devpit.zubyr.dev/docs/blog/copy-huge-folders-between-pcs-robocopy-resume</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/copy-huge-folders-between-pcs-robocopy-resume</guid><description>Robocopy over a shared folder can retry and resume. Here are the options that matter, and where Share Files fits in.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Moving a big folder, such as a game or a project archive, from one PC to another is a common job. Dragging it in File Explorer works until the Wi-Fi drops halfway. Then you do not know what was copied.&lt;/p&gt;
&lt;p&gt;Windows already has a better tool: &lt;code dir=&quot;auto&quot;&gt;robocopy&lt;/code&gt;. This post explains the options that matter, how to read the result, and what Devpit’s Share Files feature adds.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-idea&quot;&gt;The idea&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Two things are needed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;A shared folder&lt;/strong&gt; on the PC that has the files (the source).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A copy command&lt;/strong&gt; on the other PC that reads from that share and writes to a local folder.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Robocopy can copy from a network path such as &lt;code dir=&quot;auto&quot;&gt;\\192.168.1.20\share&lt;/code&gt; (a UNC path: two backslashes, the PC name or IP, the share name).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-1-share-the-folder&quot;&gt;Step 1: share the folder&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;On the PC that has the files, share the folder. In File Explorer, right-click it, choose &lt;strong&gt;Properties&lt;/strong&gt;, open the &lt;strong&gt;Sharing&lt;/strong&gt; tab, and choose &lt;strong&gt;Advanced Sharing&lt;/strong&gt;. Give it a share name.&lt;/p&gt;
&lt;p&gt;Then find that PC’s IP address (&lt;code dir=&quot;auto&quot;&gt;ipconfig&lt;/code&gt; shows it), or let Devpit’s Network Tools show it.&lt;/p&gt;
&lt;p&gt;The share also needs a Private network, file sharing turned on, and an account with a password and read access. The full steps are in &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/share-a-folder-on-windows-11&quot;&gt;share a folder on Windows 11 with another PC&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-2-check-size-and-free-space&quot;&gt;Step 2: check size and free space&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Know what you are copying. On the source PC, this PowerShell command adds up the size of all files in the folder:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$bytes &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Get-ChildItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;D:\Games\Big&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Recurse &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Force &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;File &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Measure-Object&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Property Length &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Sum&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.Sum&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;{0:N1} GB&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;$bytes &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;GB&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Check that the destination drive has more free space than that number. The time it will take is size divided by your real network speed. The network sets the speed limit, and a cable is usually faster than Wi-Fi. Test with a small folder first to learn your own speed. The arithmetic is in &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/move-100gb-between-computers&quot;&gt;move 100 GB between PCs&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-3-copy-with-robocopy&quot;&gt;Step 3: copy with robocopy&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;On the receiving PC, in Command Prompt or PowerShell:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;robocopy \\192.168.1.20\share D:\Copy /E /Z /R:5 /W:10 /LOG:C:\copy.log /TEE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;What each option means, from Microsoft’s documentation:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/E&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copy subfolders, including empty ones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restartable mode. If a file copy is interrupted, robocopy can pick up where it left off instead of copying the whole file again.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/R:5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retry a failed copy 5 times. The default is 1,000,000 retries.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/W:10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wait 10 seconds between retries. The default is 30.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/LOG:file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Write the status to a file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/TEE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Also show the status on the screen.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Two more you may want. &lt;code dir=&quot;auto&quot;&gt;/MT:n&lt;/code&gt; copies with n threads (1 to 128, default 8) and Microsoft says it is better used with a log file. &lt;code dir=&quot;auto&quot;&gt;/J&lt;/code&gt; uses unbuffered I/O, which Microsoft recommends for large files. Try them on your own network and compare, because only your own test shows what helps.&lt;/p&gt;
&lt;p&gt;Be careful with &lt;code dir=&quot;auto&quot;&gt;/MIR&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;/PURGE&lt;/code&gt;. They &lt;strong&gt;delete&lt;/strong&gt; files in the destination that are not in the source. For a plain copy, do not use them.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;resuming&quot;&gt;Resuming&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;If the copy stops, because of a network drop, a sleeping PC or a closed window, run the &lt;strong&gt;same command again&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Robocopy compares the source and the destination. Files that are already the same are skipped. Microsoft’s &lt;code dir=&quot;auto&quot;&gt;/IS&lt;/code&gt; option (“include the same files”) exists to force copying them, which tells you that same files are skipped by default. Files that were only partly copied are copied again, and with &lt;code dir=&quot;auto&quot;&gt;/Z&lt;/code&gt; an interrupted file can continue where it stopped. For one huge single file there is also BITS, which resumes by itself; see &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/resume-interrupted-file-copy-windows&quot;&gt;resume an interrupted file copy&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;reading-the-result&quot;&gt;Reading the result&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Robocopy’s exit code is not simple pass or fail. From 0 to 7 there was no failure. From 8 up there was at least one failure. 1 means files were copied, and that is a success. Read the full table on &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/robocopy-exit-codes&quot;&gt;robocopy exit codes&lt;/a&gt;. In PowerShell, &lt;code dir=&quot;auto&quot;&gt;$LASTEXITCODE&lt;/code&gt; holds the code right after the command ends.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;when-the-connection-fails&quot;&gt;When the connection fails&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;System error 53, “The network path was not found”&lt;/strong&gt;: Windows cannot reach the PC or the share. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/system-error-53-network-path-not-found&quot;&gt;System error 53&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System error 1326, “The user name or password is incorrect”&lt;/strong&gt;: the sign-in failed. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/system-error-1326-user-name-or-password-incorrect&quot;&gt;System error 1326&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System error 1219, “Multiple connections … by the same user”&lt;/strong&gt;: an old connection with other credentials is open. Run &lt;code dir=&quot;auto&quot;&gt;net use * /delete&lt;/code&gt;, then connect again. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/system-error-1219-multiple-connections&quot;&gt;System error 1219&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“…your organization’s security policies block unauthenticated guest access”&lt;/strong&gt;: Windows blocks guest logons by default. Use a real user name and password. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/guest-access-blocked-windows-11-24h2&quot;&gt;the 24H2 page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Windows cannot access”, error 0x80004005&lt;/strong&gt;: a general error. Get the real number with &lt;code dir=&quot;auto&quot;&gt;net use&lt;/code&gt;. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/windows-cannot-access-0x80004005&quot;&gt;0x80004005&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“The specified network name is no longer available”&lt;/strong&gt; (error 64) in the middle of a copy: the connection dropped. Run the same command again. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/specified-network-name-no-longer-available&quot;&gt;error 64&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;what-share-files-adds&quot;&gt;What Share Files adds&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Share Files wraps the same shared-folder and copy method in one screen, with no commands to type.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On the PC that shares&lt;/strong&gt; you pick a folder and approve one administrator prompt. Devpit turns on the file sharing firewall rule, creates a temporary login just for this share, and shares the folder read-only. Your own Windows password is never used. A card shows the IP, share name, user name and password, plus a &lt;code dir=&quot;auto&quot;&gt;net use&lt;/code&gt; line and a &lt;code dir=&quot;auto&quot;&gt;robocopy&lt;/code&gt; line for someone who does not have Devpit. Stop sharing removes everything it set up, and that also happens when you quit Devpit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On the PC that receives&lt;/strong&gt; you type the other PC’s IP, pick a shared folder from the list, sign in, and choose where to save. Before it starts, Devpit measures the exact total size and checks that you have enough free space. During the copy you see the total done, the speed and the time left, the files finished most recently, and a notice when the network blips. If the other PC stops answering, Devpit waits and carries on when it is back. If you stop the copy or close Devpit, you choose the resume entry in Share Files and it continues where it stopped. At the end you get a clear “Done” or a list of files that failed. It works whether or not the other PC has Devpit, and in any Windows language.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-short-checklist&quot;&gt;A short checklist&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Share the folder and note the IP.&lt;/li&gt;
&lt;li&gt;Measure the size and check the free space.&lt;/li&gt;
&lt;li&gt;Copy with &lt;code dir=&quot;auto&quot;&gt;/E /Z /R /W /LOG /TEE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If it stops, run the same command again.&lt;/li&gt;
&lt;li&gt;Read the exit code: 8 or more means a failure.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/robocopy&quot;&gt;Microsoft: robocopy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/troubleshoot/windows-client/networking/cannot-access-shared-folder-file-explorer&quot;&gt;Microsoft: Can’t access shared folders from File Explorer (Advanced Sharing steps)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/troubleshoot/windows-server/networking/troubleshoot-smb-guidance&quot;&gt;Microsoft: Troubleshoot SMB (net use * /delete)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/win32/debug/system-error-codes--0-499-&quot;&gt;Microsoft: System error codes (53, 1219, 1326)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.powershell.management/get-childitem&quot;&gt;Microsoft: Get-ChildItem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/measure-object&quot;&gt;Microsoft: Measure-Object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_numeric_literals&quot;&gt;Microsoft: about_Numeric_Literals (the GB suffix)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>robocopy</category><category>smb</category><category>file sharing</category><category>windows</category></item><item><title>How to see and reclaim node_modules space on Windows</title><link>https://devpit.zubyr.dev/docs/blog/reclaim-space-from-node-modules-on-windows</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/reclaim-space-from-node-modules-on-windows</guid><description>A practical way to measure node_modules on Windows, choose what to delete, and get the folder back with one command.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every JavaScript project you have ever cloned has a &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; folder. Most of them sit on your disk long after you stop working on the project.&lt;/p&gt;
&lt;p&gt;I will not tell you a number here. The size depends on your projects, and I will not invent one. Instead, this post shows you how to &lt;strong&gt;measure your own machine&lt;/strong&gt;, how to decide what is safe to delete, and how to get it all back.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-node_modules-is&quot;&gt;What node_modules is&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; is the folder where npm, pnpm or Yarn put the packages your project depends on. It is not your code. It is a copy of other people’s code, and it can be rebuilt from two files that you keep:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;, which lists the dependencies&lt;/li&gt;
&lt;li&gt;a lockfile such as &lt;code dir=&quot;auto&quot;&gt;package-lock.json&lt;/code&gt;, which pins exact versions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is why deleting it is a normal, safe thing to do. The npm documentation for &lt;code dir=&quot;auto&quot;&gt;npm ci&lt;/code&gt; even says that if a &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; folder is already there, &lt;code dir=&quot;auto&quot;&gt;npm ci&lt;/code&gt; removes it before it starts the install.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-1-measure-one-project&quot;&gt;Step 1: measure one project&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Open PowerShell in a project folder and run this. It adds up the size of every file inside &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$bytes &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Get-ChildItem&lt;/span&gt;&lt;span&gt; .\node_modules &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Recurse &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Force &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;File &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Measure-Object&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Property Length &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Sum&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.Sum&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;{0:N1} MB&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;$bytes &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;MB&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;What each part does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;Get-ChildItem -Recurse -Force -File&lt;/code&gt; lists every file, including hidden ones, in every subfolder.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;Measure-Object -Property Length -Sum&lt;/code&gt; adds up the &lt;code dir=&quot;auto&quot;&gt;Length&lt;/code&gt; (size in bytes) of all those files.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;1MB&lt;/code&gt; is a built-in PowerShell number for one mebibyte (1024 × 1024 bytes).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;-f&lt;/code&gt; is PowerShell’s format operator. &lt;code dir=&quot;auto&quot;&gt;{0:N1}&lt;/code&gt; prints the number with one decimal place.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It can take a while on a big folder, because there are many small files. That is normal.&lt;/p&gt;
&lt;p&gt;Two honest limits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By default &lt;code dir=&quot;auto&quot;&gt;Get-ChildItem&lt;/code&gt; does not follow symbolic links into other folders, so it does not count what those links point to.&lt;/li&gt;
&lt;li&gt;If you use pnpm, files in &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; are hard-linked to a shared store. This command counts each link as a file, so the real extra space on disk can be smaller than the total it prints.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;step-2-find-the-old-ones&quot;&gt;Step 2: find the old ones&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;To list &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; folders under a projects folder, run this. &lt;code dir=&quot;auto&quot;&gt;-Depth 3&lt;/code&gt; limits how deep it looks so it finishes sooner. Change the path and depth for your layout:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Get-ChildItem&lt;/span&gt;&lt;span&gt; C:\Projects &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Directory &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Recurse &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Depth &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Force &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Filter node_modules &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;ErrorAction SilentlyContinue &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Select-Object&lt;/span&gt;&lt;span&gt; FullName&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Now you have a list. You can measure each one with Step 1. Or you can let a tool do the whole job (see below).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-3-decide-what-is-safe&quot;&gt;Step 3: decide what is safe&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A good rule: delete &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; in projects you are &lt;strong&gt;not working on right now&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Before you delete, check these:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;A &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; sits next to it.&lt;/strong&gt; Without one, you may not be able to rebuild the folder. Do not delete it blindly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A lockfile exists&lt;/strong&gt; if you want the same versions back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You have internet.&lt;/strong&gt; Reinstalling downloads packages again.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You did not edit files inside &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt;.&lt;/strong&gt; Those edits are lost. If you patched a package, keep the patch somewhere else first.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h2 id=&quot;step-4-get-it-back&quot;&gt;Step 4: get it back&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;When you open the project again, run the install command for your package manager, in the project folder:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;or &lt;code dir=&quot;auto&quot;&gt;pnpm install&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;yarn&lt;/code&gt;. &lt;code dir=&quot;auto&quot;&gt;npm ci&lt;/code&gt; is the strict version for a clean install from an existing &lt;code dir=&quot;auto&quot;&gt;package-lock.json&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;other-places-that-hold-space&quot;&gt;Other places that hold space&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; is not the only one. npm keeps a download cache. The npm docs say that on Windows the default cache folder is &lt;code dir=&quot;auto&quot;&gt;%LocalAppData%\npm-cache&lt;/code&gt;. Inside it, the data lives in a folder called &lt;code dir=&quot;auto&quot;&gt;_cacache&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The npm documentation also says the cache is self-healing, so you should never need to clear it for any reason other than reclaiming disk space. If you want the space back:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm cache verify&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm cache &lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;force&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;verify&lt;/code&gt; checks the cache and removes data that is no longer needed. &lt;code dir=&quot;auto&quot;&gt;clean --force&lt;/code&gt; deletes the cache. It refills as you install packages.&lt;/p&gt;
&lt;p&gt;If you use pnpm, the shared store keeps a copy of every package your projects use. &lt;code dir=&quot;auto&quot;&gt;pnpm store prune&lt;/code&gt; removes packages that no project uses any more. The pnpm docs say it is not harmful and has no side effects on your projects, and that you should not run it too often, because a package that was unreferenced may be needed again soon.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;doing-it-with-devpit&quot;&gt;Doing it with Devpit&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Doing all of this by hand for twenty projects is boring. &lt;a href=&quot;https://devpit.zubyr.dev/docs/features/free-up-disk-space&quot;&gt;Free Up Disk Space&lt;/a&gt; does the finding, measuring and deleting for you, with safety checks.&lt;/p&gt;
&lt;figure&gt;&lt;button type=&quot;button&quot; data-shot-full=&quot;/docs/_astro/blog-node-modules-results.DHHEYKt7_rjyUC.webp&quot; data-shot-width=&quot;1856&quot; data-shot-alt=&quot;Devpit Free Up Disk Space results listing node_modules folders with their sizes and Safe risk labels&quot; aria-haspopup=&quot;dialog&quot; aria-label=&quot;Enlarge screenshot: Devpit Free Up Disk Space results listing node_modules folders with their sizes and Safe risk labels&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/docs/_astro/blog-node-modules-results.DHHEYKt7_Z1tKM0t.avif 480w, /docs/_astro/blog-node-modules-results.DHHEYKt7_ZAlcLQ.avif 736w, /docs/_astro/blog-node-modules-results.DHHEYKt7_1vxtLv.avif 960w, /docs/_astro/blog-node-modules-results.DHHEYKt7_ZKV58r.avif 1472w&quot; type=&quot;image/avif&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;source srcset=&quot;/docs/_astro/blog-node-modules-results.DHHEYKt7_1Y8OO0.webp 480w, /docs/_astro/blog-node-modules-results.DHHEYKt7_Z2cCILj.webp 736w, /docs/_astro/blog-node-modules-results.DHHEYKt7_Z5J2cW.webp 960w, /docs/_astro/blog-node-modules-results.DHHEYKt7_1MH13r.webp 1472w&quot; type=&quot;image/webp&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;img src=&quot;https://devpit.zubyr.dev/docs/_astro/blog-node-modules-results.DHHEYKt7_1d89gE.webp&quot; srcset=&quot;/docs/_astro/blog-node-modules-results.DHHEYKt7_1Y8OO0.webp 480w, /docs/_astro/blog-node-modules-results.DHHEYKt7_Z2cCILj.webp 736w, /docs/_astro/blog-node-modules-results.DHHEYKt7_Z5J2cW.webp 960w, /docs/_astro/blog-node-modules-results.DHHEYKt7_1MH13r.webp 1472w&quot; alt=&quot;Devpit Free Up Disk Space results listing node_modules folders with their sizes and Safe risk labels&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1856&quot; height=&quot;1268&quot;&gt;&lt;/picture&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; width=&quot;14&quot; height=&quot;14&quot;&gt;&lt;path d=&quot;M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Zoom&lt;/span&gt;&lt;/button&gt;&lt;/figure&gt;
&lt;p&gt;Here is what it does, based on the code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It scans a folder you choose, or the whole machine, and lists &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; folders with their sizes.&lt;/li&gt;
&lt;li&gt;A &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; is listed as junk when a &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; sits beside it. If there is no &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;, it is shown as &lt;strong&gt;unverified&lt;/strong&gt; and is never ticked for you.&lt;/li&gt;
&lt;li&gt;A project you touched in the last 7 days is never ticked for you.&lt;/li&gt;
&lt;li&gt;You see a preview, and the confirmation’s default answer is &lt;strong&gt;No&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; it shows the command to restore it, for example “Run npm install, pnpm install or yarn in the project folder.”&lt;/li&gt;
&lt;li&gt;Before it removes anything, it renames the folder to a name ending in &lt;code dir=&quot;auto&quot;&gt;.devpit-&lt;/code&gt; and random letters. Then it deletes the contents in parallel. If you stop it half way, the renamed folder is finished the next time. You never end up with a half-empty folder that looks like a working one.&lt;/li&gt;
&lt;li&gt;If a program holds a file open, Devpit tells you which program (when Windows can tell), and asks you to close it. It never ends that program for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a delete fails, these two pages explain the usual reasons: &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/eperm-operation-not-permitted-rmdir&quot;&gt;EPERM: operation not permitted&lt;/a&gt; and &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/source-file-names-are-larger-than-supported&quot;&gt;the path too long error&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-short-checklist&quot;&gt;A short checklist&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Measure one project with the PowerShell command above.&lt;/li&gt;
&lt;li&gt;List old &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; folders.&lt;/li&gt;
&lt;li&gt;Delete only in projects you are not using, and only where &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; exists.&lt;/li&gt;
&lt;li&gt;Reinstall when you come back.&lt;/li&gt;
&lt;li&gt;Optionally, verify or clean the npm cache and prune the pnpm store.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That is all it takes. Measure first, then decide. The numbers on your machine are the only ones that matter.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.npmjs.com/cli/commands/npm-ci&quot;&gt;npm docs: npm ci&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.npmjs.com/cli/commands/npm-cache&quot;&gt;npm docs: npm cache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.npmjs.com/cli/using-npm/config#cache&quot;&gt;npm docs: cache setting (Windows default)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pnpm.io/cli/store&quot;&gt;pnpm docs: pnpm store prune&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.powershell.management/get-childitem&quot;&gt;Microsoft: Get-ChildItem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/measure-object&quot;&gt;Microsoft: Measure-Object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_numeric_literals&quot;&gt;Microsoft: about_Numeric_Literals (the MB suffix)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_operators&quot;&gt;Microsoft: about_Operators (the format operator -f)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>node_modules</category><category>disk space</category><category>windows</category></item><item><title>Keep a Windows dev machine updated: winget, Scoop and npm</title><link>https://devpit.zubyr.dev/docs/blog/keep-windows-dev-machine-updated-winget-scoop-npm</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/keep-windows-dev-machine-updated-winget-scoop-npm</guid><description>One update command per tool, the reasons an update gets skipped, and a way to run them all in one pass.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A developer PC usually has more than one package manager. Apps come from winget. Command-line tools come from Scoop. JavaScript tools come from npm. Each one has its own update command, and none of them updates the others.&lt;/p&gt;
&lt;p&gt;This post gives you the commands for the three, explains what each one skips, and shows a way to run all of them in one pass.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;winget-apps&quot;&gt;winget: apps&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Winget is Microsoft’s Windows Package Manager. To see what has an update:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;winget upgrade&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Read the table first. Microsoft’s own advice is to run &lt;code dir=&quot;auto&quot;&gt;upgrade&lt;/code&gt; without arguments before you upgrade everything, so you can preview what will change. Then upgrade everything with:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;winget upgrade &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;what---all-skips&quot;&gt;What &lt;code dir=&quot;auto&quot;&gt;--all&lt;/code&gt; skips&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Winget skips some apps on purpose, and prints why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apps with an unknown version.&lt;/strong&gt; Some apps do not report a version. Winget cannot tell if a newer one exists. It skips them unless you add &lt;code dir=&quot;auto&quot;&gt;--include-unknown&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pinned apps.&lt;/strong&gt; If you pinned an app with &lt;code dir=&quot;auto&quot;&gt;winget pin add&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;--all&lt;/code&gt; leaves it alone, unless you add &lt;code dir=&quot;auto&quot;&gt;--include-pinned&lt;/code&gt; (which works for non-blocking pins only).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apps that need explicit targeting.&lt;/strong&gt; Winget lists them separately. Upgrade them by name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To upgrade one app by its exact ID, use &lt;code dir=&quot;auto&quot;&gt;--id&lt;/code&gt; with &lt;code dir=&quot;auto&quot;&gt;-e&lt;/code&gt; (exact match):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;winget upgrade &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;id Publisher.PackageName &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;what-can-go-wrong&quot;&gt;What can go wrong&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;The app is running. Winget stops with &lt;code dir=&quot;auto&quot;&gt;0x8A150101&lt;/code&gt;, “Application is currently running. Exit the application then try again.” Close the app and try again. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/winget-0x8a150101&quot;&gt;winget 0x8A150101&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The app needs administrator rights (&lt;code dir=&quot;auto&quot;&gt;0x80073D28&lt;/code&gt;). Run that one upgrade in an administrator terminal. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/winget-0x80073d28&quot;&gt;winget 0x80073D28&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More detail: &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/winget-upgrade-all-not-upgrading&quot;&gt;winget upgrade –all does not upgrade some apps&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;scoop-command-line-tools&quot;&gt;Scoop: command-line tools&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Scoop installs tools into your user folder, so it needs no administrator rights for normal apps.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;scoop update&lt;/code&gt; on its own updates Scoop itself and its app lists. To update apps, name them, or use &lt;code dir=&quot;auto&quot;&gt;*&lt;/code&gt; for all:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;scoop update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;scoop status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;scoop update &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;scoop status&lt;/code&gt; shows which apps are out of date. &lt;code dir=&quot;auto&quot;&gt;scoop update *&lt;/code&gt; updates every app.&lt;/p&gt;
&lt;p&gt;Scoop keeps old versions of each app. To remove them, and to clear the download cache:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;scoop cleanup &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;scoop cache rm &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Scoop’s help says &lt;code dir=&quot;auto&quot;&gt;*&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;-a&lt;/code&gt; mean the same thing in &lt;code dir=&quot;auto&quot;&gt;cleanup&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;cache rm&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;what-scoop-skips&quot;&gt;What Scoop skips&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Held apps.&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;scoop hold &amp;#x3C;app&gt;&lt;/code&gt; stops an app from being updated. Scoop prints &lt;code dir=&quot;auto&quot;&gt;&apos;app&apos; is held to version 1.2.3&lt;/code&gt;. Release it with &lt;code dir=&quot;auto&quot;&gt;scoop unhold &amp;#x3C;app&gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Running apps.&lt;/strong&gt; If a process from the app’s folder is running, Scoop stops with “The following instances of “app” are still running. Close them and try again.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/scoop-is-held-to-version-still-running&quot;&gt;Scoop: “is held to version” and “still running”&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;npm-global-packages&quot;&gt;npm: global packages&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Global npm packages are the tools you installed with &lt;code dir=&quot;auto&quot;&gt;npm install -g&lt;/code&gt;. To see which are out of date, and then update them:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm outdated &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm update &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The npm documentation says &lt;code dir=&quot;auto&quot;&gt;npm update -g&lt;/code&gt; applies the update to each globally installed package that is outdated. Global packages have no &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; range, so npm treats the newest version as the one you want.&lt;/p&gt;
&lt;p&gt;Project dependencies are a different thing. They live in each project’s &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;. Update those inside the project, on purpose, and test.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;one-pass-with-devpit&quot;&gt;One pass with Devpit&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Running six commands every week is easy to forget. &lt;a href=&quot;https://devpit.zubyr.dev/docs/features/update-everything&quot;&gt;Update Everything&lt;/a&gt; does them together.&lt;/p&gt;
&lt;figure&gt;&lt;button type=&quot;button&quot; data-shot-full=&quot;/docs/_astro/blog-update-everything.ClQJWHdm_Z1bu7Mb.webp&quot; data-shot-width=&quot;1856&quot; data-shot-alt=&quot;Devpit Update Everything list grouped by package manager with winget, Scoop and npm updates ticked&quot; aria-haspopup=&quot;dialog&quot; aria-label=&quot;Enlarge screenshot: Devpit Update Everything list grouped by package manager with winget, Scoop and npm updates ticked&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/docs/_astro/blog-update-everything.ClQJWHdm_Z22cFhX.avif 480w, /docs/_astro/blog-update-everything.ClQJWHdm_anqvk.avif 736w, /docs/_astro/blog-update-everything.ClQJWHdm_Z1Ydgmg.avif 960w, /docs/_astro/blog-update-everything.ClQJWHdm_Z1vJX6V.avif 1472w&quot; type=&quot;image/avif&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;source srcset=&quot;/docs/_astro/blog-update-everything.ClQJWHdm_ZGXXcX.webp 480w, /docs/_astro/blog-update-everything.ClQJWHdm_1uB8Ak.webp 736w, /docs/_astro/blog-update-everything.ClQJWHdm_ZDYyhg.webp 960w, /docs/_astro/blog-update-everything.ClQJWHdm_1Hcsbw.webp 1472w&quot; type=&quot;image/webp&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;img src=&quot;https://devpit.zubyr.dev/docs/_astro/blog-update-everything.ClQJWHdm_5bhnD.webp&quot; srcset=&quot;/docs/_astro/blog-update-everything.ClQJWHdm_ZGXXcX.webp 480w, /docs/_astro/blog-update-everything.ClQJWHdm_1uB8Ak.webp 736w, /docs/_astro/blog-update-everything.ClQJWHdm_ZDYyhg.webp 960w, /docs/_astro/blog-update-everything.ClQJWHdm_1Hcsbw.webp 1472w&quot; alt=&quot;Devpit Update Everything list grouped by package manager with winget, Scoop and npm updates ticked&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1856&quot; height=&quot;1268&quot;&gt;&lt;/picture&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; width=&quot;14&quot; height=&quot;14&quot;&gt;&lt;path d=&quot;M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Zoom&lt;/span&gt;&lt;/button&gt;&lt;/figure&gt;
&lt;p&gt;What it does:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It looks for winget, Scoop, npm and Chocolatey on your PATH and uses the ones it finds.&lt;/li&gt;
&lt;li&gt;It checks each one for outdated apps, all at the same time, and shows one list grouped by manager.&lt;/li&gt;
&lt;li&gt;It leaves things unticked when they need your decision: apps that winget says need explicit targeting, held Scoop apps, pinned Chocolatey apps, and Devpit itself (which says it updates itself). It also tells you how many winget apps it did not show because their version is unknown or because they are pinned.&lt;/li&gt;
&lt;li&gt;You pick what to update. It runs the steps one after another, and each package upgrade uses the exact package ID and silent, no-prompt options, so nothing waits for a window you cannot see.&lt;/li&gt;
&lt;li&gt;For Scoop it also runs &lt;code dir=&quot;auto&quot;&gt;scoop cleanup *&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;scoop cache rm -a&lt;/code&gt; at the end, so old versions do not pile up.&lt;/li&gt;
&lt;li&gt;At the end you get a summary. A row can say “updated”, “already up to date”, “in use, close it and retry”, “held”, or an error code for you to look up.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can stop a run with &lt;kbd&gt;Esc&lt;/kbd&gt;. Devpit stops the running step and its child processes, so nothing keeps running in the background.&lt;/p&gt;
&lt;p&gt;Devpit also has a skip key: press &lt;kbd&gt;s&lt;/kbd&gt; twice to skip the app that is updating right now and move on. The summary then says what was skipped and how to retry it. Apps that can only be updated as administrator are collected and updated together at the end with one administrator prompt. If an app has to be closed first, its row says so.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-simple-weekly-routine&quot;&gt;A simple weekly routine&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Save your work and close big apps like editors and browsers.&lt;/li&gt;
&lt;li&gt;Run &lt;code dir=&quot;auto&quot;&gt;winget upgrade&lt;/code&gt; and read the table.&lt;/li&gt;
&lt;li&gt;Update, then read the summary for anything skipped.&lt;/li&gt;
&lt;li&gt;For skipped apps, use the tool-specific fix above.&lt;/li&gt;
&lt;li&gt;Once in a while, clean old Scoop versions and caches.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/package-manager/winget/upgrade&quot;&gt;Microsoft: winget upgrade command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/package-manager/winget/pinning&quot;&gt;Microsoft: winget pin command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/winget-cli/blob/master/doc/windows/package-manager/winget/returnCodes.md&quot;&gt;winget return codes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ScoopInstaller/Scoop/blob/master/libexec/scoop-update.ps1&quot;&gt;Scoop source: scoop-update.ps1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ScoopInstaller/Scoop/blob/master/libexec/scoop-cleanup.ps1&quot;&gt;Scoop source: scoop-cleanup.ps1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ScoopInstaller/Scoop/blob/master/libexec/scoop-cache.ps1&quot;&gt;Scoop source: scoop-cache.ps1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ScoopInstaller/Scoop/blob/master/libexec/scoop-hold.ps1&quot;&gt;Scoop source: scoop-hold.ps1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.npmjs.com/cli/commands/npm-update&quot;&gt;npm docs: npm update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.npmjs.com/cli/commands/npm-outdated&quot;&gt;npm docs: npm outdated&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zubairbinshaukat/devpit/tree/main/internal/tools/managers&quot;&gt;Devpit source: internal/tools/managers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>winget</category><category>scoop</category><category>npm</category><category>updates</category></item><item><title>LocalSend vs Quick Share vs Syncthing: which to use</title><link>https://devpit.zubyr.dev/docs/blog/localsend-vs-quick-share-vs-syncthing</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/localsend-vs-quick-share-vs-syncthing</guid><description>Seven ways to move files between devices on your network, what each one is good at, and where each one falls short.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There are many free tools that move files between devices on the same network. They are not the same. Some are made for phones, some keep folders in sync forever, and some are best for one big copy.&lt;/p&gt;
&lt;p&gt;This post compares the popular ones, using only what each project says on its own website, docs or GitHub. Devpit’s own tool, Share Files, is in the list too. It is good at one job and not at others, and this post says which.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-short-version&quot;&gt;The short version&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phone to PC, or a mix of devices:&lt;/strong&gt; LocalSend. It runs on Windows, macOS, Linux, Android and iOS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Android phone to a Windows PC:&lt;/strong&gt; Quick Share for Windows, from Google.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small files between two nearby Windows PCs:&lt;/strong&gt; Nearby sharing, which is already in Windows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep folders the same on several devices, all the time:&lt;/strong&gt; Syncthing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One-off, nothing to install:&lt;/strong&gt; PairDrop in a web browser.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;From a terminal, even across the internet:&lt;/strong&gt; croc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A very large folder between two Windows PCs, with resume:&lt;/strong&gt; a shared folder with robocopy, or Devpit Share Files, which sets that up for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;side-by-side&quot;&gt;Side by side&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Devices&lt;/th&gt;
&lt;th&gt;Install on&lt;/th&gt;
&lt;th&gt;How it finds the other side&lt;/th&gt;
&lt;th&gt;Encryption (as the project states it)&lt;/th&gt;
&lt;th&gt;Resume&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LocalSend&lt;/td&gt;
&lt;td&gt;Windows, macOS, Linux, Android, iOS&lt;/td&gt;
&lt;td&gt;Both sides&lt;/td&gt;
&lt;td&gt;Multicast on the local network, or type the IP&lt;/td&gt;
&lt;td&gt;HTTPS with a certificate made on each device&lt;/td&gt;
&lt;td&gt;Not documented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick Share for Windows&lt;/td&gt;
&lt;td&gt;Android and Windows&lt;/td&gt;
&lt;td&gt;Both sides&lt;/td&gt;
&lt;td&gt;Bluetooth plus the same network, close by&lt;/td&gt;
&lt;td&gt;“Encrypted”, end to end&lt;/td&gt;
&lt;td&gt;Not documented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nearby sharing&lt;/td&gt;
&lt;td&gt;Windows 10 (1803+) and 11&lt;/td&gt;
&lt;td&gt;Built in, turned on on both&lt;/td&gt;
&lt;td&gt;Bluetooth, or Wi-Fi on the same Private network&lt;/td&gt;
&lt;td&gt;Not stated&lt;/td&gt;
&lt;td&gt;Not documented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Syncthing&lt;/td&gt;
&lt;td&gt;Windows, macOS, Linux, BSD and more&lt;/td&gt;
&lt;td&gt;Both sides&lt;/td&gt;
&lt;td&gt;Local broadcast, plus global discovery servers and relays&lt;/td&gt;
&lt;td&gt;TLS 1.2 or 1.3&lt;/td&gt;
&lt;td&gt;Keeps partial files up to a day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PairDrop&lt;/td&gt;
&lt;td&gt;Any modern browser&lt;/td&gt;
&lt;td&gt;Nothing&lt;/td&gt;
&lt;td&gt;Same network automatically, or a room code&lt;/td&gt;
&lt;td&gt;WebRTC, encrypted in transit&lt;/td&gt;
&lt;td&gt;Not documented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;croc&lt;/td&gt;
&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;
&lt;td&gt;Both sides&lt;/td&gt;
&lt;td&gt;A code phrase, through a relay&lt;/td&gt;
&lt;td&gt;End to end (PAKE)&lt;/td&gt;
&lt;td&gt;Yes, per its README&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Devpit Share Files&lt;/td&gt;
&lt;td&gt;Windows to Windows&lt;/td&gt;
&lt;td&gt;Devpit on the sharing PC; the receiver can use plain Windows commands&lt;/td&gt;
&lt;td&gt;Type the IP shown on the sharing PC&lt;/td&gt;
&lt;td&gt;Windows file sharing (SMB). Devpit does not turn on SMB encryption&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;“Not documented” means the project’s own pages do not say. It does not mean the feature is missing, only that you should test before you rely on it.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;localsend&quot;&gt;LocalSend&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;LocalSend is a free, open-source app (Apache-2.0 license) with no ads, no tracking and no account. Its README says all data is sent over HTTPS, and the certificate is made on the fly on each device. It works without the internet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How it finds devices.&lt;/strong&gt; It sends a multicast message on the local network. If that fails, it can try each local address, or you can type the other device’s IP yourself. The README warns that discovery fails when the router has “AP isolation” turned on, and that on Windows the network should be set to Private.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good at:&lt;/strong&gt; phones. It is one of the few free tools that is the same app on Android, iOS, Windows, macOS and Linux.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; resuming a stopped transfer is not in its docs. There are open feature requests for it on GitHub. For one huge folder over flaky Wi-Fi, that matters. The project also publishes security advisories on GitHub, so keep the app updated.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;quick-share-for-windows&quot;&gt;Quick Share for Windows&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Google’s Quick Share app for Windows sends files between Android devices and a Windows PC. Google’s help page lists what you need: a 64-bit version of Windows 10 or later, Bluetooth on, Wi-Fi or Ethernet on, both devices on the same network, and the devices within about 5 meters (16 feet). A Google account is optional but unlocks all options. Google says the files are encrypted when you share them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good at:&lt;/strong&gt; an Android phone and a Windows PC, with drag and drop or right-click, &lt;strong&gt;Send with Quick Share&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; Google’s pages talk about Android and Windows. They do not say that Windows-to-Windows works. On ARM-based PCs, Google’s pages disagree with each other, so check the current requirements first. Samsung PCs use Samsung’s own Quick Share app instead.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;windows-nearby-sharing&quot;&gt;Windows Nearby sharing&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Nearby sharing is built into Windows 10 (version 1803 and later) and Windows 11. Microsoft says it works over Bluetooth or Wi-Fi. On the latest Windows 11 it can use Wi-Fi if the other PC is on the same Private Wi-Fi network; otherwise it uses Bluetooth. Microsoft’s troubleshooting page adds that it needs Bluetooth 4.0 or later with Low Energy, that the network must be Private, that the devices should be within about 10 meters (30 feet), and that “Bluetooth file transfers are much slower”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good at:&lt;/strong&gt; a few files between two Windows PCs in the same room, with nothing to install.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; big transfers. If it falls back to Bluetooth, it will be slow, as Microsoft itself says.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;syncthing&quot;&gt;Syncthing&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Syncthing is different from the others. It is not a “send this file” tool. It keeps folders the same on two or more devices, all the time. When a file changes on one device, Syncthing copies the change to the others.&lt;/p&gt;
&lt;p&gt;Its docs say connections use TLS 1.2 or 1.3. It finds devices on the local network with broadcast and multicast, and by default also uses global discovery servers and relays. A relay is used only when two devices cannot connect directly, and the data stays end-to-end encrypted. It never writes directly to the real file. Changes go to a temporary file first, and after an error that temporary file is kept for up to a day so the same data is not sent again. It is free and open source (MPL-2.0).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good at:&lt;/strong&gt; keeping a folder in sync between a desktop and a laptop, or backing up phone photos to a PC, for months.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; it is more setup than a one-time copy needs. You pair devices and choose folders first.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;pairdrop-and-what-happened-to-snapdrop&quot;&gt;PairDrop (and what happened to Snapdrop)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;PairDrop runs in a web browser. You open the site on both devices and send. It uses WebRTC, which encrypts files in transit. Its FAQ says that if both devices are on the same network, no files go through any server, but a signaling server is needed to connect them. It is open source (GPL-3.0) and you can host it yourself on your own network.&lt;/p&gt;
&lt;p&gt;PairDrop began as a fork of Snapdrop. The Snapdrop GitHub page now says Snapdrop has been acquired by LimeWire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good at:&lt;/strong&gt; a quick one-off, when you cannot install anything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; the public site needs the internet for the signaling step, and a very large file depends on a browser tab staying open.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;croc&quot;&gt;croc&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;croc is a command-line tool (MIT license). Its README says it sends data between any two computers peer to peer with a relay as fallback, uses end-to-end encryption with PAKE (a password-based key exchange), works on Windows, Linux and macOS, and “allows resuming transfers that are interrupted”. You run &lt;code dir=&quot;auto&quot;&gt;croc send file&lt;/code&gt; on one side and type the code on the other.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good at:&lt;/strong&gt; developers who live in a terminal, and sending across the internet, not only the local network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; by default it goes through a public relay to find the other side.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;warpinator&quot;&gt;Warpinator&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Warpinator is Linux Mint’s tool for sending files on a local network. The official app is for Linux. Its README links to unofficial ports, including one for Windows (installable with &lt;code dir=&quot;auto&quot;&gt;winget install slowscript.Warpinator&lt;/code&gt;) and one for Android. Devices find each other with zeroconf on the same subnet, and a shared “group code” decides which devices can see each other.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good at:&lt;/strong&gt; a home with Linux PCs.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;devpit-share-files&quot;&gt;Devpit Share Files&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/features/share-files&quot;&gt;Share Files&lt;/a&gt; is part of Devpit, a free, open-source (MIT) Windows terminal app. It does one thing: move a big folder, such as a game, from one Windows PC to another on the same network, with live progress, retries and resume.&lt;/p&gt;
&lt;p&gt;It does not use a new protocol. It uses Windows’ own file sharing (SMB) and robocopy, which are already on every Windows PC.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;On the sharing PC&lt;/strong&gt;, you pick a folder and approve one admin prompt. Devpit creates a temporary login just for this share, shares the folder &lt;strong&gt;read-only&lt;/strong&gt; to that login, and turns on the firewall rule for file sharing if it is off. Your own Windows password is never used. The login expires by itself after 48 hours even if nothing removes it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On the receiving PC&lt;/strong&gt;, Devpit measures the exact size and checks free space before it starts, shows speed and time left, keeps both PCs awake, carries on by itself after a network drop, and can resume after you close it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The receiving PC does not need Devpit.&lt;/strong&gt; The sharing PC’s card shows a &lt;code dir=&quot;auto&quot;&gt;net use&lt;/code&gt; line and a &lt;code dir=&quot;auto&quot;&gt;robocopy&lt;/code&gt; line that work on any Windows PC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop sharing&lt;/strong&gt; removes the share, the login, the firewall change and the network change.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Good at:&lt;/strong&gt; tens or hundreds of gigabytes between two Windows PCs, where a drop in the middle would be painful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not for:&lt;/strong&gt; phones, Macs or Linux. It does not send over the internet, and it does not keep folders in sync. On encryption, Devpit does not turn on SMB encryption for its share. Windows 11 24H2 Pro, Enterprise and Education require SMB signing by default, which protects against changes in transit but does not hide the contents. Use it on a network you trust, such as your home Wi-Fi.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-to-choose&quot;&gt;How to choose&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Is a phone involved?&lt;/strong&gt; Use LocalSend, or Quick Share for Android and Windows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do you want the same files on both devices from now on?&lt;/strong&gt; Use Syncthing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is it a few files, both Windows, in the same room?&lt;/strong&gt; Use Nearby sharing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is it a big folder between two Windows PCs?&lt;/strong&gt; Use a shared folder and robocopy, by hand or with Devpit Share Files. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/transfer-files-between-two-pcs-over-wifi&quot;&gt;how to transfer files between two PCs over Wi-Fi&lt;/a&gt; for the step-by-step version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Can you not install anything?&lt;/strong&gt; Try PairDrop in a browser, or a shared folder, which needs nothing extra on Windows.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Want the protocol details behind these tools? Read &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/smb-vs-ftp-vs-http-local-network&quot;&gt;SMB vs FTP vs HTTP on a local network&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://localsend.org/&quot;&gt;LocalSend website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/localsend/localsend&quot;&gt;LocalSend README (HTTPS, AP isolation, Private network)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/localsend/protocol&quot;&gt;LocalSend protocol (multicast discovery, port 53317)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/localsend/localsend/security&quot;&gt;LocalSend security advisories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/localsend/localsend/issues/1191&quot;&gt;LocalSend feature request: resume transfers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/android/answer/13801258?hl=en&quot;&gt;Google: Share files between Android and Windows with Quick Share&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.android.com/better-together/quick-share-app/&quot;&gt;Google: Quick Share app for Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/windows/experience/connectivity-networking/share-things-with-nearby-devices-in-windows&quot;&gt;Microsoft: Share things with nearby devices in Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/windows/fix-problems-with-nearby-sharing-in-windows-e6f5db3a-48c3-04f6-13d6-84db6f821455&quot;&gt;Microsoft: Fix problems with Nearby sharing in Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://syncthing.net/&quot;&gt;Syncthing website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.syncthing.net/users/security.html&quot;&gt;Syncthing docs: Security principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.syncthing.net/users/relaying.html&quot;&gt;Syncthing docs: Relaying&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.syncthing.net/users/syncing.html&quot;&gt;Syncthing docs: Understanding synchronization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/schlagmichdoch/PairDrop&quot;&gt;PairDrop README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/schlagmichdoch/PairDrop/blob/master/docs/faq.md&quot;&gt;PairDrop FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/SnapDrop/snapdrop&quot;&gt;Snapdrop repository notice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/schollz/croc&quot;&gt;croc README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/linuxmint/warpinator&quot;&gt;Warpinator README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/slowscript/warpinator-windows&quot;&gt;Warpinator for Windows (unofficial port)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/storage/file-server/smb-signing&quot;&gt;Microsoft: Control SMB signing behavior&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>file transfer</category><category>file sharing</category><category>comparison</category></item><item><title>Move 100 GB between PCs: what sets the speed</title><link>https://devpit.zubyr.dev/docs/blog/move-100gb-between-computers</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/move-100gb-between-computers</guid><description>The arithmetic behind a big transfer, the rated speeds of Wi-Fi, Ethernet and USB, and why your real copy is slower than the box says.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You have 100 GB to move from one PC to another. Maybe a game library, a photo archive or a video project. The first question is always: how long will this take? The second: what is the fastest way?&lt;/p&gt;
&lt;p&gt;This post gives you the math, the rated speeds of each kind of link with a source for every number, and the things that slow a real copy down. It does not give you benchmark results, because a number measured on someone else’s PCs says little about yours. Instead it shows how to measure your own.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-formula&quot;&gt;The formula&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Time = size ÷ speed.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Watch the units. Network speeds are usually in &lt;strong&gt;bits&lt;/strong&gt; per second (Mb/s, Gb/s). File sizes are in &lt;strong&gt;bytes&lt;/strong&gt; (MB, GB). One byte is 8 bits.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;100 GB = 100,000,000,000 bytes = &lt;strong&gt;800,000,000,000 bits&lt;/strong&gt; = 800 Gb.&lt;/li&gt;
&lt;li&gt;To turn a link speed in Mb/s into MB/s, divide by 8. For example, 1,000 Mb/s ÷ 8 = 125 MB/s.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This post uses decimal units (1 GB = 1,000 MB) to keep the arithmetic simple.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-best-case-for-each-link-arithmetic-only&quot;&gt;The best case for each link (arithmetic only)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The table below takes each link’s &lt;strong&gt;rated maximum&lt;/strong&gt; and divides 800 Gb by it. This is arithmetic, not a measurement. It is the time the copy could never beat, even in a perfect world. Real copies take longer, for the reasons in the next section.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;th&gt;Rated maximum&lt;/th&gt;
&lt;th&gt;100 GB at that rate (arithmetic)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 5 (802.11ac wave 1), 2x2, 80 MHz&lt;/td&gt;
&lt;td&gt;866 Mb/s&lt;/td&gt;
&lt;td&gt;800,000 ÷ 866 ≈ 924 s ≈ 15 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 5 (802.11ac wave 2), 2x2, 160 MHz&lt;/td&gt;
&lt;td&gt;1.73 Gb/s&lt;/td&gt;
&lt;td&gt;800 ÷ 1.73 ≈ 462 s ≈ 8 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 6 (802.11ax), 2x2, 160 MHz&lt;/td&gt;
&lt;td&gt;2.4 Gb/s&lt;/td&gt;
&lt;td&gt;800 ÷ 2.4 ≈ 333 s ≈ 6 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 7, two-antenna PC, 4K QAM&lt;/td&gt;
&lt;td&gt;5.8 Gb/s&lt;/td&gt;
&lt;td&gt;800 ÷ 5.8 ≈ 138 s ≈ 2.3 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gigabit Ethernet (1000BASE-T)&lt;/td&gt;
&lt;td&gt;1 Gb/s&lt;/td&gt;
&lt;td&gt;800 ÷ 1 = 800 s ≈ 13 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.5GBASE-T Ethernet&lt;/td&gt;
&lt;td&gt;2.5 Gb/s&lt;/td&gt;
&lt;td&gt;800 ÷ 2.5 = 320 s ≈ 5.3 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB 5Gbps (USB 3.2 Gen 1)&lt;/td&gt;
&lt;td&gt;5 Gb/s&lt;/td&gt;
&lt;td&gt;800 ÷ 5 = 160 s ≈ 2.7 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB 10Gbps (USB 3.2 Gen 2)&lt;/td&gt;
&lt;td&gt;10 Gb/s&lt;/td&gt;
&lt;td&gt;800 ÷ 10 = 80 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB 20Gbps (USB 3.2 Gen 2x2)&lt;/td&gt;
&lt;td&gt;20 Gb/s&lt;/td&gt;
&lt;td&gt;800 ÷ 20 = 40 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB4 40Gbps&lt;/td&gt;
&lt;td&gt;40 Gb/s&lt;/td&gt;
&lt;td&gt;800 ÷ 40 = 20 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The Wi-Fi numbers are what Intel and the Wi-Fi Alliance call &lt;strong&gt;theoretical&lt;/strong&gt; maximum data rates. Your own card and router may support fewer antennas or narrower channels, and then the maximum is lower. Look up your exact model.&lt;/p&gt;
&lt;p&gt;Nobody copies 100 GB over Wi-Fi 7 in 2.3 minutes. The table is useful for one thing: it tells you which link has the &lt;strong&gt;higher ceiling&lt;/strong&gt;, and that a slow link can never be fast.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;why-a-real-copy-is-slower&quot;&gt;Why a real copy is slower&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A copy runs as fast as the &lt;strong&gt;slowest part&lt;/strong&gt; of the chain. The chain has more parts than people think:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The disk you read from.&lt;/strong&gt; A spinning hard drive is much slower than an SSD, especially with many small files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The link.&lt;/strong&gt; Wi-Fi, Ethernet or USB, as above.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Everything in between.&lt;/strong&gt; Your router, a switch, a long or damaged cable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The disk you write to.&lt;/strong&gt; It has to keep up too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The files themselves.&lt;/strong&gt; 100 GB as one file copies faster than 100 GB as 500,000 small files, because each file has its own work: open, create, close, set times.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The protocol.&lt;/strong&gt; Headers, acknowledgements and, with encryption, some CPU work. This takes a share of the link.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security software.&lt;/strong&gt; Scanning each new file on arrival can slow a copy of many files.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h3 id=&quot;the-wi-fi-to-wi-fi-catch&quot;&gt;The Wi-Fi to Wi-Fi catch&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;When &lt;strong&gt;both&lt;/strong&gt; PCs are on Wi-Fi through the same router, every byte usually travels over the air twice: from PC A to the router, then from the router to PC B. Both trips share the same radio channel with every other device in the house. So two PCs on Wi-Fi often copy slower than one PC on Wi-Fi and one on a cable.&lt;/p&gt;
&lt;p&gt;Microsoft’s own Nearby sharing page makes a related point: when that feature falls back to Bluetooth, transfers are “much slower”.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;measure-your-own-speed&quot;&gt;Measure your own speed&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This takes five minutes and gives you a real answer.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pick one test file of 1 to 5 GB, or a small folder that looks like your real data.&lt;/li&gt;
&lt;li&gt;Copy it the way you plan to copy the 100 GB.&lt;/li&gt;
&lt;li&gt;Time it. Divide the size by the seconds. That is your real speed in MB/s.&lt;/li&gt;
&lt;li&gt;Divide your total size by that speed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Robocopy prints a &lt;strong&gt;Speed&lt;/strong&gt; line in its summary at the end of each run, so it does the division for you. Devpit’s &lt;a href=&quot;https://devpit.zubyr.dev/docs/features/share-files&quot;&gt;Share Files&lt;/a&gt; shows the real speed and the time left while it copies.&lt;/p&gt;
&lt;figure&gt;&lt;button type=&quot;button&quot; data-shot-full=&quot;/docs/_astro/share-progress.DzyDCGs6_ZJvAtm.webp&quot; data-shot-width=&quot;2036&quot; data-shot-alt=&quot;Copy from a shared folder in progress: 47 of 80 GB done, current speed and time left, the files being copied right now and a retrying notice&quot; aria-haspopup=&quot;dialog&quot; aria-label=&quot;Enlarge screenshot: Copy from a shared folder in progress: 47 of 80 GB done, current speed and time left, the files being copied right now and a retrying notice&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/docs/_astro/share-progress.DzyDCGs6_Z2pYLw.avif 480w, /docs/_astro/share-progress.DzyDCGs6_1h0AJM.avif 736w, /docs/_astro/share-progress.DzyDCGs6_jrAVk.avif 960w, /docs/_astro/share-progress.DzyDCGs6_k61c.avif 1472w&quot; type=&quot;image/avif&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;source srcset=&quot;/docs/_astro/share-progress.DzyDCGs6_gP7LD.webp 480w, /docs/_astro/share-progress.DzyDCGs6_1AgIiW.webp 736w, /docs/_astro/share-progress.DzyDCGs6_CHIuu.webp 960w, /docs/_astro/share-progress.DzyDCGs6_ZmRlfA.webp 1472w&quot; type=&quot;image/webp&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;img src=&quot;https://devpit.zubyr.dev/docs/_astro/share-progress.DzyDCGs6_ZgzaEX.webp&quot; srcset=&quot;/docs/_astro/share-progress.DzyDCGs6_gP7LD.webp 480w, /docs/_astro/share-progress.DzyDCGs6_1AgIiW.webp 736w, /docs/_astro/share-progress.DzyDCGs6_CHIuu.webp 960w, /docs/_astro/share-progress.DzyDCGs6_ZmRlfA.webp 1472w&quot; alt=&quot;Copy from a shared folder in progress: 47 of 80 GB done, current speed and time left, the files being copied right now and a retrying notice&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2036&quot; height=&quot;1268&quot;&gt;&lt;/picture&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; width=&quot;14&quot; height=&quot;14&quot;&gt;&lt;path d=&quot;M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Zoom&lt;/span&gt;&lt;/button&gt;&lt;figcaption&gt;Share Files shows the live speed and time left (example screen, not a benchmark)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;For planning, here is the same formula at a few example speeds. These are example numbers for the arithmetic, not measurements:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your real speed&lt;/th&gt;
&lt;th&gt;100 GB (100,000 MB) takes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10 MB/s&lt;/td&gt;
&lt;td&gt;10,000 s ≈ 2 h 47 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25 MB/s&lt;/td&gt;
&lt;td&gt;4,000 s ≈ 1 h 7 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50 MB/s&lt;/td&gt;
&lt;td&gt;2,000 s ≈ 33 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 MB/s&lt;/td&gt;
&lt;td&gt;1,000 s ≈ 17 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200 MB/s&lt;/td&gt;
&lt;td&gt;500 s ≈ 8 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;the-choices-from-usually-fastest-to-usually-slowest&quot;&gt;The choices, from usually fastest to usually slowest&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;1-a-cable-between-the-two-pcs-or-both-on-the-router-by-cable&quot;&gt;1. A cable between the two PCs, or both on the router by cable&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Gigabit Ethernet’s rated 1 Gb/s is 125 MB/s at most, and it is steady. A cable does not drop or roam like Wi-Fi. If both PCs have 2.5 Gb/s ports, the ceiling is higher still. You can plug both into the router, or connect the two PCs directly: see &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/direct-ethernet-cable-between-two-pcs&quot;&gt;connect two PCs with an Ethernet cable&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;2-an-external-ssd-over-a-fast-usb-port&quot;&gt;2. An external SSD over a fast USB port&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;USB’s rated speeds are high, but you copy twice: onto the drive, then off it. The drive’s own speed, which its maker states, is often lower than the port’s. A cheap USB stick can be far slower. Also check the drive’s file system: Microsoft lists FAT32’s maximum file size as 4 GiB, so one big file will not fit on a FAT32 stick. Format it as exFAT or NTFS (that erases it).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;3-wi-fi&quot;&gt;3. Wi-Fi&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Fine for tens of gigabytes if the signal is good, one PC is on a cable, and you use a copy tool that can resume. The Wi-Fi 6 and 7 ceilings above are high, but real Wi-Fi speed changes with distance, walls and other devices.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;4-the-cloud&quot;&gt;4. The cloud&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;OneDrive and Google Drive work across the internet, not just your network. For 100 GB they are rarely the fast choice: the data goes up and comes back down, so your internet upload speed usually sets the time. Microsoft lists 5 GB of free OneDrive storage and a 250 GB limit per file. Google lists 15 GB free, shared across Gmail, Drive and Photos.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-checklist-before-a-100-gb-copy&quot;&gt;A checklist before a 100 GB copy&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Free space.&lt;/strong&gt; The destination needs more free space than the total size.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File system.&lt;/strong&gt; No FAT32 destination if any file is over 4 GiB.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Power.&lt;/strong&gt; Plug both laptops in and stop both PCs from sleeping. &lt;code dir=&quot;auto&quot;&gt;powercfg /change standby-timeout-ac 0&lt;/code&gt; sets sleep to never while plugged in; set it back after.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A tool that can resume.&lt;/strong&gt; File Explorer cannot. Use robocopy with &lt;code dir=&quot;auto&quot;&gt;/Z&lt;/code&gt;, or a tool that resumes. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/resume-interrupted-file-copy-windows&quot;&gt;resume an interrupted file copy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test first.&lt;/strong&gt; Copy one folder and measure.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Devpit’s &lt;a href=&quot;https://devpit.zubyr.dev/docs/features/share-files&quot;&gt;Share Files&lt;/a&gt; does most of this list on its own for a copy between two Windows PCs: it measures the exact size first, checks free space, warns about FAT32 and long paths before it starts, keeps both PCs awake, copies up to 16 files at once, and resumes where it stopped.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.intel.com/content/www/us/en/support/articles/000005725/wireless/legacy-intel-wireless-products.html&quot;&gt;Intel: Different Wi-Fi protocols and data rates (802.11ac, 802.11ax theoretical maximums)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wi-fi.org/beacon/the-beacon/wi-fi-7-advanced-connectivity-for-the-next-generation&quot;&gt;Wi-Fi Alliance: Wi-Fi 7, advanced connectivity (5.8 Gb/s for a two-antenna PC with 4K QAM)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://standards.ieee.org/ieee/802.3ab/1086/&quot;&gt;IEEE 802.3ab: 1000BASE-T, 1000 Mb/s over Category 5 copper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://standards.ieee.org/ieee/802.3bz/6130/&quot;&gt;IEEE 802.3bz: 2.5 Gb/s and 5 Gb/s over twisted pair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.usb.org/sites/default/files/usb_3_2_language_product_and_packaging_guidelines_final.pdf&quot;&gt;USB-IF: USB 3.2 language and packaging guidelines (5, 10, 20 Gbps)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.usb.org/sites/default/files/usb4_language_product_and_packaging_guidelines_final__0.pdf&quot;&gt;USB-IF: USB4 language and packaging guidelines (20 and 40 Gbps)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/win32/fileio/filesystem-functionality-comparison&quot;&gt;Microsoft: File system functionality comparison (FAT32 maximum file size)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/windows/fix-problems-with-nearby-sharing-in-windows-e6f5db3a-48c3-04f6-13d6-84db6f821455&quot;&gt;Microsoft: Fix problems with Nearby sharing (Bluetooth is much slower)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/office/restrictions-and-limitations-in-onedrive-and-sharepoint-64883a5d-228e-48f5-b3d2-eb39e07630fa&quot;&gt;Microsoft: Restrictions and limitations in OneDrive and SharePoint (250 GB per file)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/en-US/onedrive/microsoft-storage-quotas&quot;&gt;Microsoft: Microsoft storage quotas (5 GB free)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/googleone/answer/9312312&quot;&gt;Google: Google Account storage (15 GB)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/robocopy&quot;&gt;Microsoft: robocopy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-hardware/design/device-experiences/powercfg-command-line-options&quot;&gt;Microsoft: powercfg command-line options&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>file transfer</category><category>networking</category><category>windows</category></item><item><title>Port 3000 is already in use on Windows: find it and free it</title><link>https://devpit.zubyr.dev/docs/blog/port-3000-already-in-use-windows</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/port-3000-already-in-use-windows</guid><description>What EADDRINUSE really says, how to find the process behind a port, and three safe ways to fix it.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You start your dev server and get this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Error: listen EADDRINUSE: address already in use :::3000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The server did not start. Something else already holds port 3000. This post shows you how to find that something, how to stop it safely, and how to avoid the problem next time.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-the-error-says&quot;&gt;What the error says&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;EADDRINUSE&lt;/code&gt; is short for “address already in use”. The Node.js documentation describes it like this: an attempt to bind a server to a local address failed because another server on the same computer already occupies that address.&lt;/p&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;:::3000&lt;/code&gt; at the end is two things joined together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;::&lt;/code&gt; is the IPv6 “any address”. Node listens there when you give no host name and IPv6 is available (and otherwise on &lt;code dir=&quot;auto&quot;&gt;0.0.0.0&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;3000&lt;/code&gt; is the port number.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A port can have only one owner at a time. That is not a Windows quirk. It is how network ports work.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;who-owns-the-port&quot;&gt;Who owns the port?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Most of the time the owner is one of these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The same dev server, still running from before. You closed the terminal, but the &lt;code dir=&quot;auto&quot;&gt;node&lt;/code&gt; process lives on.&lt;/li&gt;
&lt;li&gt;A second project that uses the same default port.&lt;/li&gt;
&lt;li&gt;A different program that happens to use 3000.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;find-the-process&quot;&gt;Find the process&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;In PowerShell, ask Windows which process listens on the port:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;LocalPort &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;State Listen&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;OwningProcess&lt;/code&gt; column holds the process ID. To see the name of the program in one go:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Get-Process&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Id &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;LocalPort &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;State Listen&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.OwningProcess&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If you prefer the older tool, &lt;code dir=&quot;auto&quot;&gt;netstat -ano&lt;/code&gt; lists every connection. &lt;code dir=&quot;auto&quot;&gt;-a&lt;/code&gt; means all, &lt;code dir=&quot;auto&quot;&gt;-n&lt;/code&gt; shows numbers and &lt;code dir=&quot;auto&quot;&gt;-o&lt;/code&gt; adds the owning process ID.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;read-before-you-kill&quot;&gt;Read before you kill&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Look at the name. If it is &lt;code dir=&quot;auto&quot;&gt;node&lt;/code&gt; and it is your own old dev server, it is safe to stop. If it is something you do not know, do not stop it yet. Search for the name first, or choose another port.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;stop-it&quot;&gt;Stop it&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Stop-Process&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Id &lt;/span&gt;&lt;span&gt;12345&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Replace &lt;code dir=&quot;auto&quot;&gt;12345&lt;/code&gt; with your process ID. The old command-line way is &lt;code dir=&quot;auto&quot;&gt;taskkill /pid 12345&lt;/code&gt;. The &lt;code dir=&quot;auto&quot;&gt;/f&lt;/code&gt; flag forces the end, and &lt;code dir=&quot;auto&quot;&gt;/t&lt;/code&gt; also ends the processes it started.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-parent-process-problem&quot;&gt;The parent process problem&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Dev tools often start a child. For example, &lt;code dir=&quot;auto&quot;&gt;npm run dev&lt;/code&gt; starts &lt;code dir=&quot;auto&quot;&gt;node&lt;/code&gt;, which may start another process. If you stop only the child, the parent can start it again, and the port fills up again.&lt;/p&gt;
&lt;p&gt;That is why &lt;code dir=&quot;auto&quot;&gt;taskkill /t&lt;/code&gt; exists: it ends the process and any child processes started by it. Stop the whole tree, not just the last leaf.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-simplest-fix-use-another-port&quot;&gt;The simplest fix: use another port&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You are not required to use 3000. Many frameworks read a &lt;code dir=&quot;auto&quot;&gt;PORT&lt;/code&gt; environment variable or have a &lt;code dir=&quot;auto&quot;&gt;--port&lt;/code&gt; option. The exact option depends on your tool, so check its documentation. If two projects fight for the same port, giving each its own port ends the fight for good.&lt;/p&gt;
&lt;p&gt;Your own Node code can also handle the error. The Node.js documentation shows a small pattern: listen for the server’s &lt;code dir=&quot;auto&quot;&gt;error&lt;/code&gt; event, check &lt;code dir=&quot;auto&quot;&gt;e.code === &apos;EADDRINUSE&apos;&lt;/code&gt;, and retry after a moment. It is for servers that restart quickly. It does not help if a different program owns the port for a long time.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;freeing-the-port-with-devpit&quot;&gt;Freeing the port with Devpit&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Devpit has a section for this: &lt;a href=&quot;https://devpit.zubyr.dev/docs/features/fix-stuck-ports&quot;&gt;Fix Stuck Ports &amp;#x26; Apps&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;button type=&quot;button&quot; data-shot-full=&quot;/docs/_astro/blog-ports-kill.CBSE08sE_Z2oDaMC.webp&quot; data-shot-width=&quot;1856&quot; data-shot-alt=&quot;Devpit Fix Stuck Ports screen asking which port to free, with port 3000 typed in&quot; aria-haspopup=&quot;dialog&quot; aria-label=&quot;Enlarge screenshot: Devpit Fix Stuck Ports screen asking which port to free, with port 3000 typed in&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/docs/_astro/blog-ports-kill.CBSE08sE_Z2l446F.avif 480w, /docs/_astro/blog-ports-kill.CBSE08sE_19hace.avif 736w, /docs/_astro/blog-ports-kill.CBSE08sE_Z1f19it.avif 960w, /docs/_astro/blog-ports-kill.CBSE08sE_ZAjQgP.avif 1472w&quot; type=&quot;image/avif&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;source srcset=&quot;/docs/_astro/blog-ports-kill.CBSE08sE_2lUCqt.webp 480w, /docs/_astro/blog-ports-kill.CBSE08sE_L4HUr.webp 736w, /docs/_astro/blog-ports-kill.CBSE08sE_Z1CdAzg.webp 960w, /docs/_astro/blog-ports-kill.CBSE08sE_Z158MK.webp 1472w&quot; type=&quot;image/webp&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;img src=&quot;https://devpit.zubyr.dev/docs/_astro/blog-ports-kill.CBSE08sE_288DEH.webp&quot; srcset=&quot;/docs/_astro/blog-ports-kill.CBSE08sE_2lUCqt.webp 480w, /docs/_astro/blog-ports-kill.CBSE08sE_L4HUr.webp 736w, /docs/_astro/blog-ports-kill.CBSE08sE_Z1CdAzg.webp 960w, /docs/_astro/blog-ports-kill.CBSE08sE_Z158MK.webp 1472w&quot; alt=&quot;Devpit Fix Stuck Ports screen asking which port to free, with port 3000 typed in&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1856&quot; height=&quot;1268&quot;&gt;&lt;/picture&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; width=&quot;14&quot; height=&quot;14&quot;&gt;&lt;path d=&quot;M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Zoom&lt;/span&gt;&lt;/button&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;Open Devpit and choose &lt;strong&gt;Fix Stuck Ports &amp;#x26; Apps&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Kill a port&lt;/strong&gt; and type &lt;code dir=&quot;auto&quot;&gt;3000&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Devpit shows you which process holds the port. You confirm, and the default answer is No.&lt;/li&gt;
&lt;li&gt;It stops the process, then waits up to two seconds to check that the port is really free. It tells you “Port 3000 is free” or “Port 3000 is still busy”.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;strong&gt;Busy dev ports&lt;/strong&gt; view checks the common dev ports in one go: 3000 to 3010, 4200, 5000, 5173, 5174, 8000, 8080, 8081, 8888, 9000 and 19000 to 19006. You can change that list in Settings.&lt;/p&gt;
&lt;p&gt;If the process belongs to npm, pnpm, yarn or node, you can choose to stop the whole tree. That is the same idea as &lt;code dir=&quot;auto&quot;&gt;taskkill /t&lt;/code&gt; above.&lt;/p&gt;
&lt;p&gt;Some protections are built in, because a kill is hard to undo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Devpit refuses PID 0 and 4, Windows services, and programs in the Windows System32 folder. It tells you why.&lt;/li&gt;
&lt;li&gt;The exceptions are &lt;code dir=&quot;auto&quot;&gt;cmd.exe&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;powershell.exe&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;conhost.exe&lt;/code&gt;. They are shells that dev tools start all the time, so Devpit allows them.&lt;/li&gt;
&lt;li&gt;Devpit itself never runs as administrator. If the process runs as administrator, Devpit says it needs admin. Then you close the program yourself or use an administrator terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;a-quick-checklist&quot;&gt;A quick checklist&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Read the error. &lt;code dir=&quot;auto&quot;&gt;EADDRINUSE&lt;/code&gt; plus a port means another process holds it.&lt;/li&gt;
&lt;li&gt;Find the owner with &lt;code dir=&quot;auto&quot;&gt;Get-NetTCPConnection -LocalPort &amp;#x3C;port&gt; -State Listen&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check the name before you stop anything.&lt;/li&gt;
&lt;li&gt;Stop the whole process tree if a parent keeps restarting the child.&lt;/li&gt;
&lt;li&gt;Or pick another port.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There is a full page for this error with all commands and sources: &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/eaddrinuse-address-already-in-use-3000&quot;&gt;EADDRINUSE: address already in use :::3000&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/api/errors.html#common-system-errors&quot;&gt;Node.js: Common system errors (EADDRINUSE)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/api/net.html#serverlisten&quot;&gt;Node.js: net.Server listen, default host and the &lt;code dir=&quot;auto&quot;&gt;::&lt;/code&gt; address, and handling EADDRINUSE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/nettcpip/get-nettcpconnection&quot;&gt;Microsoft: Get-NetTCPConnection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.powershell.management/get-process&quot;&gt;Microsoft: Get-Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.powershell.management/stop-process&quot;&gt;Microsoft: Stop-Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/netstat&quot;&gt;Microsoft: netstat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/taskkill&quot;&gt;Microsoft: taskkill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zubairbinshaukat/devpit/blob/main/docs/safety.md&quot;&gt;Devpit safety rules, rule 16&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>ports</category><category>node</category><category>troubleshooting</category><category>windows</category></item><item><title>Resume an interrupted file copy on Windows</title><link>https://devpit.zubyr.dev/docs/blog/resume-interrupted-file-copy-windows</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/resume-interrupted-file-copy-windows</guid><description>File Explorer has no resume button. Here is how to carry on a stopped copy without starting over, for folders and for one huge file.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You are copying a big folder. It is at 60 percent. Then the Wi-Fi drops, the other PC goes to sleep, or Windows restarts for an update. The copy window is gone.&lt;/p&gt;
&lt;p&gt;Now you have a question: do I start again from zero?&lt;/p&gt;
&lt;p&gt;No. This guide shows how to carry on from where the copy stopped. It works for a copy between two disks on one PC, from a USB drive, and from a shared folder on another PC.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-short-answer&quot;&gt;The short answer&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;File Explorer cannot resume a copy.&lt;/strong&gt; Microsoft does not document a resume feature for it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robocopy can.&lt;/strong&gt; It is built into Windows. Run it with the same source and destination, and it skips the files that are already done. With &lt;code dir=&quot;auto&quot;&gt;/Z&lt;/code&gt;, a file that was cut off in the middle can continue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For one very large file&lt;/strong&gt;, BITS (a Windows transfer service) can pause and resume by itself, even after a restart.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;why-file-explorer-cannot-help&quot;&gt;Why File Explorer cannot help&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;File Explorer’s copy is one job. When it stops, the job is gone. If you start it again, it has no record of what it did before.&lt;/p&gt;
&lt;p&gt;That is why people end up with two bad choices: copy everything again (slow), or guess which files are complete (risky). A tool that compares the source and the destination file by file avoids both.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;resume-a-folder-copy-with-robocopy&quot;&gt;Resume a folder copy with robocopy&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Robocopy (“robust file copy”) comes with Windows. You do not install anything.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;step-1-open-a-terminal&quot;&gt;Step 1: open a terminal&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Press &lt;kbd&gt;Win&lt;/kbd&gt;, type &lt;code dir=&quot;auto&quot;&gt;cmd&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;PowerShell&lt;/code&gt;, and open it. You do not need administrator rights to copy your own files.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;step-2-run-the-copy&quot;&gt;Step 2: run the copy&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Use the same source and destination that you used in File Explorer. For a shared folder on another PC:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;robocopy \\192.168.1.20\Games D:\Games /E /Z /R:5 /W:10 /LOG:C:\copy.log /TEE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For a USB drive or another disk on the same PC:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;robocopy E:\Photos D:\Photos /E /Z /R:5 /W:10 /LOG:C:\copy.log /TEE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Replace the paths with your own. Do not put a backslash at the very end of a path in quotes, like &lt;code dir=&quot;auto&quot;&gt;&quot;D:\Games\&quot;&lt;/code&gt;. Robocopy reads &lt;code dir=&quot;auto&quot;&gt;\&quot;&lt;/code&gt; as a quote and the rest of the line breaks.&lt;/p&gt;
&lt;p&gt;What the options mean, from Microsoft’s robocopy documentation:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/E&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copies subfolders, including empty ones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restartable mode. If a file copy is interrupted, robocopy can pick up where it left off instead of copying the whole file again.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/R:5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retries a failed copy 5 times. The default is 1,000,000.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/W:10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Waits 10 seconds between retries. The default is 30.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/LOG:file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Writes the status to a file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;/TEE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Also shows the status on the screen.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h3 id=&quot;step-3-if-it-stops-again-run-the-same-command-again&quot;&gt;Step 3: if it stops again, run the same command again&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;This is the whole trick. Robocopy compares the source and the destination.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Files that are already the same on both sides are skipped. Microsoft even has an option, &lt;code dir=&quot;auto&quot;&gt;/IS&lt;/code&gt;, to &lt;em&gt;include&lt;/em&gt; the same files, which tells you they are left out by default.&lt;/li&gt;
&lt;li&gt;Files that are missing or different are copied.&lt;/li&gt;
&lt;li&gt;With &lt;code dir=&quot;auto&quot;&gt;/Z&lt;/code&gt;, a file that was cut off can continue from where it stopped.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can run it as many times as you need. Each run does only what is left.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;step-4-read-the-result&quot;&gt;Step 4: read the result&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Robocopy’s exit code is not a simple pass or fail. A code from 0 to 7 means there was no failure. A code of 8 or more means at least one file failed. In PowerShell, &lt;code dir=&quot;auto&quot;&gt;$LASTEXITCODE&lt;/code&gt; shows the code right after robocopy ends. The full table is on &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/robocopy-exit-codes&quot;&gt;robocopy exit codes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If some files failed, open the log file and search for the word &lt;code dir=&quot;auto&quot;&gt;ERROR&lt;/code&gt;. Fix the cause, and run the same command again.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;options-to-be-careful-with&quot;&gt;Options to be careful with&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;/MIR&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;/PURGE&lt;/code&gt; &lt;strong&gt;delete&lt;/strong&gt; files in the destination that are not in the source. For a plain copy, leave them out.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;/MT:n&lt;/code&gt; copies several files at once (1 to 128 threads, default 8). Microsoft says it is best used with a log file, which is why the examples above use &lt;code dir=&quot;auto&quot;&gt;/LOG&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;/J&lt;/code&gt; uses unbuffered I/O, which Microsoft recommends for large files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Try &lt;code dir=&quot;auto&quot;&gt;/MT&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;/J&lt;/code&gt; on your own copy and compare. Only your own test shows what helps on your disks and network.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;resume-one-huge-file-with-bits&quot;&gt;Resume one huge file with BITS&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A single very large file, such as a disk image or a video project, is a special case. BITS, the Background Intelligent Transfer Service, is a Windows service that Microsoft says “handles network interruptions, pausing and automatically resuming transfers, even after a reboot”. It can download from SMB file shares, which is what a shared folder is.&lt;/p&gt;
&lt;p&gt;In PowerShell:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Start-BitsTransfer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Source &lt;/span&gt;&lt;span&gt;&quot;\\192.168.1.20\share\backup.iso&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Destination &lt;/span&gt;&lt;span&gt;&quot;D:\Copy\backup.iso&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Asynchronous &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;DisplayName BigCopy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;-Asynchronous&lt;/code&gt; runs it in the background, so it survives you closing the window. Check on it with:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Get-BitsTransfer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Name BigCopy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When its state is &lt;code dir=&quot;auto&quot;&gt;Transferred&lt;/code&gt;, finish it. A background BITS job only writes the final file when you complete it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Get-BitsTransfer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Name BigCopy &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Complete-BitsTransfer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If the other PC wants a user name and password, add &lt;code dir=&quot;auto&quot;&gt;-Credential (Get-Credential)&lt;/code&gt; to the first command.&lt;/p&gt;
&lt;p&gt;BITS is best for a few big files. For a folder with thousands of files, robocopy is simpler.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-other-tools-do&quot;&gt;What other tools do&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Some copy and transfer tools also handle interruptions. Here is what their own pages say, and nothing more:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TeraCopy&lt;/strong&gt; (Windows, with a Mac version). Its site says that on a copy error it skips the file and carries on, that it “will also wait for network or device reconnection”, and that you can retry only the failed or skipped files afterwards. The product page does not describe a resume of a half-copied file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;croc&lt;/strong&gt; (command line, Windows, macOS, Linux). Its README lists “Allows resuming transfers that are interrupted”. It sends files between two computers with end-to-end encryption, and both sides run croc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic-wormhole&lt;/strong&gt; (command line). Resuming an interrupted transfer is an open feature request on its GitHub, so do not count on it for a very large file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Syncthing&lt;/strong&gt; (continuous sync). It writes changes to a temporary file first and, after an error, keeps that temporary file for up to a day so it does not have to request the same data again. It is made for keeping folders in sync, not for a one-time copy.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;resume-with-devpit-share-files&quot;&gt;Resume with Devpit Share Files&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/features/share-files&quot;&gt;Share Files&lt;/a&gt; is Devpit’s screen for copying a big folder from one Windows PC to another on the same network. Under the hood it uses a shared folder and robocopy, like the method above, with the parts that usually go wrong handled for you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;During the copy&lt;/strong&gt;, if the other PC stops answering, Devpit waits and tries again with a growing pause. When the PC answers again, it carries on by itself, as long as Devpit stays open.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you stopped the copy or closed Devpit&lt;/strong&gt;, open &lt;strong&gt;Share Files&lt;/strong&gt; again. It offers &lt;strong&gt;Resume the copy from&lt;/strong&gt; the other PC and shows how much is already copied. Press &lt;kbd&gt;Enter&lt;/kbd&gt;. Finished files are skipped and a half-copied file carries on, because Devpit runs robocopy with &lt;code dir=&quot;auto&quot;&gt;/Z&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;At the end&lt;/strong&gt; you get a clear “Done”, or a list of the files that failed with the reason, and &lt;kbd&gt;r&lt;/kbd&gt; tries them again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Devpit also keeps both PCs awake during the copy, which removes the most common reason for a stop.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;prevent-the-next-interruption&quot;&gt;Prevent the next interruption&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keep both PCs awake.&lt;/strong&gt; A PC that sleeps stops sharing and stops copying. For the length of the copy, &lt;code dir=&quot;auto&quot;&gt;powercfg /change standby-timeout-ac 0&lt;/code&gt; sets sleep to never while plugged in. Set it back afterwards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plug in a cable&lt;/strong&gt; if you can. Wi-Fi can drop or roam for a moment. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/direct-ethernet-cable-between-two-pcs&quot;&gt;connect two PCs with an Ethernet cable&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check free space first.&lt;/strong&gt; A full disk stops a copy near the end, which is the worst time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use a log.&lt;/strong&gt; With &lt;code dir=&quot;auto&quot;&gt;/LOG&lt;/code&gt;, you know exactly what was copied and what failed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the copy stopped with “The specified network name is no longer available”, see &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/specified-network-name-no-longer-available&quot;&gt;error 64&lt;/a&gt;. For the full walk-through of a copy between two PCs, see &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/copy-huge-folders-between-pcs-robocopy-resume&quot;&gt;copy a huge folder between two PCs with robocopy&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/robocopy&quot;&gt;Microsoft: robocopy (/E, /Z, /R, /W, /LOG, /TEE, /MT, /J, /IS, /MIR, exit codes)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/win32/bits/background-intelligent-transfer-service-portal&quot;&gt;Microsoft: Background Intelligent Transfer Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/bitstransfer/start-bitstransfer&quot;&gt;Microsoft: Start-BitsTransfer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/bitstransfer/complete-bitstransfer&quot;&gt;Microsoft: Complete-BitsTransfer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-hardware/design/device-experiences/powercfg-command-line-options&quot;&gt;Microsoft: powercfg command-line options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.codesector.com/teracopy&quot;&gt;TeraCopy product page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/schollz/croc&quot;&gt;croc README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/magic-wormhole/magic-wormhole/issues/88&quot;&gt;magic-wormhole issue 88: restart interrupted transfers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.syncthing.net/users/syncing.html&quot;&gt;Syncthing docs: Understanding synchronization (temporary files)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>robocopy</category><category>file transfer</category><category>windows</category></item><item><title>Set up a local FTP server on Windows 11</title><link>https://devpit.zubyr.dev/docs/blog/set-up-ftp-server-windows-11</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/set-up-ftp-server-windows-11</guid><description>Two ways to run an FTP server on your own network, the firewall and security parts people skip, and when a shared folder or SFTP is the better tool.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;FTP (File Transfer Protocol) is one of the oldest ways to move files over a network. It is still useful at home and in small offices, because many devices speak it: file manager apps on phones, some TVs and media players, cameras, scripts and Linux machines.&lt;/p&gt;
&lt;p&gt;This guide shows two ways to run an FTP server on Windows 11 for your &lt;strong&gt;local network&lt;/strong&gt;, the firewall part, how to add encryption, and when you should use something else.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;first-is-ftp-the-right-tool&quot;&gt;First: is FTP the right tool?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Answer this before you install anything.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Both computers run Windows?&lt;/strong&gt; A shared folder (SMB) is already built in, works in File Explorer, and robocopy can resume a big copy over it. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/share-a-folder-on-windows-11&quot;&gt;share a folder on Windows 11&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A phone, a TV, a camera or a script that speaks FTP?&lt;/strong&gt; FTP is a good fit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You need encryption?&lt;/strong&gt; Plain FTP has none. Use FTPS or SFTP, both covered below.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the long comparison, read &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/smb-vs-ftp-vs-http-local-network&quot;&gt;SMB vs FTP vs HTTP on a local network&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-security-part-in-plain-words&quot;&gt;The security part, in plain words&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The FTP security RFC says it directly: standard FTP sends passwords in clear text, and all data and control information, including passwords, crosses the network unencrypted. Microsoft’s IIS docs say the same about Basic sign-in: it sends passwords unencrypted, so use it only on a connection you know is secure, such as one protected with SSL.&lt;/p&gt;
&lt;p&gt;There are two encrypted choices:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Server on Windows 11&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FTP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The original protocol. No encryption.&lt;/td&gt;
&lt;td&gt;21, plus passive data ports&lt;/td&gt;
&lt;td&gt;IIS FTP, FileZilla Server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FTPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FTP with TLS encryption added (RFC 4217).&lt;/td&gt;
&lt;td&gt;21 (explicit) or 990 (implicit), plus passive ports&lt;/td&gt;
&lt;td&gt;IIS FTP, FileZilla Server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SFTP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A different protocol that runs over SSH.&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;OpenSSH Server (a Windows optional feature)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Rules that keep you safe:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use a separate Windows account for the FTP user, not your own.&lt;/li&gt;
&lt;li&gt;Give it &lt;strong&gt;read&lt;/strong&gt; access only, unless it must upload.&lt;/li&gt;
&lt;li&gt;Keep the server on your local network. Do not forward port 21 on your router.&lt;/li&gt;
&lt;li&gt;Turn the server off when you do not need it.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h2 id=&quot;option-1-the-ftp-server-built-into-windows-iis&quot;&gt;Option 1: the FTP server built into Windows (IIS)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Windows includes an FTP server as part of IIS (Internet Information Services). You turn it on as a Windows feature. Microsoft’s step-by-step pages for this were written for Windows 7 and 8, and the feature and button names below come from them. If a name looks slightly different on your PC, look for the closest match.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;turn-on-the-feature&quot;&gt;Turn on the feature&lt;/h3&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Press &lt;kbd&gt;Win&lt;/kbd&gt;, type &lt;code dir=&quot;auto&quot;&gt;Turn Windows features on or off&lt;/code&gt;, and open it.&lt;/li&gt;
&lt;li&gt;Expand &lt;strong&gt;Internet Information Services&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Expand &lt;strong&gt;FTP Server&lt;/strong&gt; and tick &lt;strong&gt;FTP Service&lt;/strong&gt;. (&lt;strong&gt;FTP Extensibility&lt;/strong&gt; is only needed for special sign-in methods.)&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Web Management Tools&lt;/strong&gt;, make sure the IIS management console is ticked, so you get IIS Manager.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt; and wait for Windows to finish.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h3 id=&quot;make-an-account-for-the-ftp-user&quot;&gt;Make an account for the FTP user&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Open &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Accounts&lt;/strong&gt;, &lt;strong&gt;Other users&lt;/strong&gt;, &lt;strong&gt;Add account&lt;/strong&gt;, then &lt;strong&gt;I don’t have this person’s sign-in information&lt;/strong&gt; and &lt;strong&gt;Add a user without a Microsoft account&lt;/strong&gt;. Give it a name and a strong password.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;add-the-ftp-site&quot;&gt;Add the FTP site&lt;/h3&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Press &lt;kbd&gt;Win&lt;/kbd&gt;, type &lt;code dir=&quot;auto&quot;&gt;IIS&lt;/code&gt;, and open &lt;strong&gt;Internet Information Services (IIS) Manager&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Connections&lt;/strong&gt; pane, expand your PC, right-click &lt;strong&gt;Sites&lt;/strong&gt; and choose &lt;strong&gt;Add FTP Site&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Site Information&lt;/strong&gt;: type a name, and in &lt;strong&gt;Physical path&lt;/strong&gt; pick the folder to share, for example &lt;code dir=&quot;auto&quot;&gt;D:\FTP&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binding and SSL Settings&lt;/strong&gt;: keep &lt;strong&gt;IP Address&lt;/strong&gt; as &lt;strong&gt;All Unassigned&lt;/strong&gt; and &lt;strong&gt;Port&lt;/strong&gt; as &lt;strong&gt;21&lt;/strong&gt;. Tick &lt;strong&gt;Start FTP site automatically&lt;/strong&gt; only if you want it running after every restart. For SSL, choose:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No SSL&lt;/strong&gt; for a quick test on a trusted home network (plain FTP), or&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Require SSL&lt;/strong&gt; and pick a certificate for FTPS (see below).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authentication and Authorization Information&lt;/strong&gt;: tick &lt;strong&gt;Basic&lt;/strong&gt; (not &lt;strong&gt;Anonymous&lt;/strong&gt;). Under &lt;strong&gt;Allow access to&lt;/strong&gt;, choose &lt;strong&gt;Specified users&lt;/strong&gt; and type the account name. Under &lt;strong&gt;Permissions&lt;/strong&gt;, tick &lt;strong&gt;Read&lt;/strong&gt; only.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h3 id=&quot;a-certificate-for-ftps&quot;&gt;A certificate for FTPS&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;For a local network, a self-signed certificate works. In IIS Manager, click your PC’s name, open &lt;strong&gt;Server Certificates&lt;/strong&gt;, and choose &lt;strong&gt;Create Self-Signed Certificate&lt;/strong&gt;. Then choose it in the FTP site’s SSL settings. The client will ask you to accept it the first time, because no public authority signed it.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;open-the-firewall&quot;&gt;Open the firewall&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Microsoft’s IIS FTP firewall guide gives these commands. Run them in Command Prompt as administrator.&lt;/p&gt;
&lt;p&gt;For plain FTP on port 21:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;netsh advfirewall firewall add rule name=&quot;FTP (non-SSL)&quot; action=allow protocol=TCP dir=in localport=21&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;netsh advfirewall set global StatefulFtp enable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For FTPS, Microsoft says the firewall’s stateful FTP inspection will most likely block it, so allow the FTP service itself and turn that inspection off:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;netsh advfirewall firewall add rule name=&quot;FTP for IIS7&quot; service=ftpsvc action=allow protocol=TCP dir=in&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;netsh advfirewall set global StatefulFtp disable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Microsoft also points out that opening port 21 alone lets a client send commands but not transfer data. In passive mode the data uses other ports. In IIS Manager, open &lt;strong&gt;FTP Firewall Support&lt;/strong&gt; on the server and set a &lt;strong&gt;Data Channel Port Range&lt;/strong&gt;, for example &lt;code dir=&quot;auto&quot;&gt;5000-5100&lt;/code&gt;, then allow that range in the firewall too.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;option-2-filezilla-server&quot;&gt;Option 2: FileZilla Server&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;FileZilla Server is a free, open-source FTP server with its own settings window. Its docs say it supports &lt;strong&gt;FTP and FTPS&lt;/strong&gt; only. SFTP is only in the paid FileZilla Pro Enterprise Server.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download FileZilla Server from the official site, &lt;code dir=&quot;auto&quot;&gt;filezilla-project.org&lt;/code&gt;, and install it. Note the &lt;strong&gt;admin port&lt;/strong&gt; the installer asks for. The default is &lt;code dir=&quot;auto&quot;&gt;14148&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open the administration window, connect to &lt;code dir=&quot;auto&quot;&gt;127.0.0.1&lt;/code&gt; on that admin port, and accept the certificate fingerprint it shows.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Server&lt;/strong&gt;, &lt;strong&gt;Configure&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under users, add a user with a password.&lt;/li&gt;
&lt;li&gt;Add a &lt;strong&gt;mount point&lt;/strong&gt;: a &lt;strong&gt;Virtual path&lt;/strong&gt; such as &lt;code dir=&quot;auto&quot;&gt;/&lt;/code&gt; mapped to a &lt;strong&gt;Native path&lt;/strong&gt; such as &lt;code dir=&quot;auto&quot;&gt;D:\FTP&lt;/code&gt;. Give it read access only unless the user must upload.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Passive mode&lt;/strong&gt;, set a port range. The FileZilla wiki says a range like &lt;code dir=&quot;auto&quot;&gt;5000-5100&lt;/code&gt; is enough.&lt;/li&gt;
&lt;li&gt;In the Windows firewall, allow port 21 (and 990 if you use implicit FTPS) plus your passive range.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;FileZilla Server can also turn on FTPS with a certificate in its settings.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;option-3-sftp-with-the-openssh-server-in-windows&quot;&gt;Option 3: SFTP with the OpenSSH Server in Windows&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;If the device you connect from supports SFTP, this is the simplest encrypted choice. Microsoft includes an OpenSSH server as an optional Windows feature.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Press &lt;kbd&gt;Win&lt;/kbd&gt;, type &lt;code dir=&quot;auto&quot;&gt;Optional features&lt;/code&gt;, and open it.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;View features&lt;/strong&gt; (or &lt;strong&gt;Add a feature&lt;/strong&gt;), find &lt;strong&gt;OpenSSH Server&lt;/strong&gt; and install it.&lt;/li&gt;
&lt;li&gt;Open &lt;code dir=&quot;auto&quot;&gt;services.msc&lt;/code&gt;, find &lt;strong&gt;OpenSSH SSH Server&lt;/strong&gt;, set &lt;strong&gt;Startup type&lt;/strong&gt; to &lt;strong&gt;Automatic&lt;/strong&gt; and click &lt;strong&gt;Start&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Or in PowerShell as administrator:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Add-WindowsCapability&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Online &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Name OpenSSH.Server~~~~&lt;/span&gt;&lt;span&gt;0.0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Start-Service&lt;/span&gt;&lt;span&gt; sshd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Microsoft says setup creates a firewall rule named &lt;code dir=&quot;auto&quot;&gt;OpenSSH-Server-In-TCP&lt;/code&gt; for port 22. Then connect from another PC with an SFTP client, or with the built-in &lt;code dir=&quot;auto&quot;&gt;sftp&lt;/code&gt; command where the OpenSSH client is installed:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sftp username@192.168.1.20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;An SSH server lets that account sign in to a command line, not only move files. Use a separate account with a strong password, and stop the service when you are done.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;connect-from-another-device&quot;&gt;Connect from another device&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Find the server PC’s IP address with &lt;code dir=&quot;auto&quot;&gt;ipconfig&lt;/code&gt; (the &lt;strong&gt;IPv4 Address&lt;/strong&gt; line), for example &lt;code dir=&quot;auto&quot;&gt;192.168.1.20&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FileZilla client&lt;/strong&gt; (free, Windows, macOS, Linux) supports FTP, FTPS and SFTP. Enter the host, user name, password and port, then connect.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows’ built-in &lt;code dir=&quot;auto&quot;&gt;ftp&lt;/code&gt; command&lt;/strong&gt; is very basic. Microsoft’s IIS docs name it as a client that does not support passive connections, and its reference page does not mention TLS. Use it only for a quick plain-FTP test.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phone apps and TVs&lt;/strong&gt;: look for FTP, FTPS or SFTP in the app’s network or server settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;can-ftp-resume-a-stopped-transfer&quot;&gt;Can FTP resume a stopped transfer?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Yes, when both sides support it. FTP has a restart command, &lt;code dir=&quot;auto&quot;&gt;REST&lt;/code&gt;, and a later RFC added restart by byte position in the normal transfer mode. In the FileZilla client, the “file exists” setting has a resume choice that continues a transfer that was stopped in the middle.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;troubleshooting&quot;&gt;Troubleshooting&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The client connects but the file list never loads.&lt;/strong&gt; The data connection is blocked. Set a passive port range in the server and allow it in the firewall.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FTPS fails, plain FTP works.&lt;/strong&gt; On IIS, follow the FTPS firewall steps above (the &lt;code dir=&quot;auto&quot;&gt;ftpsvc&lt;/code&gt; rule and &lt;code dir=&quot;auto&quot;&gt;StatefulFtp disable&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Access denied” after sign-in.&lt;/strong&gt; The account needs read permission on the folder itself, not only in the FTP site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nothing connects at all.&lt;/strong&gt; Check that both devices are on the same network, and test the port from another Windows PC with &lt;code dir=&quot;auto&quot;&gt;Test-NetConnection 192.168.1.20 -Port 21&lt;/code&gt; in PowerShell.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;when-a-shared-folder-is-the-better-choice&quot;&gt;When a shared folder is the better choice&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Between two Windows PCs, a shared folder beats FTP for most people: nothing to install, it opens in File Explorer, and robocopy can retry and resume a big copy over it.&lt;/p&gt;
&lt;p&gt;If you want that without the manual steps, &lt;a href=&quot;https://devpit.zubyr.dev/docs/features/share-files&quot;&gt;Devpit Share Files&lt;/a&gt; shares a folder read-only with a temporary login, opens only the SMB firewall rule, and shows the other PC exactly what to type. The other PC does not need Devpit. It is free and open source.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc2577&quot;&gt;IETF RFC 2577: FTP Security Considerations (clear-text passwords)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc4217&quot;&gt;IETF RFC 4217: Securing FTP with TLS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc959&quot;&gt;IETF RFC 959: File Transfer Protocol (REST)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc3659&quot;&gt;IETF RFC 3659: Extensions to FTP (restart in stream mode)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/iis/configuration/system.applicationhost/sites/site/ftpserver/&quot;&gt;Microsoft: FTP Server feature in IIS (installation)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/iis/publish/using-the-ftp-service/scenario-build-an-ftp-site-on-iis&quot;&gt;Microsoft: Build an FTP site on IIS (Basic authentication warning)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/iis/publish/using-the-ftp-service/creating-a-new-ftp-site-in-iis-7&quot;&gt;Microsoft: Creating a new FTP site in IIS 7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/iis/publish/using-the-ftp-service/using-ftp-over-ssl-in-iis-7&quot;&gt;Microsoft: Using FTP over SSL in IIS 7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/iis/publish/using-the-ftp-service/configuring-ftp-firewall-settings-in-iis-7&quot;&gt;Microsoft: Configuring FTP firewall settings in IIS 7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/ftp&quot;&gt;Microsoft: ftp command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/openssh/openssh_install_firstuse&quot;&gt;Microsoft: Get started with OpenSSH for Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wiki.filezilla-project.org/wiki/index.php?title=FAQ&quot;&gt;FileZilla wiki: FAQ (admin port, passive range, mount points)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://filezillapro.com/docs/server/basic-usage-instructions-server/protocols-supported-filezilla-server/&quot;&gt;FileZilla docs: protocols supported by FileZilla Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://filezillapro.com/docs/server/basic-usage-instructions-server/configure-filezilla-server/&quot;&gt;FileZilla docs: configure FileZilla Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://filezillapro.com/docs/v3/features-v3/filezilla-protocols/&quot;&gt;FileZilla docs: client protocols (FTP, FTPS, SFTP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://filezillapro.com/docs/v3/advanced/change-default-file-exists-behaviour/&quot;&gt;FileZilla docs: change the default file exists behaviour (resume)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>ftp</category><category>file transfer</category><category>windows</category></item><item><title>Share a folder on Windows 11 with another PC</title><link>https://devpit.zubyr.dev/docs/blog/share-a-folder-on-windows-11</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/share-a-folder-on-windows-11</guid><description>The full, safe way to share a folder between two Windows 11 PCs on the same network, and how to fix it when the other PC cannot open it.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You have two Windows 11 PCs on the same Wi-Fi or office network. You want one PC to open a folder on the other, for example to copy a game, photos or a project.&lt;/p&gt;
&lt;p&gt;Windows can do this without any extra app. It uses Windows file sharing, which works over a protocol called SMB. This guide shows every step, in the order that avoids the common errors, and says why each step matters.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;before-you-start&quot;&gt;Before you start&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Two PCs on the &lt;strong&gt;same network&lt;/strong&gt;. A guest Wi-Fi or a VPN can keep them apart.&lt;/li&gt;
&lt;li&gt;Administrator rights on the PC that shares the folder.&lt;/li&gt;
&lt;li&gt;About ten minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this guide, &lt;strong&gt;PC A&lt;/strong&gt; has the folder and shares it. &lt;strong&gt;PC B&lt;/strong&gt; opens it.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-1-set-the-network-to-private-on-pc-a&quot;&gt;Step 1: set the network to Private on PC A&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Windows keeps two sets of sharing rules: one for &lt;strong&gt;Public&lt;/strong&gt; networks and one for &lt;strong&gt;Private&lt;/strong&gt; networks. On a Public network, Microsoft says your PC is hidden from other devices. On a Private network, it is discoverable and can share files.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings&lt;/strong&gt;, then &lt;strong&gt;Network &amp;#x26; internet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Wi-Fi&lt;/strong&gt; or &lt;strong&gt;Ethernet&lt;/strong&gt;, then the network you are on.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Network profile type&lt;/strong&gt;, choose &lt;strong&gt;Private network&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do this only for a network you trust, like your home Wi-Fi. Microsoft says to use Private only when you know and trust the people and devices on the network.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-2-turn-on-file-and-printer-sharing-on-pc-a&quot;&gt;Step 2: turn on file and printer sharing on PC A&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Network &amp;#x26; internet&lt;/strong&gt;, &lt;strong&gt;Advanced network settings&lt;/strong&gt;, then &lt;strong&gt;Advanced sharing settings&lt;/strong&gt;. (Or type &lt;code dir=&quot;auto&quot;&gt;manage advanced sharing settings&lt;/code&gt; in Start.)&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Private networks&lt;/strong&gt;, turn on &lt;strong&gt;File and printer sharing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Turn on &lt;strong&gt;Network discovery&lt;/strong&gt; too if you want PC A to appear in the Network folder on other PCs. It is not needed to open a share by its address.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the other PC still cannot connect later, open &lt;strong&gt;Control Panel&lt;/strong&gt;, &lt;strong&gt;System and Security&lt;/strong&gt;, &lt;strong&gt;Windows Defender Firewall&lt;/strong&gt;, &lt;strong&gt;Allow an app or feature through Windows Defender Firewall&lt;/strong&gt;, and check that &lt;strong&gt;File and Printer Sharing&lt;/strong&gt; is ticked for &lt;strong&gt;Private&lt;/strong&gt;. A third-party firewall or security suite may need its own setting.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-3-make-an-account-for-the-other-pc-to-sign-in-with&quot;&gt;Step 3: make an account for the other PC to sign in with&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Windows lets someone open a share only after they sign in with an account that exists &lt;strong&gt;on PC A&lt;/strong&gt;. You have three choices:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Your own account on PC A.&lt;/strong&gt; It works, but you give your own password to the other PC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A separate local account just for sharing&lt;/strong&gt; (recommended). Open &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Accounts&lt;/strong&gt;, &lt;strong&gt;Other users&lt;/strong&gt;, then &lt;strong&gt;Add account&lt;/strong&gt;. Choose &lt;strong&gt;I don’t have this person’s sign-in information&lt;/strong&gt;, then &lt;strong&gt;Add a user without a Microsoft account&lt;/strong&gt;, and give it a name and a password.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No account (guest access).&lt;/strong&gt; Do not use this. Current Windows blocks guest sign-in by default, and Windows 11 24H2 Pro, Enterprise and Education also require SMB signing, which guest sign-in cannot use. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/guest-access-blocked-windows-11-24h2&quot;&gt;guest access blocked&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The account must have a password. Windows does not let an account with a blank password sign in over the network.&lt;/p&gt;
&lt;p&gt;If PC A signs in with a Microsoft account and you want to use that account, type its user name on PC B as &lt;code dir=&quot;auto&quot;&gt;MicrosoftAccount\you@example.com&lt;/code&gt; and use the account password, not the PIN.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-4-share-the-folder-on-pc-a&quot;&gt;Step 4: share the folder on PC A&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;In File Explorer, right-click the folder and choose &lt;strong&gt;Properties&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Sharing&lt;/strong&gt; tab and click &lt;strong&gt;Advanced Sharing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tick &lt;strong&gt;Share this folder&lt;/strong&gt;. Keep the share name, or type a short one without spaces, for example &lt;code dir=&quot;auto&quot;&gt;Games&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Permissions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add&lt;/strong&gt;, type the account name from step 3, and click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select that account and tick &lt;strong&gt;Allow&lt;/strong&gt; for &lt;strong&gt;Read&lt;/strong&gt;. Tick &lt;strong&gt;Change&lt;/strong&gt; only if PC B must also write files.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Everyone&lt;/strong&gt; and click &lt;strong&gt;Remove&lt;/strong&gt;, so only your account can use the share.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt;, then &lt;strong&gt;OK&lt;/strong&gt; again.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There is also a shorter menu: right-click, &lt;strong&gt;Show more options&lt;/strong&gt;, &lt;strong&gt;Give access to&lt;/strong&gt;, &lt;strong&gt;Specific people&lt;/strong&gt;. It sets both kinds of permission for you, but you see less of what it does.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-5-check-the-folders-own-permissions&quot;&gt;Step 5: check the folder’s own permissions&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A shared folder has two sets of permissions: the &lt;strong&gt;share&lt;/strong&gt; permissions from step 4, and the folder’s own &lt;strong&gt;Security&lt;/strong&gt; permissions. Microsoft says Windows applies the more restrictive of the two. So the account needs Read in both places.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the same &lt;strong&gt;Properties&lt;/strong&gt; window, open the &lt;strong&gt;Security&lt;/strong&gt; tab and click &lt;strong&gt;Edit&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add&lt;/strong&gt;, type the same account name, and click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tick &lt;strong&gt;Allow&lt;/strong&gt; for &lt;strong&gt;Read &amp;#x26; execute&lt;/strong&gt;. Click &lt;strong&gt;OK&lt;/strong&gt; twice.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This matters most for folders inside your user profile, such as Documents or Videos, which do not let other accounts in by default.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-6-find-pc-as-ip-address&quot;&gt;Step 6: find PC A’s IP address&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;On PC A, open Command Prompt and run &lt;code dir=&quot;auto&quot;&gt;ipconfig&lt;/code&gt;. Look for &lt;strong&gt;IPv4 Address&lt;/strong&gt; under your Wi-Fi or Ethernet adapter, for example &lt;code dir=&quot;auto&quot;&gt;192.168.1.20&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;An address that starts with &lt;code dir=&quot;auto&quot;&gt;192.168.&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;10.&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;172.16.&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;172.31.&lt;/code&gt; is a private address on your own network. That is the one to use.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-7-open-the-share-on-pc-b&quot;&gt;Step 7: open the share on PC B&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;On PC B, open File Explorer.&lt;/li&gt;
&lt;li&gt;In the address bar, type two backslashes, the IP, a backslash and the share name, for example &lt;code dir=&quot;auto&quot;&gt;\\192.168.1.20\Games&lt;/code&gt;, and press &lt;kbd&gt;Enter&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;Sign in with the account from step 3. On a local account, you can type it as &lt;code dir=&quot;auto&quot;&gt;PCNAME\username&lt;/code&gt; or just the user name.&lt;/li&gt;
&lt;li&gt;Tick &lt;strong&gt;Remember my credentials&lt;/strong&gt; only on your own PC.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Or from Command Prompt:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;net use \\192.168.1.20\Games /user:username&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;It asks for the password. To copy a big folder from there, use robocopy, which can retry and resume. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/copy-huge-folders-between-pcs-robocopy-resume&quot;&gt;copy a huge folder between two PCs with robocopy&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-8-stop-sharing-when-you-are-done&quot;&gt;Step 8: stop sharing when you are done&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;On PC A, open the folder’s &lt;strong&gt;Properties&lt;/strong&gt;, &lt;strong&gt;Sharing&lt;/strong&gt;, &lt;strong&gt;Advanced Sharing&lt;/strong&gt;, and untick &lt;strong&gt;Share this folder&lt;/strong&gt;. If you made an account just for sharing, remove it in &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Accounts&lt;/strong&gt;, &lt;strong&gt;Other users&lt;/strong&gt;. Set the network back to Public if you changed it only for this.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;if-it-does-not-work&quot;&gt;If it does not work&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see on PC B&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;th&gt;Read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;“The network path was not found”, 0x80070035, error 53&lt;/td&gt;
&lt;td&gt;PC B cannot reach PC A or the share&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/system-error-53-network-path-not-found&quot;&gt;System error 53&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Windows cannot access”, 0x80004005&lt;/td&gt;
&lt;td&gt;A general error; find the real one with &lt;code dir=&quot;auto&quot;&gt;net use&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/windows-cannot-access-0x80004005&quot;&gt;0x80004005&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“You do not have permission to access”, error 5&lt;/td&gt;
&lt;td&gt;Signed in, but the account may not read the folder&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/you-do-not-have-permission-to-access&quot;&gt;No permission&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“The user name or password is incorrect”, 1326&lt;/td&gt;
&lt;td&gt;The sign-in was refused&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/system-error-1326-user-name-or-password-incorrect&quot;&gt;System error 1326&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Multiple connections … by the same user”, 1219&lt;/td&gt;
&lt;td&gt;An old connection uses another account&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/system-error-1219-multiple-connections&quot;&gt;System error 1219&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“…block unauthenticated guest access”&lt;/td&gt;
&lt;td&gt;The share wants a guest sign-in&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/guest-access-blocked-windows-11-24h2&quot;&gt;Guest access blocked&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Network discovery is turned off”&lt;/td&gt;
&lt;td&gt;Only the Network list is affected&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/network-discovery-is-turned-off&quot;&gt;Network discovery&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;a-note-on-security&quot;&gt;A note on security&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Share only what you mean to.&lt;/strong&gt; Share one folder, not a whole drive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read-only is enough&lt;/strong&gt; to copy files away. Give Change only when the other PC must write.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use a real account with a password.&lt;/strong&gt; It keeps the share closed to anyone else on the network.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contents are not encrypted by default.&lt;/strong&gt; SMB 3 can encrypt a share, but that is off unless you turn it on for the share, for example with &lt;code dir=&quot;auto&quot;&gt;Set-SmbShare -Name Games -EncryptData $true&lt;/code&gt; in PowerShell as administrator. Both PCs must support SMB 3. On Windows 11 24H2 Pro, Enterprise and Education, SMB signing is required by default, which protects against changes in transit but does not hide the data. Microsoft says 24H2 Home does not require signing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop sharing&lt;/strong&gt; when the copy is done.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;the-same-thing-with-devpit&quot;&gt;The same thing with Devpit&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/features/share-files&quot;&gt;Share Files&lt;/a&gt; in Devpit does steps 1 to 8 for you on PC A, with one admin prompt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;asks before it switches a Public network to Private,&lt;/li&gt;
&lt;li&gt;turns on only the firewall rule for SMB, and only if it is off,&lt;/li&gt;
&lt;li&gt;creates a temporary login with a new password, which expires by itself after 48 hours,&lt;/li&gt;
&lt;li&gt;shares the folder &lt;strong&gt;read-only&lt;/strong&gt; to that login only, gives it read access to the folder, and checks that nobody else has access,&lt;/li&gt;
&lt;li&gt;shows a card with the IP, share name, user name, password, and a &lt;code dir=&quot;auto&quot;&gt;net use&lt;/code&gt; and a &lt;code dir=&quot;auto&quot;&gt;robocopy&lt;/code&gt; line for a PC without Devpit.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;button type=&quot;button&quot; data-shot-full=&quot;/docs/_astro/share-card.ChkbTeE__ZfvTTX.webp&quot; data-shot-width=&quot;2036&quot; data-shot-alt=&quot;Share a folder card showing the IP address, share name, user name and temporary password, and ready-to-copy commands for a PC that does not have Devpit&quot; aria-haspopup=&quot;dialog&quot; aria-label=&quot;Enlarge screenshot: Share a folder card showing the IP address, share name, user name and temporary password, and ready-to-copy commands for a PC that does not have Devpit&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/docs/_astro/share-card.ChkbTeE__1PnhFR.avif 480w, /docs/_astro/share-card.ChkbTeE__1bEsPI.avif 736w, /docs/_astro/share-card.ChkbTeE__1D1ueK.avif 960w, /docs/_astro/share-card.ChkbTeE__1OBUxi.avif 1472w&quot; type=&quot;image/avif&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;source srcset=&quot;/docs/_astro/share-card.ChkbTeE__Z1ouAgB.webp 480w, /docs/_astro/share-card.ChkbTeE__Z23dp6K.webp 736w, /docs/_astro/share-card.ChkbTeE__Z1AQnHI.webp 960w, /docs/_astro/share-card.ChkbTeE__Z26XJBG.webp 1472w&quot; type=&quot;image/webp&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;img src=&quot;https://devpit.zubyr.dev/docs/_astro/share-card.ChkbTeE__1EVEIG.webp&quot; srcset=&quot;/docs/_astro/share-card.ChkbTeE__Z1ouAgB.webp 480w, /docs/_astro/share-card.ChkbTeE__Z23dp6K.webp 736w, /docs/_astro/share-card.ChkbTeE__Z1AQnHI.webp 960w, /docs/_astro/share-card.ChkbTeE__Z26XJBG.webp 1472w&quot; alt=&quot;Share a folder card showing the IP address, share name, user name and temporary password, and ready-to-copy commands for a PC that does not have Devpit&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2036&quot; height=&quot;1268&quot;&gt;&lt;/picture&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; width=&quot;14&quot; height=&quot;14&quot;&gt;&lt;path d=&quot;M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Zoom&lt;/span&gt;&lt;/button&gt;&lt;/figure&gt;
&lt;p&gt;When you stop sharing, or quit Devpit, it removes the share, the folder permission, the login, the firewall change and the network change. PC B can copy with Devpit (with progress, retry and resume) or with the plain Windows commands on the card.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/windows/file-sharing-over-a-network-in-windows-b58704b2-f53a-4b82-7bc1-80f9994725bf&quot;&gt;Microsoft: File sharing over a network in Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/windows/essential-network-settings-and-tasks-in-windows-f21a9bbc-c582-55cd-35e0-73431160a1b9&quot;&gt;Microsoft: Essential network settings and tasks in Windows (Public and Private)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/windows/create-a-local-user-or-administrator-account-in-windows-20de74e0-ac7f-3502-a866-32915af2a34d&quot;&gt;Microsoft: Create a local user or administrator account in Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/troubleshoot/windows-client/networking/cannot-access-shared-folder-file-explorer&quot;&gt;Microsoft: Can’t access shared folders from File Explorer (Advanced Sharing, Security tab)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc753731(v=ws.10)&quot;&gt;Microsoft: Managing permissions for shared folders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/storage/file-server/enable-insecure-guest-logons-smb2-and-smb3&quot;&gt;Microsoft: Enable insecure guest logons in SMB2 and SMB3 (guest access and 24H2 signing)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/storage/file-server/smb-security-hardening&quot;&gt;Microsoft: SMB security hardening (encryption)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/powershell/module/smbshare/set-smbshare&quot;&gt;Microsoft: Set-SmbShare (EncryptData)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/gg651155(v=ws.11)&quot;&gt;Microsoft: net use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/ipconfig&quot;&gt;Microsoft: ipconfig&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc1918&quot;&gt;IETF RFC 1918: private address ranges&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>file sharing</category><category>smb</category><category>windows</category></item><item><title>SMB vs FTP vs HTTP for moving files on a LAN</title><link>https://devpit.zubyr.dev/docs/blog/smb-vs-ftp-vs-http-local-network</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/smb-vs-ftp-vs-http-local-network</guid><description>Three ways computers move files on a local network, what each one is good at, and a simple rule for choosing.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When two computers on the same network exchange files, they almost always use one of three protocols: &lt;strong&gt;SMB&lt;/strong&gt;, &lt;strong&gt;FTP&lt;/strong&gt; or &lt;strong&gt;HTTP&lt;/strong&gt;. Apps like LocalSend or Quick Share are built on top of ideas like these.&lt;/p&gt;
&lt;p&gt;This post explains each one in plain words, compares them in one table, and ends with a simple rule for choosing. There are no speed charts here, because the only speed test that means anything is the one on your own network.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;smb-windows-file-sharing&quot;&gt;SMB: Windows file sharing&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;SMB&lt;/strong&gt; (Server Message Block) is what Windows uses when you share a folder and open &lt;code dir=&quot;auto&quot;&gt;\\PC\share&lt;/code&gt; in File Explorer. It is built into every Windows PC. macOS and Linux can speak it too.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Port:&lt;/strong&gt; TCP 445.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How you use it:&lt;/strong&gt; open the share in File Explorer, map it as a drive, or copy with &lt;code dir=&quot;auto&quot;&gt;robocopy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sign-in:&lt;/strong&gt; a user name and password of an account on the sharing PC. Current Windows blocks guest (no password) sign-in by default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrity:&lt;/strong&gt; Microsoft says Windows 11 24H2 Pro, Enterprise and Education require SMB signing on all connections by default (Home does not). Signing proves the data was not changed on the way.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encryption:&lt;/strong&gt; SMB 3 can encrypt a share, but Microsoft says encryption is not mandatory by default. You turn it on per share, for example with &lt;code dir=&quot;auto&quot;&gt;Set-SmbShare -Name Games -EncryptData $true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resume:&lt;/strong&gt; SMB itself is just access to files. The copy tool decides. &lt;code dir=&quot;auto&quot;&gt;robocopy /Z&lt;/code&gt; can pick up a cut-off file, and running it again skips finished files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best at:&lt;/strong&gt; Windows to Windows. You can also open files in place, not only copy them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SMB 1.0, the very old version, is not installed on Windows 11 by default. Microsoft deprecated it in 2014. If an old NAS only speaks SMB 1.0, update it rather than turning SMB 1.0 back on.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ftp-the-classic-file-transfer-protocol&quot;&gt;FTP: the classic file transfer protocol&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;FTP&lt;/strong&gt; (File Transfer Protocol) is older than the web. A server program offers a folder, and a client connects to list, download and upload files.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ports:&lt;/strong&gt; TCP 21 for commands, plus separate data connections. In “passive” mode the server opens data ports from a range you choose, and the firewall must allow that range. This is the part that most often breaks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encryption:&lt;/strong&gt; none in plain FTP. The FTP security RFC says passwords and data cross the network unencrypted. &lt;strong&gt;FTPS&lt;/strong&gt; adds TLS encryption. &lt;strong&gt;SFTP&lt;/strong&gt; is a different protocol over SSH that is encrypted by design.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resume:&lt;/strong&gt; FTP has a restart command (&lt;code dir=&quot;auto&quot;&gt;REST&lt;/code&gt;), so a client like FileZilla can continue a transfer that stopped, when the server supports it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built into Windows:&lt;/strong&gt; there is an FTP server in IIS that you turn on as a Windows feature, and a very basic &lt;code dir=&quot;auto&quot;&gt;ftp&lt;/code&gt; command. Most people install FileZilla Server or use SFTP with Windows’ optional OpenSSH Server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best at:&lt;/strong&gt; devices that are not Windows PCs, such as phone file managers, TVs, cameras and scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full setup is in &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/set-up-ftp-server-windows-11&quot;&gt;set up a local FTP server on Windows 11&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;http-the-web&quot;&gt;HTTP: the web&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt; is how your browser loads web pages. A small web server can offer files, and any browser can download them. Nothing needs to be installed on the receiving side.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ports:&lt;/strong&gt; any. 80 for HTTP and 443 for HTTPS are the standard ones. Python’s quick server uses 8000 by default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encryption:&lt;/strong&gt; none with plain HTTP. HTTPS adds TLS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resume:&lt;/strong&gt; HTTP defines “range requests”, so a client can ask for only the missing part of a file, if the server supports it. Many download managers use this.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best at:&lt;/strong&gt; “just get this file to that laptop or phone”, with a browser on the other side.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Several popular tools build on web technology. LocalSend’s protocol is a REST API over HTTPS on port 53317. PairDrop runs in the browser and sends files with WebRTC, which encrypts them in transit.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;the-one-command-web-server&quot;&gt;The one-command web server&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If Python is installed, this serves a folder to your network:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;python &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;m http.server &lt;/span&gt;&lt;span&gt;8000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;bind &lt;/span&gt;&lt;span&gt;192.168&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1.20&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;directory D:\Share&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Use your own IP address (from &lt;code dir=&quot;auto&quot;&gt;ipconfig&lt;/code&gt;) and folder. On the other device, open &lt;code dir=&quot;auto&quot;&gt;http://192.168.1.20:8000&lt;/code&gt; in a browser. Press &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;C&lt;/kbd&gt; to stop it.&lt;/p&gt;
&lt;p&gt;Know the limits. Python’s documentation says &lt;code dir=&quot;auto&quot;&gt;http.server&lt;/code&gt; is not recommended for production and only implements basic security checks. It also warns that it follows symbolic links, so files outside the folder can be served. Anyone on your network can open the address while it runs, with no password. Python is not part of Windows; you install it from python.org or the Microsoft Store. Windows may also ask whether to allow Python through the firewall.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;side-by-side&quot;&gt;Side by side&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SMB&lt;/th&gt;
&lt;th&gt;FTP / FTPS&lt;/th&gt;
&lt;th&gt;SFTP&lt;/th&gt;
&lt;th&gt;HTTP / HTTPS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built into Windows&lt;/td&gt;
&lt;td&gt;Yes, client and server&lt;/td&gt;
&lt;td&gt;Basic client; IIS server is an optional feature&lt;/td&gt;
&lt;td&gt;Optional OpenSSH feature&lt;/td&gt;
&lt;td&gt;Browser yes; server no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open in File Explorer&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Not as a normal folder&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign-in&lt;/td&gt;
&lt;td&gt;Windows account&lt;/td&gt;
&lt;td&gt;FTP user&lt;/td&gt;
&lt;td&gt;SSH account&lt;/td&gt;
&lt;td&gt;Usually none for a quick server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encrypted by default&lt;/td&gt;
&lt;td&gt;No (signing on 24H2 Pro and up)&lt;/td&gt;
&lt;td&gt;FTP no, FTPS yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;HTTP no, HTTPS yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resume&lt;/td&gt;
&lt;td&gt;Through the copy tool (robocopy &lt;code dir=&quot;auto&quot;&gt;/Z&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;REST&lt;/code&gt;, if supported&lt;/td&gt;
&lt;td&gt;Depends on the client&lt;/td&gt;
&lt;td&gt;Range requests, if supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firewall&lt;/td&gt;
&lt;td&gt;TCP 445&lt;/td&gt;
&lt;td&gt;21 plus a passive range (990 for implicit FTPS)&lt;/td&gt;
&lt;td&gt;TCP 22&lt;/td&gt;
&lt;td&gt;One port you choose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phones and TVs&lt;/td&gt;
&lt;td&gt;Some apps&lt;/td&gt;
&lt;td&gt;Many apps&lt;/td&gt;
&lt;td&gt;Some apps&lt;/td&gt;
&lt;td&gt;Any browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Windows to Windows&lt;/td&gt;
&lt;td&gt;Mixed devices, old gear&lt;/td&gt;
&lt;td&gt;Encrypted transfers, scripts&lt;/td&gt;
&lt;td&gt;Quick one-off downloads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;what-about-speed&quot;&gt;What about speed?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;People often ask which protocol is fastest. Honest answer: on a local network, the protocol is rarely the main limit.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;link&lt;/strong&gt; (Wi-Fi or cable) sets the ceiling. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/move-100gb-between-computers&quot;&gt;move 100 GB between PCs&lt;/a&gt; for the arithmetic.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;disks&lt;/strong&gt; on both sides matter. A slow hard drive can be the bottleneck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Many small files&lt;/strong&gt; take longer than one big file of the same total size with any protocol, because each file has its own overhead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encryption&lt;/strong&gt; costs some CPU work. Whether you notice depends on your PCs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So do not trust a speed chart made on someone else’s network. Copy the same test folder two ways on yours and time it.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-simple-rule-for-choosing&quot;&gt;A simple rule for choosing&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Two Windows PCs:&lt;/strong&gt; SMB. It is already there. Copy big folders with robocopy, or let &lt;a href=&quot;https://devpit.zubyr.dev/docs/features/share-files&quot;&gt;Devpit Share Files&lt;/a&gt; set up a read-only share and do the copy with progress and resume.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A phone or mixed devices:&lt;/strong&gt; an app like LocalSend, or FTP/SFTP if the device has a client. See the &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/localsend-vs-quick-share-vs-syncthing&quot;&gt;LocalSend, Quick Share and Syncthing comparison&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One file to a device with only a browser:&lt;/strong&gt; a quick HTTP server, stopped right after.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encryption matters:&lt;/strong&gt; SFTP, FTPS, HTTPS, or SMB with encryption turned on for the share.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/storage/file-server/smb-signing&quot;&gt;Microsoft: Control SMB signing behavior (24H2 editions)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/storage/file-server/smb-security-hardening&quot;&gt;Microsoft: SMB security hardening&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/storage/file-server/smb-security&quot;&gt;Microsoft: SMB security enhancements (EncryptData)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/storage/file-server/troubleshoot/smbv1-not-installed-by-default-in-windows&quot;&gt;Microsoft: SMBv1 is not installed by default in Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/robocopy&quot;&gt;Microsoft: robocopy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc2577&quot;&gt;IETF RFC 2577: FTP Security Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc4217&quot;&gt;IETF RFC 4217: Securing FTP with TLS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc959&quot;&gt;IETF RFC 959: File Transfer Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9110&quot;&gt;IETF RFC 9110: HTTP Semantics (range requests)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/iis/publish/using-the-ftp-service/configuring-ftp-firewall-settings-in-iis-7&quot;&gt;Microsoft: Configuring FTP firewall settings in IIS 7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/openssh/openssh_install_firstuse&quot;&gt;Microsoft: Get started with OpenSSH for Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/http.server.html&quot;&gt;Python: http.server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/using/windows.html&quot;&gt;Python: Using Python on Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/localsend/protocol&quot;&gt;LocalSend protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/schlagmichdoch/PairDrop/blob/master/docs/faq.md&quot;&gt;PairDrop FAQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>smb</category><category>ftp</category><category>file transfer</category><category>comparison</category></item><item><title>Transfer files between two PCs over Wi-Fi (Windows 11)</title><link>https://devpit.zubyr.dev/docs/blog/transfer-files-between-two-pcs-over-wifi</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/transfer-files-between-two-pcs-over-wifi</guid><description>The ways to move files between two computers on the same network, with steps for each and a table to pick the right one for your situation.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You have two Windows PCs at home or in the office, on the same Wi-Fi. You want to move files from one to the other. Maybe a few documents, maybe a 100 GB game folder.&lt;/p&gt;
&lt;p&gt;Windows gives you several ways to do this, and free apps add more. They are good at different things. This guide compares them, gives the steps for each, and ends with a table so you can pick the right one in ten seconds.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;pick-by-situation&quot;&gt;Pick by situation&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Best choice&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A few files, two Windows PCs in the same room&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Nearby sharing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built into Windows, no setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A big folder (tens of GB or more), two Windows PCs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Shared folder + robocopy&lt;/strong&gt;, or &lt;strong&gt;Devpit Share Files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Handles drops and resumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Files to or from a phone, or a Mac or Linux PC&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LocalSend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same free app on every system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An Android phone and a Windows PC&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Quick Share for Windows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Made by Google for this&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The same folder on both PCs, kept up to date&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Syncthing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Continuous sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The biggest transfer, fastest&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A network cable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Steady, no Wi-Fi drops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No network between the PCs at all&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;USB drive or external SSD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Works anywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The PCs are in different places&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;OneDrive or Google Drive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Works over the internet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Now the details.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;method-1-a-shared-folder-built-into-windows&quot;&gt;Method 1: a shared folder (built into Windows)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Every Windows PC can share a folder with other PCs on the network. It uses Windows file sharing, also called SMB. Nothing to install.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The short version:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On the PC with the files, set the network to &lt;strong&gt;Private&lt;/strong&gt;: &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Network &amp;#x26; internet&lt;/strong&gt;, &lt;strong&gt;Wi-Fi&lt;/strong&gt;, your network, &lt;strong&gt;Network profile type&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Turn on &lt;strong&gt;File and printer sharing&lt;/strong&gt; for Private networks: &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Network &amp;#x26; internet&lt;/strong&gt;, &lt;strong&gt;Advanced network settings&lt;/strong&gt;, &lt;strong&gt;Advanced sharing settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Right-click the folder, &lt;strong&gt;Properties&lt;/strong&gt;, &lt;strong&gt;Sharing&lt;/strong&gt;, &lt;strong&gt;Advanced Sharing&lt;/strong&gt;, tick &lt;strong&gt;Share this folder&lt;/strong&gt;, and in &lt;strong&gt;Permissions&lt;/strong&gt; give &lt;strong&gt;Read&lt;/strong&gt; to an account that has a password.&lt;/li&gt;
&lt;li&gt;Find that PC’s IP address with &lt;code dir=&quot;auto&quot;&gt;ipconfig&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On the other PC, type &lt;code dir=&quot;auto&quot;&gt;\\192.168.1.20\ShareName&lt;/code&gt; (with your IP and share name) in File Explorer’s address bar and sign in.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The full walk-through, with the permission details that cause most errors, is in &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/share-a-folder-on-windows-11&quot;&gt;share a folder on Windows 11 with another PC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; built in, works with File Explorer, fine for any size.
&lt;strong&gt;Watch out:&lt;/strong&gt; dragging a huge folder in File Explorer cannot resume if the Wi-Fi drops. For a big copy, use robocopy (next section).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;copy-a-big-folder-over-the-share-with-robocopy&quot;&gt;Copy a big folder over the share with robocopy&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Robocopy is built into Windows. It retries, logs, and can pick up where it left off. On the receiving PC:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;robocopy \\192.168.1.20\Games D:\Games /E /Z /R:5 /W:10 /LOG:C:\copy.log /TEE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;If the copy stops, run the same command again. It skips files that are already done. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/resume-interrupted-file-copy-windows&quot;&gt;resume an interrupted file copy&lt;/a&gt; for all the options, and &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/robocopy-exit-codes&quot;&gt;robocopy exit codes&lt;/a&gt; to read the result.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;method-2-devpit-share-files-the-shared-folder-set-up-for-you&quot;&gt;Method 2: Devpit Share Files (the shared folder, set up for you)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/features/share-files&quot;&gt;Share Files&lt;/a&gt; is a screen in Devpit, a free and open-source Windows terminal app. It does Method 1 for you and adds progress, retry and resume. It is made for one job: big folders between two Windows PCs on the same network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On the PC that shares:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Devpit, choose &lt;strong&gt;Share Files&lt;/strong&gt;, then &lt;strong&gt;Share a folder&lt;/strong&gt;, and pick the folder.&lt;/li&gt;
&lt;li&gt;Approve one Windows admin prompt.&lt;/li&gt;
&lt;li&gt;Devpit asks before it switches a Public network to Private, turns on the firewall rule for file sharing if it is off, creates a temporary login, and shares the folder &lt;strong&gt;read-only&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A card shows the IP, share name, user name and password.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;button type=&quot;button&quot; data-shot-full=&quot;/docs/_astro/share-card.ChkbTeE__ZfvTTX.webp&quot; data-shot-width=&quot;2036&quot; data-shot-alt=&quot;Share a folder card showing the IP address, share name, user name and temporary password, and ready-to-copy commands for a PC that does not have Devpit&quot; aria-haspopup=&quot;dialog&quot; aria-label=&quot;Enlarge screenshot: Share a folder card showing the IP address, share name, user name and temporary password, and ready-to-copy commands for a PC that does not have Devpit&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/docs/_astro/share-card.ChkbTeE__1PnhFR.avif 480w, /docs/_astro/share-card.ChkbTeE__1bEsPI.avif 736w, /docs/_astro/share-card.ChkbTeE__1D1ueK.avif 960w, /docs/_astro/share-card.ChkbTeE__1OBUxi.avif 1472w&quot; type=&quot;image/avif&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;source srcset=&quot;/docs/_astro/share-card.ChkbTeE__Z1ouAgB.webp 480w, /docs/_astro/share-card.ChkbTeE__Z23dp6K.webp 736w, /docs/_astro/share-card.ChkbTeE__Z1AQnHI.webp 960w, /docs/_astro/share-card.ChkbTeE__Z26XJBG.webp 1472w&quot; type=&quot;image/webp&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;img src=&quot;https://devpit.zubyr.dev/docs/_astro/share-card.ChkbTeE__1EVEIG.webp&quot; srcset=&quot;/docs/_astro/share-card.ChkbTeE__Z1ouAgB.webp 480w, /docs/_astro/share-card.ChkbTeE__Z23dp6K.webp 736w, /docs/_astro/share-card.ChkbTeE__Z1AQnHI.webp 960w, /docs/_astro/share-card.ChkbTeE__Z26XJBG.webp 1472w&quot; alt=&quot;Share a folder card showing the IP address, share name, user name and temporary password, and ready-to-copy commands for a PC that does not have Devpit&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2036&quot; height=&quot;1268&quot;&gt;&lt;/picture&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; width=&quot;14&quot; height=&quot;14&quot;&gt;&lt;path d=&quot;M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Zoom&lt;/span&gt;&lt;/button&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;On the PC that receives:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Devpit, &lt;strong&gt;Share Files&lt;/strong&gt;, &lt;strong&gt;Copy from a shared folder&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Type the IP from the card, pick the folder, sign in, choose where to save.&lt;/li&gt;
&lt;li&gt;Devpit measures the exact size and checks free space, then copies with a live progress bar, speed and time left.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the Wi-Fi drops, Devpit waits and carries on by itself. If you close it, the &lt;strong&gt;Resume&lt;/strong&gt; entry continues where it stopped.&lt;/p&gt;
&lt;p&gt;The receiving PC does not need Devpit. The card also shows a &lt;code dir=&quot;auto&quot;&gt;net use&lt;/code&gt; line and a &lt;code dir=&quot;auto&quot;&gt;robocopy&lt;/code&gt; line for any Windows PC. When you stop sharing, Devpit removes everything it set up, and the temporary login expires by itself after 48 hours if anything is left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; big folders, flaky Wi-Fi, no commands to type.
&lt;strong&gt;Not for:&lt;/strong&gt; phones, Macs or Linux, or sending over the internet.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;method-3-nearby-sharing-built-into-windows&quot;&gt;Method 3: Nearby sharing (built into Windows)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Nearby sharing sends files between two Windows 10 or 11 PCs that are close to each other.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On &lt;strong&gt;both&lt;/strong&gt; PCs, open &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;System&lt;/strong&gt;, &lt;strong&gt;Nearby sharing&lt;/strong&gt;, and choose &lt;strong&gt;My devices only&lt;/strong&gt; (same Microsoft account) or &lt;strong&gt;Everyone nearby&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;On the sending PC, select a file in File Explorer and click &lt;strong&gt;Share&lt;/strong&gt; in the toolbar.&lt;/li&gt;
&lt;li&gt;Pick the other PC’s name.&lt;/li&gt;
&lt;li&gt;On the other PC, click &lt;strong&gt;Save&lt;/strong&gt; or &lt;strong&gt;Save &amp;#x26; open&lt;/strong&gt; in the notification.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Microsoft says it uses Wi-Fi when the sending PC runs the latest Windows 11 and the other PC is on the same Private Wi-Fi network; otherwise it uses Bluetooth, and “Bluetooth file transfers are much slower”. It needs Bluetooth 4.0 or later with Low Energy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; a few files, no setup.
&lt;strong&gt;Watch out:&lt;/strong&gt; not made for large folders.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;method-4-localsend-free-app-any-device&quot;&gt;Method 4: LocalSend (free app, any device)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;LocalSend is a free, open-source app for Windows, macOS, Linux, Android and iOS. It sends files over HTTPS on your local network and needs no account or internet.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install LocalSend on both devices from its official site, &lt;code dir=&quot;auto&quot;&gt;localsend.org&lt;/code&gt;, or your app store.&lt;/li&gt;
&lt;li&gt;Put both on the same network. On Windows, set the network to Private.&lt;/li&gt;
&lt;li&gt;On the sending device, pick the files and choose the other device from the list.&lt;/li&gt;
&lt;li&gt;Accept on the receiving device.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If devices do not appear, LocalSend’s README says the router’s “AP isolation” setting can block discovery. You can also type the other device’s IP address.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; phones and mixed devices.
&lt;strong&gt;Watch out:&lt;/strong&gt; its docs do not describe resuming a stopped transfer, so for a very large folder over weak Wi-Fi, prefer a method that resumes.&lt;/p&gt;
&lt;p&gt;For how it compares with Quick Share, Syncthing and others, read &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/localsend-vs-quick-share-vs-syncthing&quot;&gt;LocalSend vs Quick Share vs Syncthing&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;method-5-a-network-cable&quot;&gt;Method 5: a network cable&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Wi-Fi is convenient, but a cable is steadier. Plug both PCs into the router with Ethernet cables, and use any method above. The files then do not travel over the air at all.&lt;/p&gt;
&lt;p&gt;No free router port? You can connect the two PCs to each other with one cable. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/direct-ethernet-cable-between-two-pcs&quot;&gt;connect two PCs with an Ethernet cable&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;method-6-a-usb-drive-or-external-ssd&quot;&gt;Method 6: a USB drive or external SSD&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Copy onto the drive, carry it over, copy off. No network needed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You copy twice, so add both times.&lt;/li&gt;
&lt;li&gt;A fast external SSD on a fast USB port can be quick. A cheap USB stick can be slow.&lt;/li&gt;
&lt;li&gt;FAT32 cannot hold a single file over 4 GiB, Microsoft says. Many sticks come formatted as FAT32. Format as exFAT or NTFS for big files (formatting erases the drive).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;method-7-cloud-storage&quot;&gt;Method 7: cloud storage&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;OneDrive and Google Drive work when the PCs are not on the same network. Upload on one, download on the other.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It needs the internet, and your upload speed usually sets the time.&lt;/li&gt;
&lt;li&gt;Free space is small for big transfers: Microsoft lists 5 GB for a free Microsoft account, and Google lists 15 GB shared across Gmail, Drive and Photos.&lt;/li&gt;
&lt;li&gt;OneDrive’s limit is 250 GB per file.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;other-options&quot;&gt;Other options&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FTP or SFTP server&lt;/strong&gt;: useful for devices that speak FTP, such as phone file managers. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/set-up-ftp-server-windows-11&quot;&gt;set up a local FTP server on Windows 11&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A quick web server&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;python -m http.server&lt;/code&gt; lets any browser download from a folder. Plain HTTP, no password, for a short time only. See &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/smb-vs-ftp-vs-http-local-network&quot;&gt;SMB vs FTP vs HTTP&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Syncthing&lt;/strong&gt;: for keeping folders in sync, not a one-off copy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;croc&lt;/strong&gt;: a command-line tool that also works across the internet and can resume.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;how-long-will-it-take&quot;&gt;How long will it take?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Time is the size divided by your real speed. A 50 GB folder at a real 40 MB/s is 50,000 ÷ 40 = 1,250 seconds, about 21 minutes. That is arithmetic with an example speed, not a promise: your real speed depends on the Wi-Fi signal, the disks and the number of files. Copy a small test folder first and time it. The full explanation is in &lt;a href=&quot;https://devpit.zubyr.dev/docs/blog/move-100gb-between-computers&quot;&gt;move 100 GB between PCs&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;if-the-pcs-cannot-see-each-other&quot;&gt;If the PCs cannot see each other&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;Read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;“The network path was not found”, 0x80070035&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/system-error-53-network-path-not-found&quot;&gt;System error 53&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Windows cannot access”, 0x80004005&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/windows-cannot-access-0x80004005&quot;&gt;0x80004005&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Network discovery is turned off”&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/network-discovery-is-turned-off&quot;&gt;Network discovery&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“You do not have permission to access”&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/you-do-not-have-permission-to-access&quot;&gt;No permission&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“…block unauthenticated guest access”&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/guest-access-blocked-windows-11-24h2&quot;&gt;Guest access blocked&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A copy stopped with “network name is no longer available”&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/specified-network-name-no-longer-available&quot;&gt;Error 64&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Also check that neither PC is on a guest Wi-Fi or a VPN, which often keep devices apart.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/windows/file-sharing-over-a-network-in-windows-b58704b2-f53a-4b82-7bc1-80f9994725bf&quot;&gt;Microsoft: File sharing over a network in Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/windows/essential-network-settings-and-tasks-in-windows-f21a9bbc-c582-55cd-35e0-73431160a1b9&quot;&gt;Microsoft: Essential network settings and tasks in Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/windows/experience/connectivity-networking/share-things-with-nearby-devices-in-windows&quot;&gt;Microsoft: Share things with nearby devices in Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/windows/fix-problems-with-nearby-sharing-in-windows-e6f5db3a-48c3-04f6-13d6-84db6f821455&quot;&gt;Microsoft: Fix problems with Nearby sharing in Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/robocopy&quot;&gt;Microsoft: robocopy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/win32/fileio/filesystem-functionality-comparison&quot;&gt;Microsoft: File system functionality comparison (FAT32 4 GiB)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/office/restrictions-and-limitations-in-onedrive-and-sharepoint-64883a5d-228e-48f5-b3d2-eb39e07630fa&quot;&gt;Microsoft: Restrictions and limitations in OneDrive and SharePoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.microsoft.com/en-US/onedrive/microsoft-storage-quotas&quot;&gt;Microsoft: Microsoft storage quotas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/googleone/answer/9312312&quot;&gt;Google: Google Account storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://localsend.org/&quot;&gt;LocalSend website&lt;/a&gt; and &lt;a href=&quot;https://github.com/localsend/localsend&quot;&gt;README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/android/answer/13801258?hl=en&quot;&gt;Google: Quick Share for Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://syncthing.net/&quot;&gt;Syncthing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/schollz/croc&quot;&gt;croc README&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>file transfer</category><category>file sharing</category><category>windows</category></item><item><title>What Devpit sends, and what it never sends</title><link>https://devpit.zubyr.dev/docs/blog/what-devpit-sends-privacy</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/what-devpit-sends-privacy</guid><description>Nothing leaves your PC unless you opt in. Here is the exact report, the update check, and every switch.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A tool that deletes files should be honest about what it tells the internet. So here is the whole picture in plain words. Everything below comes from Devpit’s &lt;code dir=&quot;auto&quot;&gt;PRIVACY.md&lt;/code&gt; file and its source code, which you can read yourself.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-short-version&quot;&gt;The short version&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Devpit sends &lt;strong&gt;nothing&lt;/strong&gt; unless you turn usage stats on. They are &lt;strong&gt;off&lt;/strong&gt; until you do.&lt;/li&gt;
&lt;li&gt;The scan, the sizes, the deletions, the port list and the settings all stay on your PC.&lt;/li&gt;
&lt;li&gt;If you turn stats on, one small report goes out after a cleanup. It has numbers and short labels. No file names. No paths.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;what-stays-on-your-machine&quot;&gt;What stays on your machine&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Devpit reads and writes exactly two folders:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Override&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Settings&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;%APPDATA%\devpit\config.toml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;DEVPIT_CONFIG_DIR&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caches and logs&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;%LOCALAPPDATA%\devpit\&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;DEVPIT_CACHE_DIR&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nothing in either folder is uploaded.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;usage-stats-are-opt-in&quot;&gt;Usage stats are opt-in&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The first time you run Devpit, it asks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Help show how much space Devpit saves? Only totals are sent — no file names or paths.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The answer is already &lt;strong&gt;No&lt;/strong&gt;. You can change your mind any time in &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Usage stats&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;button type=&quot;button&quot; data-shot-full=&quot;/docs/_astro/blog-settings-usage-stats.BVzGrF_v_16XHcj.webp&quot; data-shot-width=&quot;1856&quot; data-shot-alt=&quot;Devpit Settings screen showing the Usage stats row set to off and the Update check row&quot; aria-haspopup=&quot;dialog&quot; aria-label=&quot;Enlarge screenshot: Devpit Settings screen showing the Usage stats row set to off and the Update check row&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/docs/_astro/blog-settings-usage-stats.BVzGrF_v_Zjp2s1.avif 480w, /docs/_astro/blog-settings-usage-stats.BVzGrF_v_z0wKB.avif 736w, /docs/_astro/blog-settings-usage-stats.BVzGrF_v_Z2ohTtX.avif 960w, /docs/_astro/blog-settings-usage-stats.BVzGrF_v_Z6gVQK.avif 1472w&quot; type=&quot;image/avif&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;source srcset=&quot;/docs/_astro/blog-settings-usage-stats.BVzGrF_v_Z1UGyrt.webp 480w, /docs/_astro/blog-settings-usage-stats.BVzGrF_v_Z12gYdQ.webp 736w, /docs/_astro/blog-settings-usage-stats.BVzGrF_v_14BHkv.webp 960w, /docs/_astro/blog-settings-usage-stats.BVzGrF_v_2sm9k8.webp 1472w&quot; type=&quot;image/webp&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;img src=&quot;https://devpit.zubyr.dev/docs/_astro/blog-settings-usage-stats.BVzGrF_v_1RMhxl.webp&quot; srcset=&quot;/docs/_astro/blog-settings-usage-stats.BVzGrF_v_Z1UGyrt.webp 480w, /docs/_astro/blog-settings-usage-stats.BVzGrF_v_Z12gYdQ.webp 736w, /docs/_astro/blog-settings-usage-stats.BVzGrF_v_14BHkv.webp 960w, /docs/_astro/blog-settings-usage-stats.BVzGrF_v_2sm9k8.webp 1472w&quot; alt=&quot;Devpit Settings screen showing the Usage stats row set to off and the Update check row&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1856&quot; height=&quot;1268&quot;&gt;&lt;/picture&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; width=&quot;14&quot; height=&quot;14&quot;&gt;&lt;path d=&quot;M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Zoom&lt;/span&gt;&lt;/button&gt;&lt;/figure&gt;
&lt;p&gt;Two environment variables switch stats off, and they always win, even if you said yes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;DEVPIT_NO_TELEMETRY=1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;DO_NOT_TRACK=1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Devpit never asks in a non-interactive run, and it never turns stats on by itself.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-exact-report&quot;&gt;The exact report&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;If you opted in, then after a cleanup Devpit posts one JSON body to &lt;code dir=&quot;auto&quot;&gt;https://devpit.zubyr.dev/api/report&lt;/code&gt;. The source code defines the fields, and there are no other fields. Here is the shape, with &lt;strong&gt;example values, not real data&lt;/strong&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;installId&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;a random id made on your PC&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1.2.3&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;os&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;windows&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;osVersion&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;10.0.22631&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;freedBytes&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;123456789&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;types&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;node_modules&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;npm cache&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In words:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bytes freed&lt;/strong&gt; and &lt;strong&gt;the number of items removed.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Item types&lt;/strong&gt; from a fixed list of rule names such as &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt;. Names that are not plain short labels are dropped, and there is a cap on how many labels one report may carry.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operating system name and version&lt;/strong&gt;, cleaned to plain characters and a short length.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Devpit version.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A random install ID&lt;/strong&gt; that Devpit makes on your PC. It identifies nothing else about you.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;what-is-never-sent&quot;&gt;What is never sent&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;File, folder or project names&lt;/li&gt;
&lt;li&gt;Any path, absolute or relative&lt;/li&gt;
&lt;li&gt;Your user name, machine name or domain&lt;/li&gt;
&lt;li&gt;Your IP address as a location. The server does not store it.&lt;/li&gt;
&lt;li&gt;The contents of any file&lt;/li&gt;
&lt;li&gt;What tools or apps you have installed&lt;/li&gt;
&lt;li&gt;Anything at all when a scan finds nothing, or when you cancel&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;how-it-behaves&quot;&gt;How it behaves&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Reports go out in the background and never block you. There is a three second time limit.&lt;/li&gt;
&lt;li&gt;If you are offline, or the server is down, or it takes too long, the report is dropped silently. Nothing is retried or saved to disk. A failed report never shows an error and never delays a cleanup.&lt;/li&gt;
&lt;li&gt;The server rejects impossible values, so the public totals cannot be inflated by a forged report.&lt;/li&gt;
&lt;li&gt;The server keeps a hashed form of your IP address for at most one hour, only to limit how many reports one connection can send.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not just promises in a document. The safety rules list each one with the test that checks it, for example that a report never carries a path or a name.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-update-check&quot;&gt;The update check&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This is separate from usage stats. Devpit can ask GitHub’s public releases API at most once every 24 hours whether a newer version exists. That request sends nothing but the request itself. The result is cached on your PC. If you are offline it is skipped silently.&lt;/p&gt;
&lt;p&gt;When a newer release exists you see a small “update” pill in the header, and &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;About Devpit&lt;/strong&gt; shows the one command to upgrade. Nothing is downloaded or replaced for you.&lt;/p&gt;
&lt;p&gt;To turn it off, use &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Update check&lt;/strong&gt;, or set &lt;code dir=&quot;auto&quot;&gt;DEVPIT_NO_UPDATE_CHECK=1&lt;/code&gt;, which wins over the setting. A build made from source never checks.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;other-network-use-you-should-know-about&quot;&gt;Other network use you should know about&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Some features need the internet to do their job. They are not tracking. They are the feature:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The icon font.&lt;/strong&gt; If you choose to install it, Devpit downloads one pinned file from the Nerd Fonts project on GitHub and checks its checksum. It is only downloaded when you ask for it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The package managers.&lt;/strong&gt; When you use Update Everything or Install Developer Apps, winget, Scoop, Chocolatey and npm contact their own servers. That traffic is theirs, not Devpit’s.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;how-to-check-it-yourself&quot;&gt;How to check it yourself&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Devpit is open source. The report is defined in one place, &lt;code dir=&quot;auto&quot;&gt;internal/telemetry&lt;/code&gt;, and the rule is that adding a field means changing &lt;code dir=&quot;auto&quot;&gt;PRIVACY.md&lt;/code&gt; first. If the policy changes, the file changes in the same release, the change is listed in the release notes, and anyone who had opted in is asked again.&lt;/p&gt;
&lt;p&gt;You can also read the plain summary on the &lt;a href=&quot;https://devpit.zubyr.dev/docs/safety-and-privacy&quot;&gt;Safety and privacy&lt;/a&gt; page.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-short-checklist&quot;&gt;A short checklist&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Leave usage stats on &lt;strong&gt;No&lt;/strong&gt; if you prefer. Nothing is sent.&lt;/li&gt;
&lt;li&gt;Or set &lt;code dir=&quot;auto&quot;&gt;DO_NOT_TRACK=1&lt;/code&gt; so it is always off.&lt;/li&gt;
&lt;li&gt;Turn off the update check with &lt;code dir=&quot;auto&quot;&gt;DEVPIT_NO_UPDATE_CHECK=1&lt;/code&gt; if you want no request at all.&lt;/li&gt;
&lt;li&gt;Read &lt;code dir=&quot;auto&quot;&gt;PRIVACY.md&lt;/code&gt; and the source. They are short.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zubairbinshaukat/devpit/blob/main/PRIVACY.md&quot;&gt;Devpit PRIVACY.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zubairbinshaukat/devpit/blob/main/internal/telemetry/telemetry.go&quot;&gt;Devpit source: internal/telemetry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zubairbinshaukat/devpit/blob/main/internal/selfupdate/selfupdate.go&quot;&gt;Devpit source: internal/selfupdate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zubairbinshaukat/devpit/blob/main/docs/safety.md&quot;&gt;Devpit safety rules 19, 19a and 19b&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>privacy</category><category>telemetry</category><category>safety</category></item><item><title>Why Windows can&apos;t delete some folders, and what to do</title><link>https://devpit.zubyr.dev/docs/blog/why-windows-cannot-delete-some-folders</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/why-windows-cannot-delete-some-folders</guid><description>Three real reasons a folder will not delete on Windows, how to tell them apart, and the fix for each one.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You right-click a folder, press Delete, and Windows says no. The message is often confusing. Under the message there are only a few real reasons. If you know which one you have, the fix is short.&lt;/p&gt;
&lt;p&gt;This post covers the three most common reasons for developer folders such as &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; and build output.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;reason-1-the-path-is-too-long&quot;&gt;Reason 1: the path is too long&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The message:&lt;/strong&gt; “The source file name(s) are larger than is supported by the file system. Try moving to a location which has a shorter path name, or try renaming to shorter name(s) before attempting this operation.”&lt;/p&gt;
&lt;p&gt;Windows has an old limit called &lt;code dir=&quot;auto&quot;&gt;MAX_PATH&lt;/code&gt;. Microsoft’s documentation says it is &lt;strong&gt;260 characters&lt;/strong&gt; for a path. The count includes the drive letter, the colon, every backslash, and a hidden ending character.&lt;/p&gt;
&lt;p&gt;Nested folders grow fast. A package inside a package inside a package, all under a project that already sits in a long path, can pass the limit. Microsoft names one such case itself: cloning a Git repository that has long file names into a folder that already has a long name.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;what-windows-offers&quot;&gt;What Windows offers&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extended-length paths.&lt;/strong&gt; If a path starts with &lt;code dir=&quot;auto&quot;&gt;\\?\&lt;/code&gt;, the API accepts about 32,767 characters. Programs must ask for this form themselves.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;LongPathsEnabled&lt;/code&gt;.&lt;/strong&gt; Since Windows 10 version 1607 you can turn on long paths with a registry value. But Microsoft is clear about the catch: the value must be &lt;code dir=&quot;auto&quot;&gt;1&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; the program must declare that it supports long paths. Many programs do not, so it is not a fix for everything.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To turn it on, run PowerShell as administrator:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;New-ItemProperty&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Path &lt;/span&gt;&lt;span&gt;&quot;HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Name &lt;/span&gt;&lt;span&gt;&quot;LongPathsEnabled&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Value &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;PropertyType DWORD &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Force&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Microsoft says a restart might be needed, because some programs started before the value was set.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;what-to-try-first&quot;&gt;What to try first&lt;/h3&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Rename a parent folder to something short, or move the folder up to &lt;code dir=&quot;auto&quot;&gt;C:\p&lt;/code&gt;, then delete it.&lt;/li&gt;
&lt;li&gt;Try &lt;code dir=&quot;auto&quot;&gt;rd /s /q&lt;/code&gt; on the folder. &lt;code dir=&quot;auto&quot;&gt;rd&lt;/code&gt; is the short name of &lt;code dir=&quot;auto&quot;&gt;rmdir&lt;/code&gt;. &lt;code dir=&quot;auto&quot;&gt;/s&lt;/code&gt; removes the whole tree and &lt;code dir=&quot;auto&quot;&gt;/q&lt;/code&gt; skips the question.&lt;/li&gt;
&lt;li&gt;Use the robocopy trick below.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h3 id=&quot;the-robocopy-trick&quot;&gt;The robocopy trick&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;robocopy&lt;/code&gt; with &lt;code dir=&quot;auto&quot;&gt;/MIR&lt;/code&gt; mirrors a source into a destination and deletes destination files that are not in the source. If the source is an empty folder, the destination ends up empty:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mkdir C:\empty&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;robocopy C:\empty &quot;C:\path\to\folder&quot; /MIR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;rmdir &quot;C:\path\to\folder&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;rmdir C:\empty&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The order matters: the empty folder first, the folder to empty second. If you swap them, robocopy copies instead of deleting. Microsoft’s pages describe &lt;code dir=&quot;auto&quot;&gt;/MIR&lt;/code&gt; but do not name this trick. It is a common use of the documented behaviour. If you see a code like 1 or 3 at the end, that is fine: see &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/robocopy-exit-codes&quot;&gt;robocopy exit codes&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;reason-2-another-program-has-a-file-open&quot;&gt;Reason 2: another program has a file open&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The message:&lt;/strong&gt; a note that a file or folder is open in another program, or, from Node, &lt;code dir=&quot;auto&quot;&gt;EPERM&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;EBUSY&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Windows will not remove a file that a running program holds open. The system error behind it is number 32: “The process cannot access the file because it is being used by another process.”&lt;/p&gt;
&lt;p&gt;Typical holders are a dev server, an editor with the project open, a terminal whose current folder is inside the tree, or a build watcher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; find and close the program, then try again. Stop the dev server with &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;C&lt;/kbd&gt;. Close the editor window. Move your terminal out of the folder. If you still cannot tell who holds it, restart Windows and delete the folder before you open anything else.&lt;/p&gt;
&lt;p&gt;There is a full page for the Node version of this problem: &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/eperm-operation-not-permitted-rmdir&quot;&gt;EPERM: operation not permitted, rmdir&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;reason-3-you-dont-have-the-permission&quot;&gt;Reason 3: you don’t have the permission&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The message:&lt;/strong&gt; “Access is denied” (system error 5).&lt;/p&gt;
&lt;p&gt;A folder can belong to another user, or to an administrator session. Then a normal session cannot remove it. The fix depends on why: take ownership as the owner, or open a terminal as administrator, and only if you are sure the folder is yours to remove.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-danger-worth-knowing-links&quot;&gt;A danger worth knowing: links&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Windows has junctions and symbolic links. They look like folders, but they point to a folder somewhere else. A careless delete tool can follow the link and delete the real files it points to. Devpit’s README names this as the bug that made other cleaners delete real source code.&lt;/p&gt;
&lt;p&gt;Devpit never follows these links. It treats junctions, symlinks and other reparse points as leaves, and it refuses a path that goes through one. If you delete by hand, look at what a folder really is before you run a recursive delete.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-devpit-deals-with-it&quot;&gt;How Devpit deals with it&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://devpit.zubyr.dev/docs/features/free-up-disk-space&quot;&gt;Free Up Disk Space&lt;/a&gt; deletes folders with its own code, and it plans for all of the above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Long paths.&lt;/strong&gt; If a delete fails because the path is over the limit, Devpit retries with the extended &lt;code dir=&quot;auto&quot;&gt;\\?\&lt;/code&gt; form.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Locks.&lt;/strong&gt; Devpit renames the folder to a name ending in &lt;code dir=&quot;auto&quot;&gt;.devpit-&lt;/code&gt; and random letters before it removes anything. If a program holds a file, the rename fails at once, before a single byte is deleted. The summary says which program holds it when Windows can tell, for example “Couldn’t delete api\node_modules — it’s open in Code.exe. Close it and press R to retry.” Devpit never ends that program.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interrupted runs.&lt;/strong&gt; Because of the rename, an interrupted delete leaves a clearly named leftover, never a half-emptied folder that looks like a working one. The leftover is finished on the next start, or from Settings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Links.&lt;/strong&gt; Never followed, as described above.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;button type=&quot;button&quot; data-shot-full=&quot;/docs/_astro/blog-delete-summary.CGU_jZi4_1Ij1He.webp&quot; data-shot-width=&quot;1856&quot; data-shot-alt=&quot;Devpit summary card after a delete, naming the program that holds a locked folder open&quot; aria-haspopup=&quot;dialog&quot; aria-label=&quot;Enlarge screenshot: Devpit summary card after a delete, naming the program that holds a locked folder open&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/docs/_astro/blog-delete-summary.CGU_jZi4_Z1VMIXw.avif 480w, /docs/_astro/blog-delete-summary.CGU_jZi4_SfbVP.avif 736w, /docs/_astro/blog-delete-summary.CGU_jZi4_2vmwSf.avif 960w, /docs/_astro/blog-delete-summary.CGU_jZi4_ZCBwDt.avif 1472w&quot; type=&quot;image/avif&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;source srcset=&quot;/docs/_astro/blog-delete-summary.CGU_jZi4_Z12Hy2B.webp 480w, /docs/_astro/blog-delete-summary.CGU_jZi4_1MkmRK.webp 736w, /docs/_astro/blog-delete-summary.CGU_jZi4_Z1EJpYL.webp 960w, /docs/_astro/blog-delete-summary.CGU_jZi4_Z2o40V2.webp 1472w&quot; type=&quot;image/webp&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;img src=&quot;https://devpit.zubyr.dev/docs/_astro/blog-delete-summary.CGU_jZi4_2uJlEh.webp&quot; srcset=&quot;/docs/_astro/blog-delete-summary.CGU_jZi4_Z12Hy2B.webp 480w, /docs/_astro/blog-delete-summary.CGU_jZi4_1MkmRK.webp 736w, /docs/_astro/blog-delete-summary.CGU_jZi4_Z1EJpYL.webp 960w, /docs/_astro/blog-delete-summary.CGU_jZi4_Z2o40V2.webp 1472w&quot; alt=&quot;Devpit summary card after a delete, naming the program that holds a locked folder open&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1856&quot; height=&quot;1268&quot;&gt;&lt;/picture&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; width=&quot;14&quot; height=&quot;14&quot;&gt;&lt;path d=&quot;M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Zoom&lt;/span&gt;&lt;/button&gt;&lt;/figure&gt;
&lt;div&gt;&lt;h2 id=&quot;quick-decision-guide&quot;&gt;Quick decision guide&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You see&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;th&gt;Try&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;“source file name(s) are larger than is supported”&lt;/td&gt;
&lt;td&gt;Path over 260 characters&lt;/td&gt;
&lt;td&gt;Shorten the path, &lt;code dir=&quot;auto&quot;&gt;rd /s /q&lt;/code&gt;, or the robocopy trick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“open in another program”, EPERM, EBUSY&lt;/td&gt;
&lt;td&gt;A file is locked&lt;/td&gt;
&lt;td&gt;Close the program, restart if needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Access is denied”&lt;/td&gt;
&lt;td&gt;Permission&lt;/td&gt;
&lt;td&gt;Check the owner, then use an administrator terminal if the folder is yours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/win32/fileio/maximum-file-path-limitation&quot;&gt;Microsoft: Maximum path length limitation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/win32/debug/system-error-codes--0-499-&quot;&gt;Microsoft: System error codes 0 to 499 (5 and 32)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/rmdir&quot;&gt;Microsoft: rmdir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows-server/administration/windows-commands/robocopy&quot;&gt;Microsoft: robocopy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/answers/questions/2441993/the-source-file-name-s-are-larger-than-is-supporte&quot;&gt;Microsoft Q&amp;#x26;A: the source file name(s) error text&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zubairbinshaukat/devpit/blob/main/docs/safety.md&quot;&gt;Devpit safety rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zubairbinshaukat/devpit#safety&quot;&gt;Devpit README: Safety&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>windows</category><category>delete</category><category>long paths</category><category>troubleshooting</category></item><item><title>Windows Terminal and Nerd Fonts, done right</title><link>https://devpit.zubyr.dev/docs/blog/windows-terminal-nerd-fonts-done-right</link><guid isPermaLink="true">https://devpit.zubyr.dev/docs/blog/windows-terminal-nerd-fonts-done-right</guid><description>Boxes instead of icons? Here is what a Nerd Font is, and how to use one without giving up the font you like.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Many command-line tools now draw small icons: a folder, a git branch, a trash can. On Windows Terminal you may see empty boxes instead. Nothing is broken. The font simply has no picture for those characters.&lt;/p&gt;
&lt;p&gt;This post explains what is going on and shows two clean ways to fix it.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-a-nerd-font-is&quot;&gt;What a Nerd Font is&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A font is a set of pictures, one for each character. A &lt;strong&gt;Nerd Font&lt;/strong&gt; is a normal programming font that has been patched to add many extra icons. The Nerd Fonts project says its fonts add a high number of glyphs from popular icon fonts such as Font Awesome, Devicons and Octicons, and that the combined set is over 10,000 glyphs.&lt;/p&gt;
&lt;p&gt;The project also offers each font with different glyph widths: monospaced (fixed width), double-width, or proportional. For a terminal, fixed width is the safe one, because a terminal draws everything on a grid. An icon that is wider than one cell pushes the columns out of line.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;why-you-see-boxes&quot;&gt;Why you see boxes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Windows Terminal’s default font is &lt;strong&gt;Cascadia Mono&lt;/strong&gt;. It does not contain the Nerd Font icons. And no program can ask a terminal which fonts it has. So a tool cannot know whether icons will show up. If it draws them anyway, you get boxes.&lt;/p&gt;
&lt;p&gt;That is why many terminal tools make icons opt-in. Devpit does the same. By default it draws plain shapes such as &lt;code dir=&quot;auto&quot;&gt;▸&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;✓&lt;/code&gt;, and it only uses Nerd Font icons after you turn them on.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;fix-1-use-a-full-nerd-font&quot;&gt;Fix 1: use a full Nerd Font&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Install a Nerd Font and make it your terminal font.&lt;/p&gt;
&lt;p&gt;The Nerd Fonts project lists several ways to get one. Two that fit Windows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download a font family archive from the project’s releases page and install the font files.&lt;/li&gt;
&lt;li&gt;Use a package manager. The project’s readme mentions, as unofficial routes, Chocolatey (&lt;code dir=&quot;auto&quot;&gt;choco install nerd-fonts-hack&lt;/code&gt;) and a Scoop bucket (&lt;code dir=&quot;auto&quot;&gt;scoop bucket add nerd-fonts&lt;/code&gt;, then &lt;code dir=&quot;auto&quot;&gt;scoop install Hack-NF&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then set the font in Windows Terminal’s &lt;code dir=&quot;auto&quot;&gt;settings.json&lt;/code&gt;. To open it, select &lt;strong&gt;Settings&lt;/strong&gt; in the dropdown menu while holding &lt;kbd&gt;Shift&lt;/kbd&gt;. The stable release keeps the file at &lt;code dir=&quot;auto&quot;&gt;%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The font name goes in &lt;code dir=&quot;auto&quot;&gt;face&lt;/code&gt;, inside the &lt;code dir=&quot;auto&quot;&gt;font&lt;/code&gt; object. Put it under &lt;code dir=&quot;auto&quot;&gt;defaults&lt;/code&gt; to apply it to all profiles:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;profiles&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;font&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;face&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Hack Nerd Font&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Use the family name exactly as Windows lists it after you install the font. This method is simple. The cost is that you now use that one font everywhere.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;fix-2-keep-your-font-add-a-symbols-fallback&quot;&gt;Fix 2: keep your font, add a symbols fallback&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You may like your current font. You only need the icons from somewhere. The Nerd Fonts project has a &lt;code dir=&quot;auto&quot;&gt;SymbolsOnly&lt;/code&gt; font for exactly this. Its readme calls the method “font fallback”: when the current font lacks a glyph, the system uses another font for it. The project lists the pros and the cons honestly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pro:&lt;/strong&gt; one symbol font is enough for all your text fonts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Con:&lt;/strong&gt; scaling and placement of the fallback symbols can be hit or miss.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Windows Terminal supports this since version 1.21. Its release notes say &lt;code dir=&quot;auto&quot;&gt;font.face&lt;/code&gt; now supports comma-separated face names. The first font is the main one, and the next ones are used for missing characters:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;profiles&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;font&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;face&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Cascadia Mono, Symbols Nerd Font Mono&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Save the file. Then &lt;strong&gt;close all Windows Terminal windows and open a new one&lt;/strong&gt;. Windows Terminal reads its font list once for each process, so an open window does not pick up the change.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;let-devpit-do-fix-2&quot;&gt;Let Devpit do Fix 2&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The fallback method is exactly what Devpit does, so you do not have to edit JSON. Run:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;devpit font install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Or use &lt;strong&gt;Settings&lt;/strong&gt;, &lt;strong&gt;Icon font&lt;/strong&gt; inside Devpit.&lt;/p&gt;
&lt;figure&gt;&lt;button type=&quot;button&quot; data-shot-full=&quot;/docs/_astro/blog-settings-icon-font.DsdIKp9G_Z13j8hl.webp&quot; data-shot-width=&quot;1856&quot; data-shot-alt=&quot;Devpit Settings screen with the Icon font row that installs Symbols Nerd Font Mono&quot; aria-haspopup=&quot;dialog&quot; aria-label=&quot;Enlarge screenshot: Devpit Settings screen with the Icon font row that installs Symbols Nerd Font Mono&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/docs/_astro/blog-settings-icon-font.DsdIKp9G_Z2k3M7O.avif 480w, /docs/_astro/blog-settings-icon-font.DsdIKp9G_1NwnJd.avif 736w, /docs/_astro/blog-settings-icon-font.DsdIKp9G_1f1T8P.avif 960w, /docs/_astro/blog-settings-icon-font.DsdIKp9G_X4fjl.avif 1472w&quot; type=&quot;image/avif&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;source srcset=&quot;/docs/_astro/blog-settings-icon-font.DsdIKp9G_Z1IG38i.webp 480w, /docs/_astro/blog-settings-icon-font.DsdIKp9G_2oT7IJ.webp 736w, /docs/_astro/blog-settings-icon-font.DsdIKp9G_1PoD8m.webp 960w, /docs/_astro/blog-settings-icon-font.DsdIKp9G_ZDdgF7.webp 1472w&quot; type=&quot;image/webp&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot;&gt;&lt;img src=&quot;https://devpit.zubyr.dev/docs/_astro/blog-settings-icon-font.DsdIKp9G_Z2fQukp.webp&quot; srcset=&quot;/docs/_astro/blog-settings-icon-font.DsdIKp9G_Z1IG38i.webp 480w, /docs/_astro/blog-settings-icon-font.DsdIKp9G_2oT7IJ.webp 736w, /docs/_astro/blog-settings-icon-font.DsdIKp9G_1PoD8m.webp 960w, /docs/_astro/blog-settings-icon-font.DsdIKp9G_ZDdgF7.webp 1472w&quot; alt=&quot;Devpit Settings screen with the Icon font row that installs Symbols Nerd Font Mono&quot; sizes=&quot;(min-width: 50rem) 46rem, calc(100vw - 2rem)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1856&quot; height=&quot;1268&quot;&gt;&lt;/picture&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; width=&quot;14&quot; height=&quot;14&quot;&gt;&lt;path d=&quot;M9.5 2.5h4v4M13.5 2.5 9 7M6.5 13.5h-4v-4M2.5 13.5 7 9&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Zoom&lt;/span&gt;&lt;/button&gt;&lt;/figure&gt;
&lt;p&gt;What it does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It installs &lt;strong&gt;Symbols Nerd Font Mono&lt;/strong&gt; for your user only, so no administrator rights are needed. It downloads a pinned release of &lt;code dir=&quot;auto&quot;&gt;NerdFontsSymbolsOnly.zip&lt;/code&gt; from the Nerd Fonts project and checks its SHA-256 checksum. Devpit only keeps the one font file it needs.&lt;/li&gt;
&lt;li&gt;It adds the font to the end of Windows Terminal’s &lt;code dir=&quot;auto&quot;&gt;font.face&lt;/code&gt; list, and to every profile that already sets its own &lt;code dir=&quot;auto&quot;&gt;face&lt;/code&gt;. Your own font stays first.&lt;/li&gt;
&lt;li&gt;It saves a backup of &lt;code dir=&quot;auto&quot;&gt;settings.json&lt;/code&gt; before the first change, in a file with the ending &lt;code dir=&quot;auto&quot;&gt;.devpit-bak&lt;/code&gt;, and writes the new file safely so Windows Terminal never sees a half-written file.&lt;/li&gt;
&lt;li&gt;If it cannot read your &lt;code dir=&quot;auto&quot;&gt;settings.json&lt;/code&gt;, it leaves the file alone and gives you the JSON to paste in yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To check or undo it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;devpit font status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;devpit font remove&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;remove&lt;/code&gt; deletes the font and undoes the Windows Terminal change. If you would rather never see the font step, the installer takes a &lt;code dir=&quot;auto&quot;&gt;-NoFont&lt;/code&gt; option.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;one-rule-devpit-follows-about-icons&quot;&gt;One rule Devpit follows about icons&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Every icon Devpit draws takes exactly one cell in the terminal, and it only uses Nerd Font icons from the older private-use range that even older terminals handle as one cell. Columns always line up. If your icons look squashed or overlap, that is the hit-or-miss part of fallback fonts. Switching to a full Nerd Font (Fix 1) is the fix.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-quick-checklist&quot;&gt;A quick checklist&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Boxes mean the font is missing glyphs. Nothing else is wrong.&lt;/li&gt;
&lt;li&gt;Either use a full Nerd Font, or keep your font and add a symbols fallback.&lt;/li&gt;
&lt;li&gt;For a fallback, list your font first, then &lt;code dir=&quot;auto&quot;&gt;Symbols Nerd Font Mono&lt;/code&gt;, separated by a comma.&lt;/li&gt;
&lt;li&gt;Restart all terminal windows.&lt;/li&gt;
&lt;li&gt;No time? Run &lt;code dir=&quot;auto&quot;&gt;devpit font install&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The same steps, in a shorter form, are on the troubleshooting page: &lt;a href=&quot;https://devpit.zubyr.dev/docs/troubleshooting/nerd-font-icons-show-as-boxes-windows-terminal&quot;&gt;Nerd Font icons show as boxes in Windows Terminal&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/terminal/releases/tag/v1.21.1272.0&quot;&gt;Windows Terminal 1.21 release notes: comma-separated font face names&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/terminal/customize-settings/profile-appearance&quot;&gt;Microsoft: Windows Terminal profile appearance (font face)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/terminal/install#settings-json-file&quot;&gt;Microsoft: Windows Terminal install (settings.json)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ryanoasis/nerd-fonts&quot;&gt;Nerd Fonts readme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zubairbinshaukat/devpit/blob/main/docs/icons.md&quot;&gt;Devpit icons notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zubairbinshaukat/devpit/tree/main/internal/fonts&quot;&gt;Devpit source: internal/fonts and internal/wt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>windows terminal</category><category>nerd fonts</category><category>fonts</category><category>terminal</category></item></channel></rss>