<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>ARDOR changelog</title><link>https://ardor.venizia.ai/changelogs/</link><description>What changed in ARDOR, who is affected and what to do about it.</description><item><title>useStoredState can turn its storage off with a null key</title><link>https://ardor.venizia.ai/changelogs/2026-11-08-stored-state-null-key</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-08-stored-state-null-key</guid><pubDate>Sun, 08 Nov 2026 12:00:00 GMT</pubDate><description>A null key makes useStoredState keep its value in memory, like useState, so a component can store state only when a user id or a flag is known.</description><category>Feature</category></item><item><title>BrowserStorage.subscribe tells a change of this tab from one of another tab</title><link>https://ardor.venizia.ai/changelogs/2026-11-08-storage-subscribe-is-external</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-08-storage-subscribe-is-external</guid><pubDate>Sun, 08 Nov 2026 12:00:00 GMT</pubDate><description>The listener of BrowserStorage.subscribe gets { isExternal }, false after a write through BrowserStorage in this tab and true when another tab changed the key.</description><category>Feature</category></item><item><title>reduxStore is optional</title><link>https://ardor.venizia.ai/changelogs/2026-11-08-redux-store-is-optional</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-08-redux-store-is-optional</guid><pubDate>Sun, 08 Nov 2026 12:00:00 GMT</pubDate><description>ArdorApplication no longer needs a Redux store; without one it mounts no Redux provider.</description><category>Feature</category></item><item><title>The app preset no longer has a vendor chunk that the first screen loads</title><link>https://ardor.venizia.ai/changelogs/2026-11-08-preset-vendor-group</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-08-preset-vendor-group</guid><pubDate>Sun, 08 Nov 2026 12:00:00 GMT</pubDate><description>The app preset keeps only the react group in codeSplitting, because its catch-all vendor group put the libraries of lazy routes into the first screen.</description><category>Behavior</category></item><item><title>useIntersection watches several targets, a scroll container and several thresholds</title><link>https://ardor.venizia.ai/changelogs/2026-11-08-intersection-several-targets</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-08-intersection-several-targets</guid><pubDate>Sun, 08 Nov 2026 12:00:00 GMT</pubDate><description>useIntersection takes a list of targets and returns one entry for each, takes a root element, and takes a list of thresholds, so a scroll-spy needs no own observer.</description><category>Feature</category></item><item><title>Test fakes for the browser APIs the hooks use</title><link>https://ardor.venizia.ai/changelogs/2026-11-06-test-fakes</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-06-test-fakes</guid><pubDate>Fri, 06 Nov 2026 12:00:00 GMT</pubDate><description>FakeIntersectionObserver, FakeMatchMedia, FakeStorage and FakeClipboard join FakeResizeObserver, which now shows its observers; all in @venizia/ardor/testing.</description><category>Feature</category></item><item><title>Sign-out removes the stored data and the cached queries of the user</title><link>https://ardor.venizia.ai/changelogs/2026-11-06-sign-out-clears-data</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-06-sign-out-clears-data</guid><pubDate>Fri, 06 Nov 2026 12:00:00 GMT</pubDate><description>When the session ends, by any route, the auth provider removes the keys under @app/store/ and the application empties the query cache.</description><category>Behavior</category></item><item><title>The REST data provider sends the record id as one path segment</title><link>https://ardor.venizia.ai/changelogs/2026-11-06-record-id-segment</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-06-record-id-segment</guid><pubDate>Fri, 06 Nov 2026 12:00:00 GMT</pubDate><description>getOne, update and delete percent-encode the id, so an id with a slash, a question mark or a hash reaches the server whole; doRequest refuses dot segments.</description><category>Fix</category></item><item><title>The generated app sends a report-only CSP and checks its container input</title><link>https://ardor.venizia.ai/changelogs/2026-11-06-preset-hardening</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-06-preset-hardening</guid><pubDate>Fri, 06 Nov 2026 12:00:00 GMT</pubDate><description>The app preset sends Content-Security-Policy-Report-Only, hides the nginx version, refuses more secret-looking VITE_ values and checks NGINX_LOCAL_RESOLVERS.</description><category>Behavior</category></item><item><title>The codemod never writes through a symlink</title><link>https://ardor.venizia.ai/changelogs/2026-11-06-codemod-symlink</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-06-codemod-symlink</guid><pubDate>Fri, 06 Nov 2026 12:00:00 GMT</pubDate><description>ardor codemod namespace skips a tracked symlink, so --write cannot change a file outside the project that the link points to.</description><category>Fix</category></item><item><title>The codemod writes all files or none, and refuses outside git</title><link>https://ardor.venizia.ai/changelogs/2026-11-06-codemod-safe-write</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-06-codemod-safe-write</guid><pubDate>Fri, 06 Nov 2026 12:00:00 GMT</pubDate><description>ardor codemod namespace --write stages every file, names a file it cannot rewrite and writes nothing then, and needs --allow-dirty outside a git repository.</description><category>Fix</category><category>Behavior</category></item><item><title>Client-side roles only show or hide interface</title><link>https://ardor.venizia.ai/changelogs/2026-11-06-client-roles-ui-only</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-06-client-roles-ui-only</guid><pubDate>Fri, 06 Nov 2026 12:00:00 GMT</pubDate><description>The roles ARDOR keeps in the browser, and the permission provider, are not an access check; the docs and the TSDoc now say the backend must check every permission.</description><category>Enhancement</category></item><item><title>An application id keeps two applications on one origin apart</title><link>https://ardor.venizia.ai/changelogs/2026-11-06-application-id-keys</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-06-application-id-keys</guid><pubDate>Fri, 06 Nov 2026 12:00:00 GMT</pubDate><description>IApplicationInfo.id scopes the session keys and the store prefix in browser storage; without it nothing changes, so a single application per origin needs no migration.</description><category>Feature</category></item><item><title>Sign-in can stay on the page, and the resolved auth provider can be typed as present</title><link>https://ardor.venizia.ai/changelogs/2026-11-06-after-login-false</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-06-after-login-false</guid><pubDate>Fri, 06 Nov 2026 12:00:00 GMT</pubDate><description>paths.afterLogin accepts false so login resolves with redirectTo false; ApplicationProviders.resolve takes isAuthRequired to type the auth provider as present.</description><category>Feature</category></item><item><title>Everything since ARDOR 0.4.7 in one place, with an upgrade checklist</title><link>https://ardor.venizia.ai/changelogs/2026-11-05-batch-overview</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-05-batch-overview</guid><pubDate>Thu, 05 Nov 2026 12:00:00 GMT</pubDate><description>A table of every change since 0.4.7 linked to its entry, the IGNIS peer versions, and the ordered checklist an application follows to move to ARDOR 0.4.8.</description><category>Release</category></item><item><title>ISendResponse and IListFilter.offset are removed</title><link>https://ardor.venizia.ai/changelogs/2026-11-05-remove-aliases</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-05-remove-aliases</guid><pubDate>Thu, 05 Nov 2026 12:00:00 GMT</pubDate><description>ISendResponse was a second name for INetworkResponse, and IListFilter.offset an alias of skip; both are removed, and the codemod renames or lists them.</description><category>Breaking</category></item><item><title>useUntypedTranslate translates a key that exists only at run time</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-untyped-translate-hook</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-untyped-translate-hook</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>useUntypedTranslate takes a plain string key, so a server error code or a data label needs no cast, while useTranslate keeps its compile-time key check.</description><category>Feature</category></item><item><title>useStoredState writeDelayMs writes the storage once after a burst of changes</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-stored-state-write-delay</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-stored-state-write-delay</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>useStoredState writeDelayMs updates the UI at once and writes localStorage once after the delay, for a value that changes many times a second.</description><category>Feature</category></item><item><title>useStoredState updaters compose, and the sign-out order is documented</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-stored-state-chained-updaters</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-stored-state-chained-updaters</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>setValue(updater) of useStoredState runs against the value at the call, so two updaters in one tick both apply; the reference covers sign-out.</description><category>Fix</category></item><item><title>StorageCodecs.text reads and writes a bare string</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-storage-text-codec</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-storage-text-codec</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>StorageCodecs.text() stores a string as it is, with an optional list of allowed values; useStoredState and BrowserStorage take it as a codec.</description><category>Feature</category></item><item><title>useResizeEffect runs one callback when any of several elements resizes</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-resize-effect-hook</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-resize-effect-hook</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>useResizeEffect observes several elements, and with children their direct children, and calls onResize once per animation frame or before paint.</description><category>Feature</category></item><item><title>useSizer is removed, use useElementSize</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-remove-use-sizer</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-remove-use-sizer</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>useSizer measured the element with a given id; useElementSize measures an element or a ref with more options, so useSizer is removed with no alias.</description><category>Breaking</category></item><item><title>useIntersection tells whether an element is in view</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-intersection-hook</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-intersection-hook</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>useIntersection returns the latest IntersectionObserverEntry of an element, so lazy content or a load-more sentinel needs no own observer.</description><category>Feature</category></item><item><title>ardor-react and ardor-admin no longer depend on lodash</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-drop-lodash</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-drop-lodash</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>Six lodash calls are replaced by destructuring, an existing check and two small helpers, about 10 KB less in an app bundle.</description><category>Enhancement</category></item><item><title>A refreshTokenPath now refreshes the token without a subclass</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-default-token-refresh</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-default-token-refresh</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>With authRecovery.refreshTokenPath set, the default refreshToken posts to it and saves the new token, so a 401 recovers with no subclass.</description><category>Behavior</category></item><item><title>useCopyToClipboard returns isCopied, with a resetMs option</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-copy-is-copied</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-copy-is-copied</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>useCopyToClipboard returns { copy, isCopied }, and resetMs sets isCopied back to false after a delay, so a &quot;Copied&quot; button needs no state or timer of its own.</description><category>Feature</category></item><item><title>BrowserClipboard writes and reads the clipboard outside React</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-clipboard-helper</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-clipboard-helper</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>BrowserClipboard.writeText and readText answer false or undefined on every refusal; useCopyToClipboard calls it and no longer throws on a server.</description><category>Feature</category></item><item><title>BrowserStorage.keys and removeWhere list and sweep keys by prefix</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-browser-storage-keys</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-browser-storage-keys</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>BrowserStorage.keys lists the keys of a storage area and removeWhere removes those with a prefix, without throwing.</description><category>Feature</category></item><item><title>useMediaQuery, useDocumentVisibility and useOnlineStatus read browser state</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-browser-state-hooks</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-browser-state-hooks</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>Three SSR-safe hooks over useSyncExternalStore for a media query, tab visibility and online status, with no hand-written subscribe.</description><category>Feature</category></item><item><title>useInjectableContainer is now useApplicationContainer</title><link>https://ardor.venizia.ai/changelogs/2026-11-04-application-container</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-04-application-container</guid><pubDate>Wed, 04 Nov 2026 12:00:00 GMT</pubDate><description>The hook that returns the application's container is renamed to say what it returns; there is no alias, and the upgrade is a find and replace.</description><category>Breaking</category></item><item><title>RequestBodyEncoder types its body, and ResponseReader reads a file name</title><link>https://ardor.venizia.ai/changelogs/2026-11-03-typed-request-body-and-filename</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-03-typed-request-body-and-filename</guid><pubDate>Tue, 03 Nov 2026 12:00:00 GMT</pubDate><description>encode returns a FormData, a URLSearchParams or the body you passed, and readFilename returns the name in a Content-Disposition header.</description><category>Feature</category><category>Enhancement</category></item><item><title>Session hooks see every token change, and the unauthenticated rejection is configurable</title><link>https://ardor.venizia.ai/changelogs/2026-11-03-token-hook-and-guest-rejection</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-03-token-hook-and-guest-rejection</guid><pubDate>Tue, 03 Nov 2026 12:00:00 GMT</pubDate><description>DefaultAuthService.subscribe tells the provider about every saved or cleared session, so onSessionStarted fires for a refresh by the network service, and unauthenticatedRejection sets what checkAuth and a 401 reject with.</description><category>Feature</category><category>Enhancement</category></item><item><title>DefaultAuthProvider has session hooks</title><link>https://ardor.venizia.ai/changelogs/2026-11-03-session-lifecycle-hooks</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-03-session-lifecycle-hooks</guid><pubDate>Tue, 03 Nov 2026 12:00:00 GMT</pubDate><description>onSessionStarted and onSessionCleared tell a subclass when the session starts, changes its token or ends, so a socket or a per-user cache stays in step without overriding checkAuth.</description><category>Feature</category></item><item><title>useElementSize no longer throws where there is no ResizeObserver</title><link>https://ardor.venizia.ai/changelogs/2026-11-03-element-size-without-resize-observer</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-03-element-size-without-resize-observer</guid><pubDate>Tue, 03 Nov 2026 12:00:00 GMT</pubDate><description>useElementSize stays at 0 by 0 and observes nothing on a host without ResizeObserver, instead of throwing in its effect.</description><category>Fix</category></item><item><title>useElementSize follows any element, rounds and says when it measured, and FakeResizeObserver tests it</title><link>https://ardor.venizia.ai/changelogs/2026-11-03-element-size-ref-round-measured</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-03-element-size-ref-round-measured</guid><pubDate>Tue, 03 Nov 2026 12:00:00 GMT</pubDate><description>useElementSize returns a callback ref when you pass none, takes round, returns measured, and @venizia/ardor/testing has FakeResizeObserver for hosts whose ResizeObserver does nothing.</description><category>Feature</category></item><item><title>Typed browser storage and useElementSize</title><link>https://ardor.venizia.ai/changelogs/2026-11-03-browser-storage-and-element-size</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-03-browser-storage-and-element-size</guid><pubDate>Tue, 03 Nov 2026 12:00:00 GMT</pubDate><description>BrowserStorage reads and writes localStorage and sessionStorage without throwing, useStoredState keeps a value in step across hooks and tabs, and useElementSize measures a ref.</description><category>Feature</category></item><item><title>Everything since ARDOR 0.4.6 in one place, with an upgrade checklist</title><link>https://ardor.venizia.ai/changelogs/2026-11-02-batch-overview</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-02-batch-overview</guid><pubDate>Mon, 02 Nov 2026 12:00:00 GMT</pubDate><description>A table of every change since 0.4.6 linked to its entry, the peer versions, and the ordered checklist an application follows to move to ARDOR 0.4.7.</description><category>Release</category></item><item><title>Sign-out clears only keys under @app/auth/, not @app/oauth2/</title><link>https://ardor.venizia.ai/changelogs/2026-11-02-sign-out-oauth2-prefix</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-02-sign-out-oauth2-prefix</guid><pubDate>Mon, 02 Nov 2026 12:00:00 GMT</pubDate><description>DefaultAuthService.cleanUp no longer removes keys under @app/oauth2/, and LocalStorageKeys.PREFIX_OAUTH2 is removed.</description><category>Breaking</category></item><item><title>The i18n provider takes lazy sources, so a catalogue stays out of the boot bundle</title><link>https://ardor.venizia.ai/changelogs/2026-11-01-lazy-i18n-sources</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-01-lazy-i18n-sources</guid><pubDate>Sun, 01 Nov 2026 12:00:00 GMT</pubDate><description>An entry of i18nSources can be a loader such as () =&gt; import('./vi'), called the first time its locale is used; a loader that fails leaves the locale on English.</description><category>Feature</category></item><item><title>Utilities move to classes, hooks to Ardor, logger to IGNIS, and old names are removed</title><link>https://ardor.venizia.ai/changelogs/2026-11-01-class-namespaces</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-11-01-class-namespaces</guid><pubDate>Sun, 01 Nov 2026 12:00:00 GMT</pubDate><description>Utilities and helpers are now on classes, Ardor holds all hooks, the logger comes from IGNIS, and a tool updates your code.</description><category>Breaking</category><category>Enhancement</category><category>Check this</category></item><item><title>Everything since ARDOR 0.4.4 in one place, with an upgrade checklist</title><link>https://ardor.venizia.ai/changelogs/2026-10-28-batch-overview</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-28-batch-overview</guid><pubDate>Wed, 28 Oct 2026 12:00:00 GMT</pubDate><description>A table of every change since 0.4.4 linked to its entry, and the checklist an application follows to move to ARDOR 0.4.5.</description><category>Release</category></item><item><title>useDocumentTitle takes fallback, a base title screens override</title><link>https://ardor.venizia.ai/changelogs/2026-10-28-document-title-fallback</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-28-document-title-fallback</guid><pubDate>Wed, 28 Oct 2026 12:00:00 GMT</pubDate><description>useDocumentTitle gains an optional fallback flag; a fallback call shows its title only while no other call is mounted.</description><category>Feature</category></item><item><title>assertArdorApplicationBoots proves an application boots in a unit test</title><link>https://ardor.venizia.ai/changelogs/2026-10-27-assert-ardor-application-boots</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-27-assert-ardor-application-boots</guid><pubDate>Tue, 27 Oct 2026 12:00:00 GMT</pubDate><description>The new entry @venizia/ardor/testing exports assertArdorApplicationBoots, which proves an application boots in a unit test, with no browser and no network.</description><category>Feature</category></item><item><title>ArdorApplication takes a features prop, so a shell mounts a filtered list</title><link>https://ardor.venizia.ai/changelogs/2026-10-27-application-features-prop</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-27-application-features-prop</guid><pubDate>Tue, 27 Oct 2026 12:00:00 GMT</pubDate><description>ArdorApplication has a new optional features prop, the list of features to mount, so a shell can mount a filtered list.</description><category>Feature</category></item><item><title>Everything since ARDOR 0.4.3 in one place, with an upgrade checklist</title><link>https://ardor.venizia.ai/changelogs/2026-10-26-batch-overview</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-26-batch-overview</guid><pubDate>Mon, 26 Oct 2026 12:00:00 GMT</pubDate><description>A table of every change since 0.4.3 grouped by kind and linked to its entry, and the checklist an application follows to move to ARDOR 0.4.4.</description><category>Release</category></item><item><title>Chunks keep import order, and buildInfoFile writes build-info.json</title><link>https://ardor.venizia.ai/changelogs/2026-10-26-vite-build-info</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-26-vite-build-info</guid><pubDate>Mon, 26 Oct 2026 12:00:00 GMT</pubDate><description>The preset turns on output.strictExecutionOrder so chunks keep import order, and @venizia/ardor/vite adds buildInfoFile for an About page.</description><category>Feature</category><category>Behavior</category></item><item><title>The repository sub-path exports HttpReadShapes</title><link>https://ardor.venizia.ai/changelogs/2026-10-26-ignis-0-4-3-repository-exports</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-26-ignis-0-4-3-repository-exports</guid><pubDate>Mon, 26 Oct 2026 12:00:00 GMT</pubDate><description>The repository sub-path re-exports the HTTP module of IGNIS, so HttpReadShapes and THttpReadShape from IGNIS 0.4.3 are importable from ARDOR.</description><category>Enhancement</category></item><item><title>Everything since ARDOR 0.4.1 in one place, with an upgrade checklist</title><link>https://ardor.venizia.ai/changelogs/2026-10-25-batch-overview</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-25-batch-overview</guid><pubDate>Sun, 25 Oct 2026 12:00:00 GMT</pubDate><description>A table of every change since 0.4.1 linked to its entry, and the checklist an application follows to move to ARDOR 0.4.3.</description><category>Release</category></item><item><title>getRuntimeConfig can require a value</title><link>https://ardor.venizia.ai/changelogs/2026-10-25-runtime-config-required</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-25-runtime-config-required</guid><pubDate>Sun, 25 Oct 2026 12:00:00 GMT</pubDate><description>Passing required to getRuntimeConfig makes it return a string and throw, naming the key, when no value is set; the error carries a code and the key.</description><category>Feature</category><category>Enhancement</category></item><item><title>The preset image compresses, answers /health and sends security headers</title><link>https://ardor.venizia.ai/changelogs/2026-10-25-preset-nginx</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-25-preset-nginx</guid><pubDate>Sun, 25 Oct 2026 12:00:00 GMT</pubDate><description>The preset image gzips text, answers /health, sends three security headers on every response, and writes the /api proxy only when API_UPSTREAM is set.</description><category>Security</category><category>Feature</category><category>Enhancement</category><category>Behavior</category></item><item><title>The network service is split into small parts, and its types are closed</title><link>https://ardor.venizia.ai/changelogs/2026-10-25-network-service-split</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-25-network-service-split</guid><pubDate>Sun, 25 Oct 2026 12:00:00 GMT</pubDate><description>DefaultNetworkRequestService stays the class you extend, its request types are closed, and the fetcher and socket client now come from IGNIS.</description><category>Breaking</category></item><item><title>Correctness fixes in the kernel, the admin and the hooks</title><link>https://ardor.venizia.ai/changelogs/2026-10-25-correctness-fixes</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-25-correctness-fixes</guid><pubDate>Sun, 25 Oct 2026 12:00:00 GMT</pubDate><description>A series of fixes in the data providers, the network service, the auth service and the React hooks where the code did not do what its documentation said.</description><category>Fix</category></item><item><title>ARDOR 0.4.1 follows IGNIS 0.4.1</title><link>https://ardor.venizia.ai/changelogs/2026-10-25-ardor-0-4-1</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-25-ardor-0-4-1</guid><pubDate>Sun, 25 Oct 2026 12:00:00 GMT</pubDate><description>The four ARDOR packages move to 0.4.1 and peer on IGNIS 0.4.1; the node fetcher no longer logs the Authorization header or the sign-in password.</description><category>Breaking</category></item><item><title>The fetcher no longer logs secrets, and four request bugs are fixed</title><link>https://ardor.venizia.ai/changelogs/2026-10-24-node-fetcher-fixes</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-24-node-fetcher-fixes</guid><pubDate>Sat, 24 Oct 2026 12:00:00 GMT</pubDate><description>NodeFetcher stops logging request headers and bodies, keeps your abort signal with a timeout, sends bodies as they are, and joins params to a url with a query.</description><category>Security</category><category>Fix</category></item><item><title>ARDOR 0.4.0 follows IGNIS 0.4.0</title><link>https://ardor.venizia.ai/changelogs/2026-10-24-ardor-0-4-0</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-24-ardor-0-4-0</guid><pubDate>Sat, 24 Oct 2026 12:00:00 GMT</pubDate><description>The four ARDOR packages move to 0.4.0 and peer on IGNIS 0.4.0; the app preset gets required runtime variables and no formatter config.</description><category>Breaking</category></item><item><title>Runtime config in the app preset, one image for every environment</title><link>https://ardor.venizia.ai/changelogs/2026-10-22-preset-runtime-config</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-22-preset-runtime-config</guid><pubDate>Thu, 22 Oct 2026 12:00:00 GMT</pubDate><description>The app preset writes config.js from VITE_ variables at container start, getRuntimeConfig reads it, and APP_REQUIRED_ENV stops a container early.</description><category>Feature</category></item><item><title>A feature library preset</title><link>https://ardor.venizia.ai/changelogs/2026-10-21-preset-lib</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-21-preset-lib</guid><pubDate>Wed, 21 Oct 2026 12:00:00 GMT</pubDate><description>vulcan add --preset ardor --lib &lt;name&gt; adds an ARDOR feature package to a monorepo, with a sample feature and a test that mounts it.</description><category>Feature</category></item><item><title>ARDOR ships a VULCAN preset</title><link>https://ardor.venizia.ai/changelogs/2026-10-20-vulcan-preset</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-20-vulcan-preset</guid><pubDate>Tue, 20 Oct 2026 12:00:00 GMT</pubDate><description>Create a monorepo with an ARDOR admin, or add an admin to an existing monorepo, with the ARDOR preset for VULCAN 0.3.0 or newer.</description><category>Feature</category></item><item><title>ARDOR 0.3.0 Is Stable</title><link>https://ardor.venizia.ai/changelogs/2026-10-20-ardor-0-3-0-stable</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-20-ardor-0-3-0-stable</guid><pubDate>Tue, 20 Oct 2026 12:00:00 GMT</pubDate><description>The four ARDOR packages are published at 0.3.0 on the latest tag, on IGNIS 0.3.0. ARDOR and IGNIS now share a minor version.</description><category>Enhancement</category></item><item><title>Every app has the same scripts</title><link>https://ardor.venizia.ai/changelogs/2026-10-20-app-script-standard</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-20-app-script-standard</guid><pubDate>Tue, 20 Oct 2026 12:00:00 GMT</pubDate><description>The generated admin and the examples use one set of script names (server:dev, compile, typecheck, lint, test, clean). The names dev and build are gone.</description><category>Breaking</category></item><item><title>toDataUrl no longer needs Promise.withResolvers</title><link>https://ardor.venizia.ai/changelogs/2026-10-19-to-data-url-without-with-resolvers</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-19-to-data-url-without-with-resolvers</guid><pubDate>Mon, 19 Oct 2026 12:00:00 GMT</pubDate><description>toDataUrl builds its promise with new Promise, so it runs on a Chrome older than 119.</description><category>Fix</category></item><item><title>Augment @venizia/ardor, not the declaring packages</title><link>https://ardor.venizia.ai/changelogs/2026-10-19-augment-the-umbrella</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-19-augment-the-umbrella</guid><pubDate>Mon, 19 Oct 2026 12:00:00 GMT</pubDate><description>Augment IUseInjectableKeysOverrides and IUseTranslateKeysOverrides on @venizia/ardor; a block on -react or -admin fails under a non-hoisting linker.</description><category>Fix</category></item><item><title>TPaths stops at a Date, a Set, a function and an any field</title><link>https://ardor.venizia.ai/changelogs/2026-10-18-tpaths-stops-at-values</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-18-tpaths-stops-at-values</guid><pubDate>Sun, 18 Oct 2026 12:00:00 GMT</pubDate><description>TPaths no longer names the members of a Date, RegExp, Set, Map, Promise, function or any field as paths, so createdAt.getTime is not a state path.</description><category>Fix</category></item><item><title>ARDOR 0.1.4 on stable IGNIS 0.2.2</title><link>https://ardor.venizia.ai/changelogs/2026-10-18-stable-ignis-0-2-2</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-18-stable-ignis-0-2-2</guid><pubDate>Sun, 18 Oct 2026 12:00:00 GMT</pubDate><description>The IGNIS peers of the four packages are the stable ^0.2.2 range instead of 0.2.2-N prerelease floors. ARDOR 0.1.4 is the first stable line on them.</description><category>Behavior</category></item><item><title>login stores roles, and the sign-in extension points are protected hooks</title><link>https://ardor.venizia.ai/changelogs/2026-10-18-sign-in-hooks</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-18-sign-in-hooks</guid><pubDate>Sun, 18 Oct 2026 12:00:00 GMT</pubDate><description>DefaultAuthProvider.login saves the roles of the sign-in response where getRoles reads them. The four sign-in options of 0.1.4-4 become protected hooks.</description><category>Enhancement</category><category>Behavior</category></item><item><title>One copy of each package that carries identity, owned by the application</title><link>https://ardor.venizia.ai/changelogs/2026-10-18-one-copy-of-each</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-18-one-copy-of-each</guid><pubDate>Sun, 18 Oct 2026 12:00:00 GMT</pubDate><description>ra-i18n-polyglot is a peer of ardor-admin and ardor, so an application needs no resolve.dedupe list.</description><category>Behavior</category></item><item><title>Types, hooks and utilities follow IGNIS house style</title><link>https://ardor.venizia.ai/changelogs/2026-10-18-house-style-types-hooks-utilities</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-18-house-style-types-hooks-utilities</guid><pubDate>Sun, 18 Oct 2026 12:00:00 GMT</pubDate><description>Kernel utilities take one options object, React hooks take opts with an enabled flag, and features are defined through Features.</description><category>Behavior</category></item><item><title>Options hold data, behaviour lives in protected hooks</title><link>https://ardor.venizia.ai/changelogs/2026-10-18-hooks-not-flags</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-18-hooks-not-flags</guid><pubDate>Sun, 18 Oct 2026 12:00:00 GMT</pubDate><description>Callbacks, flags and setters on the network service, providers and fetchers become protected hooks; an old-to-new table lists every renamed name.</description><category>Behavior</category></item><item><title>A Vite application autoloads its classes with IgnisArtifactsVitePlugin</title><link>https://ardor.venizia.ai/changelogs/2026-10-18-final-pin-and-autoload</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-18-final-pin-and-autoload</guid><pubDate>Sun, 18 Oct 2026 12:00:00 GMT</pubDate><description>A Vite application registers its decorated classes with IgnisArtifactsVitePlugin and AutoArtifacts instead of listing them; the IGNIS peer floors move.</description><category>Behavior</category></item><item><title>A package depends on its siblings at the exact version released with it</title><link>https://ardor.venizia.ai/changelogs/2026-10-18-exact-sibling-versions</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-18-exact-sibling-versions</guid><pubDate>Sun, 18 Oct 2026 12:00:00 GMT</pubDate><description>ardor, ardor-admin and ardor-react name the other ARDOR packages at the exact version released with them, so a fresh install cannot pull a newer sibling.</description><category>Fix</category></item><item><title>IGNIS's sign-in is the default, and an application can run with no sign-in</title><link>https://ardor.venizia.ai/changelogs/2026-10-18-auth-optional-and-ignis-sign-in</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-18-auth-optional-and-ignis-sign-in</guid><pubDate>Sun, 18 Oct 2026 12:00:00 GMT</pubDate><description>DefaultAuthProvider signs in the way IGNIS's auth controller expects, and ArdorApplication runs with no auth provider; the old path and body stay expressible.</description><category>Behavior</category></item><item><title>start() names a module cycle in the artifact index</title><link>https://ardor.venizia.ai/changelogs/2026-10-18-artifact-cycle-error</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-18-artifact-cycle-error</guid><pubDate>Sun, 18 Oct 2026 12:00:00 GMT</pubDate><description>An artifact index that lists undefined or a non-class, as a module cycle leaves behind, makes start() throw an error that names the position and the cause.</description><category>Fix</category></item><item><title>PATCH in upper case, log levels, no pagination, no NaN count</title><link>https://ardor.venizia.ai/changelogs/2026-10-17-patch-log-levels-pagination-count</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-17-patch-log-levels-pagination-count</guid><pubDate>Sat, 17 Oct 2026 12:00:00 GMT</pubDate><description>Four fixes: upper-case fetcher methods, one console method per log level, getManyReference without pagination, no NaN count.</description><category>Fix</category></item><item><title>A generated artifact index for the application</title><link>https://ardor.venizia.ai/changelogs/2026-10-17-generated-artifact-index</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-17-generated-artifact-index</guid><pubDate>Sat, 17 Oct 2026 12:00:00 GMT</pubDate><description>artifacts() takes the index ignis-artifacts generate emits, so a bundler keeps every stereotyped class and start() fails on a class that was never discovered.</description><category>Feature</category></item><item><title>canAccess reaches an AuthProvider subclass without a fourth super argument</title><link>https://ardor.venizia.ai/changelogs/2026-10-14-permission-provider-from-the-container</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-14-permission-provider-from-the-container</guid><pubDate>Wed, 14 Oct 2026 12:00:00 GMT</pubDate><description>DefaultAuthProvider reads the bound permission provider from the container itself, so a subclass with its own constructor gets canAccess without forwarding it.</description><category>Fix</category></item><item><title>The data provider throws an ApplicationError and reads Content-Range</title><link>https://ardor.venizia.ai/changelogs/2026-10-10-data-provider-errors-through-response-reader</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-10-data-provider-errors-through-response-reader</guid><pubDate>Sat, 10 Oct 2026 12:00:00 GMT</pubDate><description>A failed request through the REST data providers rejects with an ApplicationError, and a malformed Content-Range falls back to the row count.</description><category>Breaking</category><category>Behavior</category></item><item><title>checkError redirects on a 401 or 403 from the data provider</title><link>https://ardor.venizia.ai/changelogs/2026-10-10-check-error-reads-status-code</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-10-check-error-reads-status-code</guid><pubDate>Sat, 10 Oct 2026 12:00:00 GMT</pubDate><description>DefaultAuthProvider.checkError falls back to statusCode, so an ApplicationError thrown by the data provider now reaches its 401 and 403 branches.</description><category>Fix</category></item><item><title>useDocumentTitle and useHtmlLang</title><link>https://ardor.venizia.ai/changelogs/2026-10-09-document-title-and-html-lang-hooks</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-09-document-title-and-html-lang-hooks</guid><pubDate>Fri, 09 Oct 2026 12:00:00 GMT</pubDate><description>Two admin hooks - one sets the browser tab title per screen and restores it on unmount, the other keeps the html lang attribute on the UI locale.</description><category>Feature</category></item><item><title>Const-value types keep their literals when copied</title><link>https://ardor.venizia.ai/changelogs/2026-10-09-const-value-types-keep-literals</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-09-const-value-types-keep-literals</guid><pubDate>Fri, 09 Oct 2026 12:00:00 GMT</pubDate><description>TConstValue, TStringConstValue, TNumberConstValue and TStatusFromClass keep their literals when copied into an object literal or a let.</description><category>Breaking</category><category>Behavior</category></item><item><title>List extras on the data provider and the repository</title><link>https://ardor.venizia.ai/changelogs/2026-10-07-list-extras</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-07-list-extras</guid><pubDate>Wed, 07 Oct 2026 12:00:00 GMT</pubDate><description>ARDOR adopts IGNIS list extras - getList asks with meta.extra and answers meta.extra, and reads a route's default extras unasked.</description><category>Feature</category></item><item><title>Feature modules and permissions</title><link>https://ardor.venizia.ai/changelogs/2026-10-07-feature-modules</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-07-feature-modules</guid><pubDate>Wed, 07 Oct 2026 12:00:00 GMT</pubDate><description>An application mounts feature packages - resources, routes, bindings, messages - from features(), and answers react-admin's canAccess from its own provider.</description><category>Feature</category></item><item><title>Class identity survives a minifier</title><link>https://ardor.venizia.ai/changelogs/2026-10-07-class-identity-and-container</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-07-class-identity-and-container</guid><pubDate>Wed, 07 Oct 2026 12:00:00 GMT</pubDate><description>A pinned datasource resolves in a minified build, and start() refuses two classes that derive one binding key. The IGNIS peer floors rise with it.</description><category>Behavior</category></item><item><title>A repository sends what the data provider sends</title><link>https://ardor.venizia.ai/changelogs/2026-10-06-repository-sends-the-session</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-06-repository-sends-the-session</guid><pubDate>Tue, 06 Oct 2026 12:00:00 GMT</pubDate><description>getDataSourceAuth() fills IGNIS 0.2.1-4's per-send hooks - session headers, timezone, channel, no token on no-auth paths, the server's error code.</description><category>Behavior</category></item><item><title>HttpRepository writes and shares the data provider auth; BaseCrudService goes</title><link>https://ardor.venizia.ai/changelogs/2026-10-02-repository-writes-and-ignis-0-2-1</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-10-02-repository-writes-and-ignis-0-2-1</guid><pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate><description>HttpRepository writes on IGNIS 0.2.1, shares the data provider's token and one 401 refresh, and replaces BaseCrudService. Providers bind as singletons.</description><category>Breaking</category></item><item><title>Repositories by discovery, a relative baseUrl, and IGNIS 0.2.0 stable</title><link>https://ardor.venizia.ai/changelogs/2026-09-24-remote-repositories-and-relative-base-url</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-09-24-remote-repositories-and-relative-base-url</guid><pubDate>Thu, 24 Sep 2026 12:00:00 GMT</pubDate><description>Declare an HttpRepository with @repository({ type: RepositoryTypes.REMOTE }), point a datasource at '/api', and raise the IGNIS peers together.</description><category>Feature</category><category>Enhancement</category></item><item><title>Registration by hand, useRepository, and installs that load</title><link>https://ardor.venizia.ai/changelogs/2026-09-23-registration-by-hand-and-clean-install</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-09-23-registration-by-hand-and-clean-install</guid><pubDate>Wed, 23 Sep 2026 12:00:00 GMT</pubDate><description>Register artifacts by stereotype or by hand as in IGNIS, resolve repositories by class, BaseApiService removed, packages load under Node ESM.</description><category>Breaking</category><category>Feature</category><category>Fix</category></item><item><title>IGNIS stereotypes and repositories, bulk writes in the body, safer headers</title><link>https://ardor.venizia.ai/changelogs/2026-09-19-ignis-repository-and-bulk-writes</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-09-19-ignis-repository-and-bulk-writes</guid><pubDate>Sat, 19 Sep 2026 12:00:00 GMT</pubDate><description>Classes register by stereotype, HTTP repositories come from IGNIS, bulk writes send their selector in the body, and requests work on plain-http origins.</description><category>Breaking</category><category>Feature</category><category>Fix</category></item><item><title>The network layer is fetch only, and axios is gone</title><link>https://ardor.venizia.ai/changelogs/2026-09-16-fetch-only-network-layer</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-09-16-fetch-only-network-layer</guid><pubDate>Wed, 16 Sep 2026 12:00:00 GMT</pubDate><description>ARDOR drops its axios transport and moves the socket client behind a sub-path, so importing the framework pulls no HTTP client and no optional peer.</description><category>Breaking</category><category>Enhancement</category></item><item><title>One logger per scope, singleton services, and a kernel that owns its headers</title><link>https://ardor.venizia.ai/changelogs/2026-09-11-kernel-hardening</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-09-11-kernel-hardening</guid><pubDate>Fri, 11 Sep 2026 12:00:00 GMT</pubDate><description>One logger per scope, singleton services, an application that binds itself, and per-call headers and form-encoded bodies honoured.</description><category>Enhancement</category></item><item><title>ARDOR Replaces @minimaltech/ra-core-infra</title><link>https://ardor.venizia.ai/changelogs/2026-09-11-ardor-from-ra-core-infra</link><guid isPermaLink="true">https://ardor.venizia.ai/changelogs/2026-09-11-ardor-from-ra-core-infra</guid><pubDate>Fri, 11 Sep 2026 12:00:00 GMT</pubDate><description>The frontend framework splits into four ARDOR packages behind an umbrella import, with four symbol renames and updated dependency requirements.</description><category>Breaking</category><category>Feature</category></item></channel></rss>
