<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Firenook releases</title><description>Every Firenook release, newest first: what changed, what it made faster, and what happens to your data.</description><link>https://firenook.dev/changelog</link><language>en</language><atom:link href="https://firenook.dev/changelog.xml" rel="self" type="application/rss+xml"/><item><title>0.2.0: The first release for public use</title><link>https://firenook.dev/changelog/0.2.0</link><guid isPermaLink="true">https://firenook.dev/changelog/0.2.0</guid><pubDate>Fri, 23 Oct 2026 11:10:45 GMT</pubDate><content:encoded>&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A stable version.&lt;/strong&gt; &lt;code&gt;npm install firenook&lt;/code&gt; and a bare &lt;code&gt;npx firenook&lt;/code&gt; 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.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;firenook init&lt;/code&gt; in a terminal.&lt;/strong&gt; 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; &lt;code&gt;--yes&lt;/code&gt; runs them.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;TypeScript compiled as you save.&lt;/strong&gt; &lt;code&gt;--build&lt;/code&gt; runs each codebase&apos;s own &lt;code&gt;build:watch&lt;/code&gt; beside the engine and starts it after the first compile; errors show in the log. &lt;code&gt;emulators:exec --build&lt;/code&gt; runs &lt;code&gt;build&lt;/code&gt; once and no test when it fails.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ordered and range queries.&lt;/strong&gt; An order-preserving field index serves &lt;code&gt;orderBy&lt;/code&gt;, 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 (&lt;code&gt;orderBy&lt;/code&gt; 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.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Node 22, 24 and 26.&lt;/strong&gt; Older is refused with how to switch; an odd or newer major starts with a warning; a codebase whose &lt;code&gt;engines.node&lt;/code&gt; asks for another Node is warned about, as the official emulator warns. &lt;code&gt;doctor&lt;/code&gt; reports the Node and every problem.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Older Linux.&lt;/strong&gt; 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.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Security Rules as the official emulator applies them.&lt;/strong&gt; A gRPC request without an &lt;code&gt;Authorization&lt;/code&gt; header is signed out, not the owner. &lt;code&gt;@firebase/rules-unit-testing&lt;/code&gt; works. A database &lt;code&gt;firebase.json&lt;/code&gt; does not list follows the default database&apos;s rules; a Storage target with several buckets applies its rules to each; a denial names the rule line.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Nothing reaches production.&lt;/strong&gt; The console&apos;s snippets (Python Storage, Apple Firestore, Tasks and Eventarc everywhere) and &lt;code&gt;emulators:exec&lt;/code&gt;, which now sets the official variables for the running emulators only. The demo credentials of &lt;code&gt;exec&lt;/code&gt; 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&apos;s own gcloud login.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Functions.&lt;/strong&gt; Params&apos; defaults, &lt;code&gt;.env.&amp;lt;alias&amp;gt;&lt;/code&gt;, the &lt;code&gt;.env&lt;/code&gt; values at discovery, the project &lt;code&gt;firebase use&lt;/code&gt; chose, warnings for triggers on services that do not run, &lt;code&gt;functions:invoke --help&lt;/code&gt;, &lt;code&gt;ext:vendor --offline&lt;/code&gt;, the Firebase login on Windows.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;REST.&lt;/strong&gt; &lt;code&gt;createDocument&lt;/code&gt; works, and every v1 method answers as the official emulator does (the differences kept are listed in &lt;code&gt;COMPATIBILITY.md&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Starts and stops.&lt;/strong&gt; Two suites with one project id; Firestore closed after browser sessions; a killed launcher stops its engine, which saves the data; &lt;code&gt;--import&lt;/code&gt; without metadata and a bad indexes file warn; &lt;code&gt;firebase.json&lt;/code&gt; found from a folder inside the project; &lt;code&gt;localhost&lt;/code&gt; and &lt;code&gt;::1&lt;/code&gt; bound as officially.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Polish.&lt;/strong&gt; &lt;code&gt;init --force&lt;/code&gt; keeps your rules, &lt;code&gt;init --adopt&lt;/code&gt; keeps your formatting, &lt;code&gt;--ui&lt;/code&gt; comes before &lt;code&gt;ui.enabled: false&lt;/code&gt;, counts agree with their nouns, every service&apos;s lines reach the screen, &lt;code&gt;CI=false&lt;/code&gt; is not CI.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.2.0&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.2.0-next.8: The Firestore tree at once, code in colour, npx on any Node</title><link>https://firenook.dev/changelog/0.2.0-next.8</link><guid isPermaLink="true">https://firenook.dev/changelog/0.2.0-next.8</guid><pubDate>Wed, 21 Oct 2026 13:20:31 GMT</pubDate><content:encoded>&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;npx firenook&lt;/code&gt; gets this release on any Node from 20 up.&lt;/strong&gt; On any Node but 24, &lt;code&gt;npx firenook init&lt;/code&gt; installed &lt;code&gt;firenook@0.0.0&lt;/code&gt;, the placeholder that held the name before the first release, with its old advice: every release declared &lt;code&gt;engines.node&lt;/code&gt; as &lt;code&gt;&amp;gt;=24 &amp;lt;25&lt;/code&gt;, and for a bare name npm takes &lt;code&gt;latest&lt;/code&gt; only when its engines admit the running Node, and otherwise the highest version that is not a preview. &lt;code&gt;engines.node&lt;/code&gt; is now &lt;code&gt;&amp;gt;=20&lt;/code&gt;, npm&apos;s own floor. The emulators still need Node 24, and now say so with the way to switch: &quot;the emulators need Node 24, since your Functions run on it; this is Node 26.9.0. Switch to Node 24 (with nvm: nvm install 24) and run it again&quot;. &lt;code&gt;init&lt;/code&gt; and the other commands run on any Node.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Firestore tree at once.&lt;/strong&gt; The console&apos;s tree said &quot;Mapping the database…&quot; for minutes on a large store. Its first walk now reads the collection index instead of the documents (37 s instead of 133 s on 2.7 million documents), a clean stop saves the tree with the data so the next start shows it in under a millisecond, and while a walk runs the root collections are listed with their counts. After a crash, or any change to the data since the stop, the tree is mapped again on first use.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Code in colour.&lt;/strong&gt; Every code block in the console (the Connect dialog, a document as code, a request as code) is coloured with the editor&apos;s palette, in the language it is: the Flutter, Swift, Kotlin and Java snippets are no longer marked as JavaScript, and environment variables read as &lt;code&gt;.env&lt;/code&gt; lines.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The console behind local proxies.&lt;/strong&gt; Any name under &lt;code&gt;localhost&lt;/code&gt;, such as portless&apos;s &lt;code&gt;my-app.localhost&lt;/code&gt;, is answered like &lt;code&gt;localhost&lt;/code&gt;; &lt;code&gt;docs/console.md&lt;/code&gt; says how to reach the console through portless. &lt;code&gt;.local&lt;/code&gt; and custom domains still need &lt;code&gt;--allowed-hosts&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.2.0-next.8&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.2.0-next.7: Data kept without a seed, coding agents set up in one command, 54 MCP tools</title><link>https://firenook.dev/changelog/0.2.0-next.7</link><guid isPermaLink="true">https://firenook.dev/changelog/0.2.0-next.7</guid><pubDate>Tue, 20 Oct 2026 18:56:32 GMT</pubDate><content:encoded>&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A project with no seed keeps its data.&lt;/strong&gt; &lt;code&gt;--resume-state&lt;/code&gt; needed &lt;code&gt;--import&lt;/code&gt;, so a project made with &lt;code&gt;firenook init&lt;/code&gt; could not keep its data between runs. Now it needs only a state directory; data started without a seed records an empty one, and a start that mixes the two up (a seedless state given &lt;code&gt;--import&lt;/code&gt;, or a seeded one started without it) is refused with the way on, nothing changed.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;--keep-data&lt;/code&gt;&lt;/strong&gt; is short for &lt;code&gt;--state-dir ./.firenook/state --resume-state&lt;/code&gt;, with or without &lt;code&gt;--import&lt;/code&gt;. Keeping data stays opt-in, so &lt;code&gt;--import ./data&lt;/code&gt; alone still starts from that data every time. &lt;code&gt;init&lt;/code&gt; prints its start command with &lt;code&gt;--keep-data&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;firenook mcp add&lt;/code&gt;&lt;/strong&gt; gives the project&apos;s coding agents the MCP server: it writes &lt;code&gt;.mcp.json&lt;/code&gt; (Claude Code), &lt;code&gt;.cursor/mcp.json&lt;/code&gt; and &lt;code&gt;.vscode/mcp.json&lt;/code&gt; for the agents it finds, keeping every other server, with &lt;code&gt;--dry-run&lt;/code&gt;, &lt;code&gt;--agent&lt;/code&gt; and &lt;code&gt;--force&lt;/code&gt;. A second run changes nothing. &lt;code&gt;init&lt;/code&gt; offers it once in a terminal; &lt;code&gt;init --adopt&lt;/code&gt; lists it in its plan. The terminal&apos;s &lt;code&gt;?&lt;/code&gt; help names it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;54 MCP tools, up from 19.&lt;/strong&gt; The function calls and the log (with each call&apos;s error and stack trace, and a replay), Security Rules (the rules in force, whether a request as a given user is allowed and which line decided, recent denials), Auth tokens and claims, Storage files (read, upload, delete, copy, move), Eventarc, Extensions, Pub/Sub topics and a backlog peek, Cloud Tasks, schedules, Firestore counts and collection-group queries, and a reset that asks for the project id before it clears more than one service. The new tools use the console&apos;s API, so they need the console on (the default). A &lt;code&gt;{&quot;$timestamp&quot;}&lt;/code&gt; finer than a millisecond now keeps its precision when a tool writes it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;firenook mcp&lt;/code&gt; with no arguments&lt;/strong&gt; uses the one running suite, so an editor&apos;s install link needs no project id; with two running, it asks for &lt;code&gt;--project&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The console&apos;s Connect dialog has a Coding agent tab&lt;/strong&gt;: the setup for Claude Code, Cursor, VS Code and any other agent, &quot;Add to Cursor&quot; and &quot;Add to VS Code&quot; install links, and when an agent last called.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Functions start in under a second, not seven.&lt;/strong&gt; Discovery waited about 6 s for the SDK&apos;s discovery server to exit, kept open by an idle keep-alive connection; it now takes about 0.2 s. On the acceptance host, a project with seven functions and every emulator is ready in 0.78 s against 6.82 s.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Timestamps are stored to the microsecond&lt;/strong&gt;, as in production: a finer value is rounded down at write, so the export no longer refuses it, and the export rounds down any finer value an earlier release saved.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Functions log line&apos;s duration&lt;/strong&gt; prints &lt;code&gt;1.6ms&lt;/code&gt;, not &lt;code&gt;1.6076249999999999ms&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The console&apos;s document panel&lt;/strong&gt; reads a bare id in &lt;code&gt;doc=&lt;/code&gt; against the open collection instead of crashing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Checked against 0.2.0-next.6&lt;/strong&gt; on the acceptance host with the same data, instead of a new paired run against the official emulator, since no measured path changed: imports, resumed starts, writes, listener delivery and the query shapes match within run-to-run noise, and memory is 11 MB higher once ready (&lt;code&gt;docs/benchmarks.md&lt;/code&gt;, &lt;code&gt;benchmarks/next7-regression.json&lt;/code&gt;). The slow start the 0.2.0-next.6 run saw on a freshly copied state directory is the copy&apos;s pending writes reaching the disk, not Firenook.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.2.0-next.7&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.2.0-next.6: Data closed on stop, starts in milliseconds, the store&apos;s size</title><link>https://firenook.dev/changelog/0.2.0-next.6</link><guid isPermaLink="true">https://firenook.dev/changelog/0.2.0-next.6</guid><pubDate>Sun, 18 Oct 2026 12:39:19 GMT</pubDate><content:encoded>&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A stop closes the data.&lt;/strong&gt; Since 0.2.0-next.3 a stop left Firestore&apos;s store file marked open (and Storage&apos;s since 0.2.0-next.4), so every start after a stop repaired it first. The console&apos;s change feed, schema index and Overview count held the store they observed, Storage held a Firestore handle, and the console&apos;s whole-database walks ignored the stop. A stop once ready, or while starting, now closes Storage, then Firestore; one that cannot close a database is reported as a failed stop.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A killed engine is no stop.&lt;/strong&gt; The screen said &quot;stopped … everything is kept&quot; whenever a stop was asked for and the engine then ended, even by a kill. Now it says the stop did not finish and that the next start checks the data first; plain mode says the same in one line.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Saved data opens in milliseconds.&lt;/strong&gt; The documents&apos; count is saved with every commit instead of decoding every document at each open: a 32.6 GB store of 2.7 million documents opened in 146 s and now in 67 ms, a 4.3 GB one in 1.4 s and now in 63 ms. The first start of data an earlier release wrote counts once and saves the result.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;firenook state:inspect --state-dir DIR&lt;/code&gt;&lt;/strong&gt; shows what a stopped store&apos;s file holds, table by table, and how much of it is free.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;firenook state:compact --state-dir DIR&lt;/code&gt;&lt;/strong&gt; returns a stopped store&apos;s free pages to the disk, copying the file first (a clone where the file system has one; &lt;code&gt;--no-copy&lt;/code&gt; skips it). Every document stays as it is. On the 32.6 GB store: 32.60 GB to 27.79 GB in 16 minutes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The console Overview&apos;s Firestore card shows the store&apos;s size on disk.&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The old documents table is cleared&lt;/strong&gt; once its documents are copied to the current layout; stores first written before 0.1.0-next.3 carried a dead copy of every document.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Published straight to &lt;code&gt;latest&lt;/code&gt;.&lt;/strong&gt; The release workflow can now publish the CLI to &lt;code&gt;latest&lt;/code&gt; in its one trusted publish, and this release used it. npm sets one tag per publish, so the CLI&apos;s &lt;code&gt;next&lt;/code&gt; stays on 0.2.0-next.5 until it is moved by hand, and a preview install, which follows &lt;code&gt;next&lt;/code&gt;, is not told about this release until then.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.2.0-next.6&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.2.0-next.5: Saved data: a quick seed check, quick repairs, clean stops</title><link>https://firenook.dev/changelog/0.2.0-next.5</link><guid isPermaLink="true">https://firenook.dev/changelog/0.2.0-next.5</guid><pubDate>Sat, 17 Oct 2026 17:45:59 GMT</pubDate><content:encoded>&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The seed check reads file details.&lt;/strong&gt; Saved data (&lt;code&gt;--state-dir&lt;/code&gt; with &lt;code&gt;--resume-state&lt;/code&gt;) is picked up after comparing each seed file&apos;s size and times with the record made at the import (&lt;code&gt;native-seed.json&lt;/code&gt;, beside the receipt); only a file whose details changed is read. On a 7.8 GB seed the check went from 23 to 26 s to under a second.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Files operating systems write never block a start&lt;/strong&gt;: &lt;code&gt;.DS_Store&lt;/code&gt;, &lt;code&gt;._*&lt;/code&gt;, &lt;code&gt;Thumbs.db&lt;/code&gt;, &lt;code&gt;desktop.ini&lt;/code&gt;, &lt;code&gt;__MACOSX&lt;/code&gt; and the like are ignored, and the Storage import skips &lt;code&gt;._*&lt;/code&gt; files.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A first import hashes the seed beside the import&lt;/strong&gt;, on worker threads, instead of reading it twice in full around it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A changed seed names its files&lt;/strong&gt;, and &lt;code&gt;firenook state:adopt-seed --state-dir DIR --import DIR&lt;/code&gt; keeps the data with the seed as it is now (the previous receipt is kept beside the new one).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Quick repairs.&lt;/strong&gt; The store&apos;s durable commits save what a repair needs, so a start after a crash or a killed process repairs in moments instead of reading the whole store. &lt;code&gt;--durability per-commit&lt;/code&gt; leaves it out to keep its commit latency.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A repair shows its progress&lt;/strong&gt;: the Firestore row reads &lt;code&gt;repairing NN%&lt;/code&gt; with the store&apos;s size, and the plain log prints how far it has got.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A stop while starting closes the data cleanly.&lt;/strong&gt; Ctrl-C, SIGTERM, a closed terminal and the launcher&apos;s pipe are listened for from the first moment: a seed check or a repair is abandoned with nothing opened, an import into a fresh run&apos;s directory ends at once, one into saved data finishes first. Nothing is exported before the emulators served anything.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The start-up limit counts quiet time&lt;/strong&gt;: a start that reports as it goes, such as a long repair, is not stopped after 20 minutes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Saved data from 0.2.0-next.4 and earlier&lt;/strong&gt; is checked in full once, then recorded; data saved by 0.2.0-next.5 stays readable by 0.2.0-next.4. The state format is unchanged: the record is a new file beside the receipt.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.2.0-next.5&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.2.0-next.4: The terminal UI</title><link>https://firenook.dev/changelog/0.2.0-next.4</link><guid isPermaLink="true">https://firenook.dev/changelog/0.2.0-next.4</guid><pubDate>Sat, 17 Oct 2026 13:58:57 GMT</pubDate><content:encoded>&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The terminal UI.&lt;/strong&gt; In a terminal, &lt;code&gt;emulators:start&lt;/code&gt; draws its own screen: a start-up card with a row per service filling in with how long it took and what it holds, the ready summary (the console&apos;s address, the ports, the start-up warnings once, a newer release), the log with a line per call, its duration and cause and the function&apos;s own output under it at its level, reloads and failed saves with the code around the error, and a footer pinned to the window&apos;s last line with the keys: &lt;code&gt;o&lt;/code&gt; console, &lt;code&gt;r&lt;/code&gt; reload, &lt;code&gt;e&lt;/code&gt; export, &lt;code&gt;w&lt;/code&gt; warnings, &lt;code&gt;?&lt;/code&gt; keys, &lt;code&gt;q&lt;/code&gt; (or Ctrl-C) stop, saving first.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A start that cannot run&lt;/strong&gt; says what went wrong, how to fix it and what became of the data, and exits 1. A taken port names the program holding it, the command that stops it and a free port for &lt;code&gt;firebase.json&lt;/code&gt;; saved data refused because its seed changed says so, and names a &lt;code&gt;.DS_Store&lt;/code&gt; Finder wrote into the seed. Functions that do not load leave every emulator running and load again on the next save.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The plain output is unchanged.&lt;/strong&gt; Pipes, CI, log files, &lt;code&gt;emulators:exec&lt;/code&gt;, &lt;code&gt;--plain&lt;/code&gt;, &lt;code&gt;FIRENOOK_PLAIN=1&lt;/code&gt; and &lt;code&gt;TERM=dumb&lt;/code&gt; get the same lines as before, &lt;code&gt;All emulators ready&lt;/code&gt; alone on its line. &lt;code&gt;NO_COLOR&lt;/code&gt; keeps the screen without colour; terminals without its symbols get plain characters (&lt;code&gt;FIRENOOK_ASCII=1&lt;/code&gt; asks for them).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The release check&lt;/strong&gt; asks the npm registry for &lt;code&gt;firenook&lt;/code&gt;&apos;s version tags at most once a day, in the background, and shows a newer release on the next start with the install command for the project&apos;s package manager. It is off in CI, in the plain output and with &lt;code&gt;FIRENOOK_NO_UPDATE_CHECK=1&lt;/code&gt; or &lt;code&gt;NO_UPDATE_NOTIFIER=1&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Engine.&lt;/strong&gt; &lt;code&gt;firenook suite --terminal-events&lt;/code&gt; prints &lt;code&gt;FIRENOOK_EVENT &amp;lt;json&amp;gt;&lt;/code&gt; lines in place of the human lines they stand for (DESIGN.md, the terminal). Refused saved data now says what changed in every output: an unfinished import, another state format, another project, other buckets, another seed path, or the seed&apos;s content.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Journeys.&lt;/strong&gt; The New user journey waits for the form to empty before typing the next user, which a reset on the page&apos;s answer had wiped once.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.2.0-next.4&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.2.0-next.3: Firenook&apos;s own console, and Google&apos;s Emulator UI gone</title><link>https://firenook.dev/changelog/0.2.0-next.3</link><guid isPermaLink="true">https://firenook.dev/changelog/0.2.0-next.3</guid><pubDate>Sat, 17 Oct 2026 13:06:26 GMT</pubDate><content:encoded>&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The console.&lt;/strong&gt; &lt;code&gt;/console&lt;/code&gt; on the UI port covers every service the suite runs: Firestore data, queries, explain and security rules; Authentication users, activity, the inbox of codes and links, and settings; Storage files and rules; Functions with their invocations, schedules and load log; Extensions; Eventarc; Pub/Sub; Cloud Tasks; Logs; and an Overview with each section&apos;s health, recent problems, snapshots and resets. It follows the engine live over one connection per browser and works offline.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Google&apos;s Emulator UI is gone.&lt;/strong&gt; Every feature of the Emulator UI 1.15 has a console screen (&lt;code&gt;support/console-parity.md&lt;/code&gt;), so nothing is downloaded and the UI port serves the console alone. The port&apos;s root and the official UI&apos;s addresses (&lt;code&gt;/firestore/…&lt;/code&gt;, &lt;code&gt;/auth&lt;/code&gt;, &lt;code&gt;/storage/…&lt;/code&gt;, &lt;code&gt;/extensions/…&lt;/code&gt;, &lt;code&gt;/logs?q=…&lt;/code&gt;) lead to the console&apos;s page for the same thing. &lt;code&gt;/api/config&lt;/code&gt;, the logging WebSocket and the Firestore Requests socket are unchanged.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI.&lt;/strong&gt; &lt;code&gt;firenook setup&lt;/code&gt; downloads nothing and stays so that scripts which run it keep passing. The engine&apos;s &lt;code&gt;--ui-archive&lt;/code&gt; argument is gone; the npm package never passed it by hand. &lt;code&gt;doctor&lt;/code&gt; no longer reports asset files.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Functions.&lt;/strong&gt; A call&apos;s last log lines no longer appear after its own &lt;code&gt;Finished &quot;…&quot;&lt;/code&gt; line. The source watcher waits for a second of quiet after the last change (at most five after the first), as the official CLI does, and an extension&apos;s parameter file is read only once it holds still, so a save caught between truncate and write no longer reloads an instance with every value at its default.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.2.0-next.3&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.2.0-next.2: The read path, incremental listeners and a field index</title><link>https://firenook.dev/changelog/0.2.0-next.2</link><guid isPermaLink="true">https://firenook.dev/changelog/0.2.0-next.2</guid><pubDate>Sat, 03 Oct 2026 13:06:53 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.2.0-next.2&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.2.0-next.1: Firenook: the project renamed, one license</title><link>https://firenook.dev/changelog/0.2.0-next.1</link><guid isPermaLink="true">https://firenook.dev/changelog/0.2.0-next.1</guid><pubDate>Sat, 19 Sep 2026 15:04:20 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.2.0-next.1&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.1.0-next.9: Cloud Tasks emulator, every configuration shape, the CLI surface</title><link>https://firenook.dev/changelog/0.1.0-next.9</link><guid isPermaLink="true">https://firenook.dev/changelog/0.1.0-next.9</guid><pubDate>Sat, 19 Sep 2026 12:08:25 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.1.0-next.9&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.1.0-next.8: Complete Authentication and a full Pub/Sub emulator</title><link>https://firenook.dev/changelog/0.1.0-next.8</link><guid isPermaLink="true">https://firenook.dev/changelog/0.1.0-next.8</guid><pubDate>Fri, 18 Sep 2026 17:41:24 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.1.0-next.8&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.1.0-next.7: Native Storage rules and the owned Functions/Extensions runtime</title><link>https://firenook.dev/changelog/0.1.0-next.7</link><guid isPermaLink="true">https://firenook.dev/changelog/0.1.0-next.7</guid><pubDate>Fri, 18 Sep 2026 09:40:24 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.1.0-next.7&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.1.0-next.6: Write-behind durability, scan and import performance</title><link>https://firenook.dev/changelog/0.1.0-next.6</link><guid isPermaLink="true">https://firenook.dev/changelog/0.1.0-next.6</guid><pubDate>Wed, 16 Sep 2026 18:30:53 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.1.0-next.6&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.1.0-next.5: Functions admission parity for upstream-ignored handlers</title><link>https://firenook.dev/changelog/0.1.0-next.5</link><guid isPermaLink="true">https://firenook.dev/changelog/0.1.0-next.5</guid><pubDate>Sat, 12 Sep 2026 05:47:01 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.1.0-next.5&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.1.0-next.4: Phase A–F qualified engine</title><link>https://firenook.dev/changelog/0.1.0-next.4</link><guid isPermaLink="true">https://firenook.dev/changelog/0.1.0-next.4</guid><pubDate>Fri, 11 Sep 2026 12:57:23 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.1.0-next.4&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.1.0-next.3: Independent source identity</title><link>https://firenook.dev/changelog/0.1.0-next.3</link><guid isPermaLink="true">https://firenook.dev/changelog/0.1.0-next.3</guid><pubDate>Wed, 09 Sep 2026 10:48:53 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.1.0-next.3&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.1.0-next.2: Public distribution cleanup</title><link>https://firenook.dev/changelog/0.1.0-next.2</link><guid isPermaLink="true">https://firenook.dev/changelog/0.1.0-next.2</guid><pubDate>Wed, 09 Sep 2026 04:13:38 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.1.0-next.2&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.1.0-next.1: Browser Auth repair</title><link>https://firenook.dev/changelog/0.1.0-next.1</link><guid isPermaLink="true">https://firenook.dev/changelog/0.1.0-next.1</guid><pubDate>Tue, 08 Sep 2026 10:04:47 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.1.0-next.1&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>0.1.0-next.0: First installable preview</title><link>https://firenook.dev/changelog/0.1.0-next.0</link><guid isPermaLink="true">https://firenook.dev/changelog/0.1.0-next.0</guid><pubDate>Mon, 07 Sep 2026 18:35:31 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://firenook.dev/changelog/0.1.0-next.0&quot;&gt;Full notes&lt;/a&gt;&lt;/p&gt;</content:encoded></item></channel></rss>