# Changelog

All notable changes to this project will be documented in this file.

<a name="v2.3.0"></a>

## [v2.3.0 - SG Node Complete and CLI task threads](https://github.com/lvcabral/brs-engine/releases/tag/v2.3.0) - 25 July 2026

This release brings 160+ improvements and fixes, it completes the **SceneGraph** node set — every concrete node documented by Roku is now implemented, including support for **Component Libraries**. This version also rewrites the **CLI** on a worker-thread architecture where the app and each SceneGraph `Task` run on their own thread, adding keyboard control, terminal image rendering (`--image`), log redirection and screen snapshots. The core engine gains a **production mode** that removes all debug instrumentation by default, a texture memory registry exposed through the `query/r2d2-bitmaps` ECP endpoint, full `.bpk` encryption covering SceneGraph components and the package container, and several Roku OS 15.2/15.3 APIs. Read the full release notes below for more details.

### Release Changes

#### Core Engine

* (brs) Updated `setHttpVersion()` signature to accept a version string instead of a boolean by [@lvcabral](https://github.com/lvcabral) in [#920](https://github.com/lvcabral/brs-engine/pull/920)
* (draw2d) Fixed the 9-patch corner insets to be parsed from the marker start and end by [@lvcabral](https://github.com/lvcabral) in [#933](https://github.com/lvcabral/brs-engine/pull/933)
* (draw2d) Fixed `blendColor` to apply the RGB tint at full strength regardless of alpha by [@lvcabral](https://github.com/lvcabral) in [#935](https://github.com/lvcabral/brs-engine/pull/935)
* (draw2d) Clamp the 9-patch render size to the fixed corners by [@lvcabral](https://github.com/lvcabral) in [#950](https://github.com/lvcabral/brs-engine/pull/950)
* (brs) Added mocks for `roAudioGuide`, `roTextToSpeech`, `roMicrophone`, `roDSA` and `roRSA` by [@lvcabral](https://github.com/lvcabral) in [#956](https://github.com/lvcabral/brs-engine/pull/956)
* (brs) Made `bs_const` lookups case-insensitive in `#if`/`#elseif` conditions by [@markwpearce](https://github.com/markwpearce) in [#962](https://github.com/lvcabral/brs-engine/pull/962)
* (brs) Added a global texture memory registry, exposed via the `query/r2d2-bitmaps` ECP endpoint and the API `requestBitmaps()` method, and introduced the **production mode** that gates all debug instrumentation behind `debugOnCrash` by [@lvcabral](https://github.com/lvcabral) in [#967](https://github.com/lvcabral/brs-engine/pull/967)
* (brs) Propagate the optional state through dot-bracket chaining (`?.[`) by [@markwpearce](https://github.com/markwpearce) in [#969](https://github.com/lvcabral/brs-engine/pull/969)
* (brs) Properly escape strings in `FormatJSON()` by [@lvcabral](https://github.com/lvcabral) in [#973](https://github.com/lvcabral/brs-engine/pull/973)
* (brs) Matched Roku's `type()` results for `String` vs `roString` by [@lvcabral](https://github.com/lvcabral) in [#977](https://github.com/lvcabral/brs-engine/pull/977)
* (brs) Fixed an edge case for numeric values in `Type()` by [@lvcabral](https://github.com/lvcabral) in [#986](https://github.com/lvcabral/brs-engine/pull/986)
* (brs) Added the Roku OS 15.3 `roUtils` predicates `isNumber()`, `isString()` and `isFloatingPoint()` by [@lvcabral](https://github.com/lvcabral) in [#988](https://github.com/lvcabral/brs-engine/pull/988)
* (brs) Added the Roku OS 15.3 `roAssociativeArray.values()` method by [@lvcabral](https://github.com/lvcabral) in [#989](https://github.com/lvcabral/brs-engine/pull/989)
* (brs) Added the Roku OS 15.3 `roTimeSpan` methods `totalMillisecondsLong()` and `totalMicrosecondsLong()` by [@lvcabral](https://github.com/lvcabral) in [#990](https://github.com/lvcabral/brs-engine/pull/990)
* (brs) Fixed anonymous functions not being resolvable by the `$anon_N` name reported by `toStr()`, so observers registered by function name (e.g. by the `promises` library used in Rooibos node suites) work as on a real device by [@lvcabral](https://github.com/lvcabral) in [#993](https://github.com/lvcabral/brs-engine/pull/993)
* (brs) Added the Roku OS 15.2 `roUtils.hasComponent()` method by [@lvcabral](https://github.com/lvcabral) in [#994](https://github.com/lvcabral/brs-engine/pull/994)
* (brs) Added the `roDeviceInfo` methods `isHDMIConnected()` and `isPassthruCodecActive()` by [@lvcabral](https://github.com/lvcabral) in [#995](https://github.com/lvcabral/brs-engine/pull/995)
* (brs) Keep `roAssociativeArray` enumeration stable when replacing an existing key's value by [@lvcabral](https://github.com/lvcabral) in [#997](https://github.com/lvcabral/brs-engine/pull/997)
* (brs) Resolve node methods in call position when a field shadows the method name by [@lvcabral](https://github.com/lvcabral) in [#998](https://github.com/lvcabral/brs-engine/pull/998)
* (brs) Allow any numeric type on the index type check when setting array values by [@lvcabral](https://github.com/lvcabral) in [#1012](https://github.com/lvcabral/brs-engine/pull/1012)
* (brs) `roTextureManager` only warns once for a repeatedly-failing local texture by [@markwpearce](https://github.com/markwpearce) in [#1016](https://github.com/lvcabral/brs-engine/pull/1016)
* (draw2d) Accept single-axis 9-patch images (stretch marker on only one axis) by [@lvcabral](https://github.com/lvcabral) in [#1024](https://github.com/lvcabral/brs-engine/pull/1024)
* (brs) Properly handle boxed `String` in `roArray`, `roAudioPlayer` and `roVideoPlayer` by [@lvcabral](https://github.com/lvcabral) in [#1050](https://github.com/lvcabral/brs-engine/pull/1050)
* (brs) Fixed the Micro Debugger to halt **all** threads while a debug session is active, so threads blocked in a cross-thread rendezvous no longer time out with a spurious "Rendezvous timeout" by [@lvcabral](https://github.com/lvcabral) in [#1054](https://github.com/lvcabral/brs-engine/pull/1054)
* (brs) Handle boxed numbers in `for` loop bounds and `if`/`while` conditions by [@lvcabral](https://github.com/lvcabral) in [#1058](https://github.com/lvcabral/brs-engine/pull/1058)
* (brs) Fixed `roAssociativeArray` behavior when handling keys vs interface methods by [@lvcabral](https://github.com/lvcabral) in [#1071](https://github.com/lvcabral/brs-engine/pull/1071)
* (brs) Validate string values in `roRegistrySection.writeMulti()` by [@lvcabral](https://github.com/lvcabral) in [#1072](https://github.com/lvcabral/brs-engine/pull/1072)
* (brs) Percent-encode reserved URI characters in `roUrlTransfer` `escape()` and `urlEncode()` by [@markwpearce](https://github.com/markwpearce) in [#1073](https://github.com/lvcabral/brs-engine/pull/1073)
* (brs) Handle an empty POST body in `roUrlTransfer.postFromStringAsync()` by [@lvcabral](https://github.com/lvcabral) in [#1074](https://github.com/lvcabral/brs-engine/pull/1074)
* (brs) Follow HTTP redirects in the synchronous download path by [@lvcabral](https://github.com/lvcabral) in [#1082](https://github.com/lvcabral/brs-engine/pull/1082)

#### Browser API

* (api) Enable the SceneGraph extension when running a single `.brs` file that uses `roSGNode` or `roSGScreen` by [@lvcabral](https://github.com/lvcabral) in [#980](https://github.com/lvcabral/brs-engine/pull/980)
* (api) Enforce a minimum video buffering floor before playback starts by [@lvcabral](https://github.com/lvcabral) in [#1033](https://github.com/lvcabral/brs-engine/pull/1033)
* (api) Reliable media event and buffering-progress delivery for preview playback by [@lvcabral](https://github.com/lvcabral) in [#1041](https://github.com/lvcabral/brs-engine/pull/1041)
* (api) Prevent the space key from triggering page down in browsers by [@lvcabral](https://github.com/lvcabral) in [#1084](https://github.com/lvcabral/brs-engine/pull/1084)
* (api) Prevent the browser default action on held keys by [@lvcabral](https://github.com/lvcabral) in [#1085](https://github.com/lvcabral/brs-engine/pull/1085)

#### Node.js Library and CLI

* (cli) Run a folder app from `--root` alone, loading `source/` and serving the `components/` tree from the mounted `pkg:/` volume by [@lvcabral](https://github.com/lvcabral) in [#960](https://github.com/lvcabral/brs-engine/pull/960)
* (cli) Encrypt SceneGraph component files (`.brs` and `.xml`, including inline `<script>` blocks) into `.bpk` packages, prune the emptied `components/` tree, and wrap the whole package container in AES-256-CTR so plaintext assets are unreadable at rest by [@lvcabral](https://github.com/lvcabral) in [#964](https://github.com/lvcabral/brs-engine/pull/964)
* (cli) Moved to node-canvas v4 with a **worker-thread architecture** (the app and every SceneGraph `Task` run on their own worker) and added **terminal frame rendering** with the `--image` mode (iTerm2/Kitty protocols with ANSI fallback), plus `--log` and `--snapshot` by [@lvcabral](https://github.com/lvcabral) in [#1083](https://github.com/lvcabral/brs-engine/pull/1083)

#### SceneGraph Extension (`brs-scenegraph` release v0.3.0)

* (rsg) Added `width`/`height` fields to the `Video` node and suppress its UI when windowed by [@lvcabral](https://github.com/lvcabral) in [#928](https://github.com/lvcabral/brs-engine/pull/928)
* (rsg) Index `RowList` per-row arrays by the absolute row index by [@lvcabral](https://github.com/lvcabral) in [#930](https://github.com/lvcabral/brs-engine/pull/930)
* (rsg) Implemented `MaskGroup` alpha-mask compositing by [@lvcabral](https://github.com/lvcabral) in [#931](https://github.com/lvcabral/brs-engine/pull/931)
* (rsg) Apply the `uri_resolution_autosub` manifest config more robustly by [@lvcabral](https://github.com/lvcabral) in [#932](https://github.com/lvcabral/brs-engine/pull/932)
* (rsg) Update the global focus pointer before clearing the old focus chain by [@lvcabral](https://github.com/lvcabral) in [#934](https://github.com/lvcabral/brs-engine/pull/934)
* (rsg) Implemented support for **Component Libraries** by [@lvcabral](https://github.com/lvcabral) in [#936](https://github.com/lvcabral/brs-engine/pull/936)
* (rsg) Added the `allowBackgroundTask` field to `Scene` with a warning for unsupported Instant Resume by [@lvcabral](https://github.com/lvcabral) in [#937](https://github.com/lvcabral/brs-engine/pull/937)
* (rsg) Load Component Libraries created at runtime by [@lvcabral](https://github.com/lvcabral) in [#938](https://github.com/lvcabral/brs-engine/pull/938)
* (rsg) Hardened the cross-thread rendezvous (fidelity and reliability) by [@lvcabral](https://github.com/lvcabral) in [#939](https://github.com/lvcabral/brs-engine/pull/939)
* (rsg) Rendezvous Phase 2 — `roRenderThreadQueue` and device-accurate timeouts by [@lvcabral](https://github.com/lvcabral) in [#940](https://github.com/lvcabral/brs-engine/pull/940)
* (rsg) Rendezvous Phase 3a — direct render→task responses (feature-flagged) by [@lvcabral](https://github.com/lvcabral) in [#941](https://github.com/lvcabral/brs-engine/pull/941)
* (rsg) Rendezvous Phase 3 — finalized the direct render→task responses by [@lvcabral](https://github.com/lvcabral) in [#942](https://github.com/lvcabral/brs-engine/pull/942)
* (rsg) Restored synchronous (depth-first) observer dispatch with a per-field re-entrancy guard, fixing blank button labels by [@lvcabral](https://github.com/lvcabral) in [#943](https://github.com/lvcabral/brs-engine/pull/943)
* (rsg) Implemented the **Standard Dialog Framework** nodes by [@lvcabral](https://github.com/lvcabral) in [#944](https://github.com/lvcabral/brs-engine/pull/944)
* (rsg) Implemented the `SimpleLabel` node by [@lvcabral](https://github.com/lvcabral) in [#945](https://github.com/lvcabral/brs-engine/pull/945)
* (rsg) Implemented the `MultiStyleLabel` and `StdDlgMultiStyleTextItem` nodes by [@lvcabral](https://github.com/lvcabral) in [#947](https://github.com/lvcabral/brs-engine/pull/947)
* (rsg) Implemented the `MonospaceLabel` node by [@lvcabral](https://github.com/lvcabral) in [#948](https://github.com/lvcabral/brs-engine/pull/948)
* (rsg) Implemented the `TimeGrid` node (EPG) by [@lvcabral](https://github.com/lvcabral) in [#949](https://github.com/lvcabral/brs-engine/pull/949)
* (rsg) Implemented the `TargetSet`, `TargetGroup` and `TargetList` nodes by [@lvcabral](https://github.com/lvcabral) in [#951](https://github.com/lvcabral/brs-engine/pull/951)
* (rsg) Implemented the Dynamic voice keyboard nodes by [@lvcabral](https://github.com/lvcabral) in [#952](https://github.com/lvcabral/brs-engine/pull/952)
* (rsg) Use the Dynamic keyboards in the Standard dialog framework by [@lvcabral](https://github.com/lvcabral) in [#953](https://github.com/lvcabral/brs-engine/pull/953)
* (rsg) Implemented the `roRenderThreadQueue` component (OS 15) by [@lvcabral](https://github.com/lvcabral) in [#954](https://github.com/lvcabral/brs-engine/pull/954)
* (rsg) Prevent a stack overflow from re-entrant render and the `ContentNode` `parentField` cascade by [@lvcabral](https://github.com/lvcabral) in [#959](https://github.com/lvcabral/brs-engine/pull/959)
* (rsg) Trim `script.val` in `getScripts()` to ignore whitespace-only bodies by [@markwpearce](https://github.com/markwpearce) in [#961](https://github.com/lvcabral/brs-engine/pull/961)
* (rsg) Added support for `associativearray` in `FieldKind` and the value type checks by [@lvcabral](https://github.com/lvcabral) in [#963](https://github.com/lvcabral/brs-engine/pull/963)
* (rsg) Give focus to a custom `StandardDialog`'s buttons by [@lvcabral](https://github.com/lvcabral) in [#968](https://github.com/lvcabral/brs-engine/pull/968)
* (rsg) Corrected `UserSelect` focus traversal, button centering and grid focus feedback by [@lvcabral](https://github.com/lvcabral) in [#970](https://github.com/lvcabral/brs-engine/pull/970)
* (rsg) Attach a list item component to its parent before `init()` by [@lvcabral](https://github.com/lvcabral) in [#971](https://github.com/lvcabral/brs-engine/pull/971)
* (rsg) Implemented the `Video` node `bufferingBar` and `retrievingBar` fields by [@lvcabral](https://github.com/lvcabral) in [#972](https://github.com/lvcabral/brs-engine/pull/972)
* (rsg) Hug the `LabelList` focus frame instead of overflowing rows by [@lvcabral](https://github.com/lvcabral) in [#976](https://github.com/lvcabral/brs-engine/pull/976)
* (rsg) Only prevent duplicate fields when those are defined in XML by [@lvcabral](https://github.com/lvcabral) in [#978](https://github.com/lvcabral/brs-engine/pull/978)
* (rsg) Box AA/Array node-field content the way Roku does (literal-aware) by [@lvcabral](https://github.com/lvcabral) in [#979](https://github.com/lvcabral/brs-engine/pull/979)
* (rsg) Fixed issues rendering Task-loaded content in grids by [@lvcabral](https://github.com/lvcabral) in [#982](https://github.com/lvcabral/brs-engine/pull/982)
* (rsg) Cut per-node memory for large content trees with lazy fields and lazy method Callables by [@lvcabral](https://github.com/lvcabral) in [#983](https://github.com/lvcabral/brs-engine/pull/983)
* (rsg) SceneGraph list, animation and format fixes for the hero-grid and living-room samples by [@lvcabral](https://github.com/lvcabral) in [#984](https://github.com/lvcabral/brs-engine/pull/984)
* (rsg) `RowList` rendering fixes — item sizing, counter, spacing, labels, wrap and clipping by [@lvcabral](https://github.com/lvcabral) in [#985](https://github.com/lvcabral/brs-engine/pull/985)
* (rsg) Added the Roku OS 15.3 `Video.captionRenderArea` field with render-thread caption positioning; captions now only render during full-screen playback, as on a device by [@lvcabral](https://github.com/lvcabral) in [#991](https://github.com/lvcabral/brs-engine/pull/991)
* (rsg) Added regression coverage for `double` SceneGraph fields (OS 15.3) by [@lvcabral](https://github.com/lvcabral) in [#992](https://github.com/lvcabral/brs-engine/pull/992)
* (rsg) Resolve cross-thread nodes by address via a registry by [@lvcabral](https://github.com/lvcabral) in [#996](https://github.com/lvcabral/brs-engine/pull/996)
* (rsg) Added the `ifSGNodeBoundingRect` sub-part methods by [@lvcabral](https://github.com/lvcabral) in [#999](https://github.com/lvcabral/brs-engine/pull/999)
* (rsg) Guard the bounding-rect refresh renders against re-entrancy by [@lvcabral](https://github.com/lvcabral) in [#1000](https://github.com/lvcabral/brs-engine/pull/1000)
* (rsg) Mirror a remote field add/remove on the local node copy by [@lvcabral](https://github.com/lvcabral) in [#1001](https://github.com/lvcabral/brs-engine/pull/1001)
* (rsg) Added the `scrollingStatus` field to the `ArrayGrid` based nodes by [@lvcabral](https://github.com/lvcabral) in [#1002](https://github.com/lvcabral/brs-engine/pull/1002)
* (rsg) Compute bounding rects for nodes under invisible ancestors by [@lvcabral](https://github.com/lvcabral) in [#1003](https://github.com/lvcabral/brs-engine/pull/1003)
* (rsg) A failed interface field alias no longer aborts the component's remaining fields by [@lvcabral](https://github.com/lvcabral) in [#1004](https://github.com/lvcabral/brs-engine/pull/1004)
* (rsg) Skip grid slots whose item component failed to create by [@lvcabral](https://github.com/lvcabral) in [#1005](https://github.com/lvcabral/brs-engine/pull/1005)
* (rsg) `findNode()` searches breadth-first per the `ifSGNodeDict` spec by [@lvcabral](https://github.com/lvcabral) in [#1006](https://github.com/lvcabral/brs-engine/pull/1006)
* (rsg) The media-node serialization proxy no longer hijacks the singleton player by [@lvcabral](https://github.com/lvcabral) in [#1007](https://github.com/lvcabral/brs-engine/pull/1007)
* (rsg) `Video` node prebuffer, configurable autoplay, buffering-step delivery and active-player routing by [@lvcabral](https://github.com/lvcabral) in [#1008](https://github.com/lvcabral/brs-engine/pull/1008)
* (rsg) `Poster` commits the `uri` field before its synchronous load and notification by [@lvcabral](https://github.com/lvcabral) in [#1010](https://github.com/lvcabral/brs-engine/pull/1010)
* (rsg) `RowList` keeps `currFocusRow`/`currFocusColumn` in sync with the focused item by [@lvcabral](https://github.com/lvcabral) in [#1011](https://github.com/lvcabral/brs-engine/pull/1011)
* (rsg) Implemented the `ifSGNodeBoundingRect` method `ancestorSubBoundingRect()` by [@lvcabral](https://github.com/lvcabral) in [#1013](https://github.com/lvcabral/brs-engine/pull/1013)
* (rsg) `DynamicKeyboard` palette support and shared palette resolution by [@lvcabral](https://github.com/lvcabral) in [#1014](https://github.com/lvcabral/brs-engine/pull/1014)
* (rsg) Corrected button and list layout — 9-patch width, variable-width rows, icon measure and item focus by [@lvcabral](https://github.com/lvcabral) in [#1015](https://github.com/lvcabral/brs-engine/pull/1015)
* (rsg) Reliable `PanelSet` next-panel creation and focusable-based navigation by [@lvcabral](https://github.com/lvcabral) in [#1017](https://github.com/lvcabral/brs-engine/pull/1017)
* (rsg) Re-apply the grid item size each frame and fixed WebP images with dropped bottom rows by [@lvcabral](https://github.com/lvcabral) in [#1019](https://github.com/lvcabral/brs-engine/pull/1019)
* (rsg) `update()` converts a nested `{subtype:...}` AA to a node on any field, not just `children[]` by [@markwpearce](https://github.com/markwpearce) in [#1020](https://github.com/lvcabral/brs-engine/pull/1020)
* (rsg) Include the inter-item spacing in the grid `boundingRect()` extent by [@lvcabral](https://github.com/lvcabral) in [#1021](https://github.com/lvcabral/brs-engine/pull/1021)
* (rsg) Honor `clippingRect` to limit node and children rendering by [@lvcabral](https://github.com/lvcabral) in [#1022](https://github.com/lvcabral/brs-engine/pull/1022)
* (rsg) Re-measure a degenerate bounding rect (either dimension zero) mid-render by [@lvcabral](https://github.com/lvcabral) in [#1023](https://github.com/lvcabral/brs-engine/pull/1023)
* (rsg) Silence the local mirror of a rendezvous field add so observers fire once by [@lvcabral](https://github.com/lvcabral) in [#1025](https://github.com/lvcabral/brs-engine/pull/1025)
* (rsg) Don't apply `Label` `vertAlign` when wrapped text has no explicit height by [@lvcabral](https://github.com/lvcabral) in [#1026](https://github.com/lvcabral/brs-engine/pull/1026)
* (rsg) Apply an interface field's default value through its alias targets by [@lvcabral](https://github.com/lvcabral) in [#1027](https://github.com/lvcabral/brs-engine/pull/1027)
* (rsg) Emit `vertFocusDirection` with settle-last focus order and honor `Video.asyncStopSemantics` by [@lvcabral](https://github.com/lvcabral) in [#1028](https://github.com/lvcabral/brs-engine/pull/1028)
* (rsg) Resolve the `RowList`/`ZoomRowList` focused-item `subBoundingRect()` and corrected the vertical outset by [@lvcabral](https://github.com/lvcabral) in [#1029](https://github.com/lvcabral/brs-engine/pull/1029)
* (rsg) Span the focus-feedback footprint in a `RowList` focused item's `subBoundingRect()` by [@lvcabral](https://github.com/lvcabral) in [#1030](https://github.com/lvcabral/brs-engine/pull/1030)
* (rsg) Defer reentrant field observers and refresh `subBoundingRect()` on a pending focus change by [@lvcabral](https://github.com/lvcabral) in [#1032](https://github.com/lvcabral/brs-engine/pull/1032)
* (rsg) Honor `vertAlign` in `ScrollingLabel` by centering against the node height by [@lvcabral](https://github.com/lvcabral) in [#1034](https://github.com/lvcabral/brs-engine/pull/1034)
* (rsg) Honor numeric-string writes to `ArrayGrid` `numColumns`/`numRows` by [@lvcabral](https://github.com/lvcabral) in [#1035](https://github.com/lvcabral/brs-engine/pull/1035)
* (rsg) Honor descending key arrays in the `FieldInterpolator` segment resolution by [@lvcabral](https://github.com/lvcabral) in [#1036](https://github.com/lvcabral/brs-engine/pull/1036)
* (rsg) Fire the initial `itemFocused` when list/grid content is populated after assignment by [@lvcabral](https://github.com/lvcabral) in [#1037](https://github.com/lvcabral/brs-engine/pull/1037)
* (rsg) Clip `ArrayGrid`/`PosterGrid` items to their cell so overflow is hidden by [@lvcabral](https://github.com/lvcabral) in [#1038](https://github.com/lvcabral/brs-engine/pull/1038)
* (rsg) Fire `itemFocused` only when the list/grid is in the focus chain by [@lvcabral](https://github.com/lvcabral) in [#1039](https://github.com/lvcabral/brs-engine/pull/1039)
* (rsg) Fixed the regression caused by [#1037](https://github.com/lvcabral/brs-engine/pull/1037) affecting `ArrayGrid` by [@lvcabral](https://github.com/lvcabral) in [#1040](https://github.com/lvcabral/brs-engine/pull/1040)
* (rsg) Only defer reentrant observers for engine-initiated field emissions by [@lvcabral](https://github.com/lvcabral) in [#1042](https://github.com/lvcabral/brs-engine/pull/1042)
* (rsg) Honor `Library` statements in component scripts and completed the RAF mock by [@lvcabral](https://github.com/lvcabral) in [#1043](https://github.com/lvcabral/brs-engine/pull/1043)
* (rsg) Detach a node from its previous parent when it is attached elsewhere by [@lvcabral](https://github.com/lvcabral) in [#1044](https://github.com/lvcabral/brs-engine/pull/1044)
* (rsg) `ButtonBar` sample — `RowList` fit check, `LayoutGroup` re-alignment and single-row grid key propagation by [@lvcabral](https://github.com/lvcabral) in [#1045](https://github.com/lvcabral/brs-engine/pull/1045)
* (rsg) `ZoomRowList` vertical-wrap flag and row-title/poster spacing by [@lvcabral](https://github.com/lvcabral) in [#1046](https://github.com/lvcabral/brs-engine/pull/1046)
* (rsg) Only the owning, presenting `Video` node renders the video plane by [@lvcabral](https://github.com/lvcabral) in [#1047](https://github.com/lvcabral/brs-engine/pull/1047)
* (rsg) Added the missing `secondaryTitle` field to `ContentNode` by [@lvcabral](https://github.com/lvcabral) in [#1048](https://github.com/lvcabral/brs-engine/pull/1048)
* (rsg) Changed the `ContentNode.subtitleTracks` type from `assocarray` to `array` by [@lvcabral](https://github.com/lvcabral) in [#1051](https://github.com/lvcabral/brs-engine/pull/1051)
* (rsg) Properly handle boxed `String` in `PosterGrid`, `ScrollableText` and `ZoomRowList` by [@lvcabral](https://github.com/lvcabral) in [#1052](https://github.com/lvcabral/brs-engine/pull/1052)
* (rsg) Position the `PanelSet` right panel using the left panel's `leftPosition` by [@lvcabral](https://github.com/lvcabral) in [#1053](https://github.com/lvcabral/brs-engine/pull/1053)
* (rsg) Guard the cross-thread serialization against circular container references by [@lvcabral](https://github.com/lvcabral) in [#1055](https://github.com/lvcabral/brs-engine/pull/1055)
* (rsg) Paint a black plane while a full-screen `Video` with UI enabled is buffering by [@lvcabral](https://github.com/lvcabral) in [#1056](https://github.com/lvcabral/brs-engine/pull/1056)
* (rsg) Restore function values across `Task` threads from the component AST by [@lvcabral](https://github.com/lvcabral) in [#1057](https://github.com/lvcabral/brs-engine/pull/1057)
* (rsg) Keep a `Video`'s internal children off the cross-thread serialization by [@lvcabral](https://github.com/lvcabral) in [#1059](https://github.com/lvcabral/brs-engine/pull/1059)
* (rsg) Keep `ButtonGroup` from managing custom (non-`Button`) `Group` children by [@lvcabral](https://github.com/lvcabral) in [#1060](https://github.com/lvcabral/brs-engine/pull/1060)
* (rsg) Restore the `m` context on rebuilt custom nodes and fixed the quit debugger loop by [@lvcabral](https://github.com/lvcabral) in [#1061](https://github.com/lvcabral/brs-engine/pull/1061)
* (rsg) Honor the app-managed visibility/opacity of a dynamic keyboard's `textEditBox` by [@lvcabral](https://github.com/lvcabral) in [#1062](https://github.com/lvcabral/brs-engine/pull/1062)
* (rsg) Resolve the `fixed` `vertFocusAnimationStyle` to the non-wrapping `fixedFocus` by [@lvcabral](https://github.com/lvcabral) in [#1063](https://github.com/lvcabral/brs-engine/pull/1063)
* (rsg) Return the measured size from a detached `Label`'s `boundingRect()` mid-render by [@lvcabral](https://github.com/lvcabral) in [#1064](https://github.com/lvcabral/brs-engine/pull/1064)
* (rsg) Move the live focus when a managed `ButtonGroup`'s `focusButton` changes by [@lvcabral](https://github.com/lvcabral) in [#1065](https://github.com/lvcabral/brs-engine/pull/1065)
* (rsg) Measure hidden grids, flush `MarkupGrid` rects and reorder on re-append by [@lvcabral](https://github.com/lvcabral) in [#1066](https://github.com/lvcabral/brs-engine/pull/1066)
* (rsg) Keep the video plane presenting through a mid-stream re-buffer by [@lvcabral](https://github.com/lvcabral) in [#1067](https://github.com/lvcabral/brs-engine/pull/1067)
* (rsg) `PanelSet` full-screen preview position, focus handling and back-navigation panel retention by [@lvcabral](https://github.com/lvcabral) in [#1068](https://github.com/lvcabral/brs-engine/pull/1068)
* (rsg) `PanelSet` sets the attached `Panel` height per the Roku spec by [@lvcabral](https://github.com/lvcabral) in [#1069](https://github.com/lvcabral/brs-engine/pull/1069)
* (rsg) Let single-row `MarkupGrid` vertical keys bubble and honor `horizFocusAnimationStyle` `fixedFocus` by [@lvcabral](https://github.com/lvcabral) in [#1070](https://github.com/lvcabral/brs-engine/pull/1070)
* (rsg) Decouple the `Timer` polling from the frame-rate-limiting busy-wait by [@markwpearce](https://github.com/markwpearce) in [#1076](https://github.com/lvcabral/brs-engine/pull/1076)
* (rsg) `parentSubtype()` returns `Invalid` instead of `""` at the hierarchy root by [@markwpearce](https://github.com/markwpearce) in [#1077](https://github.com/lvcabral/brs-engine/pull/1077)
* (rsg) Reset the key buffer when `roSGScreen` closes, to prevent a stale key leaking into the next screen by [@markwpearce](https://github.com/markwpearce) in [#1081](https://github.com/lvcabral/brs-engine/pull/1081)

#### Chores, Build and Dependencies

* Bump follow-redirects from 1.15.11 to 1.16.0 by @dependabot[bot] in [#917](https://github.com/lvcabral/brs-engine/pull/917)
* Bump uuid from 9.0.1 to 14.0.0 by @dependabot[bot] in [#918](https://github.com/lvcabral/brs-engine/pull/918)
* Bump fast-uri from 3.1.0 to 3.1.2 by @dependabot[bot] in [#921](https://github.com/lvcabral/brs-engine/pull/921)
* Bump webpack-dev-server from 5.2.3 to 5.2.4 by @dependabot[bot] in [#923](https://github.com/lvcabral/brs-engine/pull/923)
* Bump ws from 8.18.3 to 8.20.1 by @dependabot[bot] in [#924](https://github.com/lvcabral/brs-engine/pull/924)
* Bump qs and express by @dependabot[bot] in [#925](https://github.com/lvcabral/brs-engine/pull/925)
* (chore) Added `CLAUDE.md` guidance for Claude Code by [@lvcabral](https://github.com/lvcabral) in [#927](https://github.com/lvcabral/brs-engine/pull/927)
* (chore) Added the Roku reference docs (`dev-doc` submodule) and the `brs-reference` skill by [@lvcabral](https://github.com/lvcabral) in [#929](https://github.com/lvcabral/brs-engine/pull/929)
* Bump shell-quote from 1.8.3 to 1.8.4 by @dependabot[bot] in [#946](https://github.com/lvcabral/brs-engine/pull/946)
* Bump launch-editor from 2.12.0 to 2.14.1 by @dependabot[bot] in [#955](https://github.com/lvcabral/brs-engine/pull/955)
* Bump ws by @dependabot[bot] in [#957](https://github.com/lvcabral/brs-engine/pull/957)
* Bump webpack-dev-server from 5.2.4 to 5.2.5 by @dependabot[bot] in [#958](https://github.com/lvcabral/brs-engine/pull/958)
* (test) Exercise a different case in the negated `bsConst` test by [@lvcabral](https://github.com/lvcabral) in [#965](https://github.com/lvcabral/brs-engine/pull/965)
* (chore) Enforce `no-case-declarations` and brace switch cases that declare bindings by [@lvcabral](https://github.com/lvcabral) in [#966](https://github.com/lvcabral/brs-engine/pull/966)
* (chore) Added new ESLint rules and fixed all instances by [@lvcabral](https://github.com/lvcabral) in [#974](https://github.com/lvcabral/brs-engine/pull/974)
* (chore) Enhanced the ESLint rules and refactored code for consistency by [@lvcabral](https://github.com/lvcabral) in [#975](https://github.com/lvcabral/brs-engine/pull/975)
* (chore) TypeScript 7 readiness — bundler `moduleResolution`, explicit types, drop `baseUrl` by [@lvcabral](https://github.com/lvcabral) in [#981](https://github.com/lvcabral/brs-engine/pull/981)
* (chore) Updated the `dev-doc` submodule to the latest v2.0 and added the `docs:update` script by [@lvcabral](https://github.com/lvcabral) in [#987](https://github.com/lvcabral/brs-engine/pull/987)
* (docs) Simplified and shortened `CLAUDE.md` by [@lvcabral](https://github.com/lvcabral) in [#1018](https://github.com/lvcabral/brs-engine/pull/1018)
* Bump websocket-driver from 0.7.4 to 0.7.5 by @dependabot[bot] in [#1031](https://github.com/lvcabral/brs-engine/pull/1031)
* Bump brace-expansion from 5.0.6 to 5.0.7 by @dependabot[bot] in [#1075](https://github.com/lvcabral/brs-engine/pull/1075)
* Bump shell-quote from 1.8.4 to 1.10.0 by @dependabot[bot] in [#1078](https://github.com/lvcabral/brs-engine/pull/1078)
* Bump fast-uri from 3.1.2 to 3.1.4 by @dependabot[bot] in [#1079](https://github.com/lvcabral/brs-engine/pull/1079)
* Bump uuid and webpack-dev-server by @dependabot[bot] in [#1080](https://github.com/lvcabral/brs-engine/pull/1080)

[Full Changelog][v2.3.0]

<a name="v2.2.0"></a>

## [v2.2.0 - `slice()` in `roByteArray` and new SG nodes](https://github.com/lvcabral/brs-engine/releases/tag/v2.2.0) - 12 April 2026

This release introduces the `slice` method to `RoByteArray`, `ScrollableText`, `PinPad` and `PinDialog` nodes to the SceneGraph extension, along with various bug fixes and improvements.

### Release Changes

* (brs) Properly exported mocks of `roStreamSocket` and `roDataGramSocket` by [@lvcabral](https://github.com/lvcabral) in [#886](https://github.com/lvcabral/brs-engine/pull/886)
* (brs) Prevent crash with empty images in `IfDraw2D` by [@lvcabral](https://github.com/lvcabral) in [#902](https://github.com/lvcabral/brs-engine/pull/902)
* (brs) Add `slice` method to `RoByteArray` and corresponding tests by [@lvcabral](https://github.com/lvcabral) in [#906](https://github.com/lvcabral/brs-engine/pull/906)
* (brs) Restored `roMessagePort` behavior when an `interpreter` instance is not used in `updateMessageQueue` [@lvcabral](https://github.com/lvcabral) in [#915](https://github.com/lvcabral/brs-engine/pull/915)
* Changes on `brs-scenegraph` package (release v0.2.0):
  * (rsg) Fixed handling of `Node` field `role` attribute and a crash in `ZoomRowList`with empty content by [@lvcabral](https://github.com/lvcabral) in [#884](https://github.com/lvcabral/brs-engine/pull/884)
  * (rsg) Improve `Node` ownership management in rendezvous by [@lvcabral](https://github.com/lvcabral) in [#883](https://github.com/lvcabral/brs-engine/pull/883)
  * (rsg) Implemented support for `renderTracking` field by [@lvcabral](https://github.com/lvcabral) in [#887](https://github.com/lvcabral/brs-engine/pull/887)
  * (rsg) Fixed `ButtonGroup` to handle custom buttons defined in XML and fixed `StringArray` field parsing by [@lvcabral](https://github.com/lvcabral) in [#888](https://github.com/lvcabral/brs-engine/pull/888)
  * (rsg) Added support for multiple `roMessagePort` to be used in `Main` thread by [@lvcabral](https://github.com/lvcabral) in [#889](https://github.com/lvcabral/brs-engine/pull/889)
  * (rsg) Refactored `NodeFactory` functions to streamline node creation process by [@lvcabral](https://github.com/lvcabral) in [#890](https://github.com/lvcabral/brs-engine/pull/890)
  * (rsg) Fixed `RowList` that was not setting `itemSelected` when OK was pressed by [@lvcabral](https://github.com/lvcabral) in [#891](https://github.com/lvcabral/brs-engine/pull/891)
  * (rsg) Removed `scene` from `TaskData` by [@lvcabral](https://github.com/lvcabral) in [#892](https://github.com/lvcabral/brs-engine/pull/892)
  * (rsg) Added `StandardKeyboardDialog` and `VoiceTextEditBox` nodes by [@lvcabral](https://github.com/lvcabral) in [#893](https://github.com/lvcabral/brs-engine/pull/893)
  * (rsg) Implemented `ScrollableText` node by [@lvcabral](https://github.com/lvcabral) in [#895](https://github.com/lvcabral/brs-engine/pull/895)
  * (rsg) Implemented `PinPad` widget node by [@lvcabral](https://github.com/lvcabral) in [#896](https://github.com/lvcabral/brs-engine/pull/896)
  * (rsg) Implemented `PinDialog` and added literal keys support to `PinPad` by [@lvcabral](https://github.com/lvcabral) in [#898](https://github.com/lvcabral/brs-engine/pull/898)
  * (rsg) Implemented ProgressDialog node by [@lvcabral](https://github.com/lvcabral) in [#899](https://github.com/lvcabral/brs-engine/pull/899)
  * (rsg) Set `Poster` loadStatus to "loading" when URI is updated by [@lvcabral](https://github.com/lvcabral) in [#900](https://github.com/lvcabral/brs-engine/pull/900)
  * (rsg) Fixed focus handling in `Node` to ensure global focus reference is set correctly by [@lvcabral](https://github.com/lvcabral) in [#901](https://github.com/lvcabral/brs-engine/pull/901)
  * (rsg) Fix stack overflow from ContentNode parentField notification cascade by [@jeremy-albinet](https://github.com/jeremy-albinet) in https://github.com/lvcabral/brs-engine/pull/905
  * (rsg) Support rendering during wait() on local roMessagePort by [@cewert](https://github.com/cewert) in https://github.com/lvcabral/brs-engine/pull/913
* (chore) Reverted dependency to `@zenfs/core` v2.5.0 with synchronous config by [@lvcabral](https://github.com/lvcabral) in [#894](https://github.com/lvcabral/brs-engine/pull/894)
* (chore): Removed unused dependencies and added override for minimatch to address security issue by [@lvcabral](https://github.com/lvcabral) in [#897](https://github.com/lvcabral/brs-engine/pull/897)
* Bump qs from 6.14.1 to 6.14.2 by @dependabot[bot] in [#885](https://github.com/lvcabral/brs-engine/pull/885)
* Bump minimatch from 10.2.2 to 10.2.4 by @dependabot[bot] in https://github.com/lvcabral/brs-engine/pull/903
* Bump serialize-javascript and copy-webpack-plugin by @dependabot[bot] in https://github.com/lvcabral/brs-engine/pull/911
* Bump lodash from 4.17.23 to 4.18.1 by @dependabot[bot] in https://github.com/lvcabral/brs-engine/pull/914

## New Contributors

* @jeremy-albinet made their first contribution in https://github.com/lvcabral/brs-engine/pull/905
* @cewert made their first contribution in https://github.com/lvcabral/brs-engine/pull/913

[Full Changelog][v2.2.0]

<a name="v2.1.0"></a>

## [v2.1.0 - Rendezvous and other major improvements and fixes](https://github.com/lvcabral/brs-engine/releases/tag/v2.1.0) - 11 February 2026

This release brings major improvements both to the core engine and the SceneGraph extension, including better support for Task threads, introducing real Rendezvous, enhanced debugging capabilities, and various bug fixes and optimizations. Read the full release notes below for more details.

### Release Changes

* (api) Added support to load Worker as a `Blob` by [@lvcabral](https://github.com/lvcabral) in [#818](https://github.com/lvcabral/brs-engine/pull/818)
* (brs) Handle Blowfish deprecation in `roEVPCipher` by [@lvcabral](https://github.com/lvcabral) in [#821](https://github.com/lvcabral/brs-engine/pull/821)
* (brs) Fixed MicroDebugger stack trace and context (variables) by [@lvcabral](https://github.com/lvcabral) in [#822](https://github.com/lvcabral/brs-engine/pull/822)
* (brs) Properly handle crash during debugger session by [@lvcabral](https://github.com/lvcabral) in [#824](https://github.com/lvcabral/brs-engine/pull/824)
* (brs) Properly handle files with `UTF-8 BOM` on `Lexer` by [@lvcabral](https://github.com/lvcabral) in [#840](https://github.com/lvcabral/brs-engine/pull/840)
* (brs) Implemented DRM detection in browser environment to populate `roDeviceInfo.getDrmInfoEx()` by [@lvcabral](https://github.com/lvcabral) in [#844](https://github.com/lvcabral/brs-engine/pull/844)
* (brs) Fix video URL handling to correctly process package video files by [@lvcabral](https://github.com/lvcabral) in [#845](https://github.com/lvcabral/brs-engine/pull/845)
* (brs) Added support for the `milliseconds` param on `roDateTime.toISOString()` by [@lvcabral](https://github.com/lvcabral) in [#846](https://github.com/lvcabral/brs-engine/pull/846)
* (brs) Allowed to use `global` as function parameter name by [@lvcabral](https://github.com/lvcabral) in [#850](https://github.com/lvcabral/brs-engine/pull/850)
* (brs) Refactored `Interpreter` to extract `call` from `visitCall` by [@lvcabral](https://github.com/lvcabral) in [#873](https://github.com/lvcabral/brs-engine/pull/873)
* (brs) Add log level management to device data and interpreter output by [@lvcabral](https://github.com/lvcabral) in [#881](https://github.com/lvcabral/brs-engine/pull/881)
* (brs) Add LongInteger (Int64) support to Str() global function by [@saas817](https://github.com/saas817) in [#878](https://github.com/lvcabral/brs-engine/pull/878)
* (chore) Small refactoring on API task module by [@lvcabral](https://github.com/lvcabral) in [#855](https://github.com/lvcabral/brs-engine/pull/855)
* (chore) Bump lodash from 4.17.21 to 4.17.23 by [@dependabot](https://github.com/dependabot) in [#843](https://github.com/lvcabral/brs-engine/pull/843)
* (chore) Bump webpack from 5.103.0 to 5.105.0 by [@dependabot](https://github.com/dependabot) in [#876](https://github.com/lvcabral/brs-engine/pull/876)
* Changes on `brs-scenegraph` package (release v0.1.0):
  * (rsg) Fixed `Scene` set fields before initialization by [@lvcabral](https://github.com/lvcabral) in [#819](https://github.com/lvcabral/brs-engine/pull/819)
  * (rsg) Prevent block `setValue` when in the task thread by [@lvcabral](https://github.com/lvcabral) in [#820](https://github.com/lvcabral/brs-engine/pull/820)
  * (rsg) Fixed `Scenegraph` crash handling and stack trace by [@lvcabral](https://github.com/lvcabral) in [#823](https://github.com/lvcabral/brs-engine/pull/823)
  * (rsg) Implemented support for debugging Task threads by [@lvcabral](https://github.com/lvcabral) in [#825](https://github.com/lvcabral/brs-engine/pull/825)
  * (rsg) Fixed line numbers on embedded XML scripts by [@lvcabral](https://github.com/lvcabral) in [#826](https://github.com/lvcabral/brs-engine/pull/826)
  * (rsg) Properly handle `Task` function errors and prevent crash when `functionName` is not found by [@lvcabral](https://github.com/lvcabral) in [#827](https://github.com/lvcabral/brs-engine/pull/827)
  * (rsg) Added `PosterGrid` and improved focus style handling on `ArrayGrid` based nodes by [@lvcabral](https://github.com/lvcabral) in [#828](https://github.com/lvcabral/brs-engine/pull/828)
  * (rsg) Fixed `ScrollingLabel` to handle `horizAlign` and actually scroll when needed by [@lvcabral](https://github.com/lvcabral) in [#829](https://github.com/lvcabral/brs-engine/pull/829)
  * (rsg) Added `InfoPane` node by [@lvcabral](https://github.com/lvcabral) in [#830](https://github.com/lvcabral/brs-engine/pull/830)
  * (rsg) Fixed handling of boxed numbers on `setValue()` in several nodes by [@lvcabral](https://github.com/lvcabral) in [#831](https://github.com/lvcabral/brs-engine/pull/831)
  * (rsg) Removed the interpreter parameter from `setNodeFocus` by [@lvcabral](https://github.com/lvcabral) in [#832](https://github.com/lvcabral/brs-engine/pull/832)
  * (rsg) Fixed the handling of `OK` key in `RowList` and `ZoomRowList` by [@lvcabral](https://github.com/lvcabral) in [#833](https://github.com/lvcabral/brs-engine/pull/833)
  * (rsg) Added `setNodeFocus` method to `ArrayGrid` to reset `itemFocused` when getting the focus by [@lvcabral](https://github.com/lvcabral) in [#834](https://github.com/lvcabral/brs-engine/pull/834)
  * (rsg) Added `sgnodes` command to `MicroDebugger` to list node type statistics by [@lvcabral](https://github.com/lvcabral) in [#835](https://github.com/lvcabral/brs-engine/pull/835)
  * (rsg) Added `MaskGroup` draft and fixed several issues with field assignment by [@lvcabral](https://github.com/lvcabral) in [#836](https://github.com/lvcabral/brs-engine/pull/836)
  * (rsg) Fixed component XML parsing of `interface` to handle attributes as case-insensitive by [@lvcabral](https://github.com/lvcabral) in [#838](https://github.com/lvcabral/brs-engine/pull/838)
  * (rsg) Improved parsing of field types: `StringArray`, `Vector2D` and `Vector2DArray` by [@lvcabral](https://github.com/lvcabral) in [#839](https://github.com/lvcabral/brs-engine/pull/839)
  * (rsg) Fixed XML parsing to support `alias` field to be set without `type` by [@lvcabral](https://github.com/lvcabral) in [#841](https://github.com/lvcabral/brs-engine/pull/841)
  * (rsg) Added support for default item component on `RowList` and item focus callback in `ArrayGrid` by [@lvcabral](https://github.com/lvcabral) in [#842](https://github.com/lvcabral/brs-engine/pull/842)
  * (rsg) Implemented all `PanelSet` related nodes by [@lvcabral](https://github.com/lvcabral) in [#837](https://github.com/lvcabral/brs-engine/pull/837)
  * (rsg) Fixed `role` fields to not be case sensitive by [@lvcabral](https://github.com/lvcabral) in [#847](https://github.com/lvcabral/brs-engine/pull/847)
  * (rsg) Implemented the context expansion for the Main thread by [@lvcabral](https://github.com/lvcabral) in [#848](https://github.com/lvcabral/brs-engine/pull/848)
  * (rsg) Allowed replacing hidden fields when extending `ContentNode` by [@lvcabral](https://github.com/lvcabral) in [#849](https://github.com/lvcabral/brs-engine/pull/849)
  * (rsg) Prevent issues with `Video` node on startup (after the Splash) by [@lvcabral](https://github.com/lvcabral) in [#851](https://github.com/lvcabral/brs-engine/pull/851)
  * (rsg) Improved handling of manifest entries `ui_resolutions` and `uri_resolution_autosub` by [@lvcabral](https://github.com/lvcabral) in [#852](https://github.com/lvcabral/brs-engine/pull/852)
  * (rsg) Enhance autoSub URI replacement to support regex patterns by [@lvcabral](https://github.com/lvcabral) in [#853](https://github.com/lvcabral/brs-engine/pull/853)
  * (rsg) Improved de-serialization of `Scene` and other nodes in `Task` threads by [@lvcabral](https://github.com/lvcabral) in [#854](https://github.com/lvcabral/brs-engine/pull/854)
  * (rsg) Fixed crash when `m.top.getScene()` is used on `init()` in a `Task` thread by [@lvcabral](https://github.com/lvcabral) in [#857](https://github.com/lvcabral/brs-engine/pull/857)
  * (rsg) Fixed handling of `Node` alias to support child changes by [@lvcabral](https://github.com/lvcabral) in [#859](https://github.com/lvcabral/brs-engine/pull/859)
  * (rsg) Implemented `ancestorBoundingRect()` method by [@lvcabral](https://github.com/lvcabral) in [#860](https://github.com/lvcabral/brs-engine/pull/860)
  * (rsg) Fixed `Node` field string assignment to keep the current value when parse fails by [@lvcabral](https://github.com/lvcabral) in [#861](https://github.com/lvcabral/brs-engine/pull/861)
  * (rsg) Fixed rendering to prevent `rectBound` calculation to clear `isDirty` flag by [@lvcabral](https://github.com/lvcabral) in [#862](https://github.com/lvcabral/brs-engine/pull/862)
  * (rsg) Added support for multiple `Node` field aliases (CSV) by [@lvcabral](https://github.com/lvcabral) in [#863](https://github.com/lvcabral/brs-engine/pull/863)
  * (rsg) Fixed `Node.setValue()` signature to prevent field creation on assignment by [@lvcabral](https://github.com/lvcabral) in [#864](https://github.com/lvcabral/brs-engine/pull/864)
  * (rsg) Fixed item component handling to not fail when fields are not defined in XML by [@lvcabral](https://github.com/lvcabral) in [#865](https://github.com/lvcabral/brs-engine/pull/865)
  * (rsg) Fixed `Node` field aliases observer trigger by [@lvcabral](https://github.com/lvcabral) in [#866](https://github.com/lvcabral/brs-engine/pull/866)
  * (rsg) Fixed `Node.setValue()` to update its field before the aliases by [@lvcabral](https://github.com/lvcabral) in [#867](https://github.com/lvcabral/brs-engine/pull/867)
  * (rsg) Fixed `Poster`, `BusySpinner`, `Video` and `TrickPlayBar` to properly handle child nodes `uri` update by [@lvcabral](https://github.com/lvcabral) in [#868](https://github.com/lvcabral/brs-engine/pull/868)
  * (rsg) Fixed `BusySpinner` dimensions calculation by [@lvcabral](https://github.com/lvcabral) in [#869](https://github.com/lvcabral/brs-engine/pull/869)
  * (rsg) Fixed circular dependency issue when `Node` has child with its same `id` in `alias` by [@lvcabral](https://github.com/lvcabral) in [#870](https://github.com/lvcabral/brs-engine/pull/870)
  * (rsg) Improved `Node.setValue()` exception handling by [@lvcabral](https://github.com/lvcabral) in [#871](https://github.com/lvcabral/brs-engine/pull/871)
  * (rsg) Fixed `StandardDialog` focus and `back` key press handling by [@lvcabral](https://github.com/lvcabral) in [#872](https://github.com/lvcabral/brs-engine/pull/872)
  * (rsg) Fixed observables serialization and handling of `InfoFields` by [@lvcabral](https://github.com/lvcabral) in [#874](https://github.com/lvcabral/brs-engine/pull/874)
  * (rsg) Fixed `Serializer` to prevent circular dependency by [@lvcabral](https://github.com/lvcabral) in [#875](https://github.com/lvcabral/brs-engine/pull/875)
  * (rsg) Changed `handleThreadUpdate` to preserve update id on relay to other threads by [@lvcabral](https://github.com/lvcabral) in [#879](https://github.com/lvcabral/brs-engine/pull/879)
  * (rsg) Added `nodeType` to `RoSGNode` and updated stats call by [@lvcabral](https://github.com/lvcabral) in [#880](https://github.com/lvcabral/brs-engine/pull/880)
  * (rsg) Fixed `BusySpinner` image size handling for resolution mismatch by [@lvcabral](https://github.com/lvcabral) in [#882](https://github.com/lvcabral/brs-engine/pull/882)
  * (rsg) Implement thread updates similar to SceneGraph Rendezvous  by [@lvcabral](https://github.com/lvcabral) in [#856](https://github.com/lvcabral/brs-engine/pull/856)

### New Contributors

* @fortuna97 made their first contribution in [#878](https://github.com/lvcabral/brs-engine/pull/878) - welcome to the project!

[Full Changelog][v2.1.0]

<a name="v2.0.5"></a>

## [v2.0.5 - Animation and Interpolator Nodes](https://github.com/lvcabral/brs-engine/releases/tag/v2.0.5) - 5 January 2026

This release introduces the `Animation` and `Interpolator` nodes to the SceneGraph extension, along with various bug fixes and improvements to both the CLI and SceneGraph extension.

### Release Changes

* (brs) Fixed debugger to restore the context on `RunTimeError` by [@lvcabral](https://github.com/lvcabral) in [#807](https://github.com/lvcabral/brs-engine/pull/807)
* (brs) Added `toBoolean` for all numeric components by [@lvcabral](https://github.com/lvcabral) in [#808](https://github.com/lvcabral/brs-engine/pull/808)
* (brs) Fixed `CreateObject` to properly handle boxed parameters and raise `RunTimeError` by [@lvcabral](https://github.com/lvcabral) in [#809](https://github.com/lvcabral/brs-engine/pull/809)
* Changes on `brs-scenegraph` package (release v0.0.5):
  * (rsg) Fixed `roSGNode` creation using boxed `String` as `nodeType` by [@lvcabral](https://github.com/lvcabral) in [#806](https://github.com/lvcabral/brs-engine/pull/806)
  * (rsg) Fixed focus when `initialFocus` is not set by [@lvcabral](https://github.com/lvcabral) in [#810](https://github.com/lvcabral/brs-engine/pull/810)
  * (rsg) Fixed: `ArrayGrid` based nodes must reset focused item when `content` is updated by [@lvcabral](https://github.com/lvcabral) in [#811](https://github.com/lvcabral/brs-engine/pull/811)
  * (rsg) Fixed `findNode` to prioritize search on `children` by [@lvcabral](https://github.com/lvcabral) in [#812](https://github.com/lvcabral/brs-engine/pull/812)
  * (rsg) Implemented `Animation` and `Interpolator` nodes by [@lvcabral](https://github.com/lvcabral) in [#813](https://github.com/lvcabral/brs-engine/pull/813)
  * (rsg) Changed `Node` to preserve field name case by [@lvcabral](https://github.com/lvcabral) in [#814](https://github.com/lvcabral/brs-engine/pull/814)
  * (rsg) Fixed conflict on `roSGScreen` scene events handling by [@lvcabral](https://github.com/lvcabral) in [#815](https://github.com/lvcabral/brs-engine/pull/815)
  * (cli) Fixed CLI loading SceneGraph components on Windows file system by [@lvcabral](https://github.com/lvcabral) in [#816](https://github.com/lvcabral/brs-engine/pull/816)
  * (rsg) Optimized `roSGScreen` to only render when changes happened by [@lvcabral](https://github.com/lvcabral) in [#817](https://github.com/lvcabral/brs-engine/pull/817)

[Full Changelog][v2.0.5]

<a name="v2.0.4"></a>

## [v2.0.4 - CLI Unicode Rendering](https://github.com/lvcabral/brs-engine/releases/tag/v2.0.4) - 31 December 2025

This release introduces a new Unicode rendering mode for the CLI, along with various bug fixes and improvements to both the CLI and SceneGraph extension.

### Release Changes

* (cli) Added new `unicode` display rendering mode by [@lvcabral](https://github.com/lvcabral) in [#799](https://github.com/lvcabral/brs-engine/pull/799)
* (brs) Prevented division by zero on `roAudioMetadata` by [@lvcabral](https://github.com/lvcabral) in [#798](https://github.com/lvcabral/brs-engine/pull/798)
* (brs) Fixed `roFontRegistry` to properly check parsed font metrics by [@lvcabral](https://github.com/lvcabral) in [#800](https://github.com/lvcabral/brs-engine/pull/800)
* Changes on `brs-scenegraph` package (release v0.0.4):
  * (rsg) Fixed `Poster` rendering to match Roku's automatic scaling by [@lvcabral](https://github.com/lvcabral) in [#801](https://github.com/lvcabral/brs-engine/pull/801)
  * (rsg) Fixed `Overhang` default logo scaling by [@lvcabral](https://github.com/lvcabral) in [#802](https://github.com/lvcabral/brs-engine/pull/802)
  * (rsg) Fixed item component's events on `ArrayGrid` based nodes by [@lvcabral](https://github.com/lvcabral) in [#803](https://github.com/lvcabral/brs-engine/pull/803)
  * (rsg) Changed `Field` to allow assign `roPath` to a `String` field by [@lvcabral](https://github.com/lvcabral) in [#804](https://github.com/lvcabral/brs-engine/pull/804)
  * (rsg) Fixed `Task` to prevent crash on updated fields with `null` by [@lvcabral](https://github.com/lvcabral) in [#805](https://github.com/lvcabral/brs-engine/pull/805)

[Full Changelog][v2.0.4]

<a name="v2.0.3"></a>

## [v2.0.3 - Mount External Volume Dynamically](https://github.com/lvcabral/brs-engine/releases/tag/v2.0.3) - 24 December 2025

This release introduces the ability to dynamically mount and unmount the `ext1:` volume, along with several bug fixes and improvements to the SceneGraph extension.

### Release Changes

* (brs) Closes #773 Add support to dynamically mount/unmount `ext1:` volume by [@lvcabral](https://github.com/lvcabral) in [#793](https://github.com/lvcabral/brs-engine/pull/793)
* (brs) Changed `roFileSystem.getVolumeInfo()` to properly return `ext1:/` information by [@lvcabral](https://github.com/lvcabral) in [#797](https://github.com/lvcabral/brs-engine/pull/797)
* (chore) Improved console logging and removed debug messages from production lib by [@lvcabral](https://github.com/lvcabral) in [#788](https://github.com/lvcabral/brs-engine/pull/788)
* (chore) Fixed broken links on README.md files by [@lvcabral](https://github.com/lvcabral) in [#789](https://github.com/lvcabral/brs-engine/pull/789)
* Changes on `brs-scenegraph` package (release v0.0.3):
  * (rsg) Implemented support for `change` field in `Node` by [@lvcabral](https://github.com/lvcabral) in [#790](https://github.com/lvcabral/brs-engine/pull/790)
  * (rsg) Changed `Task` to update existing `Node` fields to preserve references by [@lvcabral](https://github.com/lvcabral) in [#792](https://github.com/lvcabral/brs-engine/pull/792)
  * (rsg) Fixed `Node` environment `hostNode` initialization by [@lvcabral](https://github.com/lvcabral) in [#794](https://github.com/lvcabral/brs-engine/pull/794)
  * (rsg) Fixed `Node.callFunc()` to not be case sensitive by [@lvcabral](https://github.com/lvcabral) in [#796](https://github.com/lvcabral/brs-engine/pull/796)
  * (chore) Renamed factory modules by [@lvcabral](https://github.com/lvcabral) in [#791](https://github.com/lvcabral/brs-engine/pull/791)

[Full Changelog][v2.0.3]

<a name="v2.0.2"></a>

## [v2.0.2 - Various Fixes and Improvements](https://github.com/lvcabral/brs-engine/releases/tag/v2.0.2) - 12 December 2025

This release brings enhancements to the SceneGraph extension, CLI and API improvements, and various bug fixes.

### Release Changes

* (api) Improved `SceneGraph` app detection by [@lvcabral](https://github.com/lvcabral) in [#778](https://github.com/lvcabral/brs-engine/pull/778)
* (chore) Fixed multiple static analysis issues reported by SonarCloud by [@lvcabral](https://github.com/lvcabral) in [#779](https://github.com/lvcabral/brs-engine/pull/779)
* (chore) Closes [#33](https://github.com/lvcabral/brs-engine/issues/33) replaced `opentype.js` by a fork with font parsing only by [@lvcabral](https://github.com/lvcabral) in [#780](https://github.com/lvcabral/brs-engine/pull/780)
* (brs) Fixed `String` coercion to handle `isStringComp` objects by [@lvcabral](https://github.com/lvcabral) in [#782](https://github.com/lvcabral/brs-engine/pull/782)
* (brs) Changed `BrsExtension` signature to include `version` by [@lvcabral](https://github.com/lvcabral) in [#787](https://github.com/lvcabral/brs-engine/pull/787)
* Changes on `brs-scenegraph` package (release v0.0.2):
  * (rsg) Fixes [#769](https://github.com/lvcabral/brs-engine/issues/769) `Video` UI header removed too soon by [@lvcabral](https://github.com/lvcabral) in [#781](https://github.com/lvcabral/brs-engine/pull/781)
  * (rsg) Prevent crash when custom fonts are missing by [@lvcabral](https://github.com/lvcabral) in [#783](https://github.com/lvcabral/brs-engine/pull/783)
  * (rsg) Made `ArrayGrid` based nodes to be aware of `content` changes by [@lvcabral](https://github.com/lvcabral) in [#784](https://github.com/lvcabral/brs-engine/pull/784)
  * (rsg) Fixed `roSGNode` methods `setField` and `addFields` to properly handle `ContentNode` by [@lvcabral](https://github.com/lvcabral) in [#785](https://github.com/lvcabral/brs-engine/pull/785)
  * (rsg) Removed usage of reflection to build `subtypeHierarchy` in `Node` by [@lvcabral](https://github.com/lvcabral) in [#786](https://github.com/lvcabral/brs-engine/pull/786)

[Full Changelog][v2.0.2]

<a name="v2.0.1"></a>

## [v2.0.1 - Fixed API Types and Registry persistence](https://github.com/lvcabral/brs-engine/releases/tag/v2.0.1) - 08 December 2025

### Release Changes

* (api) Fixed `getWorkerLibPath` to avoid duplicate parameters by [@lvcabral](https://github.com/lvcabral) in [#765](https://github.com/lvcabral/brs-engine/pull/765)
* (api) Fix: Added back API library types to the package by [@lvcabral](https://github.com/lvcabral) in [#766](https://github.com/lvcabral/brs-engine/pull/766)
* (api) Fixed [#775](https://github.com/lvcabral/brs-engine/issues/775) Deleted registry keys not being removed from LocalStorage by [@lvcabral](https://github.com/lvcabral) in [#776](https://github.com/lvcabral/brs-engine/pull/776)

[Full Changelog][v2.0.1]

<a name="v2.0.0"></a>

## [v2.0.0 - Extensions and SceneGraph Support](https://github.com/lvcabral/brs-engine/releases/tag/v2.0.0) - 05 December 2025

The `brs-engine` has been refactored to support an extension model, with **Roku SceneGraph** functionality moved to a separate NPM package `brs-scenegraph`. This architectural change keeps the core interpreter lean, while enabling optional extensions for **RSG** and, in the future, **SDK1** (legacy Roku apps) and **BrightSign** (digital signage platform).

### Release Changes

* Refactored `brs-engine` to support extensions and moved **SceneGraph** code to a separate package by [@lvcabral](https://github.com/lvcabral) in [#760](https://github.com/lvcabral/brs-engine/pull/760)
  * Introduced an extension system with the `BrsExtension` interface and lifecycle hooks
  * Moved SceneGraph code to the `src/extensions/scenegraph/` directory
  * Several documentation updates to reflect the new extension model, including a new [Extensions](docs/extensions.md) document
  * Refactored test file imports to use top-level `brs` exports
  * Created the new `brs-scenegraph` package with independent build configuration

Note: The **SceneGraph** functionality is on par with the last alpha release: [v2.0.0-alpha.26](https://github.com/lvcabral/brs-engine/releases/tag/v2.0.0-alpha.26). All future SceneGraph-related implementations will be made in the `brs-scenegraph` package and documented in its [CHANGELOG.md](https://github.com/lvcabral/brs-engine/blob/master/packages/scenegraph/CHANGELOG.md).

[Full Changelog][v2.0.0]

<a name="v1.10.0"></a>

## [v1.10.0 - BrsEvent and BrsCollection](https://github.com/lvcabral/brs-engine/releases/tag/v1.10.0) - 03 December 2025

This is the final v1.x release in the `master` branch and brings the inclusion of the `BrsEvent` abstract class and `BrsCollection` interface, which provide a structured way to handle events and collections within the BrightScript engine. Additionally, this release includes various dependency updates and bug fixes to enhance security, stability and performance. This label will be branched for maintenance updates while work on the v2.0 major release will continue in the `master` branch.

### Release Changes

* Replaced dependency `xml2js` by `xmldoc` by [@lvcabral](https://github.com/lvcabral) in [#749](https://github.com/lvcabral/brs-engine/pull/749)
* Bump js-yaml from 3.14.1 to 3.14.2 by @dependabot[bot] in [#752](https://github.com/lvcabral/brs-engine/pull/752)
* Raise type mismatch error when passing `Uninitialized` value to non-dynamic function parameters by [@lvcabral](https://github.com/lvcabral) in [#756](https://github.com/lvcabral/brs-engine/pull/756)
* Added `BrsEvent` abstract class and `BrsCollection` interface by [@lvcabral](https://github.com/lvcabral) in [#759](https://github.com/lvcabral/brs-engine/pull/759)
* Bump node-forge from 1.3.1 to 1.3.2 by @dependabot[bot] in [#758](https://github.com/lvcabral/brs-engine/pull/758)
* Fixed optional chaining with `roInvalid` when using methods by [@lvcabral](https://github.com/lvcabral) in [#763](https://github.com/lvcabral/brs-engine/pull/763)

[Full Changelog][v1.10.0]

<a name="v1.9.9"></a>

## [v1.9.9 - File System improvements](https://github.com/lvcabral/brs-engine/releases/tag/v1.9.9) - 14 November 2025

This release brings several improvements to the virtual file system, including better handling of writeable volumes and case sensitivity on path names. It also includes fixes for the `roRegex.split()` return type, `MicroDebugger` handling of multiple statements in a single line, support for UTF-16 in `StringI` global function and other minor enhancements.

### Release Changes

* Fixed: `stop` not working as the last statement by [@lvcabral](https://github.com/lvcabral) in [#719](https://github.com/lvcabral/brs-engine/pull/719)
* Fixed return type for `roRegex.split()` to `roList` instead of `roArray` by [@lvcabral](https://github.com/lvcabral) in [#721](https://github.com/lvcabral/brs-engine/pull/721)
* Upgraded `zenFS` dependency and removed `memory-fs` by [@lvcabral](https://github.com/lvcabral) in [#725](https://github.com/lvcabral/brs-engine/pull/725)
* Added `common:/certs/ca-bundle.crt` file and upgraded `zenFS` by [@lvcabral](https://github.com/lvcabral) in [#727](https://github.com/lvcabral/brs-engine/pull/727)
* Fixed issue that prevented playback of the first loaded audio by [@lvcabral](https://github.com/lvcabral) in [#728](https://github.com/lvcabral/brs-engine/pull/728)
* Save paths in writeable volumes with original case by [@lvcabral](https://github.com/lvcabral) in [#730](https://github.com/lvcabral/brs-engine/pull/730)
* Force ignore cache for `common.zip` when new version is available by [@lvcabral](https://github.com/lvcabral) in [#732](https://github.com/lvcabral/brs-engine/pull/732)
* Fixed `MicroDebugger` to properly handle a line with multiple statements separated by colon `:` by [@lvcabral](https://github.com/lvcabral) in [#738](https://github.com/lvcabral/brs-engine/pull/738)
* Generate a `registry` event when loading the registry during startup of the engine by [@lvcabral](https://github.com/lvcabral) in [#739](https://github.com/lvcabral/brs-engine/pull/739)
* Clear the display before showing icon as splash by [@lvcabral](https://github.com/lvcabral) in [#741](https://github.com/lvcabral/brs-engine/pull/741)
* Added support for the `not` operator in the preprocessor's `#if` clause evaluation by [@lvcabral](https://github.com/lvcabral) in [#742](https://github.com/lvcabral/brs-engine/pull/742)
* Fixed exception handling for Parser and Preprocessor by [@lvcabral](https://github.com/lvcabral) in [#743](https://github.com/lvcabral/brs-engine/pull/743)
* Added UTF-16 support for `StringI` and prevented crash with negative `string.repeat()` by [@lvcabral](https://github.com/lvcabral) in [#744](https://github.com/lvcabral/brs-engine/pull/744)
* Added validation to `#if` to not allow extra text after the condition token by [@lvcabral](https://github.com/lvcabral) in [#745](https://github.com/lvcabral/brs-engine/pull/745)
* Fixed ZIP based volumes `pkg:`, `common:` and `ext1:` to show the original case on path names by [@lvcabral](https://github.com/lvcabral) in [#747](https://github.com/lvcabral/brs-engine/pull/747)
* Prevent debug error messages in `Network.ts` by [@lvcabral](https://github.com/lvcabral) in [#748](https://github.com/lvcabral/brs-engine/pull/748)

[Full Changelog][v1.9.9]

<a name="v1.9.8"></a>

## [v1.9.8 - Added new API method `getScreenshot()`](https://github.com/lvcabral/brs-engine/releases/tag/v1.9.8) - 29 October 2025

This release adds a new API method `getScreenshot()` that returns the latest rendered screenshot as an `ImageData` object, allowing host applications to get a full resolution image, instead of relying on the resizable display `canvas`.

### Release Changes

* Added new API method `getScreenshot()` by [@lvcabral](https://github.com/lvcabral) in [#711](https://github.com/lvcabral/brs-engine/pull/711)
* Updated API documentation to add new `getScreenshot()` method by [@lvcabral](https://github.com/lvcabral) in [#712](https://github.com/lvcabral/brs-engine/pull/712)
* Prevent crash on Micro Debugger with `bpk` files by [@lvcabral](https://github.com/lvcabral) in [#713](https://github.com/lvcabral/brs-engine/pull/713)
* Bump validator from 13.12.0 to 13.15.20 by @dependabot[bot] in [#706](https://github.com/lvcabral/brs-engine/pull/706)

[Full Changelog][v1.9.8]

<a name="v1.9.7"></a>

## [v1.9.7 - Fixes API method `enableStats`](https://github.com/lvcabral/brs-engine/releases/tag/v1.9.7) - 19 October 2025

This release fixes issues on the API methods `enableStats` and improves the handling of the `dev` app.

### Release Changes

* Simplified `setupCurrentApp` to give the API consumer the control of the `dev` app by [@lvcabral](https://github.com/lvcabral) in [#678](https://github.com/lvcabral/brs-engine/pull/678)
* Fixed `enableStats` API method that was not properly hiding the `stats` panel by [@lvcabral](https://github.com/lvcabral) in [#679](https://github.com/lvcabral/brs-engine/pull/679)

[Full Changelog][v1.9.7]

<a name="v1.9.6"></a>

## [v1.9.6 - Fixes in CORS Proxy and SDKLauncher](https://github.com/lvcabral/brs-engine/releases/tag/v1.9.6) - 19 October 2025

This release brings a couple of fixes for the CORS proxy usage and the `NDKStart` handling of `SDKLauncher`.

### Release Changes

* Prevent using CORS proxy with `localhost` by [@lvcabral](https://github.com/lvcabral) in [#676](https://github.com/lvcabral/brs-engine/pull/676)
* Changed `NDKStart` handling of `SDKLauncher` to return any `channelId` by [@lvcabral](https://github.com/lvcabral) in [#677](https://github.com/lvcabral/brs-engine/pull/677)

[Full Changelog][v1.9.6]

<a name="v1.9.5"></a>

## [v1.9.5 - New API Methods](https://github.com/lvcabral/brs-engine/releases/tag/v1.9.5) - 17 October 2025

This release includes new methods in the engine API, improvements to `roAppManager`, and the `manifest` parsing now matches the behavior of Roku devices.

### Release Changes

* Added `setDebugState` and `getDebugState` to the engine API by [@lvcabral](https://github.com/lvcabral) in [#672](https://github.com/lvcabral/brs-engine/pull/672)
* Added new optional parameter to `roAppManager.getAppList` to allow get all apps properties by [@lvcabral](https://github.com/lvcabral) in [#673](https://github.com/lvcabral/brs-engine/pull/673)
* Fixed `parseManifest` to match Roku behavior and added deprecation warning to `roAppInfo.getSubtitle` by [@lvcabral](https://github.com/lvcabral) in [#674](https://github.com/lvcabral/brs-engine/pull/674)
* Refactored `core` to move Lexer and Parser functions to a separate module by [@lvcabral](https://github.com/lvcabral) in [#675](https://github.com/lvcabral/brs-engine/pull/675)

[Full Changelog][v1.9.5]

<a name="v1.9.4"></a>

## [v1.9.4 - Gamepad Remapping](https://github.com/lvcabral/brs-engine/releases/tag/v1.9.4) - 16 October 2025

This release bring a remapping of the game pad buttons to the Roku remote control, allowing for a better experience using the game pad with Roku apps. It also documents the custom `manifest` option `multi_key_events` that allows apps to receive multiple key events at the same time.

Check the [Remote Control](docs/remote-control.md) and [Customization](docs/customization.md) pages for more details.

### Release Changes

* Remapped game pad to Roku remote buttons by [@lvcabral](https://github.com/lvcabral) in [#669](https://github.com/lvcabral/brs-engine/pull/669)
* Documented the custom `manifest` option `multi_key_events` by [@lvcabral](https://github.com/lvcabral) in [#670](https://github.com/lvcabral/brs-engine/pull/670)

[Full Changelog][v1.9.4]

<a name="v1.9.3"></a>

## [v1.9.3 - Fixed `brs-node` package](https://github.com/lvcabral/brs-engine/releases/tag/v1.9.3) - 12 October 2025

This release fixes the `brs-node` package that had two major issues, the `assets/common.zip` file was missing from the package and the `brs-ecp.js` was crashing due to a dependency issue. Other noticeable fixes were related to `roNDK.start()` allowing URL as `ChannelId` on `SDKLaunch` and `RokuBrowser.brs` library now parses arrays in options object.

### Release Changes

* Allow `roNDK.start()` with `SDKLauncher` to send an URL as `ChannelId` by [@lvcabral](https://github.com/lvcabral) in [#659](https://github.com/lvcabral/brs-engine/pull/659)
* Replaced usage of `forEach()` by `for...of` by [@lvcabral](https://github.com/lvcabral) in [#661](https://github.com/lvcabral/brs-engine/pull/661)
* Added `Number` prefix before `isNaN` and `parseInt` by [@lvcabral](https://github.com/lvcabral) in [#662](https://github.com/lvcabral/brs-engine/pull/662)
* Replaced usage of `window` by `globalThis` by [@lvcabral](https://github.com/lvcabral) in [#663](https://github.com/lvcabral/brs-engine/pull/663)
* Replaced `instanceof Array` by `Array.isArray()` by [@lvcabral](https://github.com/lvcabral) in [#664](https://github.com/lvcabral/brs-engine/pull/664)
* Improved `createPayloadFromFileMap` to support folder structure. by [@lvcabral](https://github.com/lvcabral) in [#665](https://github.com/lvcabral/brs-engine/pull/665)
* Optimized loading of Libraries and fixed Roku Browser app launch by [@lvcabral](https://github.com/lvcabral) in [#667](https://github.com/lvcabral/brs-engine/pull/667)
* Added missing `common.zip` to `brs-node` and fixed `brs-ecp.js` dependency issue by [@lvcabral](https://github.com/lvcabral) in [#668](https://github.com/lvcabral/brs-engine/pull/668)

[Full Changelog][v1.9.3]

<a name="v1.9.2"></a>

## [v1.9.2 - New method `createPayloadFromFileMap`](https://github.com/lvcabral/brs-engine/releases/tag/v1.9.2) - 10 October 2025

This release includes minor improvements and bug fixes for the BrightScript Simulation Engine.

### Release Changes

* Implemented new method `createPayloadFromFileMap` in `brs-node` library by [@lvcabral](https://github.com/lvcabral) in [#657](https://github.com/lvcabral/brs-engine/pull/657)
* Bump on-headers and compression by [@dependabot[bot]](https://github.com/dependabot[bot]) in [#655](https://github.com/lvcabral/brs-engine/pull/655)
* Several minor documentation improvements by [@lvcabral](https://github.com/lvcabral)

[Full Changelog][v1.9.2]

<a name="v1.9.1"></a>

## [v1.9.1 - Artifacts released as two NPM Packages](https://github.com/lvcabral/brs-engine/releases/tag/v1.9.1) - 09 October 2025

This release reorganizes the repository as a monorepo splitting the released artifacts into two separate NPM packages: `brs-engine` (for Web applications) and `brs-node` (for Node.js and CLI). This change aims to improve the development experience reducing the size of the imported packages, as the use cases and environments for each package are very different.

Also, with this release, the BrightScript language and components are now synchronized with Roku OS 15.0.

### Release Changes

* Changed to Monorepo with two packages: `brs-engine` (browser) and `brs-node` (node.js and CLI) by [@lvcabral](https://github.com/lvcabral) in [#654](https://github.com/lvcabral/brs-engine/pull/654)
* Return `0` when a function has typed return and no return statement is hit by [@lvcabral](https://github.com/lvcabral) in [#641](https://github.com/lvcabral/brs-engine/pull/641)
* Limited typed function returns zero solution to user functions only by [@lvcabral](https://github.com/lvcabral) in [#642](https://github.com/lvcabral/brs-engine/pull/642)
* Added new `d` flag to `parseJSON` function to support parsing to `double` by [@lvcabral](https://github.com/lvcabral) in [#643](https://github.com/lvcabral/brs-engine/pull/643)
* Fixed edge cases of `double` handing on `ParseJson` by [@lvcabral](https://github.com/lvcabral) in [#644](https://github.com/lvcabral/brs-engine/pull/644)
* Fixed `Lexer` parsing of `Double` literals by [@lvcabral](https://github.com/lvcabral) in [#645](https://github.com/lvcabral/brs-engine/pull/645)
* Implemented new methods `reserve` and `shrinkToFit` to `roArray` by [@lvcabral](https://github.com/lvcabral) in [#646](https://github.com/lvcabral/brs-engine/pull/646)
* Implemented `roDateTime.asMillisecondsLong()` and `roDeviceInfo.getUptimeMillisecondsAsLong()` by [@lvcabral](https://github.com/lvcabral) in [#647](https://github.com/lvcabral/brs-engine/pull/647)
* Implemented `roDeviceInfo.IsAutoAdjustRefreshRateEnabled` by [@lvcabral](https://github.com/lvcabral) in [#648](https://github.com/lvcabral/brs-engine/pull/648)
* Implemented `roUtils` component by [@lvcabral](https://github.com/lvcabral) in [#649](https://github.com/lvcabral/brs-engine/pull/649)
* Fixed `roUtils.deepCopy` to properly copy `boxed` objects by [@lvcabral](https://github.com/lvcabral) in [#650](https://github.com/lvcabral/brs-engine/pull/650)
* Bump pbkdf2 from 3.1.2 to 3.1.3 by @dependabot in [#630](https://github.com/lvcabral/brs-engine/pull/630)
* Bump sha.js from 2.4.11 to 2.4.12 by @dependabot in [#632](https://github.com/lvcabral/brs-engine/pull/632)

[Full Changelog][v1.9.1]

<a name="v1.8.9"></a>

## [v1.8.9 - Improvements on `Audio`, `Video` and `Fonts`](https://github.com/lvcabral/brs-engine/releases/tag/v1.8.9) - 10 June 2025

This release introduces a few missing methods in `roDeviceInfo` and a new method to `ifStringOps`, also several enhancements on Video and Audio handling. The default font was replaced by `DejaVuSansCondensed` that is used in Roku devices for `Draw2D` text rendering.

### Release Changes

* Implemented new `getGraphicsFeatures()` in `roDeviceInfo` by [@lvcabral](https://github.com/lvcabral) in [#589](https://github.com/lvcabral/brs-engine/pull/589)
* Use CORS proxy (if configured) by default by [@lvcabral](https://github.com/lvcabral) in [#594](https://github.com/lvcabral/brs-engine/pull/594)
* Added missing `roDeviceInfo` deprecated methods and updated behavior by [@lvcabral](https://github.com/lvcabral) in [#595](https://github.com/lvcabral/brs-engine/pull/595)
* Implemented `ifStringOps.Arg()` new method by [@lvcabral](https://github.com/lvcabral) in [#596](https://github.com/lvcabral/brs-engine/pull/596)
* Improved event handling for `roAudioPlayer` and `roVideoPlayer` by [@lvcabral](https://github.com/lvcabral) in [#597](https://github.com/lvcabral/brs-engine/pull/597)
* Upgraded `hls.js` and fixed video playback race conditions by [@lvcabral](https://github.com/lvcabral) in [#598](https://github.com/lvcabral/brs-engine/pull/598)
* Prevent duplicate `requestAnimationFrame()` call when `video` is playing by [@lvcabral](https://github.com/lvcabral) in [#599](https://github.com/lvcabral/brs-engine/pull/599)
* Improved `video` playback error handling by [@lvcabral](https://github.com/lvcabral) in [#602](https://github.com/lvcabral/brs-engine/pull/602)
* Replaced `Asap` font by `DejaVuSansCondensed` and improved font family handling by [@lvcabral](https://github.com/lvcabral) in [#605](https://github.com/lvcabral/brs-engine/pull/605)
* Removed redundant `platform` reference by [@lvcabral](https://github.com/lvcabral) in [#607](https://github.com/lvcabral/brs-engine/pull/607)
* Refactored `video` media tracks handling by [@lvcabral](https://github.com/lvcabral) in [#609](https://github.com/lvcabral/brs-engine/pull/609)
* Added support for preferred Audio locale by [@lvcabral](https://github.com/lvcabral) in [#610](https://github.com/lvcabral/brs-engine/pull/610)
* Made `preventDefault()` to also be called on `keyUp` event by [@lvcabral](https://github.com/lvcabral) in [#611](https://github.com/lvcabral/brs-engine/pull/611)
* Refactored API `display` module to receive `displayData` object by [@lvcabral](https://github.com/lvcabral) in [#612](https://github.com/lvcabral/brs-engine/pull/612)
* Added new API methods `getCaptionMode` and `setCaptionMode` by [@lvcabral](https://github.com/lvcabral) in [#613](https://github.com/lvcabral/brs-engine/pull/613)
* Added support for HLS.js event `MEDIA_ENDED` by [@lvcabral](https://github.com/lvcabral) in [#615](https://github.com/lvcabral/brs-engine/pull/615)
* Bump webpack-dev-server from 4.15.2 to 5.2.1 by @dependabot in [#614](https://github.com/lvcabral/brs-engine/pull/614)
* Improved handling of Sound Effect (WAV) files by [@lvcabral](https://github.com/lvcabral) in [#620](https://github.com/lvcabral/brs-engine/pull/620)
* Refactored `roChannelStore` to be reused in `SceneGraph` by [@lvcabral](https://github.com/lvcabral) in [#624](https://github.com/lvcabral/brs-engine/pull/624)

[Full Changelog][v1.8.9]

<a name="v1.8.8"></a>

## [v1.8.8 - Support `flags` on `ParseJSON()` and `FormatJSON()`](https://github.com/lvcabral/brs-engine/releases/tag/v1.8.8) - 11 May 2025

This release added the support for the `flags` parameter on the `ParseJSON()` to make the AA returned to be case insensitive, and `FormatJSON` flag now allows you to disable the escape of non-ASCII characters. There are also, fixes for `Left()` and `Mid()` that were not handling negative values properly and `Substitute()` that now supports the `^0` notation. The `chr()` and `asc()` functions were also updated to support extended Unicode. A new custom manifest flag was added: `cors_proxy` as the proxy is now only enabled it is added to the app's manifest. The `roAudioPlayer` and `roVideoPlayer` components were updated to support the CORS proxy.

### Release Changes

* Refactored usage of `canvas` and `fonts` to improve performance by [@lvcabral](https://github.com/lvcabral) in [#547](https://github.com/lvcabral/brs-engine/pull/547)
* Updated `lastKeyTime` and `currKeyTime` to consistently use `Date.now()` by [@lvcabral](https://github.com/lvcabral) in [#548](https://github.com/lvcabral/brs-engine/pull/548)
* Added support for literal keys on the Browser by [@lvcabral](https://github.com/lvcabral) in [#557](https://github.com/lvcabral/brs-engine/pull/557)
* Increased the `prettier` max line length from 100 to 120 by [@lvcabral](https://github.com/lvcabral) in [#559](https://github.com/lvcabral/brs-engine/pull/559)
* Bump http-proxy-middleware from 2.0.7 to 2.0.9 by @dependabot in [#561](https://github.com/lvcabral/brs-engine/pull/561)
* Optimized images by [@lvcabral](https://github.com/lvcabral) in [#566](https://github.com/lvcabral/brs-engine/pull/566)
* Added new custom `manifest` flag: `cors_proxy` by [@lvcabral](https://github.com/lvcabral) in [#571](https://github.com/lvcabral/brs-engine/pull/571)
* Moved `useCORSProxy` and `singleKeyEvents` from `Interpreter` to `BrsDevice` by [@lvcabral](https://github.com/lvcabral) in [#572](https://github.com/lvcabral/brs-engine/pull/572)
* Added support for CORS proxy to `roAudioPlayer` and `roVideoPlayer` by [@lvcabral](https://github.com/lvcabral) in [#573](https://github.com/lvcabral/brs-engine/pull/573)
* Prevent use CORS proxy on local URLs by [@lvcabral](https://github.com/lvcabral) in [#574](https://github.com/lvcabral/brs-engine/pull/574)
* Added support for default sound effect volume level by [@lvcabral](https://github.com/lvcabral) in [#579](https://github.com/lvcabral/brs-engine/pull/579)
* Implemented `flags` parameter on `ParseJSON()` global function by [@lvcabral](https://github.com/lvcabral) in [#585](https://github.com/lvcabral/brs-engine/pull/585)
* Implemented `FormatJSON` flag to disable escape of non-ASCII characters by [@lvcabral](https://github.com/lvcabral) in [#586](https://github.com/lvcabral/brs-engine/pull/586)
* Fixed `Left()` `Mid()` and `Substitute()` global functions by [@lvcabral](https://github.com/lvcabral) in [#587](https://github.com/lvcabral/brs-engine/pull/587)
* Support extended Unicode in `chr()` and `asc()` by [@lvcabral](https://github.com/lvcabral) in [#588](https://github.com/lvcabral/brs-engine/pull/588)

[Full Changelog][v1.8.8]

<a name="v1.8.7"></a>

## [v1.8.7 - New `InStr()` 2 params signature](https://github.com/lvcabral/brs-engine/releases/tag/v1.8.7) - 12 April 2025

This release brings a few discoveries from the discussions in the [Roku Development Community slack](https://join.slack.com/t/rokudevelopers/shared_invite/zt-4vw7rg6v-NH46oY7hTktpRIBM_zGvwA), including the undocumented signature for `InStr()` function with only 2 parameters, the  `roTimespan.totalMicroseconds()` method and the `Type()` function returning "legacy" types (unless you pass version 3 parameter). Some important fixes to highlight are the support for boxed values as array indexes and having `roBoolean` to be properly comparable.

### Release Changes

* Implemented the signature with 2 parameters on `InStr()` by [@lvcabral](https://github.com/lvcabral) in [#534](https://github.com/lvcabral/brs-engine/pull/534)
* Added legacy types support for `Type()` function by [@lvcabral](https://github.com/lvcabral) in [#536](https://github.com/lvcabral/brs-engine/pull/536)
* Implemented `roTimespan.totalMicroseconds()` and changed `roTimespan` to use `performance.now()` by [@lvcabral](https://github.com/lvcabral) in [#501](https://github.com/lvcabral/brs-engine/pull/501)
* Implemented `roHttpAgent` component by [@lvcabral](https://github.com/lvcabral) in [#499](https://github.com/lvcabral/brs-engine/pull/499)
* Added support to use a CORS proxy with `roURLTransfer` and `Network` modules by [@lvcabral](https://github.com/lvcabral) in [#514](https://github.com/lvcabral/brs-engine/pull/514)
* Fixed `MacOS` keyboard mapping for `Info` (asterisk) remote button by [@lvcabral](https://github.com/lvcabral) in [#511](https://github.com/lvcabral/brs-engine/pull/511)
* Fixed `m` context when the indexed function was accessed inside an AA by [@lvcabral](https://github.com/lvcabral) in [#509](https://github.com/lvcabral/brs-engine/pull/509)
* Added mocked libraries `RED` and `Google IMA3` by [@lvcabral](https://github.com/lvcabral) in [#508](https://github.com/lvcabral/brs-engine/pull/508)
* Implemented support for using `methods` with literal `integer` values by [@lvcabral](https://github.com/lvcabral) in [#507](https://github.com/lvcabral/brs-engine/pull/507)
* Properly handle `NaN` in number types, print and conversion by [@lvcabral](https://github.com/lvcabral) in [#502](https://github.com/lvcabral/brs-engine/pull/502)
* Updated web demo app to upscale the display when in fullscreen mode by [@lvcabral](https://github.com/lvcabral) in [#513](https://github.com/lvcabral/brs-engine/pull/513)
* Improved the scaling quality of the web demo app by [@lvcabral](https://github.com/lvcabral) in [#525](https://github.com/lvcabral/brs-engine/pull/525)
* Prevent crash when no entry point is defined by [@lvcabral](https://github.com/lvcabral) in [#516](https://github.com/lvcabral/brs-engine/pull/516)
* Added `backslash` key as alternative to the `replay` button on the sample app by [@lvcabral](https://github.com/lvcabral) in [#520](https://github.com/lvcabral/brs-engine/pull/520)
* Fixed boxed `boolean` values not being comparable by [@lvcabral](https://github.com/lvcabral) in [#528](https://github.com/lvcabral/brs-engine/pull/528)
* Fixed handling of boxed array indexes by [@lvcabral](https://github.com/lvcabral) in [#530](https://github.com/lvcabral/brs-engine/pull/530)

[Full Changelog][v1.8.7]

<a name="v1.8.6"></a>

## [v1.8.6 - Fixed `m` context with `IndexedGet`](https://github.com/lvcabral/brs-engine/releases/tag/v1.8.6) - 18 March 2025

Continuing the refactorings v1.8.x to improve the architecture and support `SceneGraph` development, the internal device assets (fonts, sounds, images and libraries)
are now stored in the `common.zip` file that holds the `common:/` volume in the file system. Created `npm` packages to several dependencies that were forked of archived
or modified components. And mainly this brings a fix for the `m` context when using indexed get to retrieve functions.

### Release Changes

* Created `BrsDevice` static object with `deviceInfo`, `registry` and `sharedArray` by [@lvcabral](https://github.com/lvcabral) in [#469](https://github.com/lvcabral/brs-engine/pull/469)
* Moved `FileSystem` to `BrsDevice` by [@lvcabral](https://github.com/lvcabral) in [#470](https://github.com/lvcabral/brs-engine/pull/470)
* Moved `stdout` and `stderr` from `Interpreter` to `BrsDevice` by [@lvcabral](https://github.com/lvcabral) in [#472](https://github.com/lvcabral/brs-engine/pull/472)
* Fixed the `Val()` global function to always return `Float` if no `radix` parameter is passed by [@lvcabral](https://github.com/lvcabral) in [#474](https://github.com/lvcabral/brs-engine/pull/474)
* Moved `fonts`, `audio` and `libraries` to `common:` volume as a `zip` file by [@lvcabral](https://github.com/lvcabral) in [#475](https://github.com/lvcabral/brs-engine/pull/475)
* Prevent transforming `DeviceInfo` into a `Map` by [@lvcabral](https://github.com/lvcabral) in [#478](https://github.com/lvcabral/brs-engine/pull/478)
* Moved `Rect` and `Circle` type definitions to `ifDraw2D` by [@lvcabral](https://github.com/lvcabral) in [#481](https://github.com/lvcabral/brs-engine/pull/481)
* Updating forked dependencies by [@lvcabral](https://github.com/lvcabral) in [#495](https://github.com/lvcabral/brs-engine/pull/495)
* Invert the remote control mapping for `PageUp` and `PageDown` keys by [@lvcabral](https://github.com/lvcabral) in [#497](https://github.com/lvcabral/brs-engine/pull/497)
* Fixed `m` context when getting function with `index` [#494](https://github.com/lvcabral/brs-engine/issues/494) by [@lvcabral](https://github.com/lvcabral) in [#498](https://github.com/lvcabral/brs-engine/pull/498)

[Full Changelog][v1.8.6]

<a name="v1.8.5"></a>

## [v1.8.5 - Implemented `roTextureManager`](https://github.com/lvcabral/brs-engine/releases/tag/v1.8.5) - 31 January 2025

This release brings more refactoring, with the Event components being moved to a separate folder, and the implementation of `roTextureManager`. As the development of the next major version already started, with support for SceneGraph, some changes were done in `ifDraw2D` to allow the reuse of its graphical capabilities on the Nodes rendering. 
I believe this is a stable state of the `core` library, and any Roku app developed using the Draw 2D API should be able to perform well in multiple platforms.

### Release Changes

* Implemented `ifHttpAgent` as a separate interface module by [@lvcabral](https://github.com/lvcabral) in [#464](https://github.com/lvcabral/brs-engine/pull/464)
* Implemented `roTextureRequest` and `roTextureManager` by [@lvcabral](https://github.com/lvcabral) in [#465](https://github.com/lvcabral/brs-engine/pull/465)
* Implemented mocked `roDataGramSocket` and extracted common interfaces into `ifSocket` by [@lvcabral](https://github.com/lvcabral) in [#466](https://github.com/lvcabral/brs-engine/pull/466)
* Moved events to a separate folder
* Adjusted `rgba` parameter in `ifDraw2D` to be `number`

[Full Changelog][v1.8.5]

<a name="v1.8.4"></a>

## [v1.8.4 - Improved `roURLTransfer`](https://github.com/lvcabral/brs-engine/releases/tag/v1.8.4) - 26 January 2025

### Release Changes

* Implemented `roSocketAddress` by [@lvcabral](https://github.com/lvcabral) in [#460](https://github.com/lvcabral/brs-engine/pull/460)
* Improved component `roURLTransfer` by [@lvcabral](https://github.com/lvcabral) in [#461](https://github.com/lvcabral/brs-engine/pull/461)
* Implemented mocked `roStreamSocket` component by [@lvcabral](https://github.com/lvcabral) in [#462](https://github.com/lvcabral/brs-engine/pull/462)
* Implemented `roHdmiStatus` and `roHdmiStatusEvent` components by [@lvcabral](https://github.com/lvcabral) in [#463](https://github.com/lvcabral/brs-engine/pull/463)

[Full Changelog][v1.8.4]

<a name="v1.8.3"></a>

## [v1.8.3 - Fixed `roVideoPlayer` and `End` Statement](https://github.com/lvcabral/brs-engine/releases/tag/v1.8.3) - 18 January 2025

### Release Changes

* Fixed `roVideoPlayer` method `getAudioTracks`
* Added `serialNumber` to device info object and to reponse of `GetModelDetails()`
* Fixed behavior of `End` statement to terminate the app
* Improved CLI app list handling
* Improved and documented MicroDebugger functions
* Moved home sound effect setup
* Improvements on WAV handling
* Reduced complexity and simplifed some references
* Upgraded dependencies

[Full Changelog][v1.8.3]

<a name="v1.8.2"></a>

## [v1.8.2 - Fixed `ifToStr()` for `roInvalid`](https://github.com/lvcabral/brs-engine/releases/tag/v1.8.2) - 17 January 2025

### Release Changes

* Fixed `IfToStr` to properly handle `roInvalid` component by [@lvcabral](https://github.com/lvcabral) in [#451](https://github.com/lvcabral/brs-engine/pull/451)
* Simplified `AppPayload` type checking by [@lvcabral](https://github.com/lvcabral) in [#452](https://github.com/lvcabral/brs-engine/pull/452)

[Full Changelog][v1.8.2]

<a name="v1.8.1"></a>

## [v1.8.1 - New interface modules and fixes on number parsing](https://github.com/lvcabral/brs-engine/releases/tag/v1.8.1) - 10 January 2025

This release bring several fixes on numeric types parsing to hexadecimal and using the `toStr()` and `String.format()` methods. This also brings the extraction of reused interfaces into separate modules, reducing the replication of code and also improving the maintainability of the `core` library.

### Release Changes

* Fixed `Int32` constructor handling of overflow to match Roku by [@lvcabral](https://github.com/lvcabral) in [#435](https://github.com/lvcabral/brs-engine/pull/435)
* Upgraded dependency `restana` to v5.0.0 by [@lvcabral](https://github.com/lvcabral) in [#436](https://github.com/lvcabral/brs-engine/pull/436)
* Added new `roDateTime` methods: `asSecondsLong` and `fromSecondsLong` by [@lvcabral](https://github.com/lvcabral) in [#437](https://github.com/lvcabral/brs-engine/pull/437)
* Fixed `Int32` and `Int64` hex parsing and formatting by [@lvcabral](https://github.com/lvcabral) in [#438](https://github.com/lvcabral/brs-engine/pull/438)
* Simplified `Int32` constructor code by [@lvcabral](https://github.com/lvcabral) in [#439](https://github.com/lvcabral/brs-engine/pull/439)
* Updated some documentation pages by [@lvcabral](https://github.com/lvcabral) in [#440](https://github.com/lvcabral/brs-engine/pull/440)
* Fixed runtime error stack trace on `Callables` by [@lvcabral](https://github.com/lvcabral) in [#442](https://github.com/lvcabral/brs-engine/pull/442)
* Created `ifToStr()` and refactored components to use it and improved `sprintf` formatting by [@lvcabral](https://github.com/lvcabral) in [#443](https://github.com/lvcabral/brs-engine/pull/443)
* Change file names to the standard by [@lvcabral](https://github.com/lvcabral) in [#444](https://github.com/lvcabral/brs-engine/pull/444)
* Made `ifToStr` to handle components that do not support `format` by [@lvcabral](https://github.com/lvcabral) in [#445](https://github.com/lvcabral/brs-engine/pull/445)
* Created `IfSetMessagePort`  and  `IfGetMessagePort` interfaces by [@lvcabral](https://github.com/lvcabral) in [#446](https://github.com/lvcabral/brs-engine/pull/446)
* Implemented `IfEnum` as an interface module and refactored components by [@lvcabral](https://github.com/lvcabral) in [#447](https://github.com/lvcabral/brs-engine/pull/447)
* Implemented `IfDraw2D` interface to simplify and reuse code by [@lvcabral](https://github.com/lvcabral) in [#448](https://github.com/lvcabral/brs-engine/pull/448)
* Improved `IfToStr` type checking by [@lvcabral](https://github.com/lvcabral) in [#449](https://github.com/lvcabral/brs-engine/pull/449)
* Implemented `IfArray` and `IfList` interface modules by [@lvcabral](https://github.com/lvcabral) in [#450](https://github.com/lvcabral/brs-engine/pull/450)

[Full Changelog][v1.8.1]

<a name="v1.8.0"></a>

## [v1.8.0 - Multiple Improvements](https://github.com/lvcabral/brs-engine/releases/tag/v1.8.0) - 03 January 2025

This release is full of refactorings and improvements on the engine internals, the folder structure was also changed with the `app` folder renamed to `browser` and the `src/worker` folder renamed to `src/core`. The File System now supports the external USB volume (`ext1:`) that can be mounted from an additional `zip` file (or folder in CLI). Several other changes and improvements were done in the registry and apps management. The `roMessagePort` component was simplified and improved, and new events are now supported, in particular: `roInput` (via ECP and API) and `roChannelStore` using the `fakeServer(true)` option. The BrightScript language and components are now synchronized with Roku OS 14.
Check specific PRs in the log below for more information.

### Release Changes

* Implemented `roDeviceInfo.getExternalIP()` by [@lvcabral](https://github.com/lvcabral) in [#397](https://github.com/lvcabral/brs-engine/pull/397)
* Prevent crash when using invalid URL() by [@lvcabral](https://github.com/lvcabral) in [398](#https://github.com/lvcabral/brs-engine/pull/398)
* Improved check for `SharedArrayBuffer` support by [@lvcabral](https://github.com/lvcabral) in [#399](https://github.com/lvcabral/brs-engine/pull/399)
* Finish optional chaining operator implementation by [@lvcabral](https://github.com/lvcabral) in [#400](https://github.com/lvcabral/brs-engine/pull/400)
* Added support for `RokuBrowser` library and `roNDK` component. by [@lvcabral](https://github.com/lvcabral) in [#402](https://github.com/lvcabral/brs-engine/pull/402)
* Implemented support to mount External storage as volume `ext1:` by [@lvcabral](https://github.com/lvcabral) in [#403](https://github.com/lvcabral/brs-engine/pull/403)
* Several Registry improvements by [@lvcabral](https://github.com/lvcabral) in [#407](https://github.com/lvcabral/brs-engine/pull/407)
* Changed the `For Each` behavior to match Roku, using `ifEnum` iteration index by [@lvcabral](https://github.com/lvcabral) in [#410](https://github.com/lvcabral/brs-engine/pull/410)
* Several App handling/management improvements by [@lvcabral](https://github.com/lvcabral) in [#413](https://github.com/lvcabral/brs-engine/pull/413)
* Added `Platform` info to the result of `roDeviceInfo.getModelDetails()` by [@lvcabral](https://github.com/lvcabral) in [#414](https://github.com/lvcabral/brs-engine/pull/414)
* Allowed `m` object to be re-assigned in Function scope by [@lvcabral](https://github.com/lvcabral) in [#417](https://github.com/lvcabral/brs-engine/pull/417)
* Implemented `global` static object by [@lvcabral](https://github.com/lvcabral) in [#418](https://github.com/lvcabral/brs-engine/pull/418)
* Implemented BrightScript features up to Roku OS 14.0 by [@lvcabral](https://github.com/lvcabral) in [#420](https://github.com/lvcabral/brs-engine/pull/420)
* Add new supported control buttons and ECP command by [@lvcabral](https://github.com/lvcabral) in [#421](https://github.com/lvcabral/brs-engine/pull/421)
* Remove debug local ips by [@lvcabral](https://github.com/lvcabral) in [#422](https://github.com/lvcabral/brs-engine/pull/422)
* Fixed `CreateObject` behavior to match Roku by [@lvcabral](https://github.com/lvcabral) in [#423](https://github.com/lvcabral/brs-engine/pull/423)
* Raised Runtime Error with Interpreter `addError` method by [@lvcabral](https://github.com/lvcabral) in [#424](https://github.com/lvcabral/brs-engine/pull/424)
* Implemented `roSystemLog` and refactored `roMessagePort` by [@lvcabral](https://github.com/lvcabral) in [#426](https://github.com/lvcabral/brs-engine/pull/426)
* Fixed `dev` app saving data on app list by [@lvcabral](https://github.com/lvcabral) in [#427](https://github.com/lvcabral/brs-engine/pull/427)
* Implemented function `toAssociativeArray()` to simplify creation of AA in TypeScript code by [@lvcabral](https://github.com/lvcabral) in [#428](https://github.com/lvcabral/brs-engine/pull/428)
* Implemented `roDeviceInfoEvent` by [@lvcabral](https://github.com/lvcabral) in [#429](https://github.com/lvcabral/brs-engine/pull/429)
* Implement `roCECStatus` component by [@lvcabral](https://github.com/lvcabral) in [#430](https://github.com/lvcabral/brs-engine/pull/430)
* Add fake server support to `roChannelStore` by [@lvcabral](https://github.com/lvcabral) in [#431](https://github.com/lvcabral/brs-engine/pull/431)
* Fix File System when using `root` or `ext` CLI flags and running on Linux by [@lvcabral](https://github.com/lvcabral) in [#432](https://github.com/lvcabral/brs-engine/pull/432)
* Restricted `FlexObject` content types by [@lvcabral](https://github.com/lvcabral) in [#433](https://github.com/lvcabral/brs-engine/pull/433)
* Implemented support for `roInputEvent` generated via ECP or API by [@lvcabral](https://github.com/lvcabral) in [#434](https://github.com/lvcabral/brs-engine/pull/434)
* build(deps): bump elliptic from 6.5.7 to 6.6.0 by @dependabot in [#394](https://github.com/lvcabral/brs-engine/pull/394)

[Full Changelog][v1.8.0]

<a name="v1.7.3"></a>

## [v1.7.3 - Fixed Optional Operators and For Each](https://github.com/lvcabral/brs-engine/releases/tag/v1.7.3) - 05 December 2024

### Release Changes

* Changed the `For Each` behavior to match Roku, using `ifEnum` iteration index by [@lvcabral](https://github.com/lvcabral) in [#410](https://github.com/lvcabral/brs-engine/pull/410)
* Finished optional chaining operator implementation by [@lvcabral](https://github.com/lvcabral) in [#400](https://github.com/lvcabral/brs-engine/pull/400)
* Implemented `roDeviceInfo.getExternalIP()` by [@lvcabral](https://github.com/lvcabral) in [#397](https://github.com/lvcabral/brs-engine/pull/397)
* Prevent crash when using invalid URL() by [@lvcabral](https://github.com/lvcabral) in [#398](https://github.com/lvcabral/brs-engine/pull/398)
* Improved check for `SharedArrayBuffer` suport by [@lvcabral](https://github.com/lvcabral) in [#399](https://github.com/lvcabral/brs-engine/pull/399)
* build(deps): bump elliptic from 6.5.7 to 6.6.0 by @dependabot in https://github.com/lvcabral/brs-engine/pull/394

[Full Changelog][v1.7.3]

<a name="v1.7.0"></a>

## [v1.7.0 - FormatJSON() fixes and MicroDebugger stats](https://github.com/lvcabral/brs-engine/releases/tag/v1.7.0) - 12 October 2024

### Release Changes

* Implemented new Type and Enum definitions by [@lvcabral](https://github.com/lvcabral) in [#374](https://github.com/lvcabral/brs-engine/pull/374)
* Added reference tracking and object disposal event by [@lvcabral](https://github.com/lvcabral) in [#373](https://github.com/lvcabral/brs-engine/pull/373)
* Implemented `ObjFun()` global function and support for `variadic` arguments on `Callable` by [@lvcabral](https://github.com/lvcabral) in [#375](https://github.com/lvcabral/brs-engine/pull/375)
* Added support for `formatJson()` undocumented flags 256 and 512 by [@lvcabral](https://github.com/lvcabral) in [#377](https://github.com/lvcabral/brs-engine/pull/377)
* Implemented Micro Debugger commands:  `classes`,  `bscs` and `stats` by [@lvcabral](https://github.com/lvcabral) in [#385](https://github.com/lvcabral/brs-engine/pull/385)
* Static analysis fixes by [@lvcabral](https://github.com/lvcabral) in [#389](https://github.com/lvcabral/brs-engine/pull/389)
* Fixed Critical bug with `formatJson` #383 by [@lvcabral](https://github.com/lvcabral) in [#390](https://github.com/lvcabral/brs-engine/pull/390)
* Fixed #384 - Allow `try` and `catch` as object properties. by [@lvcabral](https://github.com/lvcabral) in [#391](https://github.com/lvcabral/brs-engine/pull/391)
* build(deps-dev): bump webpack from 5.91.0 to 5.94.0 by @dependabot in [#381](https://github.com/lvcabral/brs-engine/pull/381)
* build(deps): bump ws from 8.17.0 to 8.17.1 by @dependabot in [#379](https://github.com/lvcabral/brs-engine/pull/379)
* build(deps): bump braces from 3.0.2 to 3.0.3 by @dependabot in [#378](https://github.com/lvcabral/brs-engine/pull/378)
* build(deps): bump elliptic from 6.5.5 to 6.5.7 by @dependabot in [#386](https://github.com/lvcabral/brs-engine/pull/386)
* build(deps): bump express from 4.19.2 to 4.21.1 by @dependabot in [#387](https://github.com/lvcabral/brs-engine/pull/387)
* Upgraded dependencies by [@lvcabral](https://github.com/lvcabral) in [#388](https://github.com/lvcabral/brs-engine/pull/388)

[Full Changelog][v1.7.0]

<a name="v1.6.1"></a>

## [v1.6.1 - Numeric Labels](https://github.com/lvcabral/brs-engine/releases/tag/v1.6.1) - 11 May 2024

### Release Changes

* Added support for numeric labels by [@lvcabral](https://github.com/lvcabral) in [#372](https://github.com/lvcabral/brs-engine/pull/372)
* Fixed `goto` with `try/catch` by [@lvcabral](https://github.com/lvcabral) in [#371](https://github.com/lvcabral/brs-engine/pull/371)

[Full Changelog][v1.6.1]

<a name="v1.6.0"></a>

## [v1.6.0 - Goto Label Statement](https://github.com/lvcabral/brs-engine/releases/tag/v1.6.0) - 05 May 2024

### Release Changes

* Implemented `goto` statement by [@lvcabral](https://github.com/lvcabral) in [#367](https://github.com/lvcabral/brs-engine/pull/367)
* Fixed sound `select` not being triggered [@lvcabral](https://github.com/lvcabral) in [#366](https://github.com/lvcabral/brs-engine/pull/366)

[Full Changelog][v1.6.0]

<a name="v1.5.7"></a>

## [v1.5.7 - Fixed Critical Issue](https://github.com/lvcabral/brs-engine/releases/tag/v1.5.7) - 01 May 2024

### Release Changes

* Fixed issue that was not restoring the environment in Try mode when `stopOnCrash` was enabled by [@lvcabral](https://github.com/lvcabral) in [#361](https://github.com/lvcabral/brs-engine/pull/361)
* Reduced complexity of Try/Catch visit functions by [@lvcabral](https://github.com/lvcabral) in [#362](https://github.com/lvcabral/brs-engine/pull/362)

[Full Changelog][v1.5.7]

<a name="v1.5.6"></a>

## [v1.5.6 - Bump to Firmware 11.5 and Fixes](https://github.com/lvcabral/brs-engine/releases/tag/v1.5.6) - 01 May 2024

### Release Changes

* Fixed loading fonts on CLI when running `.brs` files by [@lvcabral](https://github.com/lvcabral) in [#351](https://github.com/lvcabral/brs-engine/pull/351)
* Added unit tests for `continue for/while` by [@lvcabral](https://github.com/lvcabral) in [#352](https://github.com/lvcabral/brs-engine/pull/352)
* Improvements to stack trace and `try...catch` by [@lvcabral](https://github.com/lvcabral) in [#353](https://github.com/lvcabral/brs-engine/pull/353)
* Updated engine-api.md by [@lvcabral](https://github.com/lvcabral) in [#354](https://github.com/lvcabral/brs-engine/pull/354)
* Simplification of the Error objects and removing abbreviations from properties by [@lvcabral](https://github.com/lvcabral) in [#355](https://github.com/lvcabral/brs-engine/pull/355)
* Renamed type `ErrorCode` to `ErrorDetail` by [@lvcabral](https://github.com/lvcabral) in [#356](https://github.com/lvcabral/brs-engine/pull/356)
* Updated Firmware Version to 11.5 as `continue for/while` is now supported by [@lvcabral](https://github.com/lvcabral) in [#357](https://github.com/lvcabral/brs-engine/pull/357)
* Removed usage of global objects to encrypt/decrypt packages by [@lvcabral](https://github.com/lvcabral) in [#358](https://github.com/lvcabral/brs-engine/pull/358)
* Fixed multiple Static Analysis issues raised by Sonar Cloud by [@lvcabral](https://github.com/lvcabral) in [#359](https://github.com/lvcabral/brs-engine/pull/359)
* Increased the timeout for CLI run zip file test to 10s by [@lvcabral](https://github.com/lvcabral) in [#360](https://github.com/lvcabral/brs-engine/pull/360)

[Full Changelog][v1.5.6]

<a name="v1.5.5"></a>

## [v1.5.5 - Several fixes and Unit Tests enabled](https://github.com/lvcabral/brs-engine/releases/tag/v1.5.5) - 26 Apr 2024

### Release Changes

* Implemented `pos()` and `tab()` for `print` statement by [@lvcabral](https://github.com/lvcabral) in [#339](https://github.com/lvcabral/brs-engine/pull/339)
* Fixed Callable signature check by [@lvcabral](https://github.com/lvcabral) in [#340](https://github.com/lvcabral/brs-engine/pull/340)
* Fixed conversion functions to Integer: `Int()`, `CInt()` and `Fix()` by [@lvcabral](https://github.com/lvcabral) in [#342](https://github.com/lvcabral/brs-engine/pull/342)
* Refactored `worker` and `cli` libraries to support `run` function by [@lvcabral](https://github.com/lvcabral) in [#344](https://github.com/lvcabral/brs-engine/pull/344)
* Updated CLI app to load the engine as an external library by [@lvcabral](https://github.com/lvcabral) in [#350](https://github.com/lvcabral/brs-engine/pull/350)
* Fixed CLI font loading by [@lvcabral](https://github.com/lvcabral) in [#345](https://github.com/lvcabral/brs-engine/pull/345)
* Fixed Unit Tests and several issues by [@lvcabral](https://github.com/lvcabral) in [#348](https://github.com/lvcabral/brs-engine/pull/348)
* Fixed Video seek causing a stack overflow crash by [@lvcabral](https://github.com/lvcabral) in [#349](https://github.com/lvcabral/brs-engine/pull/349)

[Full Changelog][v1.5.5]

<a name="v1.5.4"></a>

## [v1.5.4 - Continue For/While statements](https://github.com/lvcabral/brs-engine/releases/tag/v1.5.4) - 14 Apr 2024

### Release Changes

* Implemented support for multi-dimensional indexes of `roArray` and `roList` by [@lvcabral](https://github.com/lvcabral) in [#331](https://github.com/lvcabral/brs-engine/pull/331)
* Implemented `Continue For` and `Continue While` statements by [@lvcabral](https://github.com/lvcabral) in [#332](https://github.com/lvcabral/brs-engine/pull/332)
* Fixed CLI: REPL was not showing any error messages.

[Full Changelog][v1.5.4]

<a name="v1.5.3"></a>

## [v1.5.3 - Metadata components and Coercion](https://github.com/lvcabral/brs-engine/releases/tag/v1.5.3) - 12 Apr 2024

### Release Changes

* Implemented `roImageMetadata` component by [@lvcabral](https://github.com/lvcabral) in [#325](https://github.com/lvcabral/brs-engine/pull/325)
* Implemented `roAudioMetadata` component by [@lvcabral](https://github.com/lvcabral) in [#326](https://github.com/lvcabral/brs-engine/pull/326)
* Fixed Boxing for Callable parameters and implemented Coercion properly by [@lvcabral](https://github.com/lvcabral) in [#327](https://github.com/lvcabral/brs-engine/pull/327)
* Fixed #323 MicroDebugger is stopping on handled exceptions (try..catch) by [@lvcabral](https://github.com/lvcabral) in [#324](https://github.com/lvcabral/brs-engine/pull/324)
* Upgraded dependencies

[Full Changelog][v1.5.3]

<a name="v1.5.2"></a>

## [v1.5.2 - Try..Catch and Throw](https://github.com/lvcabral/brs-engine/releases/tag/v1.5.2) - 09 Apr 2024

### Release Changes

* Implemented `try...catch` and `throw` by [@lvcabral](https://github.com/lvcabral) in [#318](https://github.com/lvcabral/brs-engine/pull/318)
* Implemented support for `rethrown` and custom fields on `throw` statement by [@lvcabral](https://github.com/lvcabral) in [#319](https://github.com/lvcabral/brs-engine/pull/319)
* Implemented `ifArraySizeInfo` in `roArray` by [@lvcabral](https://github.com/lvcabral) in [#316](https://github.com/lvcabral/brs-engine/pull/316)
* Improved Lexer performance by [@lvcabral](https://github.com/lvcabral) in [317](https://github.com/lvcabral/brs-engine/pull/317)

[Full Changelog][v1.5.2]

<a name="v1.5.1"></a>

## [v1.5.1 - New: box(), roFunction and roDeviceCrypto](https://github.com/lvcabral/brs-engine/releases/tag/v1.5.1) - 03 Apr 2024

### Release Changes
* Removed `isEmpty` from `roPath` to match Roku behavior by [@lvcabral](https://github.com/lvcabral) in [#306](https://github.com/lvcabral/brs-engine/pull/306)
* Allow to use AND/OR between Boolean and Numbers by [@lvcabral](https://github.com/lvcabral) in [#307](https://github.com/lvcabral/brs-engine/pull/307)
* Improved `roEVPCipher` error handling by [@lvcabral](https://github.com/lvcabral) in [#308](https://github.com/lvcabral/brs-engine/pull/308)
* Implemented `roDeviceCrypto` component by [@lvcabral](https://github.com/lvcabral) in [#309](https://github.com/lvcabral/brs-engine/pull/309)
* Implemented `roFunction` component and `Box()` runtime function by [@lvcabral](https://github.com/lvcabral) in [#310](https://github.com/lvcabral/brs-engine/pull/310)
* Improved Iterable objects to behave as Roku devices by [@lvcabral](https://github.com/lvcabral) in [#311](https://github.com/lvcabral/brs-engine/pull/311)
* Fixed Boxing on Numbers and Booleans by [@lvcabral](https://github.com/lvcabral) in [#313](https://github.com/lvcabral/brs-engine/pull/313)
* Fixed issues with `roByteArray` by [@lvcabral](https://github.com/lvcabral) in [#314](https://github.com/lvcabral/brs-engine/pull/314)
* Improved print variables by [@lvcabral](https://github.com/lvcabral) in [#315](https://github.com/lvcabral/brs-engine/pull/315)
* Implemented `slice()` method in `roArray` under `ifArraySlice`

[Full Changelog][v1.5.1]

<a name="v1.5.0"></a>

## [v1.5.0 - Encrypt/Decrypt components](https://github.com/lvcabral/brs-engine/releases/tag/v1.5.0) - 28 Mar 2024

### Release Changes

* Added: `roEVPDigest` component by [@lvcabral](https://github.com/lvcabral) in [#301](https://github.com/lvcabral/brs-engine/pull/301)
* Added: `roEVPCipher` component by [@lvcabral](https://github.com/lvcabral) in [#303](https://github.com/lvcabral/brs-engine/pull/303)
* Added: `roHMAC` component by [@lvcabral](https://github.com/lvcabral) in [#305](https://github.com/lvcabral/brs-engine/pull/305)
* Changed: Improvements to `roPath` by [@lvcabral](https://github.com/lvcabral) in [#296](https://github.com/lvcabral/brs-engine/pull/296)
* Changed: `roUrlEvent` and `roUniversalControlEvent` to be comparable by [@lvcabral](https://github.com/lvcabral) in [#299](https://github.com/lvcabral/brs-engine/pull/299)
* Changed: Updated Limitations document by [@lvcabral](https://github.com/lvcabral) in [#302](https://github.com/lvcabral/brs-engine/pull/302)
* Changed: Only raise HTTP Errors in development mode and other exception handling improvements [@lvcabral](https://github.com/lvcabral) in [#300](https://github.com/lvcabral/brs-engine/pull/300)
* Fixed: `ifString.tokenize()` behavior to match Roku by [@lvcabral](https://github.com/lvcabral) in [#295](https://github.com/lvcabral/brs-engine/pull/295)
* Fixed: `String` comparison and concatenation by [@lvcabral](https://github.com/lvcabral) in [#298](https://github.com/lvcabral/brs-engine/pull/298)
* build(deps): bump express from 4.18.3 to 4.19.2 by **@dependabot** in [#297](https://github.com/lvcabral/brs-engine/pull/297)

[Full Changelog][v1.5.0]

<a name="v1.4.1"></a>

## [v1.4.1 - CLI: Removed Flicker on ASCII Mode](https://github.com/lvcabral/brs-engine/releases/tag/v1.4.1) - 22 Mar 2024

### Release Changes

* Updated: Flicker on CLI ASCII mode was removed by [@lvcabral](https://github.com/lvcabral) in [#294](https://github.com/lvcabral/brs-engine/pull/294)
* Updated: IIS config file was added for the sample web app by [@lvcabral](https://github.com/lvcabral) in [#294](https://github.com/lvcabral/brs-engine/pull/294)
* Fixed: Invalid BRS files are now handled correctly by [@lvcabral](https://github.com/lvcabral) in [#294](https://github.com/lvcabral/brs-engine/pull/294)
* build(deps): bump webpack-dev-middleware from 5.3.3 to 5.3.4 by **@dependabot** in [#293](https://github.com/lvcabral/brs-engine/pull/293)

[Full Changelog][v1.4.1]

<a name="v1.4.0"></a>

## [v1.4.0 - CLI: Canvas and HTTP support](https://github.com/lvcabral/brs-engine/releases/tag/v1.4.0) - 21 Mar 2024

### Release Changes

* Added: Support for `ifDraw2D` in CLI with flag to show screen as ASCII Art by [@lvcabral](https://github.com/lvcabral) in [#284](https://github.com/lvcabral/brs-engine/pull/284)
* Added: Support for `roUrlTransfer` in CLI by [@lvcabral](https://github.com/lvcabral) in [#289](https://github.com/lvcabral/brs-engine/pull/289)
* Added: ECP and SSDP services to the CLI by [@lvcabral](https://github.com/lvcabral) in [#290](https://github.com/lvcabral/brs-engine/pull/290)
* Added: New `ascii_rendering` custom feature (only on CLI) by [@lvcabral](https://github.com/lvcabral) in [#291](https://github.com/lvcabral/brs-engine/pull/291)
* Added: Option to CLI persist the registry to the disk by [@lvcabral](https://github.com/lvcabral) in [#292](https://github.com/lvcabral/brs-engine/pull/292)
* Fixed: CLI Font Loading by [@lvcabral](https://github.com/lvcabral) in [#285](https://github.com/lvcabral/brs-engine/pull/285)

[Full Changelog][v1.4.0]

<a name="v1.3.2"></a>

## [v1.3.2 - Custom Features](https://github.com/lvcabral/brs-engine/releases/tag/v1.3.2) - 09 Mar 2024

### Release Changes

* Add custom features by [@lvcabral](https://github.com/lvcabral) in [#283](https://github.com/lvcabral/brs-engine/pull/283)
  * Added a way to add custom features to be checked by `roDeviceInfo.hasFeatures()`
  * Created new document [docs/customization.md](https://github.com/lvcabral/brs-engine/blob/master/docs/customization.md)
  * Updated default game pad mapping

[Full Changelog][v1.3.2]

<a name="v1.3.1"></a>

## [v1.3.1 - MicroDebugger Improvements](https://github.com/lvcabral/brs-engine/releases/tag/v1.3.1) - 02 Mar 2024

### Release Changes

* Micro debugger improvements by [@lvcabral](https://github.com/lvcabral) in [#280](https://github.com/lvcabral/brs-engine/pull/280)
  * Added to the API `initialize` method a new option: `disableDebug`
  * Added to the MicroDebugger support for `Function`, `If`,  `For` and `While`
  * Added support for MicroDebugger on CLI
  * Fixed MicroDebugger formatting issues and the handling of linefeed
  * Moved command parsing code from API to MicroDebugger
  * Added `quit` command to the MicroDebugger
* Added #278 - Support to ECP control keys `VolumeMute` and `PowerOff` by [@lvcabral](https://github.com/lvcabral) in [#279](https://github.com/lvcabral/brs-engine/pull/279)

[Full Changelog][v1.3.1]

<a name="v1.3.0"></a>

## [v1.3.0 - New method: ifDraw2D.drawTransformedObject()](https://github.com/lvcabral/brs-engine/releases/tag/v1.3.0) - 19 Feb 2024

### Release Changes

* Added #272 `ifDraw2d` method `drawTransformedObject()` by [@lvcabral](https://github.com/lvcabral) in [#275](https://github.com/lvcabral/brs-engine/pull/275)
* Fixed #274 - MicroDebugger truncate String variable to max 94 characters by [@lvcabral](https://github.com/lvcabral) in [#276](https://github.com/lvcabral/brs-engine/pull/276)
* Fixed #273 - MicroDebugger not exiting properly with `exit` command by [@lvcabral](https://github.com/lvcabral) in [#277](https://github.com/lvcabral/brs-engine/pull/277)

[Full Changelog][v1.3.0]

<a name="v1.2.11"></a>

## [v1.2.11 - New API Event: `control`](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.11) - 14 Feb 2024

### Release Changes

* Added `control` event triggered when `keydown` and `keyup` are sent to the engine by [@lvcabral](https://github.com/lvcabral) in [#270](https://github.com/lvcabral/brs-engine/pull/270)
  * Created to allow the apps to have access to the control keys
  * Updated API documentation
* Removed "Loading..." message when running apps without splash, only showing the icon (Roku updated behavior)

[Full Changelog][v1.2.11]

<a name="v1.2.10"></a>

## [v1.2.10 - New roString methods and Keyboard mapping](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.10) - 12 Feb 2024

### Release Changes

* Fixed #265 - Implemented `roString` methods `startsWith()` and `endsWith()` by [@lvcabral](https://github.com/lvcabral) in [#266](https://github.com/lvcabral/brs-engine/pull/266)
* Fixed #267 - Allow map modification keys (Shift, Control, Alt and Meta) independently by [@lvcabral](https://github.com/lvcabral) in [#268](https://github.com/lvcabral/brs-engine/pull/268)
* Improved performance of creating encrypted package by [@lvcabral](https://github.com/lvcabral) in [#269](https://github.com/lvcabral/brs-engine/pull/269)


[Full Changelog][v1.2.10]

<a name="v1.2.9"></a>

## [v1.2.9 - Fixes: roByteArray and roVideoPlayer](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.9) - 05 Feb 2024

### Release Changes

* Fixed #260 - `roByteArray` - Capacity calculation now behave as Roku by [@lvcabral](https://github.com/lvcabral) in [#261](https://github.com/lvcabral/brs-engine/pull/261)
* Fixed #255 - `roVideoPlayer` - Seek now behave as Roku by [@lvcabral](https://github.com/lvcabral) in [#262](https://github.com/lvcabral/brs-engine/pull/262)
* Fixed #263 - Checking the Game Pad buttons map on event handler by [@lvcabral](https://github.com/lvcabral) in [#264](https://github.com/lvcabral/brs-engine/pull/264)

[Full Changelog][v1.2.9]

<a name="v1.2.8"></a>

## [v1.2.8 - Video: Play List Fixes](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.8) - 03 Feb 2024

### Release Changes

* Fixed #252 - Clear the audio tracks list when switching videos by [@lvcabral](https://github.com/lvcabral) in [#256](https://github.com/lvcabral/brs-engine/pull/256)
* Fixed #253 - Safari native HLS support not selecting default audio track by [@lvcabral](https://github.com/lvcabral) in [#257](https://github.com/lvcabral/brs-engine/pull/257)
* Fixed #254 - Keep the audio track selection on each playlist video metadata by [@lvcabral](https://github.com/lvcabral) in [#258](https://github.com/lvcabral/brs-engine/pull/258)
* Fixed #250 - Made `RunUserInterface` the primary entry point by [@lvcabral](https://github.com/lvcabral) in [259](https://github.com/lvcabral/brs-engine/pull/259)

[Full Changelog][v1.2.8]

<a name="v1.2.7"></a>

## [v1.2.7 - Video: HLS Support and Multiple Audios](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.7) - 02 Feb 2024

### Release Changes

* Added full support to HLS and Multiple Audio Tracks - closes #247, #220 by [@lvcabral](https://github.com/lvcabral) in [#249](https://github.com/lvcabral/brs-engine/pull/249)
* Added support to videos inside the package or downloaded - closes #239 by [@lvcabral](https://github.com/lvcabral) in [#246](https://github.com/lvcabral/brs-engine/pull/246)
* Finished implementation of `roByteArray`- closes #172 by [@lvcabral](https://github.com/lvcabral) in [#251](https://github.com/lvcabral/brs-engine/pull/251)
* Fixed #244 - API Debug issues by [@lvcabral](https://github.com/lvcabral) in [#245](https://github.com/lvcabral/brs-engine/pull/245)

[Full Changelog][v1.2.7]

<a name="v1.2.6"></a>

## [v1.2.6 - roScreen fix and Video Codec Detection](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.6) - 28 Jan 2024

### Release Changes

* Fixed #234 - Return last buffer on `roScreen` methods `getPng` and `roGetByteArray` by [@lvcabral](https://github.com/lvcabral) in [#236](https://github.com/lvcabral/brs-engine/pull/236)
* Fixed #235 - Updated `ifDraw2D` to support `roScreen` as image source by [@lvcabral](https://github.com/lvcabral) in [#237](https://github.com/lvcabral/brs-engine/pull/237)
* Fixed #238 - Detected supported video codecs and containers to return in `roDeviceInfo.canDecodeVideo()` by [@lvcabral](https://github.com/lvcabral) in [#240](https://github.com/lvcabral/brs-engine/pull/240)
* Fixed last frame on screen using `cancelAnimationFrame()` by [@lvcabral](https://github.com/lvcabral) in [#241](https://github.com/lvcabral/brs-engine/pull/241)
* Fixed #242 - Raise `resolution` event during app startup by [@lvcabral](https://github.com/lvcabral) in [#243](https://github.com/lvcabral/brs-engine/pull/243)


[Full Changelog][v1.2.6]

<a name="v1.2.5"></a>

## [v1.2.5 - Fixes on Keyboard Control, Display and XML](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.5) - 22 Jan 2024

### Release Changes

* Fixed #228 - Prevent repeated `keydown` events by [@lvcabral](https://github.com/lvcabral) in [#230](https://github.com/lvcabral/brs-engine/pull/230)
* Fixed #229 - Clear buffer on terminate by [@lvcabral](https://github.com/lvcabral) in [#231](https://github.com/lvcabral/brs-engine/pull/231)
* Fixed #232 - Object `roXMLElement` called method `getText()` is returning empty string by [@lvcabral](https://github.com/lvcabral) in [#233](https://github.com/lvcabral/brs-engine/pull/233)

[Full Changelog][v1.2.5]

<a name="v1.2.4"></a>

## [v1.2.4 - Fixed Low Resolution and Video Pause](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.4) - 21 Jan 2024

### Release Changes

* Fixed #225 - Low Resolution on Screen Resize by [@lvcabral](https://github.com/lvcabral) in [#226](https://github.com/lvcabral/brs-engine/pull/226)
* Fixed #219 - Video playback is not always pausing when the app get `PAUSE` or `BREAK` commands by [@lvcabral](https://github.com/lvcabral) in [#227](https://github.com/lvcabral/brs-engine/pull/227)

[Full Changelog][v1.2.4]

<a name="v1.2.3"></a>

## [v1.2.3 - Improved Control Simulation](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.3) - 19 Jan 2024

### Release Changes

* Fixed issue that allowed API to unmute a video when App had it muted by [@lvcabral](https://github.com/lvcabral) in [#221](https://github.com/lvcabral/brs-engine/pull/221)
* Added new API methods to enable/disable dynamically both keyboard or game pad controllers by [@lvcabral](https://github.com/lvcabral) in [#222](https://github.com/lvcabral/brs-engine/pull/222)
  * `setControlMode()`
  * `getControlMode()`
  * `setCustomPadButtons()`
* Improvements on Remote Control simulation by [@lvcabral](https://github.com/lvcabral) in [#223](https://github.com/lvcabral/brs-engine/pull/223)
  * Added support for different control types
  * Added a key buffer on the API side to avoid losing key events

[Full Changelog][v1.2.3]

<a name="v1.2.2"></a>

## [v1.2.2 - Implemented FindMemberFunction()](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.2) - 17 Jan 2024

### Release Changes

* Fixed #190 - Implemented global function `FindMemberFunction()`  by [@lvcabral](https://github.com/lvcabral) in [#216](https://github.com/lvcabral/brs-engine/pull/216)
* Improved Example web app by [@lvcabral](https://github.com/lvcabral) in [#217](https://github.com/lvcabral/brs-engine/pull/217)
  * Removed unecessary content policy
  * Replaced usage of `prompt()` by an HTML5 `dialog`
  * Updated execution source using the button to match Roku side load with "auto-run-dev"

[Full Changelog][v1.2.2]


<a name="v1.2.1"></a>

## [v1.2.1 - Mute Audio and Video in Sync](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.1) - 15 Jan 2024

### Release Changes

* Fixed API to handle `mute` in sync for both Audio and Video by [@lvcabral](https://github.com/lvcabral) in [#215](https://github.com/lvcabral/brs-engine/pull/215)
* Fixed bad performance when in full screen mode on 4K monitors by [@lvcabral](https://github.com/lvcabral) in [#214](https://github.com/lvcabral/brs-engine/pull/214)
* build(deps): bump follow-redirects from 1.15.3 to 1.15.4 by @dependabot in [#212](https://github.com/lvcabral/brs-engine/pull/212)
* Added new demo app to the example web application: `custom-video-player`
* Updated documentation


[Full Changelog][v1.2.1]

<a name="v1.2.0"></a>

## [v1.2.0 - Video Playback and GamePad customization](https://github.com/lvcabral/brs-engine/releases/tag/v1.2.0) - 14 Jan 2024

### Release Changes

* Implemented `roVideoPlayer` component by [@lvcabral](https://github.com/lvcabral) in [#213](https://github.com/lvcabral/brs-engine/pull/213)
* Added support to customize GamePad buttons mapping by [@lvcabral](https://github.com/lvcabral) in [#210](https://github.com/lvcabral/brs-engine/pull/210)
* Control queue modes: Single Key Events and Multi Key Events by [@lvcabral](https://github.com/lvcabral) in [#211](https://github.com/lvcabral/brs-engine/pull/211)
  * Add the entry `multi_key_events=1` to the manifest to enable support for simultaneous keys.

[Full Changelog][v1.2.0]

<a name="v1.1.11"></a>

## [v1.1.11 - Improved roRegex and fixed Sound issues](https://github.com/lvcabral/brs-engine/releases/tag/v1.1.11) - 05 Jan 2024

### Release Changes

* Added support for `g` flag on `roRegex` by [@lvcabral](https://github.com/lvcabral) in [#209](https://github.com/lvcabral/brs-engine/pull/209)
* Fixed sound related issues by [@lvcabral](https://github.com/lvcabral) in [#208](https://github.com/lvcabral/brs-engine/pull/208)
  * Home Button sound was not always being triggered
  * The `roAudioResource` was with the old DataType enum configuration
  * Sound will totally pause now both on `stop` and `pause` states.

[Full Changelog][v1.1.11]

<a name="v1.1.10"></a>

## [v1.1.10 - Fixed DBG Command conflict with WAV](https://github.com/lvcabral/brs-engine/releases/tag/v1.1.10) - 04 Jan 2024

### Release Changes

* Fixed wav stream conflict with Debug command by [@lvcabral](https://github.com/lvcabral) in [#207](https://github.com/lvcabral/brs-engine/pull/207)
  * Extracted enumerators from `util.js` into `enums.js` to reuse inside the worker
  * Fixed issue that was restarting a sound when returning from pause of break, when the app already had stopped it.

[Full Changelog][v1.1.10]

<a name="v1.1.9"></a>

## [v1.1.9 - GamePad support and FPS Limitation](https://github.com/lvcabral/brs-engine/releases/tag/v1.1.9) - 03 Jan 2024

### Release Changes

* Updated package name on README.md badges by [@lvcabral](https://github.com/lvcabral) in [#200](https://github.com/lvcabral/brs-engine/pull/200)
* Fixed [#201](https://github.com/lvcabral/brs-engine/issues/201) - Prevent Exception when SharedArrayBuffer is not supported by [@lvcabral](https://github.com/lvcabral) in [#202](https://github.com/lvcabral/brs-engine/pull/202)
* Implementing features to remove limitations by [@lvcabral](https://github.com/lvcabral) in [#205](https://github.com/lvcabral/brs-engine/pull/205)
  * Fixed [#164](https://github.com/lvcabral/brs-engine/issues/164) - Allowing usage of explicit interfaces when calling methods [@lvcabral](https://github.com/lvcabral) in [#206](https://github.com/lvcabral/brs-engine/pull/206)
  * Fixed [#159](https://github.com/lvcabral/brs-engine/issues/159) - Properly casting numeric values on Math functions and other scenarios
  * Added support to have the variable name after `next` statement in a `for...next` loop
* Implemented GamePad support by [@lvcabral](https://github.com/lvcabral) in [#204](https://github.com/lvcabral/brs-engine/pull/204)
  * Added support for the GamePad API
  * Added a new feature `simulation_engine` to the `roDeviceInfo.hasFeature()` method, allowing apps to adapt when under `brs-engine`
  * Added new option to define `maxFps` on `deviceData` and limit framerate inside the worker
  * Reduced web app default framerate to prevent issues on iOS
  * Added icon dimentions to css
  * Fixed CLI to not show `start` event
  * Fixed high framerate performance issue
  * Fixed loading encrypted package
* Added new debug command `pause` to allow interrupt the interpreter when app loses focus

[Full Changelog][v1.1.9]

<a name="v1.0.0"></a>

## [v1.0.0 - Simulation Engine Release](https://github.com/lvcabral/brs-engine/releases/tag/v1.0.0) - 15 Dec 2023

After 4 years of Alpha and Beta stages, the project is stable and performant enough to finally be released as version 1.0 and with that, we decided to give it a new name:

## brs-engine - BrightScript Simulation Engine

The term _simulation engine_ was chosen instead of the former _emulator_ to better represent the nature and purpose of the project, as there is no intention to fully emulate a Roku device (OS and Hardware), but rather simulate the behavior, as a development tool and as an engine/framework to run BrightScript apps in different platforms.

In this release the [new CLI](/docs/run-as-cli.md) was introduced, still with some limitations (e.g. no `OffScreenCanvas` support), but allowing basic BrightScript code to be executed, either via REPL or files. It also performs the encryption of a `.zip` file into a `.bpk` package to protect the source code.

#### Release Changes

* Renamed package for `brs-engine`
* Renamed libraries to `brs.api.js` and `brs.worker.js`
* Reorganized `src` folder by library, subfolders: `api`, `cli` and `worker`
* Added new CLI with REPL (`bin/brs.cli.js`) ([#181](https://github.com/lvcabral/brs-engine/181))
* Added support for Conditional Compilation ([#93](https://github.com/lvcabral/brs-engine/93))
* Added support for `webp` file format in `roBitmap` ([#166](https://github.com/lvcabral/brs-engine/166))
* Added support for interfaces `ifGetArray` and `ifSetArray` ([#170](https://github.com/lvcabral/brs-engine/170))
* Added support for `.bpk` encrypted package file ([#188](https://github.com/lvcabral/brs-engine/188))
* Added support optional chaining operators: `?.`, `?(`, `?[`, and `.@` ([#176](https://github.com/lvcabral/brs-engine/176))
* Moved `models` list to API library and updated `serialNumber` format
* Added new API event `registry`
* Added check for `break` debug command during the `roMessagePort` loop
* Added code to pause sound when Micro Debugger is triggered (does not affect wav)
* Added option to stop on Micro Debugger when a crash happens ([#198](https://github.com/lvcabral/brs-engine/198))
* Added partial try/catch implementation ([#195](https://github.com/lvcabral/brs-engine/195))
* Improved error handling and added warning for RSG usage
* Added stub `roAppMemoryMonitor` and `roDeviceInfo.enableLowGeneralMemory` ([#196](https://github.com/lvcabral/brs-engine/196))
* Added new method `getAllPurchases` and changed `doOrder` to return `false` ([#178](https://github.com/lvcabral/brs-engine/178))
* Added `formatLocation` method in the Interpreter to help show location in warning messages
* Added Bundle Stats Analyzer and replaced dependencies to reduce package size
* Updated default firmware to 11.0 and added new models to the list
* Updated images and layout of sample Web application
* Updated `roDateTime.GetTimeZoneOffset()` to consider `roDeviceInfo.GetTimeZone()` ([#94](https://github.com/lvcabral/brs-engine/94))
* Finished implementation of `ifEnum` on all array/list objects ([#171](https://github.com/lvcabral/brs-engine/171))
* Fixed multiple cascading calls for dot-chained methods ([#55](https://github.com/lvcabral/brs-engine/55))
* Fixed `roRegion` offset not being properly applied when `setWrap` was `true` ([#194](https://github.com/lvcabral/brs-engine/194))
* Fixed `Val()` function not compliant with Roku ([#162](https://github.com/lvcabral/brs-engine/162))
* Fixed duplication of exception handling messages ([#126](https://github.com/lvcabral/brs-engine/126))
* Fixed code smells and bugs based on Sonar Cloud recommendations ([#169](https://github.com/lvcabral/brs-engine/169))
* Replaced `luxon` by `day.js` on `roDateTime` and `roTimespan` ([#193](https://github.com/lvcabral/brs-engine/193))
* Replaced module `jszip` by the lighter `fflate`
* Removing `ua-parser-js` dependency for the API
* Bumped version of several dependencies
* Removed Node 14.x from the build ([#182](https://github.com/lvcabral/brs-engine/182))

[Full Changelog][v1.0.0]

<a name="v0.10.22"></a>

## [v0.10.22 - New API and Boosted Performance](https://github.com/lvcabral/brs-emu/releases/tag/v0.10.22) - 10 Sep 2023

This release was a result of months of refactoring work and performance improvements. 

* Implemented new API to simplify usage of the `brs-emu` package, see [new documentation](https://github.com/lvcabral/brs-emu/blob/master/docs/integrating.md) [@lvcabral](https://github.com/lvcabral) 
* Implemented the Roku MicroDebugger (including `stop` statement, back trace and debug commands) [#127](https://github.com/lvcabral/brs-emu/issues/127)
* Added support for Firefox and Safari browsers
* Added option to execute a channel without audio
* Added support for both Windows and MacOS keyboard names
* Multiple performance improvements on handling Canvas 2D, big thanks for [@markwpearce](https://github.com/markwpearce) [#139](https://github.com/lvcabral/brs-emu/issues/139)
* Implemented `roInput` [#57](https://github.com/lvcabral/brs-emu/issues/57)
* Implemented `roAppInfo`  [#104](https://github.com/lvcabral/brs-emu/issues/104) 
* Implemented support for `ScaleMode` in `roRegion` [#62](https://github.com/lvcabral/brs-emu/issues/62)
* Implemented missing methods to `roRegion` [#120](https://github.com/lvcabral/brs-emu/issues/120)
* Implemented missing methods to `roUrlTransfer` as mocks to avoid channel crash. [#104](https://github.com/lvcabral/brs-emu/issues/104)
* Implemented missing `roDeviceInfo` methods [#134](https://github.com/lvcabral/brs-emu/issues/134)
* Implemented missing `roChannelStore` methods [#137](https://github.com/lvcabral/brs-emu/issues/137)
* Implemented a mock of `RunGarbageCollector()` [#119](https://github.com/lvcabral/brs-emu/issues/119)
* Implemented numeric type auto cast in function parameters and return value [#122](https://github.com/lvcabral/brs-emu/issues/122)
* Implemented support for external input parameters [#123](https://github.com/lvcabral/brs-emu/issues/123)
* Implemented support for format parameter on `toStr()` [#132](https://github.com/lvcabral/brs-emu/issues/132)
* Implemented method `format()` in `roString` [#133](https://github.com/lvcabral/brs-emu/issues/133)
* Implemented `end` command to terminate app without crash
* Improved casting on `roBitmap`, `roRegion` and `roScreen`
* Improved Function call performance [#141](https://github.com/lvcabral/brs-emu/issues/141)
* Changed to show icon when no splash exist in zip file
* Changed to only enable keyboard control when channel is running
* Changed to make sure audio do not play if  `stop()` is called during load
* Fixed: `drawRotatedObject` on `roScreen` and `roBitmap`
* Fixed: `ifDraw2d` drawing methods on `roRegion` [#120](https://github.com/lvcabral/brs-emu/issues/120)
* Fixed: return `invalid` when `roCompositor` doesn't receive valid regions creating sprites [#125](https://github.com/lvcabral/brs-emu/issues/125)
* Fixed: Edge case of comparing `invalid` with `roInvalid`
* Fixed: Prevent crash with invalid collection with `for each` [#118](https://github.com/lvcabral/brs-emu/issues/118)
* Fixed: Added missing audio files to the npm package
* Added option to show and overlay with display performance indicators  [#129](https://github.com/lvcabral/brs-emu/issues/129)
* Implemented use of `Atomics` with the `SharedArrayBuffer` and other small improvements.
* Adding a python script to allow testing on newer browsers with COOP and COEP enabled.
* Upgraded to TypeScript 4, Webpack 5 and several other dependencies
* [sonar] Code smell and complexity fixes [#153](https://github.com/lvcabral/brs-emu/issues/153)
* Merged [**brs**](https://github.com/sjbarag/brs) v0.45.0 below cherry picked commits:
  * feat(stdlib): Add lookupCI for assocarray ([#639](https://github.com/sjbarag/brs/issues/639)) resolves [#629](https://github.com/sjbarag/brs/issues/629) 
  * fix(interp): allow functions to be typed as objects ([#659](https://github.com/sjbarag/brs/659))

[Full Changelog][v0.10.22]

<a name="v0.9.0-emu"></a>

## [v0.9.0 - Improved ECP and BrightScript support](https://github.com/lvcabral/brs-emu/releases/tag/v0.9.0-emu) - 28 Jun 2021

This release brings the integration of improvements and fixes from the `brs` interpreter up to their **v0.43**. Also several improvements

* (app) Implemented ECP-2 WebSocket API to support official Roku mobile apps (iOS and Android)
* (app) Implemented support for keyboard characters sent via ECP
* (app) Added support for new control keys: Backspace, Enter, PlayOnly and Stop
* (app) Restore the app window, if minimized, when a channel is loaded remotely via the Installer
* (app) Added `Ctrl+R` shortcut to reload most recent channel
* (app) Added current locale on the Status bar
* (app) Made path length on the status bar proportional to the app window's width
* (app) Fixed status bar Resolution label that was showing "width" twice
* (app,web) Now emulator loads all files from the zip package even ones with custom extension.
* (app,web) Made Key8 to behave as the Info (*) control key, for keyboards that lacks the numeric keypad
* (app,web) Upgraded several dependencies to patch security vulnerabilities.
* (brs) Implemented support for Dot (.) and Attribute (@) operators for XML objects
* (brs) Implemented several missing methods to `roDeviceInfo` 
* (brs) Added check for valid parameters on `roRegion` constructor
* (brs) Ignore Label statements when parsing the code
* (brs) Fixed `roRegion.SetWrap(true)` in `ifDraw2D.DrawObject()` and `ifDraw2D.DrawScaledObject()`
* (brs) Fixed `roString.Tokenize()` that was sometimes returning an empty string at the end of the list
* (brs) Fixed `roAppManager.updateLastKeyPressTime()` definition typo and implemented actual time reset
* (brs) Fixed issues with `roTimespan`
* (brs) Fixed `roRegion.offset()` to accept float parameters
* (doc) Updated [list of emulator limitations](https://github.com/lvcabral/brs-emu/blob/master/docs/limitations.md)
* Merged [**brs**](https://github.com/sjbarag/brs) v0.43.0 below some key commits:
  * fix(lexer): Add support for explicit integer literals ([#637](https://github.com/sjbarag/brs/issues/637))
  * feat(stdlib): add isEmpty method to roString ([#636](https://github.com/sjbarag/brs/issues/636))
  * fix(parse,interp): Support unary + operator for numbers ([#615](https://github.com/sjbarag/brs/issues/615))
  * fix(lex): Allow JS object properties as identifiers ([#614](https://github.com/sjbarag/brs/issues/614))
  * feat(stdlib): Implement RoLongInteger and cast int to LongInt, float to Double ([#600](https://github.com/sjbarag/brs/issues/600))
  * fix(stdlib): Correct sorting issues with mixed arrays ([#592](https://github.com/sjbarag/brs/issues/592))
  * feat(parse,interp): Implement dim statement ([#531](https://github.com/sjbarag/brs/issues/531))
  * fix(rsg): Adds optional arg to RoString constructor ([#533](https://github.com/sjbarag/brs/issues/533))
  * fix(parse): Restore nested block parsing ([#514](https://github.com/sjbarag/brs/issues/514))
  * fix(parse): Allow multiple statements in single-line `if` branches
  * feat(stdlib): Added case sensitive support to roAssociativeArray ([#509](https://github.com/sjbarag/brs/issues/509))
  * fix(parser): make if statements with 'not' work ([#443](https://github.com/sjbarag/brs/issues/443))
  * fix(parse): Capture `EndIf` token when used alongside `else` ([#393](https://github.com/sjbarag/brs/issues/393))
  * fix(interp): Allow Float parameters passed into function signatures expecting Double ([#394](https://github.com/sjbarag/brs/issues/394))
  * fix(interp): Allow invalid returns for signatures that return object (brs#395)

[Full Changelog][v0.9.0-emu]

<a name="v0.8.1-emu"></a>

## [v0.8.1 - Fixes and Security Patches](https://github.com/lvcabral/brs-emu/releases/tag/v0.8.1-emu) - 09 Jun 2021

This release brings bug fixes, support for new Chrome security policies and the desktop application has upgraded dependencies including Electron's bump to v9.

* (brs)Added new message "getVersion" to allow request library version to the WebWorker
* (brs) Revert "fix(interp): Automatically box as object function parameters (sjbarag#365)"
* (brs) Fixed support for Retaliate game that was not working properly on v0.8 
* (web) Shows dynamically the library version using new message "getVersion"
* (web) Added support to [Chrome 92+ that will force **self.crossOriginIsolated**](https://developer.chrome.com/blog/enabling-shared-array-buffer/)
* (app) Upgraded several dependencies to patch security vulnerabilities.

[Full Changelog][v0.8.1-emu]

<a name="v0.8.0-emu"></a>

## [v0.8.0 - Localization Support](https://github.com/lvcabral/brs-emu/releases/tag/v0.8.0-emu) - 11 Mar 2020

This release brings full support for channel localization. The desktop application has a new menu with the locales with the same options available on Roku devices.

* (brs)Added support to localize texts using TS or XLIFF files [#67](https://github.com/lvcabral/brs-emu/issues/67)
* (brs)Implemented support for localization of images [#66](https://github.com/lvcabral/brs-emu/issues/66)
* (brs)Added missing method setAdPrefs() for Roku_Ads.brs  [#68](https://github.com/lvcabral/brs-emu/issues/68)
* (brs)Removed BRS original manifest handler
* (app) Added option on Device menu to change localization
* (app) Refactored app code into several front-end modules
* Merged BRS v0.18.2
  * fix(stdlib): Implement RoAssociativeArray.items() correctly ([#371](https://github.com/sjbarag/brs/issues/371))
  * fix(interp): Automatically box `as object` function parameters ([#35](https://github.com/sjbarag/brs/issues/35))
  * fix(stdlib): Allow formatJson to serialize boxed types ([#364](https://github.com/sjbarag/brs/issues/364))
  * feat(stdlib): Implement getString() and toStr() on RoString ([#362](https://github.com/sjbarag/brs/issues/362))
  * feat(stdlib): Implement GetInterface ([#352](https://github.com/sjbarag/brs/issues/352))
  * fix(interp): Automatically box return values for 'as object' return types ([#360](https://github.com/sjbarag/brs/issues/360))
  * feat(parse): Allow `.` before indexed property access ([#357](https://github.com/sjbarag/brs/issues/357))
  * chore(cruft): Remove unused AutoBox.ts

[Full Changelog][v0.8.0-emu]

<a name="v0.7.2-emu"></a>

## [v0.7.2 - First Beta Release](https://github.com/lvcabral/brs-emu/releases/tag/v0.7.2-emu) - 17 Nov 2019

* (brs) Library now supports `roUrlTransfer` and `roUrlEvent`
* (brs) Added support to **bmp** images, and better file type detection
* (brs) Emulator **File System** is now case insensitive (like Roku)
* (brs) Finished `roXMLElement` implementation with XML creation methods
* (brs) Mocked `roAppManager` component with working `GetUpTime()` method
* (brs) Support to global functions: RebootSystem(), UpTime(), Tr()
* (brs) Fixed scope of the `m` object inside global functions **(v0.7.2)**
* (brs) Fixed support for fonts with spaces and numbers on the family name **(v0.7.2)**
* (brs) Fixed issues related to `if..then..else` on a single line **(v0.7.2)**
* (app,web) Added support to play downloaded audio files
* (app,web) Added support to show downloaded images
* (app,web) Updated default sound effects with the original Roku audio resources
* (app) **Web Installer** (port 80 or custom) to allow remote installation and screenshot
* (app) **ECP** server (port 8060) with **SSDP** detection implemented
* (app) **Remote Console** (port 8085) is available for remote monitoring
* (app) Status bar now changes color if errors or warnings are raised
* (app) New _clickable_ status bar icons for errors, ECP and web installer
* (web) Shows animated gif to indicate a channel is being downloaded
* (doc) Updated [list of emulator limitations](https://github.com/lvcabral/brs-emu/blob/master/docs/limitations.md)
* (doc,app) Added [desktop app build documentation](https://github.com/lvcabral/brs-emu-app/blob/master/docs/build-from-source.md)

[Full Changelog][v0.7.2-emu]

<a name="v0.6.0-emu"></a>

## [v0.6.0 - Audio Playback and new Display Modes](https://github.com/lvcabral/brs-emu/releases/tag/v0.6.0-emu) - 24 Oct 2019

* (app,web) Support for audio playback from `roAudioResource` and `roAudioPlayer`
* (app,web) Support for **SD** and **FHD** display modes
* (app) Added TV over-scan emulation options: disabled, only guide lines, enabled
* (app) Added **Open Recent** sub-menu
* (app) Added **Close Channel** menu option
* (app) Added **macOS** standard app menu
* (brs) Implemented `roAudioPlayerEvent` and updated `roMessagePort` to support it
* (doc) Updated [list of emulator limitations](https://github.com/lvcabral/brs-emu/blob/master/docs/limitations.md)

[Full Changelog][v0.6.0-emu]

<a name="v0.5.0-emu"></a>

## [v0.5.0 - Desktop Applications and Library Fixes](https://github.com/lvcabral/brs-emu/releases/tag/v0.5.0-emu) - 05 Oct 2019

This version brings the first release of the desktop application and several fixes and improvements:

* (app) Desktop app for Windows, Linux and macOS
* (brs) Fixed issues with inline `if` statements on `Parser`  [#252](https://github.com/sjbarag/brs/issues/252) [#253](https://github.com/sjbarag/brs/issues/253) [#309](https://github.com/sjbarag/brs/issues/309)
* (brs) Implemented global function `GetInterface()`  [#42](https://github.com/lvcabral/brs-emu/issues/42)
* (brs) Added support for an optional parameter on `Main()` [#44](https://github.com/lvcabral/brs-emu/issues/44) 
* (brs) Added `RunUserInterface()` as alternative for `Main()` [#44](https://github.com/lvcabral/brs-emu/issues/44)
* (brs) Added missing method `maxSimulStreams()` on `roAudioResource` component [#26](https://github.com/lvcabral/brs-emu/issues/26)
* (web) Reduced the app html to be simple, adding links to documentation on the repository
* (web) Detect and inform user about unsupported browser [#40](https://github.com/lvcabral/brs-emu/issues/40)
* (doc) Reorganized repository folders and documentation for v0.5.0 [#43](https://github.com/lvcabral/brs-emu/issues/43)
* Merged BRS v0.15.0
  * fix(types): Return `true` for invalid values on `RoAssociativeArray#doesExist` ([#323](https://github.com/sjbarag/brs/issues/323))
  * fix(types,interp): Automatically convert between Int and Float ([#291](https://github.com/sjbarag/brs/issues/291))
  * feat(extension): Add _brs_.runInScope ([#326](https://github.com/sjbarag/brs/issues/326))
  * chore(naming): rename src/mocks/ -> src/extensions/ ([#325](https://github.com/sjbarag/brs/issues/325))

[Full Changelog][v0.5.0-emu]

<a name="v0.4.0-emu"></a>

## [v0.4.0 - Support for rgba on Draw Object methods](https://github.com/lvcabral/brs-emu/releases/tag/v0.4.0-emu) - 25 Sep 2019

This release has the following changes:

* Implemented method IsEmpty() for both roArray and roAssociativeArray [#316](https://github.com/sjbarag/brs/issues/316)
* Fixed [#320](https://github.com/sjbarag/brs/issues/320) Making sure DoesExist() returns true even when value of the existing item is invalid
* Implemented mock components roChannelStore and roChannelStoreEvent [#39](https://github.com/lvcabral/brs-emu/issues/39)
* Implemented mock of Roku_Ads() object [#25](https://github.com/lvcabral/brs-emu/issues/25)
* Implemented support for rgba on DrawObject* methods [#27](https://github.com/lvcabral/brs-emu/issues/27)
* Added option to configure device font,
* Added new font family "Roboto"
* Added new font family "Asap" that is similar to Roku default
* Implemented missing methods for RoUniversalControlEvent [#37](https://github.com/lvcabral/brs-emu/issues/37)
* Changed DrawText to get string from value property of BrsString
* fix(parse): Include surrounding whitespace in Block nodes([#257](https://github.com/sjbarag/brs/issues/257))
* Finished Collision detection implementation (rectangle and circle)
* Updated roRegion to handle offset properly based on SetWrap() flag
* Implemented roScreen methods SetPort(), GetPng() and GetByteArray()
* Fixed `for loop` issue that should not process loop when step is on the wrong direction of the start-end parameters [#310](https://github.com/sjbarag/brs/issues/310) ([#311](https://github.com/sjbarag/brs/issues/311))

[Full Changelog][v0.4.0-emu]


<a name="v0.3.0-emu"></a>

## [v0.3.0 - Several fixes and improvements](https://github.com/lvcabral/brs-emu/releases/tag/v0.3.0-emu) - 16 Sep 2019

This releases adds a few font related features as follows:

* Updated website and added new demo channels
* Added parameter `rgba`` to `roScreen.DrawObject()` (only alpha opacity supported) [#27](https://github.com/lvcabral/brs-emu/issues/27)
* Fixed `for loop` to correctly handle `steps` sjbarag#315
* Fixed issue that `roCompositor` was not clearing the canvas properly
* Implemented channel close detection
* Fixed `roSprite` animation when frame time was configured on `roRegion`
* Implemented double buffer support for `roScreen` and `roRegion`
* Added method `DrawText()` to `roRegion`
* Implemented string `Tokenize()` method
* Added boxing to the numeric types
* Merged `roBoolean`, `roDouble`, `roFloat` and `roInt` implementation [#35](https://github.com/lvcabral/brs-emu/issues/35)
* Made file type identification case-insensistive
* Added support for `.csv` extension on zip package
* Removed `roSGNode` as **RSG** is out of scope for the emulator
* Added support for `.gif` and `.jpeg` image extensions
* Fixed [#32](https://github.com/lvcabral/brs-emu/issues/32) Changed default font loading code to use relative path
* Fixed [#30](https://github.com/lvcabral/brs-emu/issues/30) Moved the screen clear code to run before the splash

[Full Changelog][v0.3.0-emu]

<a name="v0.2.0-emu"></a>

## [v0.2.0 - Custom Fonts and Metrics](https://github.com/lvcabral/brs-emu/releases/tag/v0.2.0-emu) - 09 Sep 2019

This releases adds a few font related features as follows:

* Support for loading custom fonts from the channel `zip` package.
* Included **Open Sans** as the default device font.
* Finished roFontRegistry and roFont implementation by adding font metrics.
* Updated license information.

Included a new dependency to [opentype.js](https://www.npmjs.com/package/opentype.js) package to parse font files.

[Full Changelog][v0.2.0-emu]

<a name="v0.1.0-emu"></a>

## [v0.1.0 - First Emulator Alpha Release](https://github.com/lvcabral/brs-emu/releases/tag/v0.1.0-emu) - 08 Sep 2019

This is the prototype release of the 2D API emulator, forked from the original BRS project.
The following is the list of components implemented (some partially or just mocked):

* roAudioPlayer.ts (mock)
* roAudioResource.ts (mock)
* roBitmap.ts
* roByteArray.ts
* roCompositor.ts
* roDateTime.ts
* roDeviceInfo.ts
* roFileSystem.ts
* roFont.ts
* roFontRegistry.ts
* roList.ts
* roMessagePort.ts
* roPath.ts
* roRegion.ts
* roRegistry.ts
* roRegistrySection.ts
* roScreen.ts
* roSprite.ts
* roUniversalControlEvent.ts
* roXMLElement.ts
* roXMLList.ts

[Full Changelog][v0.1.0-emu]

[v2.3.0]: https://github.com/lvcabral/brs-engine/compare/v2.2.0...v2.3.0
[v2.2.0]: https://github.com/lvcabral/brs-engine/compare/v2.1.0...v2.2.0
[v2.1.0]: https://github.com/lvcabral/brs-engine/compare/v2.0.5...v2.1.0
[v2.0.5]: https://github.com/lvcabral/brs-engine/compare/v2.0.4...v2.0.5
[v2.0.4]: https://github.com/lvcabral/brs-engine/compare/v2.0.3...v2.0.4
[v2.0.3]: https://github.com/lvcabral/brs-engine/compare/v2.0.2...v2.0.3
[v2.0.2]: https://github.com/lvcabral/brs-engine/compare/v2.0.1...v2.0.2
[v2.0.1]: https://github.com/lvcabral/brs-engine/compare/v2.0.0...v2.0.1
[v2.0.0]: https://github.com/lvcabral/brs-engine/compare/v1.10.0...v2.0.0
[v1.10.0]: https://github.com/lvcabral/brs-engine/compare/v1.9.9...v1.10.0
[v1.9.9]: https://github.com/lvcabral/brs-engine/compare/v1.9.8...v1.9.9
[v1.9.8]: https://github.com/lvcabral/brs-engine/compare/v1.9.7...v1.9.8
[v1.9.7]: https://github.com/lvcabral/brs-engine/compare/v1.9.6...v1.9.7
[v1.9.6]: https://github.com/lvcabral/brs-engine/compare/v1.9.5...v1.9.6
[v1.9.5]: https://github.com/lvcabral/brs-engine/compare/v1.9.4...v1.9.5
[v1.9.4]: https://github.com/lvcabral/brs-engine/compare/v1.9.3...v1.9.4
[v1.9.3]: https://github.com/lvcabral/brs-engine/compare/v1.9.2...v1.9.3
[v1.9.2]: https://github.com/lvcabral/brs-engine/compare/v1.9.1...v1.9.2
[v1.9.1]: https://github.com/lvcabral/brs-engine/compare/v1.8.9...v1.9.1
[v1.8.9]: https://github.com/lvcabral/brs-engine/compare/v1.8.8...v1.8.9
[v1.8.8]: https://github.com/lvcabral/brs-engine/compare/v1.8.7...v1.8.8
[v1.8.7]: https://github.com/lvcabral/brs-engine/compare/v1.8.6...v1.8.7
[v1.8.6]: https://github.com/lvcabral/brs-engine/compare/v1.8.5...v1.8.6
[v1.8.5]: https://github.com/lvcabral/brs-engine/compare/v1.8.4...v1.8.5
[v1.8.4]: https://github.com/lvcabral/brs-engine/compare/v1.8.3...v1.8.4
[v1.8.3]: https://github.com/lvcabral/brs-engine/compare/v1.8.2...v1.8.3
[v1.8.2]: https://github.com/lvcabral/brs-engine/compare/v1.8.1...v1.8.2
[v1.8.1]: https://github.com/lvcabral/brs-engine/compare/v1.8.0...v1.8.1
[v1.8.0]: https://github.com/lvcabral/brs-engine/compare/v1.7.2...v1.8.0
[v1.7.3]: https://github.com/lvcabral/brs-engine/compare/v1.7.0...v1.7.3
[v1.7.0]: https://github.com/lvcabral/brs-engine/compare/v1.6.1...v1.7.0
[v1.6.1]: https://github.com/lvcabral/brs-engine/compare/v1.6.0...v1.6.1
[v1.6.0]: https://github.com/lvcabral/brs-engine/compare/v1.5.7...v1.6.0
[v1.5.7]: https://github.com/lvcabral/brs-engine/compare/v1.5.6...v1.5.7
[v1.5.6]: https://github.com/lvcabral/brs-engine/compare/v1.5.5...v1.5.6
[v1.5.5]: https://github.com/lvcabral/brs-engine/compare/v1.5.4...v1.5.5
[v1.5.4]: https://github.com/lvcabral/brs-engine/compare/v1.5.3...v1.5.4
[v1.5.3]: https://github.com/lvcabral/brs-engine/compare/v1.5.2...v1.5.3
[v1.5.2]: https://github.com/lvcabral/brs-engine/compare/v1.5.1...v1.5.2s
[v1.5.1]: https://github.com/lvcabral/brs-engine/compare/v1.5.0...v1.5.1
[v1.5.0]: https://github.com/lvcabral/brs-engine/compare/v1.4.1...v1.5.0
[v1.4.1]: https://github.com/lvcabral/brs-engine/compare/v1.4.0...v1.4.1
[v1.4.0]: https://github.com/lvcabral/brs-engine/compare/v1.3.2...v1.4.0
[v1.3.2]: https://github.com/lvcabral/brs-engine/compare/v1.3.1...v1.3.2
[v1.3.1]: https://github.com/lvcabral/brs-engine/compare/v1.3.0...v1.3.1
[v1.3.0]: https://github.com/lvcabral/brs-engine/compare/v1.2.11...v1.3.0
[v1.2.11]: https://github.com/lvcabral/brs-engine/compare/v1.2.10...v1.2.11
[v1.2.10]: https://github.com/lvcabral/brs-engine/compare/v1.2.9...v1.2.10
[v1.2.9]: https://github.com/lvcabral/brs-engine/compare/v1.2.8...v1.2.9
[v1.2.8]: https://github.com/lvcabral/brs-engine/compare/v1.2.7...v1.2.8
[v1.2.7]: https://github.com/lvcabral/brs-engine/compare/v1.2.6...v1.2.7
[v1.2.6]: https://github.com/lvcabral/brs-engine/compare/v1.2.5...v1.2.6
[v1.2.5]: https://github.com/lvcabral/brs-engine/compare/v1.2.4...v1.2.5
[v1.2.4]: https://github.com/lvcabral/brs-engine/compare/v1.2.3...v1.2.4
[v1.2.3]: https://github.com/lvcabral/brs-engine/compare/v1.2.2...v1.2.3
[v1.2.2]: https://github.com/lvcabral/brs-engine/compare/v1.2.1...v1.2.2
[v1.2.1]: https://github.com/lvcabral/brs-engine/compare/v1.2.0...v1.2.1
[v1.2.0]: https://github.com/lvcabral/brs-engine/compare/v1.1.11...v1.2.0
[v1.1.11]: https://github.com/lvcabral/brs-engine/compare/v1.0.10...v1.1.11
[v1.1.10]: https://github.com/lvcabral/brs-engine/compare/v1.0.9...v1.1.10
[v1.1.9]: https://github.com/lvcabral/brs-engine/compare/v1.0.0...v1.1.9
[v1.0.0]: https://github.com/lvcabral/brs-engine/compare/v0.10.22...v1.0.0
[v0.10.22]: https://github.com/lvcabral/brs-emu/compare/v0.9.0-emu...v0.10.22
[v0.9.0-emu]: https://github.com/lvcabral/brs-emu/compare/v0.8.1-emu...v0.9.0-emu
[v0.8.1-emu]: https://github.com/lvcabral/brs-emu/compare/v0.8.0-emu...v0.8.1-emu
[v0.8.0-emu]: https://github.com/lvcabral/brs-emu/compare/v0.7.2-emu...v0.8.0-emu
[v0.7.2-emu]: https://github.com/lvcabral/brs-emu/compare/v0.6.0-emu...v0.7.2-emu
[v0.6.0-emu]: https://github.com/lvcabral/brs-emu/compare/v0.5.0-emu...v0.6.0-emu
[v0.5.0-emu]: https://github.com/lvcabral/brs-emu/compare/v0.4.0-emu...v0.5.0-emu
[v0.4.0-emu]: https://github.com/lvcabral/brs-emu/compare/v0.3.0-emu...v0.4.0-emu
[v0.3.0-emu]: https://github.com/lvcabral/brs-emu/compare/v0.2.0-emu...v0.3.0-emu
[v0.2.0-emu]: https://github.com/lvcabral/brs-emu/compare/v0.1.0-emu...v0.2.0-emu
[v0.1.0-emu]: https://github.com/lvcabral/brs-emu/tree/v0.1.0-emu

<!-- Generated by https://github.com/rhysd/changelog-from-release v3.7.1 -->
