A small window into Apple's walled garden. Keep your Apple Notes, Reminders, Passwords and Photos in sync with other services. Mainly targeted towards Nextcloud (reminders, notes, photos) and Bitwarden/Vaultwarden (passwords) - however, can easily be used for any other services too.
iCloudBridge is in no way affiliated with or endorsed by Apple, Inc.
-
ποΈ Apple Notes can be synced with a folder containing Markdown files. If using Nextcloud, this can then be synced to your instance and used via the Nextcloud Notes app. Supports images, URLs, attachments, folders and checkboxes (TODO items).
-
π Apple Reminders can be synced with a CalDAV server, such as the one provided by Nextcloud. Supports due dates, notes, folders, recurring reminders & completion status.
-
πΈ Apple Photos sync. This one is quite specific to Nextcloud. When the Nextcloud app is installed on iOS, it can automatically upload photos to Nextcloud - however - it is a one-way sync. Photos added on Nextcloud are not synced back to your Apple Photos library. iCloudBridge fixes this by downloading new photos from Nextcloud and adding them to Apple Photos. Bidirectional sync is also supported - export photos from Apple Photos (including shared family libraries) back to Nextcloud.
-
π Apple Passwords can be synced with Bitwarden or Vaultwarden, or optionally Nextcloud passwords. Supports all common fields and TOTP codes. This is a manual sync, but iCloudBridge tries to make it as easy as possible.
-
iCloudBridge requires a macOS machine to run on. The machine does not need to be always on, but the syncs will only run when it is powered on (duh!). A macOS VM is also possible, but not officially supported.
-
Apple Notes: Whilst TODO items are supported, there is a limitation that when a todo item is checked (i.e. marked as completed), iCloudBridge cannot directly update the note to reflect this (this is currently not possible - believe me, I've tried). Instead, iCloudBridge will prepend a β to the start of the line. This is not ideal, but is the best that can be done for now. Sub-folders are also only partially supported at this time, but this may be improved in future.
-
Apple Photos: Sync is additive only - deletions or modifications are not synced. When importing, photos always go to your personal library (not shared library) - this is an Apple limitation. When exporting, the default "going forward" mode only exports new photos added after enabling export.
-
Apple Passwords: At this time, only manual syncs are supported. No automatic or scheduled syncs. Passkeys are also not synced at this time. It is also recommended to use Bitwarden or Vaultwarden, as Nextcloud Passwords does not support TOTP.
Grab the latest release, then double-click!
iCloudBridge features a web-based GUI. After launching the app, click on the menubar icon and select "Open WebUI". For documentation on how to use the WebUI, see the User Guide.
iCloudBridge can also be run from the command line. For documentation on how to use the command line interface, see the Usage guide.
iCloudBridge is a one-man show - I basically built this to scratch my own itch. However, if you find it useful and would like to contribute, please feel free to open issues or pull requests on GitHub.
- Backend: Python 3.11+ with FastAPI, packaged with PyInstaller
- Frontend: React + TypeScript with Vite, TailwindCSS, and shadcn/ui components
- Desktop App: Swift-based macOS menubar app
- Build Tool: Just command runner for task automation
- Apple Integration: PyObjC for Notes/Reminders, AppleScript for Photos, native Shortcuts for Passwords
Before you begin, ensure you have:
- macOS 13.0+ (Ventura or later)
- Xcode Command Line Tools: Install with
xcode-select --install - Python >= 3.11:
brew install python3 - Poetry: Python dependency management -
pipx install poetry - Node.js 18+:
brew install node - Ruby >= 3.0: For Notes Ripper -
brew install ruby - Just: Command runner -
brew install just
Quick install (Homebrew):
brew install python3 node just ruby
pipx install poetry
just install-
Clone the repository
git clone https://github.com/keithvassallomt/icloudbridge.git cd icloudbridge -
Install dependencies
# Install backend dependencies just install # Install frontend dependencies npm --prefix frontend install
-
Run the development environment
Open two terminal windows/tabs:
Terminal 1 - Backend (FastAPI server with hot reload):
just dev
Backend runs on
http://localhost:8000with/api/*and WebSocket at/api/wsTerminal 2 - Frontend (Vite dev server):
npm --prefix frontend run dev
Frontend runs on
http://localhost:3000with API proxy to backendNavigate to
http://localhost:3000in your browser to see the WebUI. -
Optional: Activate Poetry shell
For running ad-hoc commands or debugging:
poetry shell
Before committing, ensure your code passes quality checks:
# Run linter
just lint
# Auto-format code
just format
# Run tests
just testiCloudBridge offers several build configurations:
Debug Build (ad-hoc signed, no DMG):
just build-debugOutput: build/Debug/iCloudBridge.app
Production Build (Developer ID signed, no DMG):
just buildOutput: build/Release/iCloudBridge.app
Full Release (signed + notarized DMG):
just releaseOutput: dist/iCloudBridge.dmg
Backend Only (PyInstaller):
just build-backendOutput: dist/icloudbridge-backend
just cleanRemoves build/, dist/, DMG files, and Python cache.
After building a production app:
just verify-signingValidates code signature and Gatekeeper acceptance.
icloudbridge/
βββ icloudbridge/ # Python backend source
β βββ api/ # FastAPI routes
β βββ services/ # Sync logic (notes, reminders, photos, passwords)
β βββ models/ # Pydantic models
β βββ utils/ # Helpers and utilities
βββ frontend/ # React frontend
β βββ src/
β β βββ components/ # React components
β β βββ pages/ # Page components
β β βββ hooks/ # Custom hooks
β β βββ lib/ # Utilities and API client
β β βββ store/ # Zustand state management
β βββ public/ # Static assets
βββ macos/ # macOS menubar app
β βββ MenubarApp/ # Swift menubar application
βββ scripts/ # Build and automation scripts
βββ docs/ # User documentation
βββ justfile # Task runner configuration
βββ pyproject.toml # Python dependencies
Backend Services:
notes.py- Apple Notes sync using PyObjCreminders.py- CalDAV sync for Apple Remindersphotos.py- Photo library sync via AppleScriptpasswords.py- Password sync using Shortcuts automation
Frontend Pages:
- Dashboard, Notes, Reminders, Photos, Passwords, Schedules, Logs, Settings
API Endpoints:
- REST API at
/api/*for CRUD operations - WebSocket at
/api/wsfor real-time sync updates
- Backend logs: Backend server logs appear in the terminal running
just dev - Frontend debugging: Use React DevTools and browser console
- WebSocket issues: Check WebSocket connection status in the sidebar footer
- Build issues: Try
just cleanbefore rebuilding - Permission errors: Ensure Full Disk Access is granted in System Settings > Privacy & Security
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Run quality checks:
just lint && just test - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
Note: All PRs should pass linting and tests before merging.
For maintainers creating a release:
- Update version in
pyproject.tomlandfrontend/src/components/Layout.tsx - Build and notarize:
just release - Create GitHub release with
dist/iCloudBridge.dmg - Update documentation site if needed
iCloudBridge uses some existing open-source code created by the fantastic community. In particular:
- Apple Cloud Notes Parser - a fantastic project which decodes as much as possible of Apple's arcane Notes format.
- /u/z1ts on Reddit, who created a fantastic sample Apple Shortcut for how to add rich content to Apple Notes (see their Reddit Post).
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.