Firenook 0.2.0

The first release for public use. Published on .

npm install --save-dev firenook@0.2.0
Every release

What changed

12 changes you will notice, as the release notes give them.

  1. A stable version

    npm install firenook and a bare npx firenook get 0.2.0 on any Node from 20 up; previews keep their own versions, and a preview install is told about 0.2.0.

  2. firenook init in a terminal

    One screen with every choice made (the project id, the emulators on their usual ports, TypeScript, JavaScript or no Functions, the coding agents, the set-up), then the installs, Firenook pinned, the first build and the emulators started in the same terminal. TypeScript is the default, from the official template. Without a terminal it writes the files and prints the commands that finish the set-up; --yes runs them.

  3. TypeScript compiled as you save

    --build runs each codebase's own build:watch beside the engine and starts it after the first compile; errors show in the log. emulators:exec --build runs build once and no test when it fails.

  4. Ordered and range queries

    An order-preserving field index serves orderBy, range filters and cursors on a top-level field, and checks equality on other fields before a document is read; a batch get writes stored documents straight into the reply. The six query shapes the official emulator answered faster in the 0.2.0-next.6 benchmark are now 1.8 to 8 times faster than it (orderBy an integer, limit 20: 12.0 ms against 96.3 ms). A store an earlier release wrote builds the index once on its first open (7.4 s for 211,202 documents, 49.3 s for 2.7 million on the benchmark server); an earlier release opening a 0.2.0 store rebuilds its own index.

  5. Node 22, 24 and 26

    Older is refused with how to switch; an odd or newer major starts with a warning; a codebase whose engines.node asks for another Node is warned about, as the official emulator warns. doctor reports the Node and every problem.

  6. Older Linux

    The engines need glibc 2.28 (RHEL 8, Debian 10, Ubuntu 20.04, node:24-slim and later) instead of 2.39; Alpine and older systems are told what they lack.

  7. Security Rules as the official emulator applies them

    A gRPC request without an Authorization header is signed out, not the owner. @firebase/rules-unit-testing works. A database firebase.json does not list follows the default database's rules; a Storage target with several buckets applies its rules to each; a denial names the rule line.

  8. Nothing reaches production

    The console's snippets (Python Storage, Apple Firestore, Tasks and Eventarc everywhere) and emulators:exec, which now sets the official variables for the running emulators only. The demo credentials of exec and of the Functions workers take their token from the emulators: no firebase-admin release tested asked Google for one, and a function no longer falls back to the developer's own gcloud login.

  9. Functions

    Params' defaults, .env.<alias>, the .env values at discovery, the project firebase use chose, warnings for triggers on services that do not run, functions:invoke --help, ext:vendor --offline, the Firebase login on Windows.

  10. REST

    createDocument works, and every v1 method answers as the official emulator does (the differences kept are listed in COMPATIBILITY.md).

  11. Starts and stops

    Two suites with one project id; Firestore closed after browser sessions; a killed launcher stops its engine, which saves the data; --import without metadata and a bad indexes file warn; firebase.json found from a folder inside the project; localhost and ::1 bound as officially.

  12. Polish

    init --force keeps your rules, init --adopt keeps your formatting, --ui comes before ui.enabled: false, counts agree with their nouns, every service's lines reach the screen, CI=false is not CI.

What got faster

Measured on the same data with 0.2.0-next.8 and with 0.2.0. Lower is better.

orderBy a timestamp, limit 20, on 2.7 million documents

1,192× faster

0.2.0-next.8
5,128 ms
0.2.0
4.3 ms

orderBy an integer field, limit 20

14× faster

0.2.0
12.0 ms

Every multiple is rounded down. Every release’s measures.

Your data

What this release does to data an earlier one kept, and to the ports and protocols.

  • Data 0.2.0 saves opens in 0.2.0-next.8, which rebuilds its own field index first; no emulator protocol or port changed, except that localhost now binds ::1 as well for the hub and the console, as officially.

How it was checked

The source it was built from, the runs it passed, and how it was published.

  • Pin the engine to 7a9614bea49f8208f96d2126b29ef11ee2f2810b, the merge of PR #117 on 0.2.0-next.8. Its tree is the PR head's, bbd437e, which passed CI (run 39667251564) and the five-platform packed-install matrix (run 39667251694).
  • Benchmarked against the official emulator on one application's two hours of traffic: 10 times less emulator memory (2.11 against 22.57 GiB), writes 40 times faster (5.1 against 208 ms at the median), listener updates 19 times faster and 61% less CPU; a restart with the data kept is ready in 0.59 s against 30.8 s, and Firenook is faster on 25 of 26 query shapes and ties on the last.
  • Published straight to latest; the CLI's next stays on 0.2.0-next.8 until it is moved by hand.

The release on GitHub.

Install Firenook 0.2.0

Install it in your project next to firebase-tools, and change one word in your emulator script.

npm install --save-dev firenook@0.2.0
Switch in three steps