local-first について
local-firstは、ローカルデータベースをUIのデータ源とし、変更をバックグラウンドで同期するアプリ設計のガイドスキルです。オフライン対応、応答性、データモデル、同期、競合処理の検討に役立ちます。
主な機能
- 01ローカルファーストとサーバー型の選択
- 02読み書き経路の設計
- 03同期エンジンとクライアントストレージの選択肢
- 04競合解決の戦略
- 05部分レプリケーションとスキーマ移行の指針
- 06オンライン・オフラインのテスト方法
活用シーン
- 01オフライン対応アプリのアーキテクチャ選定
- 02同期と競合処理の設計
- 03データパターンに応じたクライアントストレージ選定
- 04サーバーファースト設計からの移行計画
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ oakoss/ agent-skills --skill local-firstインストール後、Claude Code で/local-firstを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/architecture-patterns.mdclient-storage.mdconflict-resolution.mddevtools-debugging.mdencryption.mdmigration-guide.mdmulti-tenant.mdoffline-patterns.mdschema-evolution.mdsync-engines.mdtesting.md詳細
ローカルファースト
概要
ローカルファーストとは、アプリケーションがローカルデータベースに対して読み書きを行い、変更内容をバックグラウンドでサーバーと同期するアーキテクチャです。ローカルデータベースを UI の信頼できる唯一の情報源とすることで、デフォルトで即時の読み取り、オフライン対応、楽観的な書き込みを実現します。
使用する場面: オフライン対応が必要な共同作業アプリ、即時応答が重要なレイテンシに敏感な UI、ネットワーク環境が不安定なアプリ、リアルタイムのマルチプレイヤー機能、接続が断続的になるモバイルアプリ。
使用しない場面: 安定した接続環境で使うシンプルな CRUD アプリ、サーバーが権威を持つワークフロー(決済、在庫管理)、インタラクティブ性が最小限のコンテンツ中心のサイト、画面を描画するたびにサーバーから取得した最新データが不可欠なアプリ。
クイックリファレンス
| 判断項目 | 選択肢 | 主な検討事項 |
|---|---|---|
| アーキテクチャモデル | サーバーベース、ローカルファースト、ハイブリッド | オフライン対応の必要性とレイテンシの許容度で選択する |
| 読み取り経路 | サーバーから取得、ローカル DB を読み取り、キャッシュ後にネットワークから取得 | ローカル読み取りは即時。サーバー読み取りはネットワーク完了まで待つ |
| 書き込み経路 | サーバーへの変更、楽観的更新、ローカルファーストの書き込み | ローカル書き込みは失敗せず、同期によって配信される |
| 同期エンジン | Electric、Zero、PowerSync、Replicache、LiveStore | Postgres との統合か、フレームワークに依存しない設計か |
| クライアントストレージ | IndexedDB、OPFS、SQLite WASM、PGlite | 容量制限、クエリ機能、ブラウザーのサポート |
| 競合解決 | LWW、CRDT、サーバー優先、フィールド単位のマージ | 複雑さと正確性のトレードオフ |
| データモデル | 正規化テーブル、ドキュメントストア、CRDT ドキュメント | 最適なモデルはクエリのパターンで決まる |
| 部分レプリケーション | Shapes、サブスクリプション、クエリベースの同期 | クライアントに必要なデータのみを同期する |
| 段階的な機能強化 | サーバーファーストとローカルキャッシュ、完全なローカルファースト | シンプルに始め、段階的にローカルファーストを取り入れる |
| CQRS の分離 | 読み取り/書き込みモデルを分離、統合モデル | ローカルファーストでは読み取りと書き込みが自然に分離される |
| 初期同期 | 完全なスナップショット、差分、段階的な読み込み | 初回読み込みのパフォーマンスと完全性のバランス |
| 認証との統合 | トークンベースの Shape フィルタリング、行レベルセキュリティ | セキュリティはクライアントではなく同期レイヤーで確保する |
| スキーマの進化 | 加算的なマイグレーション、バージョン管理された Shape | データを失わずにローカル DB のスキーマを進化させる必要がある |
| 状態管理 | React Query を置き換える、併用する、ハイブリッド方式 | ローカルファーストはサーバー状態の代わりにも補完にもなる |
| テスト戦略 | 同期エンジンをモックする、オフラインのシナリオをテストする、ローカル DB に初期データを投入する | オンラインとオフラインの両方のコードパスをテストする |
よくある間違い
| 間違い | 正しいアプローチ |
|---|---|
| シンプルな CRUD アプリでローカルファーストを選ぶ | オフライン対応や低遅延が実際に必要でない限り、サーバーベースのアーキテクチャを使います |
| データモデルを定義する前に同期エンジンを選ぶ | まず読み取り/書き込みパターンを定義し、それに合うエンジンを選びます |
| 競合解決を後回しにする | 最初からデータモデルと合わせて競合戦略を設計します |
| データベース全体をすべてのクライアントに同期する | 関連データには部分レプリケーション(シェイプ、サブスクリプション)を使います |
| ローカル DB をキャッシュとして扱う | UI にとってローカル DB は信頼できる唯一の情報源であり、キャッシュ層ではありません |
| すべてに CRDT を使う | ほとんどのフィールドでは、LWW またはサーバー優先のほうがシンプルで十分です |
| プログレッシブエンハンスメントを省略する | まずサーバーファーストで始め、価値の高いインタラクションにローカルファーストを追加します |
| スキーマのマイグレーションを計画しない | ローカルデータベースにも、サーバー DB と同様にマイグレーション戦略が必要です |
委任
electricsqlスキルが利用可能な場合は、ElectricSQL のセットアップ、シェイプ、認証、書き込みパターンをそのスキルに委任します。 それ以外の場合は、次を推奨します:pnpm dlx skills add oakoss/agent-skills -s electricsql -a claude-code -yrealtime-syncスキルが利用可能な場合は、WebTransport、pub/sub、CRDT の実装詳細をそのスキルに委任します。tanstack-dbスキルが利用可能な場合は、コレクションのセットアップ、ライブクエリ、楽観的ミューテーションパターンをそのスキルに委任します。 それ以外の場合は、次を推奨します:pnpm dlx skills add oakoss/agent-skills -s tanstack-db -a claude-code -ytanstack-startスキルが利用可能な場合は、サーバー関数プロキシと SSR 統合をそのスキルに委任します。 それ以外の場合は、次を推奨します:pnpm dlx skills add oakoss/agent-skills -s tanstack-start -a claude-code -y
- アーキテクチャのレビュー:
Planエージェントを使って、ローカルファーストとサーバーベースのトレードオフを評価します - 同期エンジンの比較:
Exploreエージェントを使って、現在のエンジンの機能を調査します - ストレージのベンチマーク:
Taskエージェントを使って、特定のデータパターンに適したストレージオプションをテストします