# ADR-001: SQLite Library Choice **Date:** 2026-03-23 **Status:** Accepted **Decision:** Use `sql.js` instead of `better-sqlite3` --- ## Context During MVP development (iteration 3), `better-sqlite3` failed to build on WSL2 with Node.js v22.22.0: ``` error: 'class v8::ObjectTemplate' has no member named 'SetAccessor' gyp ERR! build error ``` **Root cause:** `better-sqlite3` native bindings are not compatible with Node.js v22's V8 API changes. **Options considered:** 1. **Downgrade Node.js** to v20 LTS - ❌ Impacts other workspace projects - ❌ Not sustainable long-term 2. **Wait for better-sqlite3 update** - ❌ Blocks autonomous development - ❌ Timeline uncertain 3. **Switch to sql.js** (pure JavaScript SQLite) - ✅ Zero native dependencies - ✅ Works everywhere (WSL2, Docker, browser) - ✅ Synchronous API available - ⚠️ Slightly slower than native (acceptable for single-household use) 4. **Switch to node-sqlite3** (callback-based) - ⚠️ Async API violates ARCHITECTURE.md sync preference - ⚠️ May have similar v22 compatibility issues --- ## Decision Use **sql.js** (https://github.com/sql-js/sql.js) for MVP and beyond. **Rationale:** - Enables autonomous overnight agent work (no environment blockers) - Synchronous API matches original architecture vision - Pure JavaScript = portable across all environments - Performance difference negligible for ~1000 recipes - Can persist to filesystem same as better-sqlite3 --- ## Implementation Notes **Package:** `sql.js` (npm install sql.js) **Usage pattern:** ```typescript import initSqlJs from 'sql.js'; const SQL = await initSqlJs(); const db = new SQL.Database(); // ... same SQL queries as before ``` **Persistence:** ```typescript // Save to file const data = db.export(); fs.writeFileSync('data/recipes.db', Buffer.from(data)); // Load from file const buffer = fs.readFileSync('data/recipes.db'); db = new SQL.Database(buffer); ``` **Migration path:** - If future performance issues arise, can revisit when better-sqlite3 supports Node v22+ - Database file format is standard SQLite (portable) --- ## Consequences **Positive:** - ✅ Unblocked autonomous development - ✅ Zero native build dependencies - ✅ Easier Docker deployment - ✅ Works in browser (future PWA feature) **Negative:** - ⚠️ ~10-20% slower than native bindings (negligible for our use case) - ⚠️ Requires explicit save() calls (better-sqlite3 auto-persists) **Neutral:** - Same SQL syntax and database schema - Same overall architecture (just the driver changes) --- ## Status **Accepted** — 2026-03-23 Documented environment blocker, evaluated alternatives, chose pragmatic path forward per agent-harness methodology (keep moving vs block on environment).