はじめに
ObsidianをiCloudで同期しながら、ClaudeやCursorと連携したいけど、なかなかできないもどかしさがありました。
iPhoneから扱おうとすると、Claudeにアップロードしたり、CursorだとGIthubが前提となります。
調べると「GitHub移行しろ」という記事が多いですが、iPhoneで毎日Obsidianを使っている身からすると、iCloudの安定性を捨てるのは正直きついです。Working Copyという選択肢もありますが5,500円かかります。
試行錯誤の末、iCloudはそのまま、GitHubは別リポジトリという構成に落ち着きましたので、今回紹介したいと思います。
構成の全体像
iPhone / Mac
↕ iCloud(Obsidianネイティブ同期)
Mac(iCloud Vault)
↓ rsync + launchd(15分おき・単方向・特定フォルダのみ)
Mac(obsidian-backup/)
↓ git push
GitHub
↑↓ AIエージェント(ai-output/ のみ書き込み)
↓ git pull → rsync
Mac(obsidian-backup/)
↓ rsync(逆方向・特定フォルダのみ)
iCloud Vault
ポイントはObsidianとGitを完全に分離していることです。Obsidianは一切GitHubを知りません。
なぜconflictが起きないのか
よくあるconflictの原因は「複数の主体が同じファイルを書き換えること」です。
この構成では書き込み権限をディレクトリで分離しています。
| ディレクトリ | 書き込む主体 |
|---|---|
| notes/ daily/ 等 | Obsidianのみ |
| ai-output/ | AIエージェントのみ |
同じファイルを複数の主体が触らないので、conflictが構造的に発生しません。
sync.shの実装
#!/bin/bash
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:$PATH"
set -e
ICLOUD_VAULT="$HOME/Library/Mobile Documents/iCloud~md~obsidian/Documents/YOUR_VAULT_NAME"
GITHUB_DIR="/Users/YOUR_USERNAME/Documents/obsidian-backup"
LOG="$GITHUB_DIR/sync.log"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] sync start" >> "$LOG"
# 1. GitHubの最新を取得
cd "$GITHUB_DIR"
git pull origin main >> "$LOG" 2>&1
# 2. iCloud → GitHub(全ノート・単方向)
rsync -av --delete \
--exclude='.git/' \
--exclude='.obsidian/' \
--exclude='.DS_Store' \
--exclude='ai-output/' \
--exclude='AGENTS.md' \
--exclude='CLAUDE.md' \
--exclude='sync.sh' \
--exclude='.gitignore' \
--exclude='sync.log' \
"$ICLOUD_VAULT/" "$GITHUB_DIR/" >> "$LOG" 2>&1
# 3. GitHub → iCloud(AIが書いたファイルのみ逆方向コピー)
rsync -av \
"$GITHUB_DIR/ai-output/" "$ICLOUD_VAULT/ai-output/" >> "$LOG" 2>&1 || true
# 4. 変更があればcommit & push
git add .
if git diff --cached --quiet; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] no changes" >> "$LOG"
else
git commit -m "sync: $(date '+%Y-%m-%d %H:%M')"
git push origin main
echo "[$(date '+%Y-%m-%d %H:%M:%S')] pushed" >> "$LOG"
fi
YOUR_USERNAMEはMacのユーザー名、YOUR_VAULT_NAMEはObsidianのVault名に置き換えてください。Vault名は以下のコマンドで確認できます。
ls ~/Library/Mobile\ Documents/iCloud~md~obsidian/Documents/
--deleteオプションで転送元にないファイルは転送先からも削除されます。.git/の除外を忘れると.gitごと消えてしまうので注意してください。
launchdで自動化
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.obsidian.sync</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/YOUR_USERNAME/Documents/obsidian-backup/sync.sh</string>
</array>
<key>StartInterval</key>
<integer>900</integer>
<key>RunAtLoad</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/obsidian-sync.log</string>
<key>StandardErrorPath</key>
<string>/tmp/obsidian-sync.err</string>
</dict>
</plist>
launchctl load ~/Library/LaunchAgents/com.obsidian.sync.plist
フルディスクアクセスが必要です。 システム設定 → プライバシーとセキュリティ → フルディスクアクセス → /bin/bashを追加してください。
AIエージェント向けの設定ファイル
GitHubリポジトリのルートに2つ置きます。CLAUDE.mdはClaude Code用、AGENTS.mdはCursor用で、内容は共通で問題ありません。
## Repository Structure
- ai-output/ : 書き込みOK(唯一の書き込み可能ディレクトリ)
- それ以外 : READ ONLY
## ルール
- ai-output/ 以外には絶対に書き込まない
- 新しいディレクトリが増えても同様にREAD ONLY
ハマりどころ
.git/をrsyncで消してしまった
--deleteオプションはiCloud側にないファイルをGitHub側から消します。.git/の除外を忘れると.gitディレクトリごと消えてfatal: not a git repositoryになります。
launchdでOperation not permitted
手動実行は通るのにlaunchdだと失敗します。フルディスクアクセスに/bin/bashを追加することで解決しました。
launchdでgit secretsエラー
手動実行と違い、launchdは$PATHが最小構成です。Homebrewでインストールしたツールが見つからずエラーになります。sync.sh冒頭に明示的にPATHを設定することで解決しました。
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:$PATH"
まとめ
- iCloudはそのまま使えます(iPhone安定)
- GitHubは完全に別リポジトリです(Obsidianが触らない)
- 書き込み主体をディレクトリで分離することでconflictを解消しています
- Claude Code・Cursorどちらも即使えます
- 追加コストゼロです
iPhoneで毎日Obsidianを使いながらAI連携したい方の参考になれば幸いです。