Flux

Changelog

Every package, every adapter, and what's still on the roadmap. Click a package for its full version history.

Public launch, August 17, 2026

Flux went public on Aug 17, 2026. Core jumped from 0.1.9 to 0.2.0 and flux-next from 0.1.6 to 0.1.7 on that day. Everything before it was private beta iteration.

Packages

Release history

v0.3.6Sep 30, 2026
@tsworldtech/flux
  • ChangedThe project public key used for offline license verification now lives in its own license object store instead of the shared cache store, and is stored as a plain key and timestamp with no TTL tier attached.
  • FixedThe cached key's freshness is now governed only by its 3 day browser window. Previously the record carried the 5 minute short TTL tier, which suggested a lifetime the verification code never actually enforced.
  • AddedA one time migration copies an existing key from its old cache location into the new store and keeps its original timestamp, so upgraded browsers don't spend a request against the key endpoint's daily rate limit.
v0.3.5Sep 29, 2026
@tsworldtech/flux
  • AddedCatch up request coalescing. Channels that finish subscribing within a 75ms window are sent to the adapter as one batch: through the new optional adapter.syncMany() when the adapter provides it (a single request), or one sync() per channel otherwise.
  • Fixeddestroy() now drops queued catch up requests and releases everything awaiting them, instead of leaving those promises pending after the engine is torn down.
v0.3.4Sep 22, 2026
@tsworldtech/flux
  • ChangedCross tab mirroring now sends only what changed instead of the full payload: a diff patch of upserts and removed ids for COLLECTION_ALL, a single item frame for LRU, and a full frame only for snapshots and unpersisted writes. The previous IDB record is the baseline, and a write identical to it sends nothing.
  • AddedEcho guard: while a tab is applying a frame from another tab, its own store handlers no longer re broadcast, so two tabs can't ping pong the same data.
  • AddeddispatchLocalDelete(channel, id?, options?) for SNAPSHOT and LRU channels. It deletes from the store and IDB and mirrors the delete to other tabs. For COLLECTION_ALL, keep using dispatchLocalUpdate with the new list, and the removal travels as part of the diff patch.
  • AddedLRU realtime intake. A realtime or delta row for an LRU channel now only refreshes an entry the user already cached: it never creates a cache entry for an item they never opened and never replaces the store's active item. An optional lruMerge(cachedItem, row) on the registration handles cached items that are a mapped shape while the row is a raw table row.
  • FixedValid mirrored frames were being discarded because the per tab generation counter was compared across tabs. Session safety now comes from a userId check on the receiving side.
v0.3.3Sep 20, 2026
@tsworldtech/flux
  • AddedLRU channels now catch up after a reconnect. The delta request starts from the oldest cached item's timestamp so every cached item is covered, and is skipped when that is older than the adapter's delta retention window.
  • ChangedOn a fresh page load with no in memory anchor, the sync anchor is seeded from the IDB record's write time, adjusted for clock skew and backed off 30 seconds. Replayed rows are idempotent, so the overlap is safe.
  • ChangedA channel that was just filled by a real network bootstrap now only subscribes and listens, with no redundant delta sync right behind it.
v0.3.1Sep 12, 2026
@tsworldtech/flux
  • FixedclearUserSession() now resets the per user/scope bootstrap cooldown timestamp. Previously only the bootstrap.ts 5xx failure path called clearCooldownTs, so logging out and back in within the 30s cooldown window could silently short circuit a legitimate bootstrap() call into a hydrate()-only no-op against a registry clearUserSession() had already emptied.
  • AddedexecuteLocalSessionPurge() in engine.ts now clears that cooldown for scope 'user' as one of its purge steps, alongside the existing registry, IDB, queue, and job tracker teardown — so a fresh bootstrap() call right after logout is never blocked by a stale cooldown from the previous session.
v0.3.0Sep 9, 2026
@tsworldtech/flux
  • AddeddispatchDeleteToStore: a dedicated DELETE event intake path, wired through bindDeletePortal, separate from the existing create/update gate.
  • AddedHandles all three ingestion shapes: per item IDB delete for LRU, in place array filtering for COLLECTION_ALL, and a full store/IDB clear for SNAPSHOT.
  • FixedSession purge now clears the last known user namespace marker (LAST_USER_NAMESPACE_KEY), so the UI no longer optimistically renders a dashboard backed by nothing right after a confirmed logout.
