Releases: optimizely/javascript-sdk
Release list
Release 6.6.1
[6.6.1] - September 18, 2026
Bug Fixes
- Use an updated datafile cache key so the SDK no longer reads a stale or malformed datafile persisted by an older SDK version (#1175)
Release 6.6.0
[6.6.0] - September 3, 2026
New Features
Holdout Targeted Delivery Exclusion: Holdouts can now be configured to exclude Targeted Delivery rules, so users held out of experiments still receive their Targeted Delivery experiences. This gives you a cleaner measure of experiment impact without holding users back from ongoing rollouts.
- Add holdout exclusion logic for Targeted Delivery rules (#1171)
Release 6.5.0
[6.5.0] - July 8, 2026
New Features
- Local Holdouts: Added support for Local Holdouts, enabling holdout experiments
to be scoped to specific feature flag rules rather than applied globally.
Local Holdouts let you measure the true incremental impact of individual features
by holding out a subset of users from specific rollouts while still serving them other experiences.
See Holdouts docs for more information.
Changed
- Refactor project config creation (#1164)
- Replace deprecated url.parse() with the WHATWG URL in NodeRequestHandler (#1161)
- Upgrade to uuid v13 (#1159)
- Don't send ODP identify event for single identifier (#1152)
Bug Fixes
Release 6.4.0
[6.4.0] - May 7, 2026
New Features
Feature Rollout: Added support for Feature Rollouts, a new experiment type
combining Targeted Delivery simplicity with A/B test measurement capabilities.
Feature Rollouts enable progressive rollouts with full impact analytics, metric tracking,
and confidence intervals.
See Feature Rollout docs for more information.
- Add Feature Rollout support (#1140)
Bug Fixes
- Export
UserProfileServiceAsynctype
Release 6.3.1
Release 5.4.1
Release 6.3.0
[6.3.0] - November 19, 2025
New Features
- Added Holdouts support: Holdouts Feature Experimentation feature is now officially supported.
- Added configurable prediction endpoint: Added ability to configure custom prediction endpoint for CMAB (#1102)
- Added HTTP support in NodeRequestHandler: Added support for HTTP protocol in addition to HTTPS (#1104)
- Added TTL support for events in event store: Events in event store now have configurable time-to-live (TTL) functionality (#1103)
- Exposed maxRetries option for createBatchEventProcessor: Added ability to configure maximum retry attempts for batch event processing (#1106)
- Added customHeaders option to polling config manager: Added support for custom HTTP headers in polling config manager (#1107)
Changed
- Excluded CMAB from user profile service: CMAB experiments are now properly excluded from user profile service operations (#1105)
Bug Fixes
- Fixed ODP logging: Log error instead of silently ignoring when ODP methods are called without providing an OdpManager (#1108)
Release 6.2.0
[6.2.0] - October 23, 2025
New Features
-
Added support for Contextual Multi-Armed Bandit (CMAB): Added support for CMAB experiments(Contextual Bandits rules) with new configuration options and cache control. To get decision from CMAB rules,
decideAsyncand related methods must be used. The syncdecidemethod does not support CMABs and will just skip CMAB rules while making decision for a flag.CMAB Configuration Options
The following new options have been added to configure the cmab cache:
import { createInstance } from '@optimizely/optimizely-sdk' const optimizely = createInstance({ // ... other config options cmab: { cacheSize: 1000, // Optional: Set CMAB cache size (default: 1000) cacheTtl: 30 * 60 * 1000, // Optional: Set CMAB cache TTL in milliseconds (default: 30 * 60 * 1000) cache: customCache // Optional: Custom cache implementation, instance of CacheWithRemove interface } });
CMAB-Related OptimizelyDecideOptions
New decide options are available to control CMAB caching behavior:
OptimizelyDecideOption.IGNORE_CMAB_CACHE: Bypass CMAB cache for fresh decisionsOptimizelyDecideOption.RESET_CMAB_CACHE: Clear and reset CMAB cache before making decisionsOptimizelyDecideOption.INVALIDATE_USER_CMAB_CACHE: Invalidate CMAB cache for the particular user and experiment
// Example usage with CMAB decide options const decision = await userContext.decideAsync('feature-flag-key', [ optimizelySdk.enums.OptimizelyDecideOption.IGNORE_CMAB_CACHE ]);