Tide は、複数台の Mac 間でファイルを同期するための macOS 向けツールです。 バックエンドは自分自身の AWS S3 バケットを使います。メニューバーに常駐し、Finder サイドバー「場所」に現れる Tide フォルダ(File Provider ドメイン)を通じてファイルを読み書きすると、その変更が S3 と各 Mac に反映されます。クリーンインストール後の環境復旧にも利用できます。
個人利用前提のツールです。既存のファイル同期サービスに頼らず、自分の AWS アカウント(S3)の中だけで完結します。
- 📁 ファイルオンデマンド: ファイルは dataless プレースホルダとして一覧され、開いた瞬間に S3 からダウンロードされる(ディスクを圧迫しない)。実体化状態はバッジで表示され、「ダウンロードを削除」でいつでもオンラインのみに戻せる
- 🖥 複数台の Mac 間で同期: 各 Mac で同じ S3 バケットを指定すると、Tide フォルダの内容が揃う(フォルダ ⇄ バケットは 1 対 1)
- 🔁 即時アップロード: Tide フォルダでの作成・編集・削除・リネームを File Provider 拡張が S3 へ直接反映
- ⏱ リモート反映: 起動時・スリープ/ネットワーク復帰時・定期チェック(既定 3 分・マニフェストの ETag 比較による軽量検知)
- 🚫 柔軟な除外ルール:
.syncignore(gitignore 文法のサブセット)で不要な新規ファイルを同期対象から外せる。ディレクトリごとのネスト(git 風の階層オーバーライド)にも対応(node_modules/などの既定テンプレートを新規バケット時に自動生成) - 🧷 データ損失より重複を優先: 競合時は両方を保持してリネーム
- 🕰 S3 バージョニング前提: 削除・上書きは S3 のバージョニングで復元可能(ライフサイクルルールを自動投入)。過去バージョン・削除済みファイルの復元 UI あり
- 💾 クリーンインストール復旧: S3 と AWS 認証情報だけで完全復旧(ローカル状態は不要)
- 🔒 機密ファイルの既定除外(
.env/id_rsa/*.pemなど)+ パストラバーサル・シンボリックリンク対策
クライアント側暗号化・複数ユーザー間コラボ・iOS 版などは対象外です。
- macOS 26.0 (Tahoe) 以降(それ未満は非対応)
- 自分の AWS アカウントと、書き込み可能な S3 バケット(無い場合はアプリから作成も可能)
- ビルド用に Xcode と xcodegen(
brew install xcodegen)
プレビルドの配布物はありません。興味を持たれた場合は手元の環境でビルドしてご利用ください(コード署名・Notarization は不要)。
セットアップで入力する AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY には、同期対象バケットへの読み書きに加え、初回プロビジョニング(バケット作成・バージョニング有効化・ライフサイクル / Public Access Block の設定)を行う権限が必要です。
最も簡単なのは、AWS マネージドポリシー AmazonS3FullAccess を Tide 専用の IAM ユーザーにアタッチする方法です(上記の操作をすべて含みます)。
権限を絞りたい場合は、対象バケットだけに限定した最小権限ポリシー(s3:ListBucket / s3:GetObject / s3:PutObject / s3:DeleteObject / s3:GetBucketVersioning / s3:PutBucketVersioning / s3:GetLifecycleConfiguration / s3:PutLifecycleConfiguration / s3:PutBucketPublicAccessBlock ほか、アプリからバケットを作成する場合は s3:CreateBucket)を docs/06-SETUP-AND-BUILD.md に用意しています。
⚠️ 静的アクセスキーは流出時の被害が大きい(バケット内ファイルの全消去まで可能)ため、Tide 専用の IAM ユーザーに付与し、可能なら対象バケットに限定したポリシーを推奨します。
開発タスクはすべて Makefile 経由です。make help で一覧を表示できます。
make build # Debug ビルド
make test # ユニットテスト
make run # ビルドして起動
make run-ja # 日本語ロケールで起動
make run-en # 英語ロケールで起動
make reset # ローカル状態を全消去(設定 / Keychain / キャッシュ等)
make fresh # reset してから起動(新規セットアップ検証用)初回のみ、Keychain の entitlement とデバイス登録のため Xcode GUI から一度ビルドする必要があります。 詳細な手順(IAM ポリシー雛形、トラブルシュート含む)は
docs/06-SETUP-AND-BUILD.mdを参照してください。
make runでアプリを起動するとメニューバーにアイコンが出ます。- 初回はセットアップウィザードで、AWS 認証情報・リージョン・バケット名を入力します(ローカルの同期フォルダ選択はありません)。
- バケットが無ければアプリから作成(バージョニング有効化・Public Access Block・ライフサイクルルールを自動設定)。
- 既存バケットを指定すれば、そこから復元できます(別 Mac での再セットアップやクリーンインストール復旧)。
- ウィザードの案内に従い、システム設定 > ログイン項目と機能拡張 > ファイルプロバイダで Tide の拡張を有効にします(OFF のままだと同期が始まりません。稼働後に OFF になった場合はメニューバー表示と通知で警告されます)。
- Finder サイドバー「場所」の Tide フォルダが同期面です。ここでのファイル操作が S3 へ反映され、リモートの変更も自動で現れます。ファイルは開いた瞬間にダウンロードされ、「ダウンロードを削除」でオンラインのみに戻せます。
- 除外したいものは Tide フォルダ内の
.syncignoreに記述します(新規ファイルにのみ適用。サブディレクトリにも.syncignoreを置けば、その配下に階層適用されます)。
| 種別 | パス |
|---|---|
| 同期面(Tide フォルダ) | ~/Library/CloudStorage/Tide-Tide/(Finder では「場所」の Tide) |
| 設定・状態 | App Group コンテナ(~/Library/Group Containers/G5G54TCH8W.org.izukawa.Tide/) |
| AWS 認証情報 | Keychain(Data Protection Keychain) |
| S3 マニフェスト | バケット内 .tide/index.json + .tide/shards/ |
| マイルストーン | 内容 | 状態 |
|---|---|---|
| M1 | ローカル → S3 一方向アップロード | ✅ 完了 |
| M2 | ダウンロード / 復元 / ポーリング(MVP: クリーンインストール復旧) | ✅ 完了 |
| M3 | 双方向同期 / 競合解決 / マルチパート | ✅ 完了(サブ A〜E) |
| M4 | 復元 UI・過去バージョン参照・Sync Activity・通知・パフォーマンス最適化 | ✅ 完了 |
| M5 | ファイルオンデマンド(File Provider・双方向書込・実体化バッジ・evict) | ✅ 完了 |
| v0.3.0 | File Provider モードへの一本化(旧 FSEvents モードをユーザー目線から削除) | ✅ 完了 |
このほか、About / バージョン情報ウィンドウと診断エクスポート(サポート用)を備えています。
- 1 フォルダ ⇄ 1 バケットのシングルユーザ運用。複数フォルダや複数ユーザ間コラボは対象外。
- クライアント側暗号化は無し(S3 の SSE-S3 によるサーバ側暗号化のみ)。
- 並行更新の競合解決は両側で対称。複数 Mac が同じファイルを同時編集すると、
リモート版が正規パスに残り、自分の編集は
(local copy …)として保持される(後勝ちでの無音消失は無い)。 .syncignoreはディレクトリごとのネストに対応(git 風の階層オーバーライド。深い階層が浅い階層を上書き)。- 複数 Mac 同時運用の長期耐久(2 台 soak)は未実施(1 台・1 週間のライブ soak は合格済み)。
- 旧 FSEvents(folderSync)モードは v0.3.0 でユーザー目線から削除(コードは温存・復帰は git revert のみ)。
設計仕様は docs/ にまとまっています(docs/README.md が概観と索引の入口)。
セキュリティレビューと対応状況は security/ を参照してください。
MIT License © Takanobu Izukawa