From: v82.x β v83.0.0 | Released: 2026-03-xx | Difficulty: π’ LOW
Hoist React v83 is a major release paired with hoist-core v37. The headline addition is
client-side distributed tracing via TraceService, providing OTEL-based end-to-end observability
across browser and server. Traced exceptions now include a traceId for correlation with
server-side traces, displayed in both error dialogs and toasts. This release also introduces the
static defaults pattern for app-level configuration overrides across several core models, new
SegmentedControl and CheckboxButton input components, and Admin Console support for opt-in
metrics publishing.
The downloadjs third-party dependency has been removed and replaced with built-in utilities.
Apps that imported downloadjs directly (relying on it as a transitive hoist-react dependency)
must update those usages.
Apps should also take the opportunity to migrate deprecated static
properties to the new ModelClassName.defaults pattern (scheduled for removal in v85).
Before starting, ensure:
- Running hoist-react v82.x
- hoist-core upgraded to >= v37.0 (required β TraceService and metrics publishing depend on new server-side infrastructure)
Hoist React v83 requires hoist-core >= v37.0.
File: gradle.properties
Before:
hoistCoreVersion=36.3.1After:
hoistCoreVersion=37.0.0Bump hoist-react to v83.
File: package.json
Before:
"@xh/hoist": "~82.0.3"After:
"@xh/hoist": "~83.0.0"Then run yarn install or npm install to update dependencies.
Several models previously exposed ad-hoc static properties for app-level configuration (e.g.
GridModel.DEFAULT_AUTOSIZE_MODE). These have been replaced by a unified static defaults
pattern. The old properties still function but log deprecation warnings and are scheduled for
removal in v85.
Find affected files:
grep -rE "GridModel\.(DEFAULT_AUTOSIZE_MODE|DEFAULT_RESTORE_DEFAULTS_WARNING|defaultContextMenu)|ChartModel\.defaultContextMenu|ExceptionHandler\.(REDACT_PATHS|ALERT_TYPE|TOAST_PROPS)|FetchService\.(autoGenCorrelationIds|genCorrelationId|correlationIdHeaderKey)" client-app/src/Before:
import {GridModel} from '@xh/hoist/cmp/grid';
GridModel.DEFAULT_AUTOSIZE_MODE = 'managed';
GridModel.DEFAULT_RESTORE_DEFAULTS_WARNING = 'Reset all grid settings?';After:
import {GridModel} from '@xh/hoist/cmp/grid';
GridModel.defaults.autosizeMode = 'managed';
GridModel.defaults.restoreDefaultsWarning = 'Reset all grid settings?';See GridModelDefaults for the full set of available defaults including cellBorders,
colChooserModel, contextMenu, enableColumnPinning, enableExport, rowBorders,
showGroupRowCounts, sizingMode, stripeRows, and more.
Before:
import {ChartModel} from '@xh/hoist/cmp/chart';
const menu = ChartModel.defaultContextMenu;After:
import {ChartModel} from '@xh/hoist/cmp/chart';
const menu = ChartModel.defaults.contextMenu;Before:
import {ExceptionHandler} from '@xh/hoist/core';
ExceptionHandler.ALERT_TYPE = 'toast';
ExceptionHandler.TOAST_PROPS = {timeout: 5000};After:
import {ExceptionHandler} from '@xh/hoist/core';
ExceptionHandler.defaults.alertType = 'toast';
ExceptionHandler.defaults.toastProps = {timeout: 5000};Before (in Bootstrap.ts):
import {FetchService} from '@xh/hoist/svc';
FetchService.autoGenCorrelationIds = true;After:
import {FetchService} from '@xh/hoist/svc';
FetchService.defaults.autoGenCorrelationIds = true;The downloadjs third-party package has been removed from hoist-react's dependencies. Hoist
itself has migrated to new built-in utilities. If your app imported downloadjs directly (relying
on it as a transitive dependency of hoist-react), you must replace those usages with the new
downloadBlob() or downloadViaUrl() utilities from @xh/hoist/utils/js.
Find affected files:
grep -rE "from 'downloadjs'|from \"downloadjs\"|require\('downloadjs'\)" client-app/src/Before:
import download from 'downloadjs';
const blob = await response.blob();
download(blob, 'export.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');After:
import {downloadBlob} from '@xh/hoist/utils/js';
const blob = await response.blob();
downloadBlob(blob, 'export.xlsx');For URL-based downloads (where you have a URL rather than a Blob):
import {downloadViaUrl} from '@xh/hoist/utils/js';
downloadViaUrl('/api/export/report', 'report.pdf');Note that these utilities do not require a content type parameter β the browser infers the type from the Blob or URL.
If you have not yet migrated from the deprecated standalone filter utilities (withFilterByField,
withFilterByKey, replaceFilterByKey, withFilterByTypes), do so now. These were deprecated
in v82 and are scheduled for removal in v85. See the
v82 upgrade notes for detailed
before/after examples.
Find affected files:
grep -rE "withFilterByField|withFilterByKey|replaceFilterByKey|withFilterByTypes" client-app/src/v83 introduces SegmentedControl, a new desktop input component for mutually exclusive option
sets. It provides stronger visual differentiation of the active selection compared to
ButtonGroupInput and is well-suited for small, fixed option groups (e.g. sizing modes, view
toggles, status filters).
This is not a required migration β ButtonGroupInput remains fully supported. However, if
your app uses ButtonGroupInput for small toggle groups, SegmentedControl may be a worthwhile
improvement worth exploring.
Find potential candidates:
grep -rE "buttonGroupInput|ButtonGroupInput" client-app/src/Review each usage and consider whether the use case is a small set of mutually exclusive options
that would benefit from the segmented control style. SegmentedControl supports the same bind
pattern as other Hoist inputs and works with both model binding and onChange callbacks.
After completing all steps:
-
hoistCoreVersioningradle.propertiesis >= 37.0.0 -
yarn install/npm installcompletes without errors -
yarn lint/npm run lintpasses (or only pre-existing warnings remain) -
npx tsc --noEmitpasses - Application loads without console errors
- No
downloadjsimports remain:grep -rE "from 'downloadjs'|from \"downloadjs\"" client-app/src/ - No deprecated static property warnings in console:
grep -rE "DEFAULT_AUTOSIZE_MODE|DEFAULT_RESTORE_DEFAULTS_WARNING|defaultContextMenu|REDACT_PATHS|ALERT_TYPE|TOAST_PROPS" client-app/src/ - No deprecated filter utilities remain:
grep -rE "withFilterByField|withFilterByKey|replaceFilterByKey|withFilterByTypes" client-app/src/ - Grids, charts, and dashboards render correctly
- Admin Console Metrics tab loads (if hoist-core v37+ with metrics configured)
- Toolbox on GitHub β canonical example of a Hoist app