About the sqlite3 WASM/JS Subproject

WebAssembly, a.k.a. WASM, is a standard defining a low-level programming language suitable (A) as a target for cross-compilation from many other languages and (B) for running via a virtual machine in a browser. Designed with scriptability via JavaScript in mind, it provides a way to compile C code (among others) to WASM and script it via JavaScript with relatively little friction despite the vast differences between JavaScript and C.

Folks have been building sqlite3 for the web since as far back as 2012 but this subproject is the first effort "officially" associated with the SQLite project, created with the goal of making WASM builds of the library first-class members of the family of supported SQLite deliverables.

Specific Goals of this Project

The concrete goals of this project include...

Specific Non-goals

Things we specifically do not aim to achieve:


Several projects have helped us considerably along the way. We are greatly indebted to (in the order we investigated them)...



The Emscripten WASM toolchain is, as of this writing, the only full-featured WASM toolchain available. Though other toolchains exist, Emscripten offers several "killer features" which others do not, most notably transparent emulation of POSIX file I/O APIs, which allows sqlite3 to function as-is in a WASM build, with no changes or tweaking necessary.

Additionally, Emscripten developers directly offered invaluable support during the development of the OPFS-based features.



Alon Zakai's sql.js was an essential stepping stone in this code's development as it demonstrates how to handle some of the WASM-related voodoo (like handling pointers-to-pointers and adding JS implementations of C-bound callback functions). These APIs have a considerably different shape than sql.js, however.

As far as we're aware, sql.js was the first-ever published use of sqlite3 for the web.



James Long's aptly-named absurd-sql demonstrates persistent browser-side sqlite3 by storing the databases in IndexedDB storage. We experimented with that approach but it didn't suit us. Even so, it was an interesting experiment.



Roy Hashimoto's wa-sqlite was the first project to public an OPFS storage option for sqlite3. It also provides a full demonstration of how to use the otherwise largely undocumented OPFS APIs.