iCloud sync too slow on Mac is annoying for anyone, but it is especially painful when your work folder is a software project. You save one file, install a package, switch a branch, or rebuild the app, and iCloud Drive spends the next hour chewing through a queue that never seems to shrink.
The usual advice is to restart the Mac, toggle iCloud Drive, or wait. Sometimes that helps. For developers, though, slow iCloud sync is often not a temporary glitch. It is a workload problem. iCloud is trying to treat dependency folders, Git internals, virtual environments, build output, cache directories, and normal source files as the same kind of data. They are not the same.
A normal document folder may contain a few hundred files. A medium Node.js project can contain 80,000 files after npm install. A Python project with .venv, caches, notebooks, and test output can create the same kind of churn. The raw size may not look scary in Finder, but the file count is brutal.
Why iCloud sync too slow on Mac usually means too many file events
Cloud sync tools do more than upload bytes. When a file changes, macOS has to notice the change, update metadata, decide whether the file is local or cloud-backed, schedule sync work, upload or download data, and reconcile state with the server. That is reasonable for photos, PDFs, Keynote decks, and notes.
Development folders behave differently. Package managers and build tools create short bursts of filesystem chaos:
npm install,pnpm install, andyarn installwrite thousands of files undernode_modules.git checkout,git rebase, andgit pullupdate files under.gitand often rewrite working-tree files.python -m venv .venvcreates an entire local Python environment that can be recreated fromrequirements.txtorpyproject.toml.- Build tools rewrite
dist,build,.next,coverage,target, and cache folders over and over.
That is why iCloud Drive can feel randomly slow even when your internet connection is fine. The bottleneck may be local scanning, hashing, file provider bookkeeping, Spotlight indexing, or server-side reconciliation. Upload bandwidth is only one part of the story.
First, confirm the slow sync is really iCloud
Before changing your project layout, check what is actually busy. Open Activity Monitor and sort by CPU, then by Network. The iCloud-related processes you will often see are bird, cloudd, and fileproviderd. Spotlight processes such as mds and mdworker may also spike because they are indexing the same files iCloud is trying to sync.
From Terminal, this gives you a quick view:
ps aux | egrep 'bird|cloudd|fileproviderd|mds|mdworker' | grep -v grep
Then check whether your project has the kind of file graph that makes iCloud miserable:
find node_modules -type f 2>/dev/null | wc -l
find .git -type f 2>/dev/null | wc -l
find .venv venv -type f 2>/dev/null | wc -l
find .next dist build coverage target -type f 2>/dev/null | wc -l
If those commands return five-digit numbers, you have found a likely cause. You can also look for files that are changing constantly:
find . -type f -mmin -10 | head -50
That command shows files modified in the last ten minutes. If the list is mostly build output, caches, or dependencies, syncing the whole project through iCloud is the wrong shape of workload.
Fix 1: pause the churn before you touch iCloud settings
If iCloud is already behind, do not keep feeding it. Stop dev servers, build watchers, test watchers, bundlers, and package installs. Anything that rewrites files every few seconds makes the queue harder to drain.
Common offenders:
npm run dev,vite,next dev, and webpack watcherspytest --watch, Jest watch mode, and coverage tools- local databases writing under the project directory
- generators that write screenshots, logs, reports, or temporary files into synced folders
Once the writers stop, give iCloud a few minutes. If the queue starts draining, the issue was not mysterious. Your tools were producing changes faster than iCloud could process them.
Fix 2: move active repositories out of iCloud Drive
The best fix is also the boring one: do not develop inside iCloud Drive. Put active repositories in a local folder such as:
~/Developer
~/Code
~/Projects
Use Git for source history and a remote host such as GitHub, GitLab, or your own server for collaboration. Use iCloud for documents, exports, notes, and archived project copies if you want, but keep the live working tree local.
This change alone solves a surprising number of slow-sync cases. iCloud stops seeing node_modules, .git, .venv, and build output as live cloud data. Your editor, package manager, test runner, and build tool can write files without making the sync engine chase every change.
Fix 3: clean generated folders before syncing a project copy
If you need a project copy in iCloud, clean it before you put it there. Keep source, docs, assets, config, and lockfiles. Remove generated files that can be recreated.
For Node.js projects:
rm -rf node_modules .next dist build coverage .turbo .parcel-cache
npm install
Do the delete before copying the project into iCloud. Then reinstall dependencies only in the local working copy, not in the synced copy.
For Python projects:
rm -rf .venv venv __pycache__ .pytest_cache .mypy_cache .ruff_cache
python3 -m venv .venv
For Ruby projects:
rm -rf vendor/bundle .bundle tmp/cache log/*.log
bundle install
This is not about saving disk space. It is about avoiding a huge sync queue made of files you do not need on another Mac.
Fix 4: use .nosync carefully
macOS generally treats files and folders ending in .nosync as excluded from iCloud Drive sync. That can help for scratch folders you control:
mkdir local-cache.nosync
mkdir tmp-exports.nosync
mkdir playground-data.nosync
Be careful with dependency folders. Renaming node_modules to node_modules.nosync will break Node's module resolution unless you add symlinks or change the workflow. That usually creates more problems than it solves.
Use .nosync for folders your own tools can reference directly. Do not use it as a magic exclude rule for package-manager internals unless you have tested the project after the rename.
Fix 5: use filtered sync instead of making iCloud handle everything
If you want a backup or mirror of your projects, sync the parts that matter. Skip the parts that are easy to recreate. rsync can do this well if you are comfortable maintaining the command:
rsync -av --delete \
--exclude 'node_modules/' \
--exclude '.git/' \
--exclude '.venv/' \
--exclude 'venv/' \
--exclude '.next/' \
--exclude 'dist/' \
--exclude 'build/' \
--exclude 'coverage/' \
~/Developer/my-app/ ~/Backups/my-app/
Run a dry run first, especially with --delete:
rsync -avn --delete \
--exclude 'node_modules/' \
~/Developer/my-app/ ~/Backups/my-app/
Look at the output before you remove -n. A wrong trailing slash or destination path can copy to the wrong place or delete files you meant to keep.
Where Lsyncer fits
Lsyncer is for the developer who wants that filtered workflow without babysitting shell scripts. It is a native macOS app that syncs folders while skipping the common junk: node_modules, .git, virtual environments, build folders, and caches. You choose the source, destination, exclusions, and schedule.
It will not make iCloud Drive a better realtime sync engine for live dependency trees. That is not the point. The better workflow is to keep active projects local, sync a clean copy somewhere useful, and leave generated folders on the machine that generated them.
Good fit
- You want clean project backups without dependency folders.
- You prefer a macOS app over a custom
rsyncscript. - You want scheduled runs and visible sync status.
- You like one-time purchases. Lsyncer is $19.99, not a subscription.
Not a good fit
- You need Dropbox-style realtime collaboration.
- You want every generated file mirrored exactly.
- Your existing backup script is tested and you enjoy maintaining it.
- You need team permissions, comments, file sharing, or cloud conflict resolution.
Best practices to speed up iCloud sync for developer workflows
- Keep live repos local. Use
~/Developeror~/Codefor active projects. - Do not sync dependency folders. Keep lockfiles such as
package-lock.json,pnpm-lock.yaml,requirements.txt, andGemfile.lock. Recreate dependencies from those. - Keep build output out of cloud folders. Folders like
.next,dist,build,coverage, andtargetare usually disposable. - Do not run watch mode inside iCloud Drive. Watchers are designed to rewrite files quickly. Cloud sync engines are designed to preserve files safely. Those goals clash.
- Use filtered backups for projects. Sync source and config, not every generated artifact.
- Check file counts before blaming the network. If a folder contains tens of thousands of files, slow sync is expected.
Related reading
- iCloud Drive not syncing on Mac explains how developer folders can make iCloud look stalled even when it is still processing.
- iCloud Drive stuck uploading on Mac covers what to do when the queue stops moving completely.
- iCloud Drive high CPU usage on Mac explains the CPU side of the same developer-folder problem.
- How to stop iCloud from syncing certain folders walks through practical exclusion options and their limits.
- Mac sync two folders compares Finder,
ditto,rsync, and filtered sync workflows.
FAQ
Why is iCloud sync so slow on my Mac?
iCloud sync can be slow because it is processing many file changes, not just uploading a large file. Developer folders with node_modules, .git, virtual environments, build output, and caches create thousands of filesystem events. iCloud has to scan, track, upload, and reconcile those changes.
How do I speed up iCloud sync on Mac?
Stop active file writers, move live development projects out of iCloud Drive, remove generated folders from synced copies, avoid running build watchers inside iCloud, and use filtered sync for project backups. Restarting may help a stuck daemon, but it will not fix a folder that keeps generating thousands of files.
Does node_modules make iCloud Drive slow?
Yes, it can. node_modules often contains tens of thousands of small files. That file count creates metadata and sync overhead even when the folder is not huge in gigabytes. Most teams should recreate node_modules from lockfiles instead of syncing it.
Should I store coding projects in iCloud Drive?
For active development, usually no. Keep repos in a local folder, use Git for source history, and use a filtered backup or sync workflow for the files you want copied elsewhere. iCloud Drive is convenient for documents, but it is a poor fit for live dependency trees and build caches.
Is Lsyncer an iCloud replacement?
No. Lsyncer is a folder sync app for macOS developers. It helps you copy or back up project folders while skipping dependency folders, Git internals, virtual environments, build output, and caches. It is not a cloud collaboration service.