Version
v0.23.0
Date
2026-07-14
Highlights
- License changed to Apache License, Version 2.0.
v0.22.0remains the
final MIT-licensed release; see Changed below. - Git integration (GitHub / GitLab). Per-site repository connections with
PR/CI tracking, GitOps reconcile, and opt-in preview environments. - Change Feed: schema-change capture + long-poll, plus a documented API/SDK
surface. - Visitor / pageview counting and extension signing + verify-everywhere
land as first-party modules.
Added
-
Git integration (GitHub / GitLab). Per-site repository connections with
GitHub App / GitLab App or OAuth/PAT auth (tokens encrypted at rest). Tracks
pull requests + CI, stores CI logs for replay, posts a
lumibase/content-validationcommit status, runs GitOps reconcile of
lumibase/intents.jsoninto content intents, records commit↔content
provenance, and provisions opt-in ephemeral preview environments per PR. New
git-syncagent role with conservative L1 autonomy. Studio: Settings →
Integrations → Git repositories. Migration0009_git_integrationis additive
(CREATE TABLE IF NOT EXISTS, tables prefixedlumibase_git_*per ADR-010) —
no backfill needed. Registry row #70.Optional env:
GITHUB_CLIENT_ID/SECRET,GITHUB_APP_ID/PRIVATE_KEY(PKCS#8),
GITLAB_CLIENT_ID/SECRET,LUMIBASE_PUBLIC_URL. Requires existing
ENCRYPTION_KEYto manage integrations. -
Change Feed API contract + SDK.
apps/cms/openapi.yamlnow documents
every/cdc/eventsand/cdc/subscriptions/*endpoint (schemas
EventEnvelope,ChangeFeedSubscription,ChangeFeedDelivery, …), and
@lumibase/sdkships typed command resources —readCdcEvents,
listCdcSubscriptions,createCdcSubscription,updateCdcSubscription,
deleteCdcSubscription,ackCdcSubscription,replayCdcSubscription,
dispatchCdcSubscription,listCdcSubscriptionDeliveries— with the
matchingCdc*result/input types. -
Change Feed captures schema changes + long-polls. The outbox gained a
resourcediscriminator (migration0008_cdc_resource_column, default
item), so collection/field DDL now emitscollections.*/fields.*
events alongsideitems.*(envelopetypeis<plural-resource>.<operation>;
schema payloads are stored verbatim — masking stays item-only).GET /cdc/eventsaccepts?wait=<seconds>(≤25) to long-poll: the server holds an
empty first read until an event arrives, cutting idle polls.settings.*
capture, realtime WS fan-out, consumer-group parallelism, inbound/two-way
sync, and outbox partitioning are specced in.kiro/specs/cdc-feed-roadmap/. -
Visitor / pageview counting (
lumibase-pageview-counter). Built-in
pageview module with four per-site strategies (db-rollupdefault,
hot-counter,cdc,hll), selectable via thepageviewssettings key. Adds
an atomic counter to the runtime (CacheProvider.increment; RedisINCRBYon
Docker, a newPageviewCounterDurable Object on Cloudflare) plus a public
beaconPOST /api/v1/pageviews/:site_id/hitand authenticated
GET /api/v1/pageviews/stats. Attribution is consent-gated (analytics) and
privacy-preserving (salted visitor hash, never a raw IP). Counters flush to
lumibase_pageview_dailyevery 5 minutes. -
Extension signing + verify-everywhere. Detached Ed25519 signatures are now
verified at every install/load path (marketplace install, generic CRUD, the
dynamic endpoint mount, hook dispatch) — officiallumibase-*extensions are
fail-closed. Newlumibase_publisher_keysregistry (DB overrides env for
official/revoked), server-derivedisOfficial, and a signing CLI
(@lumibase/extension-cli:keygen/sign/verify). Official extensions with
autoInstall/enabledByDefaultare installed during setup / on site-create.
Changed
- Project license updated to the Apache License, Version 2.0 (from MIT),
effective this release.v0.22.0is the final MIT-licensed release; no
further0.22.xpatch will be issued under MIT.LICENSEand the
publishable packages'package.json(create-lumibase,@lumibase/sdk,
@lumibase/mcp-server,@lumibase/extension-sdk) now declare
Apache-2.0.
Fixed
- Release Docker image could lose its arm64 variant.
release.yml
(amd64-only, no QEMU) anddocker-publish.yml(multi-arch) raced to push
the same semver tag; the amd64-only build could win and clobber the
multi-arch manifest (forcing Rosetta on Apple Silicon).release.ymlnow
buildslinux/amd64,linux/arm64via QEMU;docker-publish.ymlonly
publishesedgefrommain, so semver/latesttags come solely from
release.yml.
Notes
- Docs: anti-abuse mechanisms & best practices guide, OpenAPI setup-endpoint
documentation, and a data-import guide.
Migrations
0008_cdc_resource_column,0009_git_integration,0010_pageviews,
0011_extension_signing— all additive (CREATE TABLE IF NOT EXISTS/
ADD COLUMN IF NOT EXISTS, all defaulted). No data backfill required.
Upgrade steps
- Cloudflare only: deploy the new
PAGEVIEW_COUNTERDurable Object binding +
DO migrationtag="v2"(new_sqlite_classes) and the added*/5 * * * *cron
trigger (already inwrangler.tomlfor every env). Missing the DO binding
degradeshot-counter/hlltodb-rollup(fail-soft). - For official extensions to verify on an existing instance: set
MARKETPLACE_PUBLIC_KEYSto include the official key (lumibase-official-v1)
and run setup key-seed / a one-time reconcile.LUMIBASE_EXT_SIGNATURE_POLICY
defaults torequire(setwarnto soften third-party enforcement). - For Git integration: set
ENCRYPTION_KEY(if not already) plus the
provider env vars above to enable connecting repositories.