Pure Swift macOS 26+ menu bar app that mounts Backblaze B2 buckets as local Finder volumes using Apple's FSKit framework. Browse, read, write, and delete files as if they were on a local disk. No FUSE, no kernel extensions, no Electron.
- macOS 26 (Tahoe) or later
- Enable the FSKit extension after install: System Settings -> General -> Login Items & Extensions -> CloudMount
brew install ebreen/cloudmount/cloudmountDownload the latest DMG: https://github.com/ebreen/cloudmount/releases
Open the DMG and drag CloudMount to Applications.
brew install xcodegen create-dmg
xcodegen generate
xcodebuild archive \
-project CloudMount.xcodeproj \
-scheme CloudMount \
-configuration Release \
-archivePath build/CloudMount.xcarchive- Launch CloudMount -- it appears in your menu bar (no Dock icon).
- If the FSKit extension isn't enabled, an onboarding screen guides you to System Settings.
- Open Settings -> Credentials and add your Backblaze B2 application key ID + key.
- Add a bucket in Settings -> Buckets, choose a mount point (default:
/Volumes/<bucket>). - Click Mount. Your bucket appears in Finder.
mount -t b2 b2://my-bucket /Volumes/my-bucket
diskutil unmount /Volumes/my-bucket- Mount B2 buckets as native macOS volumes visible in Finder and
diskutil. - Browse directories, open files, drag-and-drop -- it's a regular folder.
- Read files on open, write back to B2 on close (download-on-open / write-on-close).
- Delete files and create directories through Finder.
- On-disk file cache with LRU eviction (default 1 GB,
~/Library/Caches/CloudMount/). - In-memory metadata cache reduces B2 API calls (default 5 min TTL).
- macOS metadata suppression (
.DS_Store,._*,.Spotlight-V100, etc.) to minimize API noise. - Secure credential storage in macOS Keychain -- never in config files.
- Automatic B2 token refresh with retry on auth expiry.
- Upload retry with fresh upload URL on transient failures.
- Sparkle auto-updates -- checks for new versions automatically.
- Launch at Login option in Settings.
- Signed, notarized, and stapled for Gatekeeper.
- No Dock icon, minimal UI, lives entirely in the menu bar.
CloudMount is a three-target Xcode project generated by XcodeGen:
CloudMount.app
├── CloudMount Menu bar app (SwiftUI)
│ Manages accounts, settings, mount/unmount via Process,
│ monitors volume events via NSWorkspace notifications.
│
├── CloudMountExtension FSKit filesystem extension (XPC)
│ Implements FSUnaryFileSystem for the b2:// URL scheme.
│ Handles all file operations: lookup, enumerate, read,
│ write, create, delete, rename. Runs sandboxed.
│
└── CloudMountKit Shared framework
B2 API client, auth manager, credential store,
metadata cache, file cache, shared config.
The extension runs as an XPC service managed by macOS. When you mount a b2:// URL, the kernel routes filesystem operations to the extension. No daemon process, no socket IPC, no polling -- it's native.
| Operation | Strategy |
|---|---|
| Read | Download to local staging on open, read from disk |
| Write | Write to local staging, upload to B2 on close |
| Delete | b2_delete_file_version (permanent) |
| Mkdir | Zero-byte marker with application/x-directory content type |
| Rename | Server-side copy + delete original |
| Dir rename | Not supported (B2 limitation) |
- Backblaze B2 only -- S3-compatible providers planned.
- Directory rename not supported -- B2 has no rename primitive; file rename uses copy+delete.
- No symlinks or hard links -- B2 is a flat object store.
CloudMount reads/writes only to the Keychain (credentials), App Group UserDefaults (mount configs), and your chosen mount points. No telemetry, no analytics, no network calls except to the B2 API and Sparkle update feed.
- Mountain Duck -- Commercial alternative that inspired this project.
- rclone -- CLI tool for cloud storage (sync approach, not native mount).
MIT -- Eirik Breen (ebreen)