SQLite Runtime Resolution
OmniRoute resolves its SQLite driver at startup through a 5-step fallback chain:
-
Bundled
better-sqlite3(viadependenciesinpackage.json) — fastest, native binary, installed bynpm installwhen build tools are present. -
Runtime-installed
better-sqlite3(in~/.omniroute/runtime/) — installed lazily on first run OR byscripts/build/postinstall.mjs → scripts/postinstall.mjs. Validates native.nodemagic bytes (ELF / Mach-O / PE) before loading to guard against corrupt or wrong-platform binaries. -
node:sqlite(Node ≥22.5 stdlib) — no native build needed; used when both better-sqlite3 paths fail. Limited feature set. -
sql.js(WASM) — final fallback. Works everywhere but is slower and writes data on an interval rather than synchronously.
Why this complexity?
- Windows EBUSY:
npm install -g omniroute@latestcan fail if the previous version'sbetter_sqlite3.nodeis locked by a running process. The runtime install in~/.omniroute/runtime/sidesteps the global npm cache. - No build tools: Some environments (corporate Windows without VS Build
Tools, minimal Docker images) cannot compile
better-sqlite3. The runtime installer resolves a pre-built binary from the npm registry; the fallback drivers ensure OmniRoute still boots even if that fails. - Air-gapped systems: If the npm registry is unreachable,
node:sqliteorsql.jsguarantee baseline functionality.
Magic-byte validation
Before loading a runtime-installed .node file, OmniRoute reads the first 8
bytes and matches against known platform magics:
| Platform | Bytes (hex) | Label |
|---|---|---|
| Linux | 7F 45 4C 46 |
elf |
| macOS 64-bit BE | FE ED FA CF |
macho |
| macOS 64-bit LE | CF FA ED FE |
macho-le |
| macOS fat (universal) | CA FE BA BE |
macho-fat |
| Windows | 4D 5A (MZ) |
pe |
A mismatched magic → file is ignored, fallback continues to the next step.
Checking the active driver
import { getDriverInfo } from "@/lib/db/core";
const info = getDriverInfo();
// { source: "bundled" | "runtime" | "runtime-installed-now" | "node-sqlite" | "sql-js",
// kind: "better-sqlite3" | "node-sqlite" | "sql-js" }
Manual control
# Skip postinstall warm-up (for fast CI installs)
OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute
# Force-reinstall runtime better-sqlite3
rm -rf ~/.omniroute/runtime
omniroute # will reinstall on next start
# Check what driver is active
omniroute config db-info # (if CLI command exists)
Reference
Implementation:
bin/cli/runtime/magicBytes.mjs— binary magic-byte validation helpersbin/cli/runtime/sqliteRuntime.mjs— 5-step runtime resolver + lazy installerbin/cli/runtime/index.mjs— startup orchestrator (warmUpRuntimes())scripts/postinstall.mjs— npm post-install hook (non-fatal warm-up)src/lib/db/core.ts—ensureDbInitialized()/getDriverInfo()exports
🏠 Home
🌍 Languages (40+)
🚀 Getting Started
- Setup Guide
- User Guide
- Features
- Quick Start (Docker)
- Electron Desktop App
- Termux (Android)
- PWA Guide
🌐 Providers
🎯 Routing & Combos
🗜️ Compression
🔌 Integrations
- MCP Server
- A2A Server
- Agent Protocols
- OpenCode Plugin
- Webhooks
- Cloud Agents
- Skills
- Memory
- Evals
- Gamification
🏗️ Architecture
🔒 Security
- Guardrails
- Compliance
- Error Sanitization
- Public Credentials
- Route Guard Tiers
- Stealth Guide
- CLI Token Auth
📋 Reference
🚀 Operations
- VM Deployment
- Fly.io Deployment
- Tunnels Guide
- Proxy Guide
- SQLite Runtime
- Coverage Plan
- Release Checklist