v0.2.9Sep 9, 2026
@tsworldtech/flux
  • Addedreconcile() contract: reconcileChannel() asks the adapter which locally cached record IDs the server confirms deleted, for channels whose sync anchor has aged past the adapter's delta retention window.
  • AddedisChannelPastDeltaRetention() and adapter.getDeltaRetentionWindow() run leader tab only, during the cache revalidation loop.
v0.2.8Sep 9, 2026
@tsworldtech/flux
  • AddeddispatchLocalUpdate(channel, data, options?): a third data intake path for confirmed local writes, reusing the same generation barrier and cross tab mirror gate as bootstrap and realtime data.
v0.2.7Sep 3, 2026
@tsworldtech/flux
  • FixedLicense re-verification now runs on every focus and visibilitychange event, not only while already invalid, so revocations, expirations, and the periodic public key refresh are no longer missed for the lifetime of a tab.
v0.2.6Sep 2, 2026
@tsworldtech/flux
  • AddedcreateNoopAdapter() is now the default adapter. createFlux() works out of the box with zero realtime backend configured.
  • AddedDeferred license re-evaluation queue: registrations made before the license check resolves are re-evaluated, and downgraded if needed, once it does.
v0.2.5Aug 27, 2026
@tsworldtech/flux
  • AddedevictVideoCacheForScope() wired into session purge. A logged out user's per user video cache is swept alongside IDB, queue, and job tracker state.
v0.2.3Aug 26, 2026
@tsworldtech/flux
  • AddedSparse COLLECTION_ALL patch normalization. A realtime UPDATE frame carrying just the changed record now upserts into the cached array instead of requiring a full array payload.
v0.2.0Aug 17, 2026, public launch
@tsworldtech/flux
  • AddedPer channel sync anchor map with delta catch up on reconnect: the server streams only what changed while offline instead of a full re-bootstrap.
  • AddedActivityBus holds the cache revalidation loop while realtime is actively delivering a delta stream, preventing redundant HTTP refetches.
  • AddedMulti tenant session scoping: StorageScope, clearUserSession(), and the boot time namespace sweep.
  • SecurityLicense system rewritten to fully offline ES256 signed JWT verification. Zero network calls from end user browsers to determine or enforce tier.
v0.3.1Sep 30, 2026
@tsworldtech/flux-next
  • FixedThe offline route lookup fast path now reads only the cache object store, and when the service worker was restarted and lost the active user id it falls back to matching any user's key suffix. Previously a user scoped detail page could miss its cached data after the worker had been idle.
  • FixedVisiting a dynamic route online no longer overwrites the precached __flux_shell__ document with that slug's real HTML, which removed the sentinel and made an offline visit to a different slug render the wrong page. The runtime write now only seeds a shell that is missing.
  • FixedThe service worker now closes its IndexedDB connection after every lookup and on versionchange, so it can't block a schema upgrade, and it no longer creates an empty database if the app hasn't opened one yet.
  • ChangedRoute slugs are percent decoded for IndexedDB lookups, and the config values interpolated into the generated worker are now JSON escaped.
v0.3.0Sep 20, 2026
@tsworldtech/flux-next
  • FixeddynamicRouteIdbKeys is now forwarded through withFlux() and generateSwFile() to the service worker template. It was accepted by the template but dropped before reaching it, so every route prefix silently used the full IDB scan.
  • ChangeddynamicRouteIdbKeys is now part of the derived cache version hash, so changing which prefixes use the fast path re-installs the worker on devices that already have it.
v0.2.9Sep 8, 2026
@tsworldtech/flux-next
  • AddedFlux Shells: precaches a per subpath sentinel shell document (__flux_shell__) for dynamic routes with multiple offline navigable subpages, rewritten to the real slug on serve.
  • AddeddynamicRouteIdbKeys maps a route prefix to its channel's idbKey so the service worker can do an O(log n) direct IDB lookup for offline route resolution instead of a full cursor scan.
v0.1.7Aug 17, 2026, public launch
@tsworldtech/flux-next
  • AddedwithFlux() Next.js config wrapper generates and injects the service worker at build time.
  • AddedDynamic route offline virtualization via FLUX_WARM_CHUNKS and dynamicRoutePrefixes.
v0.1.0Sep 2, 2026
@tsworldtech/flux-react
  • AddedFirst stable release: FluxProvider, useFlux, useFluxTime, a Vite plugin for service worker injection, and FluxErrorBoundary.
