Linear sent me down a local-first rabbit hole | Bytemash の記事が興味深ったので、少しまとめました。
動機
Linearは信じられないほど高速なプロジェクト管理ツールで、ネットワークの遅延はどこにあるのでしょうか?競合はどのように処理されているのでしょうか?オフラインになるとどうなるのでしょうか?と疑問に感じて調べたそうです。
ウサギの穴に落ちる
簡単に言うと、彼らはブラウザのIndexedDBを実際のデータベースとして扱う独自の同期エンジンを構築しました。すべての変更はまずローカルで行われ、その後バックグラウンドでGraphQLによる変更とWebsocketによる同期が行われているそうです。
データベースをクライアントに移動することで、ユーザーインタラクションパスにおけるネットワーク遅延が排除されることです。更新はローカルデータベースの読み取り/書き込みのみなので、瞬時に実行されます。
課題:これは簡単なことではない
Linearのアプローチを理解した後、私の最初の直感は似たようなものを作ることでした。しかし、現実が突きつけられました。彼らの同期エンジンの基本バージョンでさえ、おそらく数ヶ月のエンジニアリング作業が必要だったのです。
複雑さの原因は次のとおりです。
- オフライン/オンラインの移行を適切に処理する
- 分散クライアント間の競合解決
- 部分的な同期(データベース全体をダウンロードしたくない)
- キャッシュされたデータ間のスキーマ移行
- 分散システムにおけるセキュリティとアクセス制御
- きっと誰かがすでにこの魔法を再利用できるものに組み込んでいるのでしょう…
2025年のローカルファーストエコシステム
幸いなことに、地域を第一に考えるコミュニティが解決策を構築してきました。現在の状況は次のとおり調査したそうです。
生産準備完了オプション
- Electric SQL – Postgres ベースの同期エンジン
- PowerSync – エンタープライズ向けソリューション
- Jazz – 私の目に留まったもの (下記参照)
- Replicache – The OG (RIP)
- [Zero](https://zero.rocicorp.dev/( – Replicacheチームの新しいアプローチ
- Triplit – TripleStoreベースの同期
- Instant – 開発者エクスペリエンスに重点を置く
- LiveStore – 電力会社やその他のプロバイダー向けのリアクティブレイヤー
深掘り:Jazz
Jazz と Zod で構築されたスキーマから始めます。これらが単なる型定義ではなく、自動的に同期するライブで反応的なオブジェクトである点です。APIルートも、リクエスト/レスポンスのサイクルも、DTOもありません。ただ…魔法のように同期するオブジェクトだけ。
ローカルファーストが意味を成すのはいつでしょうか?
ローカル ファーストを調べ、Jazz を試した後、このパラダイムがどのような場合に適するかについて次のような印象を受けました。
優れたフィット感:
- クリエイティブツール(デザイン、ライティング、音楽)
- 共同作業アプリケーションまたは大規模なアプリケーションの要素
- オフラインサポートが必要なモバイルアプリ
- 開発者ツール
- 個人の生産性向上アプリ
挑戦的なフィット感:
- 重いサーバーサイドビジネスロジック
- 厳格な監査要件
- 大規模分析
- 深く統合された既存のシステム
- リクエストがサーバー側のロジックによって定期的に拒否されるシステム(楽観的な更新が困難になる)
楽しみにしている
ローカルファーストは、アプリケーション構築方法に根本的な変化をもたらします。ユーザーエクスペリエンスのメリットは紛れもなく、Linearがそれを証明しました。問題は、アーキテクチャ上のトレードオフが、あなたのユースケースにとって価値があるかどうかです。
これらのトレードオフを実際に理解するために、Jazzを使って個人用アプリケーションを開発しています。開発体験は驚くほど新鮮ですが、抽象化が漏れている箇所を注意深く見守っています。
エコシステムはまだ若い。ツールは成熟し、パターンが生まれ、鋭いエッジは滑らかになるだろう。しかし、データをローカルに保つことでユーザーエクスペリエンスを劇的に向上させることができるという、核となる洞察は消えることはない。
何か新しいものを構築していて、制約内で作業できる場合は、ローカルファーストを試してみることをお勧めします。最悪のケースでは、新しいアーキテクチャパターンを習得することになります。最良のケースでは、ユーザーにとって信じられないほど高速に感じられるものを構築できるでしょう。
応答時間が 300 ミリ秒の世界では、これは利点となります。
まとめ
ブラウザのIndexedDBにデータを持たせて、ユーザー体験を素早いものにしつつ、サーバ側/クラウド側に裏で同期して、整合性を持たせる。というアーキテクチャは今後増えていきそうですね。