Tuesday, October 27, 2026

Electric Firebird / firebird-wasm: six releases in four days (v0.10.0 - v0.14.0)

Electric Firebird runs the Firebird database engine compiled to WebAssembly, in the browser and in Node, similar to what PGlite does for PostgreSQL. It ships on npm as firebird-wasm, and the repo and the package share version numbers. Six releases came out between October 24 and October 27, 2026. Here is what each one brought.

npm install firebird-wasm@0.14.0

v0.14.0 – Zero-copy results and Firebird 5.0 LTS builds (Oct 27)

v0.14.0 release notes on GitHub

  • Zero-copy query results across workers. Query results now travel in a packed binary format (FBR\x01) and are handed from the worker to the page without copying, through WorkerTransport, SharedEngineTransport and serveEngine.
  • Firebird 5.0 LTS and 6.0 engines. wasm/build.sh --firebird-ref 5 now builds a Firebird 5.0 LTS (ODS 13.1) WASM engine, alongside Firebird 6.0 (ODS 14.0). CI builds and tests both.
  • Idle cached statements are released before DDL or dropping a database.

v0.13.0 – BLOB streaming, migrations, sweep and an offline write queue (Oct 27)

v0.13.0 release notes on GitHub

  • Segmented BLOB streaming: db.openBlobStream() and db.createBlobStream() read and write large BLOBs as Web streams, segment by segment.
  • Schema introspection and migrations: db.introspect() returns typed metadata for tables, views and sequences. db.migrate() runs ordered, transactional migrations and tracks them in FB_MIGRATIONS$.
  • Sweep: db.sweep() (and a Sweep button in <firebird-repl>) runs garbage collection and reports how far the OIT moved and how many pages were reclaimed.
  • Durable offline writes for Electric sync: pending changes are stored in a FB_WRITE_QUEUE$ table, survive page reloads, and roll local rows back if the server rejects them.
  • Prepared statement streaming: stmt.queryStream() streams rows in batches without preparing the SQL again.

v0.12.0 – Developer experience: live queries, plans, diagnostics (Oct 26)

v0.12.0 release notes on GitHub

  • Zero-config live queries: db.live(sql, onChange) and the React/Vue useLiveQuery(sql) hooks now find the tables a query uses and install the change triggers themselves.
  • Query plans: db.explain(sql) returns the compact PLAN (...) or Firebird's detailed plan tree, without running the query.
  • Database diagnostics: db.databaseInfo() reports page size, database size, ODS version, OIT/OAT/OST transaction counters, memory use and I/O counters.
  • Prepared statement handles: db.prepare(sql) returns a reusable statement with query, exec and execBatch.
  • Streaming dump and restore: dumpDataStream() and loadDataStream() work in 64 KiB chunks, with optional gzip, so the whole database never has to sit in memory at once.
  • ICU locale packs: locale collations such as de_DE, es_ES, fr_FR and ja_JP can be loaded on demand, so the default WASM binary stays the same size.

v0.11.0 – Unicode collations built in (Oct 25)

v0.11.0 release notes on GitHub

  • The engine now embeds ICU 68 collation data (about 130 KB gzipped), so COLLATE UNICODE, UNICODE_CI (case-insensitive) and UNICODE_CI_AI (case- and accent-insensitive) work out of the box in tables, ORDER BY, WHERE, GROUP BY and indexes.
  • Fixed an ICU function signature mismatch that WebAssembly's strict call checking rejected.

v0.10.1 – Fixed npm package (Oct 25)

v0.10.1 release notes on GitHub

  • The 0.10.0 npm package had shipped the older 0.9.0 WASM binaries by mistake. 0.10.1 ships the rebuilt ones, so queryStream() and DECFLOAT support actually work.
  • Multi-row INSERTs in the Kysely and Drizzle dialects now go through execBatch, avoiding Firebird error -804 (Data type unknown).
  • Build script and CI fixes, including GCC 15 support.

v0.10.0 – Kysely and Drizzle ORMs, streaming queries (Oct 24)

v0.10.0 release notes on GitHub

  • ORM dialects: firebird-wasm/kysely and firebird-wasm/drizzle support Firebird pagination, upserts via UPDATE OR INSERT ... MATCHING, RETURNING, identity columns, transactions and savepoints.
  • Streaming queries: queryStream() returns rows in batches (500 by default) over an open cursor. Stopping a for await loop early closes the cursor right away.
  • Node parity: the Node backend now returns the same value types and field metadata as the browser.
  • Electric shape server: replica=full sends old values on updates and deletes, and applyWrite() confirms queued writes directly.
  • Faster batches on Node through Firebird 4.0+'s native IBatch API, plus zero-copy OPFS reads and writes in the browser.

Try it

The source, demos and full changelog are on GitHub, and the package is on npm. Bug reports and feedback are welcome.

No comments: