Start a 14-day trial
Xcode
Apple's developer IDE

Back up Xcode on Mac.

Back up Xcode projects, provisioning profiles, and Swift package resolutions without dragging DerivedData along for the ride.

Handles:.xcodeproj.xcworkspace.swift.swiftpm.storyboard

No card required

Why Xcode is hard to back up

Git covers your source. It does not cover the rest of what makes a Mac a working Xcode environment. ~/Library/Developer/Xcode/DerivedData grows into tens of gigabytes of build intermediates that regenerate on the next build. Simulator runtimes and their on-disk state can be dozens of gigabytes per installed iOS version. Provisioning profiles at ~/Library/MobileDevice/Provisioning Profiles are the quiet reason a clean-room Mac cannot build-and-sign a release for three hours. Swift Package Manager’s resolved package cache, custom Instruments templates, user-defined build settings, and code-signing identities in the login keychain are all easy to forget. Copy everything and the backup is enormous and slow. Copy only your source and the restored Mac is useless until a day of reinstalling tooling.

How macup handles it

macup excludes DerivedData, Simulator device data, Swift package build caches, and Module Cache by default — they regenerate, they are huge, and they churn on every compile. What it includes is the tooling state that matters: provisioning profiles, custom Instruments templates, Xcode user preferences, and your local Git repositories. If you keep clones outside ~/Documents, add their parent directory.

Swift Package dependency caches at ~/Library/Caches/org.swift.swiftpm are excluded because Package.resolved plus a fresh resolve rebuilds them. But the .swiftpm directory inside each project, which carries workspace state and user-scheme data, is captured along with the repo.

Continuous backup watches while you work. Because chunked deduplication operates on file contents, switching branches and rebuilding does not balloon the set. Large build-artifact directories stay excluded across branches because the exclude rules are glob-based, not path-snapshotted.

A backup set configured like this covers the important things and skips the regeneratable ones:

xcode.backup-set.yamlyaml
name: Xcode work
include:
- ~/Documents/Developer
- ~/GitHub
- ~/Library/MobileDevice/Provisioning Profiles
- ~/Library/Developer/Xcode/UserData
- ~/Library/Developer/Xcode/Templates
- ~/Library/Application Support/Instruments
exclude:
- "**/DerivedData/**"
- "**/.build/**"
- "**/build/**"
- "**/*.xcodeproj/xcuserdata/**"
- "**/*.xcworkspace/xcuserdata/**"
- "**/ModuleCache.noindex/**"
- "**/CoreSimulator/Devices/**"
- "**/Caches/org.swift.swiftpm/**"
schedule:
mode: continuous
debounceSeconds: 45
quietHours: 02:00-06:00
destination: s3-compatible
retention:
daily: 30
weekly: 26
monthly: 24

Tune further in the macup dashboard per destination.

What you get back

You boot a fresh Mac, install Xcode, run one restore, and the provisioning profiles, Instruments templates, and repositories land where Xcode expects them. The first build of your flagship project takes a while because DerivedData has to rebuild. Then it is a normal development Mac — not a weekend project.

Back up Xcode like it matters.

14-day trial. Restore a file. See the difference.