hidane (火種, the seed of fire) — a Firestore emulator without Java.

公式の Cloud Firestore エミュレータを置き換える、Rust 製の単一バイナリです。JVM は要りません。ミリ秒で起動し、公式エミュレータとの parity をテストで確かめます。

curl -fsSL https://hidane.dev/install.sh | sh v0.5.1 · macOS · Linux

最新のリリースを ~/.local/bin に入れます。SHA-256 で検証済みです。Homebrew、npm(Windows も)、cargo、Docker はインストールを参照してください。

v0.5.1 · hidane doctor・migrate・benchmark savings・report、Testcontainers に対応

なぜ hidane か

21

Java 21 が必須になった

firebase-tools 15 で、Java 21 未満のサポートが削除されました。ローカルでデータベースを動かすだけのために、JDK を入れる必要はないはずです。

出典: firebase-tools v15.0.0 リリースノート
852 ms · 148 MiB

起動に 852 ms、アイドルで 148 MiB

正式なベンチマーク環境での中央値で、公式エミュレータはポートを開くまでに 852 ms かかり、アイドル時に 148 MiB を使います。同じマシンで、hidane v0.5.1 は 1.53 ms、9.3 MiB です。

出典: ベンチマーク結果(全サンプル付き、英語)
11 倍

データが増えると書き込みが遅くなる

リスナーを接続した状態では、公式エミュレータのバッチ書き込みがドキュメントの総数に比例して遅くなります。100k 件では 11 倍です。hidane は、commit のコストが変更した件数だけで決まるように設計しています。同じ 10 万件は 4.9 秒で、バッチごとの時間は一定です。

出典: 実測値と生ログ(英語)

起動とメモリ: AWS c7i.xlarge 1 台(Ubuntu 24.04、Java 21、firebase-tools 15.33.0)で両方を測った中央値です(2026-10-13)。測り方は bench/(英語)にあります。リスナー接続時の書き込み: Phase 0 の実測値で、同じ条件での比較ではありません。この条件はまだベンチマークに含まれていません。背景は Why hidane(英語)にまとめています。

対応クライアント

v0.5.1 での状態です。 planned not verified verified
gRPCfirebase-admin (Node)verified
gRPC@google-cloud/firestoreverified
gRPCfirebase-js-sdk(Node 上)verified
RESTfirebase-js-sdk Liteverified
WebChannelfirebase-js-sdk(ブラウザ)verified
gRPCGoverified
gRPCPythonverified
gRPCJavaverified
gRPCiOSnot verified
gRPCAndroidnot verified
gRPCFlutter(モバイル / デスクトップ)not verified
WebChannelFlutter Webverified
filesfirebase-tools のエクスポート / インポートverified
rulesSecurity Rulesverified

verified は、そのクライアントの結果を公式エミュレータと突き合わせて確認したものです。not verified は、hidane がそのトランスポートを提供しているものの、まだ誰もそのクライアントで動かしていないものです。各 SDK が必要とするトランスポートは compatibility(英語)を参照してください。

Parity

hidane は公式エミュレータをオラクルとして扱います。公式の応答を記録し、テストスイートがその記録をすべて hidane に対して再生します。テストの裏付けがない互換性は主張しません。

現時点で、公式エミュレータの応答 26,556 件を 57 の記録に収め、CI がそのすべてを hidane に対して再生しています。SDK の記録も両方のエミュレータで突き合わせています(results)。数え方は docs/parity.md(英語)にあります。

領域トランスポート記録した応答全体を比較SDK の記録
ドキュメントと書き込みgRPC, RESTgRPC, REST5,7495,119一致 2既知の差 4
クエリと集計gRPC, RESTgRPC, REST1,7871,079一致 9
トランザクションgRPC, RESTgRPC, REST215210一致 4既知の差 3
Listen / Write ストリームgRPCgRPC1,3071,270一致 4既知の差 4
RESTRESTREST875870一致 1既知の差 1
WebChannelREST, WebChannelREST, WebChannel3431一致 2既知の差 1
Security RulesgRPC, REST, WebSocket, プロセス内gRPC, REST, WebSocket, プロセス内15,3665,567既知の差 2
エクスポートとインポートREST, CLIREST, CLI7067一致 3
認証と管理エンドポイントgRPC, REST, WebChannelgRPC, REST, WebChannel875823一致 1既知の差 3
値と上限gRPC, REST, WebChannel, プロセス内gRPC, REST, WebChannel, プロセス内278274—
合計26,55615,310一致 26既知の差 18

全体を比較: 記録が保持する応答の全体(ステータス、メッセージや本文、値)を、実行ごとに変わる値(時刻や ID など)だけを除いて比べている応答の数です。そのほかは Security Rules の判定と理由、応答の一部、またはステータスで比べています。内訳と比べ方はテストごとに docs/parity.md にあります。SDK の記録: 同じ手順を SDK から両方のエミュレータに対して実行した記録の組です。既知の差は、results/README.md または parity exceptions に理由が書かれている差です。意図的に公式と違える点(75 件)は parity exceptions(英語)に一覧があります。

ロードマップ

  1. v0.1

    サーバー SDK とネイティブクライアント。firebase-admin、Google Cloud の各ライブラリ、iOS、Android、Flutter が firebase-tools の配下で動きます。

    GitHub の v0.1 マイルストーン
  2. v0.2

    Security Rules。公式エミュレータと同じ判定を、1 リクエストにつき 1 回の評価で行います。読み取り、書き込み、リスナー、クエリを公式と 1 ケースずつ突き合わせており、コンパイラの警告、ルールのカバレッジレポート、debug() の出力も公式と同じです。v0.2.0 でリリースし、v0.2.1 で Emulator UI のリクエスト表示にも対応しました。@firebase/rules-unit-testing も Node とブラウザの両方で確かめています。

    GitHub の v0.2 マイルストーン
  3. v0.3

    ブラウザのクライアント。ブラウザ上の firebase-js-sdk と Flutter Web に対応します。v0.3.0 でリリースし、SDK 自身のブラウザ用テスト 1,183 件が公式エミュレータと同じく hidane でも通ります(Chromium)。Flutter Web も確かめています。

    GitHub の v0.3 マイルストーン
  4. v0.4

    Functions のトリガー。firebase emulators:start の下で、Firestore のイベントを Functions エミュレータに届けます(v1 と v2)。v0.4.0 でリリースし、公式エミュレータが送るイベントを記録して再生しているほか、関数が公式と同じデータを受け取ることも確かめています。

    GitHub の v0.4 マイルストーン

範囲、目標値、リスクは ROADMAP(英語)にあります。

インストール

どのチャネルでも、同じリリースのバイナリが入ります。macOS(arm64、x86_64)、Linux(arm64、x86_64、静的リンク)、Windows(x64)に対応しています。

GitHub Releasesアーカイブ、チェックサム、ビルドの来歴available
cargo binstallcargo binstall hidaneavailable
Homebrew tapbrew install hidane-dev/tap/hidaneavailable
npmnpm install --save-dev hidaneavailable
pub.devdart pub global activate hidaneavailable
Dockerdocker run -p 8080:8080 ghcr.io/hidane-dev/hidaneavailable
curl | shcurl -fsSL https://hidane.dev/install.sh | shavailable