iCloud Drive high CPU usage on Mac usually means one of Apple's sync daemons is stuck doing filesystem work: scanning, hashing, uploading, downloading, or reconciling a huge queue of file changes. For developers, the trigger is often boring and predictable. You put an active project inside iCloud Drive, run npm install, create a Python venv, switch branches, or rebuild a project, and suddenly bird, cloudd, or fileproviderd starts eating CPU.
The annoying part is that iCloud is not "wrong" from its point of view. It sees thousands of files changing and tries to keep them consistent across devices. The problem is that development folders are shaped nothing like documents. A Pages file might be one bundle. A React app can have 80,000 tiny files after dependencies and build output. That difference matters.
Why iCloud Drive high CPU usage happens with development folders
iCloud Drive is built around the assumption that most user files are worth syncing: documents, photos, spreadsheets, PDFs, notes, and small project assets. Developer folders break that assumption because they contain a mix of source code you care about and generated junk you can recreate at any time.
When you save a file in an iCloud Drive location, macOS has to notice the change, decide whether the file is local or cloud-backed, update metadata, and schedule sync work. That is fine for normal documents. It gets ugly when a tool writes thousands of files in seconds.
node_modulescan contain tens of thousands of files, many of them tiny JavaScript, JSON, TypeScript, binary, and metadata files..gitstores objects, refs, packs, hooks, index files, and lock files that change during commits, rebases, branch switches, and fetches..venv,venv, and Ruby bundle directories contain installed packages that do not need to live in iCloud.dist,build,.next,coverage,target, and cache folders can be deleted and rebuilt, but iCloud still sees them as sync candidates.
How to confirm iCloud is the process using CPU
Before changing your workflow, check the process. Open Activity Monitor and sort by CPU. The usual suspects are bird, cloudd, fileproviderd, and sometimes mds or mdworker if Spotlight is indexing the same churn. In Terminal, you can also run:
ps aux | egrep 'bird|cloudd|fileproviderd|mds|mdworker' | grep -v grep
If one of those processes is high while iCloud Drive says it is syncing, the sync engine is probably the source. If node, python, ruby, cargo, or a build tool is the top process instead, iCloud may be a secondary victim rather than the cause.
You can also check how much churn lives under your project. These commands give you a rough count of files in the directories that most often cause trouble:
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 -type f 2>/dev/null | wc -l
If those numbers are in the thousands, do not be surprised when iCloud burns CPU. It has to process the file graph, not just the bytes.
Fix 1: move active code out of iCloud Drive
The cleanest fix for iCloud Drive high CPU usage is also the least magical: do not work inside iCloud Drive. Put active repositories somewhere local, for example:
~/Developer
~/Code
~/Projects
Then keep source code in Git and treat iCloud as a place for documents, exports, and maybe archives. This avoids the worst case entirely because iCloud never sees the dependency churn.
This is the workflow I recommend if you can tolerate not having every project mirrored through iCloud automatically. It is simple, boring, and reliable. The downside is that you need a separate backup plan for your local project folder.
Fix 2: use .nosync for folders iCloud should ignore
macOS has a useful convention: files and folders ending in .nosync are treated as unsynced by iCloud Drive. For some workflows, you can rename a folder so iCloud avoids it:
mv node_modules node_modules.nosync
That sounds convenient, but package managers expect the folder to be named node_modules. Renaming it will break normal Node.js resolution unless you use symlinks or a custom setup, which is usually not worth the mess.
The .nosync trick works better for project-level scratch folders you control:
mkdir cache.nosync
mkdir exports.nosync
mkdir local-db.nosync
Use it for data you never want synced. Do not use it as a half-hidden dependency manager unless you really understand the consequences.
Fix 3: clean generated folders before they enter iCloud
If a project already lives in iCloud Drive and you need to calm the machine down now, remove generated folders and let your package manager recreate them later. For a Node.js project:
rm -rf node_modules .next dist build coverage
npm install
For Python:
rm -rf .venv venv __pycache__ .pytest_cache
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
For Ruby:
rm -rf vendor/bundle .bundle tmp/cache
bundle install
This fix is not permanent if you keep rebuilding inside iCloud Drive, but it can stop a runaway sync queue. After deleting large generated folders, give iCloud time to settle. Do not immediately start another install in the same location and expect CPU to drop.
Fix 4: use a filtered sync workflow instead of syncing everything
The more durable approach is to sync the parts of a project that matter and skip the parts that do not. That means copying source files, configuration, docs, assets, and maybe lockfiles, while excluding dependencies and build output.
You can do this with rsync if you are comfortable maintaining a 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/
This is a good command. It is also easy to get wrong. A missing trailing slash changes behavior. --delete is useful, but it can remove files at the destination if your source path is wrong. If you go this route, run a dry run first:
rsync -avn --delete --exclude 'node_modules/' ~/Developer/my-app/ ~/Backups/my-app/
Once you trust the output, remove -n.
Where Lsyncer fits
Lsyncer exists for the specific case where you want filtered folder sync on macOS without keeping fragile shell scripts around. It skips common developer junk like node_modules, .git, virtual environments, build folders, and caches, then syncs the files that are worth preserving.
That makes it a practical middle ground:
Good fit
- You want a clean backup of projects without dependency folders.
- You prefer a native macOS app over a pile of scripts.
- You want scheduled sync and visible run status.
- You would rather pay once than add another subscription.
Not the right tool
- You need realtime multi-device conflict resolution like Dropbox.
- You want to sync every generated file exactly as-is.
- You already have a tested backup script and like maintaining it.
- You need team sharing, permissions, comments, or cloud collaboration.
If iCloud Drive is spiking CPU because it is trying to sync development garbage, Lsyncer does not try to make iCloud smarter. It avoids the bad workload. Keep active projects local, sync a filtered copy where you want it, and leave generated folders on the machine that generated them.
Best practices to keep iCloud CPU quiet
- Keep active repos outside iCloud Drive. Use
~/Developeror~/Codeas your working directory. - Commit code to Git, but do not sync
.gitas a live cloud folder. Git already has its own model for history and remotes. - Exclude dependencies from backups. Keep
package-lock.json,pnpm-lock.yaml,yarn.lock,requirements.txt,pyproject.toml,Gemfile.lock, and similar files. Recreate dependencies from those. - Separate source from generated output. If a tool can rebuild a folder, it probably should not be in a cloud sync queue.
- Use dry runs before destructive syncs. Any command with
--deletedeserves a-npass first. - Watch file counts, not just size. A folder with 60,000 tiny files is a sync problem even when Finder says it is only a few hundred megabytes.
Related reading
- Why iCloud freezes your Mac when syncing node_modules explains the dependency-folder version of this problem in more detail.
- How to stop iCloud from syncing certain folders on Mac covers practical exclusion options and their limits.
- Best rsync alternative for Mac developers compares scripted sync with filtered macOS tools.
FAQ
Why is bird using so much CPU on my Mac?
bird is associated with iCloud document sync. High CPU usually means iCloud Drive is processing many file changes, stuck on a queue, or reconciling local and remote metadata. Developer folders with node_modules, .git, virtual environments, and build output are common triggers because they create thousands of filesystem events.
Can I safely force quit bird or cloudd?
You can force quit them, and macOS will usually restart them. That may temporarily lower CPU, but it does not fix the workload that caused the spike. If iCloud still has a huge queue to process, the CPU usage will often come back.
Should I put coding projects in iCloud Drive?
For active development, usually no. Store active projects in a local folder such as ~/Developer, use Git for source history, and use a filtered backup or sync workflow for the files worth preserving. iCloud Drive is convenient for documents, but it is not designed around dependency trees and build caches.
Does deleting node_modules fix iCloud Drive high CPU usage?
It can help if node_modules is the source of the sync queue. Delete it, wait for iCloud to settle, then recreate it outside iCloud Drive or use a workflow that excludes it. If you reinstall dependencies inside iCloud Drive, the same problem can return.
Is Lsyncer a replacement for iCloud Drive?
No. Lsyncer is a filtered folder sync app for macOS developers. It is useful when you want to copy or back up project folders while skipping dependency folders, Git internals, virtual environments, build output, and caches. It is not a cloud collaboration platform.