Files
zandClaude Fable 5 3c89724d75 feat: canonical Node 24 base image with sqlite3 bundled
Node 24.18.0 (LTS Krypton) on alpine. sqlite3 bundled two ways, both
proven at build time: require('node:sqlite') builtin works, and native
better-sqlite3/sqlite3 compile against build-base+python3+sqlite-dev via
node-gyp. One base, one way: services do FROM ghcr.io/hanzoai/nodejs:v24.18.0.

Self-contained CI on hanzo-build-linux-amd64, amd64-only, semver-only
(vX.Y.Z + :v24), never sha/latest.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 12:32:29 -07:00

1.5 KiB

LLM.md — hanzoai/nodejs

Canonical Node base image for the whole Hanzo Node fleet. One base, one way.

What this is

FROM node:24.18.0-alpine + the sqlite3 toolchain, published as ghcr.io/hanzoai/nodejs:v24.18.0 (+ :v24). Every Hanzo Node service does FROM ghcr.io/hanzoai/nodejs:v24.18.0 so Node 24 and sqlite3 are uniform.

sqlite3, two ways (both build-gated)

  • require('node:sqlite') (builtin DatabaseSync, stable Node ≥22.5) — no deps.
  • better-sqlite3 / sqlite3 compile via node-gyp against build-base + python3 + sqlite-dev. The Dockerfile compiles better-sqlite3 at build time and round-trips it; the image fails to build if that breaks.

Why alpine

Majority of Hanzo Node services already use node:*-alpine. better-sqlite3 compiles cleanly on musl with build-base; node:sqlite is builtin regardless. libc6-compat lets prebuilt glibc addons load. Debian-slim consumers (paas, platform, base-studio, market, embeddings, store-api, insights, gallery) need an apt-getapk port before switching to this base — tracked as the sweep tail.

Release / bump

  1. Edit the FROM node:<X.Y.Z>-alpine pin in Dockerfile to move the runtime.
  2. Tag vX.Y.Z (must equal the Node version). CI publishes :vX.Y.Z + :vX.
  3. Consumers bump their FROM ghcr.io/hanzoai/nodejs:vX.Y.Z pin on their own release.

CI: .github/workflows/build.yml, self-contained, routes to hanzo-build-linux-amd64. amd64-only (DOKS has no arm64). Semver only, never sha/latest.