Linearが私をローカルファーストの rabbit hole に誘った
(bytemash.net)- Linear を使い始めてから、ウェブアプリケーション開発の視点が大きく変わった
- Linear はローカルファースト方式で動作し、即時の反応とネットワーク遅延のないインタラクションを提供する
- この方式では、クライアントが独立したデータベースを持ち、変更は非同期でサーバーと同期される
- ただし、分散環境での同期、衝突解決、オフライン処理などの実装難易度が高い
- Jazz、Electric SQL、Zero などのローカルファーストエコシステムのさまざまなソリューションが登場しており、開発者体験も徐々に改善している
概要
Linear というプロジェクト管理ツールを使い、ローカルファースト方式の卓越した速度とユーザー体験から大きな影響を受けた。既存のウェブアプリでよく体験するネットワーク遅延、ローディング状態、ページリフレッシュといった事象が全く感じられない点が印象的だった。この体験を通じて、ローカルファースト(local-first) パラダイムの技術的な原理と実際の適用事例を深く掘り下げることになった。
Down the Rabbit Hole
Linear の技術的な仕組みを探るうちに、彼らはブラウザの IndexedDB を実際のデータベースとして活用していることを知った。すべての変更はローカルで先に即時処理され、その後GraphQL と WebSocketsを使ってバックグラウンドで同期が行われる。
- local-first という用語は、UX戦略(即時応答)またはデータ自体をローカルに保存して同期する哲学としてさまざまに解釈できる
- 伝統的なウェブアプリではサーバーが単一の真実の源だったが、ローカルファースト構造では各クライアントが独自のデータベースを持つ
- データベースの位置がユーザーに近づくことで、ユーザーインタラクションにおけるネットワーク遅延が完全になくなる
The Challenge: This Is Not Trivial
Linear の方式を実際に実装しようとしてみると、かなりの複雑さがあることに気づいた。
- オフライン/オンライン切り替え処理
- 分散したクライアント間の衝突解決
- 部分同期(全データをダウンロードしないための設計)
- キャッシュデータのスキーマ移行
- 分散環境でのセキュリティおよびアクセス制御
- こうした機能は、膨大なエンジニアリング時間と労力を要する領域である
The Local-First Ecosystem in 2025
2025 年時点で、ローカルファーストエコシステムには複数の強力なソリューションが登場している。
- Electric SQL: Postgres ベースの同期エンジン
- PowerSync: エンタープライズ向けソリューション
- Jazz: ローカルファーストアプリを簡単に構築できるようにするツール
- Replicache: 主要な既存ソリューション(開発終了)
- Zero: Replicache チームの新しい方向性
- Triplit: TripleStore ベースの同期
- Instant: 開発者体験に焦点を当てる
- LiveStore: リアルタイム同期レイヤーを提供
Deep Dive: Jazz
Jazz は、"ローカルファーストアプリをステート更新と同じくらい簡単にする"という独自の約束で注目される。
The Mental Model
Jazz は Collaborative Values(CoValues) というリアルタイム共同作業構造を導入している。
- Jazz と Zod でスキーマを定義する。これは単なる型ではなく、自動同期されるライブオブジェクトとして動作する
- 別途の API ルート、リクエスト/レスポンスロジック、DTO は不要で、単にオブジェクトの状態を変更するだけで自動で同期される
How Jazz Achieves This
Jazz の内部構造は次の通り。
- 一意性保証: 各データにユニーク ID を自動割り当て
- イベントソーシング: 変更履歴をイベントとして保存し、リアルタイム同期の効率を高める
- エンドツーエンド暗号化: 同期前にクライアント側でデータを暗号化。サーバーは暗号化された BLOB だけを見ることができる
- グループベースの権限設計: 従来の ACL の代わりにグループ単位で権限を定義し、所有権を明確に分離
The Trade-offs
この構造は、プロトタイピングと迅速な UI 開発において非常に生産的だ。ただしいくつか考慮すべき特性がある。
Your Server Is Blind
エンドツーエンド暗号化のため、サーバーはユーザーのデータを読み取れない。事前にサーバーがアクセスする必要があるデータを明確に定義しておかないと、監視や悪意ある保存防止など管理上の制限が生じる。
Time Travel Is Mandatory
イベントソーシングにより、すべての変更履歴が永続保存される。これにより Undo/Redo は非常に便利だが、GDPR などの法的要件を考えると削除が難しいという欠点がある。
Storage Goes Brrr
削除が行われないため、ストレージ使用量がどんどん増加する。小規模プロジェクトでは問題ないが、大規模な SaaS ではストレージコストが大きく増加する可能性がある。
Local Dev Still Has Quirks
Passkeys を中心とした認証方式が基本だが、独自開発やローカル環境では HTTPS、証明書管理、鍵の移行などで開発初期の手間が発生する。とはいえ、Better Auth 統合などの改善が予定されている。
But Honestly? Still Worth It
これらの制約があるにもかかわらず、Jazz の開発体験と生産性は非常に印象的だ。まだ初期バージョンだが、今後はさまざまな問題が徐々に解決される見込みだ。
Exploring: Electric SQL and Zero
Jazz と異なり、Electric SQL と Zero は段階的なアプローチを取る。
- 既存の Postgres テーブルをそのまま利用可能
- Electric SQL はテーブルの一部を reactive query(Shape)として購読し、UI と同期できる
- 変更(ミューテーション)処理は Jazz とは異なり、LiveStore 統合など複数の選択肢がある
- Zero は Electric と似ているが、変更の同期サポートが組み込まれている
When Does Local-First Make Sense?
ローカルファーストパラダイムが適する場面と難しい場面を次のように整理した。
適している:
- 創作ツール(デザイン、執筆、音楽など)
- コラボレーション支援アプリケーション
- オフライン対応が必要なモバイルアプリ
- 開発者向けツール
- 個人向け生産性アプリ
難しい:
- 大規模なサーバー側ビジネスロジック
- 厳格な監査要件
- 大規模分析システム
- 深く統合された既存システム
- サーバー側でリクエストを頻繁に拒否するシステム
Looking Forward
ローカルファーストはウェブ開発のパラダイムシフトを意味する。Linear はすでにユーザー体験で大きな効果を実証している。開発者はこれらの構造的なトレードオフが自分のプロジェクトに適しているかを判断する必要がある。
Jazz でパーソナルアプリを実際に作る過程で、実際の長所と短所、抽象化の限界を体験している。エコシステムはまだ初期段階で、今後はツールとパターンが成熟し改善されるだろう。しかし、データをローカルに置く方法の利点は明確であり、これはなくならない見通しだ。
新しいプロジェクトでこれらの制約を受け入れられるなら、ローカルファーストを試してみる価値は十分にある。最悪でも新しいアーキテクチャパターンを学べるだけで、最良なら不可能と思えるほど高速なユーザー体験を実装できる。300ms 応答競争の中でこれは重要な優位性になる。
まだコメントはありません。