Apple Notes Sync

by Adam Coddington
5
4
3
2
1
Score: 50/100

Description

Your Apple Notes as markdown files in your vault

Reviews

No reviews yet.

Stats

10
stars
666
downloads
0
forks
58
days
45
days
45
days
1
total PRs
0
open PRs
0
closed PRs
1
merged PRs
3
total issues
0
open issues
3
closed issues
28
commits

Latest Version

a month ago

Changelog

Remote retitles now flow through Obsidian instead of happening behind its back: pull defers each rename to the plugin, which performs it via Obsidian's file manager so wikilinks pointing at the note are rewritten as it moves. Renames left pending by anything else - an external icloud-md run, a previously blocked target - are swept up the same way on every status refresh.

A new pre-connect toggle chooses whether filenames follow note titles (icloud-md's --filename-as-title), a whole-vault choice that only clone accepts and so has to be made before Connect.

The plugin now expects icloud-md 0.6.0 - retitles set apple-note-title instead of only renaming the file, and shared-zone pagination and body lookup are fixed - and the settings tab warns, without blocking anything, when the installed release is older or can't report a version.

minAppVersion unchanged (1.13.0).

README file from

Github

Apple Notes Sync

Sync a folder in your Obsidian vault with your Apple Notes, in both directions, from any operating system — Linux, Windows, or macOS.

This plugin is a thin Obsidian front-end for the icloud-md CLI, which turns your Apple Notes into a folder of real Markdown files and syncs your edits back to iCloud as if you'd typed them into Notes.app all along. The plugin lets you drive that from inside Obsidian — connect a folder, pull, push, and (optionally) sync on a schedule — without ever leaving your vault.

[!WARNING] This is not an official or supported Apple integration, and data loss is a real possibility. icloud-md works by reverse-engineering the private CloudKit service behind www.icloud.com/notes, and every push makes real writes to your live Notes account. Read icloud-md's own safety notice in full before you point this at notes you care about, keep the synced folder under version control (or otherwise backed up), and try a push against a disposable test note first.

Features

  • Bidirectional sync, not just export — pull remote changes and push local edits from inside Obsidian. Editing happens in your vault; the plugin reconciles both sides through icloud-md.
  • Connect a single vault folder — bind one folder to your Apple Notes and keep the rest of your vault untouched.
  • One-click actions everywhere — a ribbon icon, a status-bar item, and commands (Pull now, Push now, Reauthenticate, Show status) all open the same quick menu.
  • At-a-glance status — the status-bar item shows whether you're connected, syncing, up to date, or have local changes waiting to be pushed.
  • Optional scheduled sync — off by default. Turn it on and set how many minutes to wait between automatic pull-then-push runs.
  • Safe by construction — overlapping runs can't happen: every action (manual or scheduled) is serialized through a single queue, so a scheduled sync never collides with a button you just clicked.

Requirements

  • Desktop only. This plugin shells out to a local command-line tool, so it does not work on Obsidian mobile.

  • Node.js 20+ and the icloud-md CLI installed and on your PATH:

    npm install -g icloud-md
    

    If Obsidian can't find the binary (GUI-launched apps often don't inherit your shell's PATH), you can point the plugin at it explicitly — see Advanced settings below.

  • An Apple ID whose Notes you want to sync. Sign-in happens through Apple's own browser pages; icloud-md never sees your password. Note that it likely requires Advanced Data Protection to be disabled on the account — see the icloud-md docs.

Usage

  1. Install and enable the plugin.
  2. Open Settings → Apple Notes Sync.
  3. Enter a vault folder to sync into — an empty or new folder works best.
  4. Click Connect. This runs icloud-md clone, which opens an Apple sign-in window in your browser; sign in as you normally would (password, 2FA, whatever your account requires). The first ever run also downloads a Chromium browser for sign-in (a one-off ~150 MB fetch).
  5. Once connected, use Pull and Push from the settings tab, the ribbon icon, the status-bar item, or the commands.

Sign-ins for the same Apple ID are remembered, so you typically won't need to re-authenticate on subsequent syncs.

Settings

Once connected, the settings tab offers:

  • Pull / Push — fetch remote changes into the folder, or send local edits back to iCloud.
  • Reauthenticate — force a fresh Apple sign-in for this folder, e.g. if a session goes stale.
  • Disconnect — forget the binding and stop auto-sync. This is plugin-local only: your synced files and your iCloud-side sign-in are left untouched, so you can reconnect later.
  • Sync automatically — off by default. When enabled, the plugin pulls then pushes on a fixed interval, and an Auto-sync interval field lets you set the number of minutes between runs.

Advanced settings

  • icloud-md binary location — leave blank to use icloud-md from your PATH, or set an explicit path if Obsidian can't find it. The directory containing it is added to PATH automatically, so with a Node version manager this also lets icloud-md find the node sitting beside it.
  • Extra PATH entries — directories to prepend to PATH when spawning icloud-md (for example, wherever your Node version manager installs global binaries). Useful because a GUI-launched Obsidian doesn't inherit your shell's PATH. Separate multiple directories the way your platform's PATH does: with ; on Windows, : elsewhere.

Finding the right values:

Platform Command Typical result
macOS / Linux which icloud-md /Users/you/.nvm/versions/node/v24.14.1/bin/icloud-md
Windows where icloud-md C:\Users\you\AppData\Roaming\npm\icloud-md.cmd

Commands

Command Action
Pull now Fetch remote changes into the connected folder.
Push now Send local edits back to iCloud.
Reauthenticate Force a fresh Apple sign-in for the connected folder.
Show status Report whether you're up to date or have pending changes.

How it works

The plugin does not talk to iCloud itself. It spawns the icloud-md CLI with its --json flag and parses the structured results, streaming progress back into Obsidian's UI. All the real work — authentication, the CloudKit protocol, three-way merges, conflict handling, version history — lives in icloud-md. See its documentation for the full picture of what happens under the hood and what the safety guarantees are.

Development

npm install
npm run lint
npm run typecheck
npm test
npm run build
  • npm run dev — rebuild on change during development.
  • npm run build — production bundle (main.js).
  • npm test — unit tests for the pure logic (CLI protocol parsing and the sync queue), run with tsx --test.

To try it in a real vault, symlink or copy main.js, manifest.json, and styles.css into <vault>/.obsidian/plugins/icloud-notes/ and reload Obsidian.

License

MIT