Tide は、複数台の Mac 間でフォルダを同期するための macOS 向けツールです。 バックエンドは自分自身の AWS S3 バケットを使います。メニューバーに常駐し、同期フォルダの変更を S3 へアップロード/S3 の変更を各 Mac へ反映します。クリーンインストール後の環境復旧にも利用できます。
個人利用前提のツールです。既存のファイル同期サービスに頼らず、自分の AWS アカウント(S3)の中だけで完結します。
- 🖥 複数台の Mac 間で同期: 各 Mac で同じ S3 バケットを指定すると、同期フォルダの内容が揃う(フォルダ ⇄ バケットは 1 対 1)
- 🔁 即時アップロード: FSEvents + デバウンスでローカル変更を検知
- ⏱ リモート反映: 起動時・スリープ/ネットワーク復帰時・定期ポーリング(既定 3 分)
- 🚫 柔軟な除外ルール:
.syncignore(gitignore 文法のサブセット)で不要なファイルを同期対象から外せる(node_modules/などの既定テンプレートも自動生成) - 🧷 データ損失より重複を優先: 競合時は両方を保持してリネーム
- 🕰 S3 バージョニング前提: 削除・上書きは S3 のバージョニングで復元可能(ライフサイクルルールを自動投入)
- 💾 クリーンインストール復旧: ローカル DB がゼロでも、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 # ローカル状態を全消去(設定 / DB / Keychain / キャッシュ)
make fresh # reset してから起動(新規セットアップ検証用)初回のみ、Keychain の entitlement とデバイス登録のため Xcode GUI から一度ビルドする必要があります。 詳細な手順(IAM ポリシー雛形、トラブルシュート含む)は
docs/06-SETUP-AND-BUILD.mdを参照してください。
make runでアプリを起動するとメニューバーにアイコンが出ます。- 初回はセットアップウィザードで、リージョン・バケット名・AWS 認証情報・同期フォルダを入力します。
- バケットが無ければアプリから作成(バージョニング有効化・Public Access Block・ライフサイクルルールを自動設定)。
- 既存バケットを指定すれば、そこから復元できます(別 Mac での再セットアップやクリーンインストール復旧)。
- 以降は同期フォルダへの変更が自動でアップロードされ、リモートの変更も自動で取り込まれます。
- 除外したいものは同期フォルダ直下の
.syncignoreに記述します(node_modules/などの既定テンプレートを新規バケット時に自動生成)。
| 種別 | パス |
|---|---|
| ローカル DB | ~/Library/Application Support/Tide/db.sqlite |
| キャッシュ(DL 一時) | ~/Library/Caches/Tide/ |
| AWS 認証情報 | Keychain(Data Protection Keychain) |
| S3 マニフェスト | バケット内 .tide/index.json + .tide/shards/ |
| マイルストーン | 内容 | 状態 |
|---|---|---|
| M1 | ローカル → S3 一方向アップロード | ✅ 完了 |
| M2 | ダウンロード / 復元 / ポーリング(MVP: クリーンインストール復旧) | ✅ 完了 |
| M3 | 双方向同期 / 競合解決 / マルチパート | ✅ 完了(サブ A〜E) |
| M4 | 復元 UI・バージョン参照・通知などの磨き込み | 🚧 一部着手(削除済み復元 / 過去バージョン参照 UI 実装済み) |
設計仕様は docs/ にまとまっています(00-OVERVIEW.md から順に読むのが入口)。
セキュリティレビューと対応状況は security/ を参照してください。
MIT License © Takanobu Izukawa