Skip to content

soundkitchen/Tide

Repository files navigation

Tide

Tide は、複数台の Mac 間でフォルダを同期するための macOS 向けツールです。 バックエンドは自分自身の AWS S3 バケットを使います。メニューバーに常駐し、同期フォルダの変更を S3 へアップロード/S3 の変更を各 Mac へ反映します。クリーンインストール後の環境復旧にも利用できます。

個人利用前提のツールです。既存のファイル同期サービスに頼らず、自分の AWS アカウント(S3)の中だけで完結します。


特徴

  • 🖥 複数台の Mac 間で同期: 各 Mac で同じ S3 バケットを指定すると、同期フォルダの内容が揃う(フォルダ ⇄ バケットは 1 対 1)
  • 🔁 即時アップロード: FSEvents + デバウンスでローカル変更を検知
  • リモート反映: 起動時・スリープ/ネットワーク復帰時・定期ポーリング(既定 3 分)
  • 🚫 柔軟な除外ルール: .syncignore(gitignore 文法のサブセット)で不要なファイルを同期対象から外せる。ディレクトリごとのネスト(git 風の階層オーバーライド)にも対応(node_modules/ などの既定テンプレートも自動生成)
  • 🧷 データ損失より重複を優先: 競合時は両方を保持してリネーム
  • 🕰 S3 バージョニング前提: 削除・上書きは S3 のバージョニングで復元可能(ライフサイクルルールを自動投入)
  • 💾 クリーンインストール復旧: ローカル DB がゼロでも、S3 と AWS 認証情報だけで完全復旧
  • 🔒 機密ファイルの既定除外.env / id_rsa / *.pem など)+ パストラバーサル・シンボリックリンク対策

クライアント側暗号化・ファイルオンデマンド・複数ユーザー間コラボ・iOS 版などは対象外です。


動作要件

  • macOS 26.0 (Tahoe) 以降(それ未満は非対応)
  • 自分の AWS アカウントと、書き込み可能な S3 バケット(無い場合はアプリから作成も可能)
  • ビルド用に Xcodexcodegenbrew install xcodegen

現在は開発途中のため、配布物の提供はありません。興味を持たれた場合は手元の環境でビルドしてご利用ください。(コード署名・Notarization は不要)。


必要な AWS 権限(IAM)

セットアップで入力する 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 を参照してください。


使い方

  1. make run でアプリを起動するとメニューバーにアイコンが出ます。
  2. 初回はセットアップウィザードで、リージョン・バケット名・AWS 認証情報・同期フォルダを入力します。
    • バケットが無ければアプリから作成(バージョニング有効化・Public Access Block・ライフサイクルルールを自動設定)。
    • 既存バケットを指定すれば、そこから復元できます(別 Mac での再セットアップやクリーンインストール復旧)。
  3. 以降は同期フォルダへの変更が自動でアップロードされ、リモートの変更も自動で取り込まれます。
  4. 除外したいものは同期フォルダ直下の .syncignore に記述します(サブディレクトリにも .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・過去バージョン参照・Sync Activity・通知・パフォーマンス最適化 ✅ 完了

このほか、About / バージョン情報ウィンドウと診断エクスポート(サポート用)を備えています。

既知の制限

  • 1 フォルダ ⇄ 1 バケットのシングルユーザ運用。複数フォルダや複数ユーザ間コラボは対象外。
  • クライアント側暗号化は無し(S3 の SSE-S3 によるサーバ側暗号化のみ)。
  • 並行更新の競合解決は pull / アップロード両側で対称。複数 Mac が同じファイルを同時編集すると、 リモート版が正規パスに残り、自分の編集は (local copy …) として保持される(後勝ちでの無音消失は無い)。
  • .syncignore はディレクトリごとのネストに対応(git 風の階層オーバーライド。深い階層が浅い階層を上書き)。
  • ファイルオンデマンドや外付け / ネットワークボリュームは非対応。

ドキュメント

設計仕様は docs/ にまとまっています(00-OVERVIEW.md から順に読むのが入口)。 セキュリティレビューと対応状況は security/ を参照してください。


ライセンス

MIT License © Takanobu Izukawa

About

No description, website, or topics provided.

Resources

License

Stars

1 star

Watchers

0 watching

Forks

Packages

 
 
 

Contributors