v0.0.6Sep 30, 2026
@tsworldtech/flux-supabase
  • FixedA flux_sync_complete broadcast is now ignored unless this client asked for a catch up. The broadcast channel name is shared by everyone subscribed to a table, so applying another tab's or device's reply could regress local state or leak rows.
  • FixedA catch up requested while another one for the same table is already in flight is no longer silently dropped. It waits for the first to settle and then issues its own request, since the in flight reply only covers the anchors of the callers that made it.
v0.0.5Sep 29, 2026
@tsworldtech/flux-supabase
  • ChangedEvery flux channel on the same table now shares one postgres_changes subscription instead of opening one Supabase channel each. Adding a channel to a table that is already subscribed just catches that channel up.
  • AddedsyncMany(): catch up for many channels in as few requests as possible. Channels sharing a table are asked for once using the oldest anchor among them, and every table goes out in a single flux_request_delta_batch call, falling back to one flux_request_delta per table when the batch function isn't installed.
  • Changedreconcile() is now a plain flux_reconcile RPC with no broadcast round trip, sent in chunks of 5,000 ids, with concurrent calls per channel sharing one request. Requires the flux_reconcile SQL function.
  • FixedLive events now honour each flux channel's own event filter (INSERT, UPDATE, DELETE, or all). Catch up frames are intentionally not filtered, so a catch up stays complete.
v0.0.4Aug 29, 2026
@tsworldtech/flux-supabase
  • AddedcreateConnectivityAwareFetch(): a fetch wrapper with a 2.5s bounded timeout that flips to a known offline state on a real network failure, not just the browser's 'offline' event.
  • AddedresolveAuthIntent(event, session) tells a confirmed logout apart from a null session your app can't yet verify because it's offline, so a flaky connection doesn't wipe a still valid session.
v0.0.4Sep 30, 2026
@tsworldtech/flux-socketio
  • FixedA second sync() on a channel that already has one in flight now waits for the first instead of overwriting it. The overwrite leaked the first request's listener and could replay the same rows twice.
  • FixedA handler that throws while a delta is being applied no longer leaves the sync() promise unresolved. Rows are delivered one at a time and a failure in one no longer aborts the rest.
  • Fixeddisconnect(), unsubscribe(), destroy(), and a dropped connection now resolve pending sync() and reconcile() calls immediately instead of waiting out their backstop timers.
  • FixedThe engine's catch up hook now fires once per channel and only while the socket is connected, where before it could fire on attach and again on connect. destroy() also removes the adapter's own connect and disconnect handlers from the socket.
  • Changedreconcile() now shares one run per channel and sends ids in chunks of 5,000, so a server sees one flux_reconcile_request per chunk for larger lists and must answer each one. Returned ids are coerced to strings.
  • ChangedDelta rows with an unrecognized op are dropped and CREATE is normalized to INSERT. The sync backstop is now 30 seconds (was 60), reconcile's is 8, and an empty delta logs at debug instead of warn.
v0.0.3Aug 11, 2026
@tsworldtech/flux-socketio
  • Addedsync() delta catch up over flux_sync_request/flux_sync_complete, and reconcile() for server confirmed deletion detection.
v0.0.3Aug 11, 2026
@tsworldtech/flux-sse
  • FixedSync anchor is now always appended to the EventSource URL, previously skipped whenever the anchor was 0, which silently dropped cold boot backfill.
  • Addedreconcile() via a configurable reconcileUrl endpoint (SSE has no client to server channel to reuse for this).
v0.0.3Aug 11, 2026
@tsworldtech/flux-websocket
  • Addedreconcile() request/response contract (RECONCILE_REQUEST / RECONCILE_COMPLETE frames).

On the roadmap

Angular, Vue, and Svelte adapters are planned but not started. Each is a thin idiomatic layer over the same core engine documented above, built after a framework's earlier integrations have shipped and earned their keep. Nothing below has a version number yet.
@tsworldtech/flux-angularMonth 6

Signals adapter for Angular 16+, plain injectable service pattern for versions 14 to 15. Built after Next.js and React have shipped and earned.

@tsworldtech/flux-vueNot yet started

Queued alongside the Angular and Svelte adapters, on the same track: a thin idiomatic layer over the same core engine.

@tsworldtech/flux-svelteNot yet started

Queued alongside the Angular and Vue adapters, on the same track: a thin idiomatic layer over the same core engine.

Cache encryption and throttlingMonth 12

AES-GCM cache encryption and connection aware realtime throttling for advanced enterprise compliance.

Powered by Flux