BrightScript Engine Current Limitations
November 7, 2025 ยท View on GitHub
The BrightScript Engine implements the BrightScript language specification up to Roku OS 15.0. However, some features and components remain unsupported or only partially implemented. These limitations fall into three categories: features planned for future development, components that will remain as mock objects for compatibility purposes, and functionality considered outside the project's scope. The following sections detail each category and its current status.
In Scope (to be developed/fixed in future releases)
- Roku SceneGraph SDK components are currently being implemented in this branch and released as pre-release alpha, so far we support:
- Load XML component files and create SceneGraph nodes tree.
- Basic support for
roSGNodeandroSGScreencomponents and rendering. - The
Tasknode is implemented but its behavior is limited:- For now only 10 task threads are supported per application
- The
m.globalobject can have children, but changes on those nodes are not shared among the threads - Only one
portinstance can be used on Taskinit()to observe fields
- The following nodes are already implemented:
- The basic nodes:
ContentNode,Group,Scene,Global,Font,Timer,Rectangle,Label,ScrollingLabel,Poster,LayoutGroupandRSGPalette - Grids and list nodes based on
ArrayGrid:LabelList,CheckList,RadioButtonList,MarkupList,MarkupGrid,RowListandZoomRowList - Dialog related nodes:
Dialog,KeyboardDialog,StandardDialog,StandardProgressDialog,StdDlgProgressItem,StdDlgContentAreaandStdDlgTitleArea - Media related nodes:
Audio,SoundEffect,VideoandTrickPlayBar - Other supported nodes:
Button,ButtonGroup,BusySpinner,Overhang,Keyboard,MiniKeyboard,TextEditBoxandChannelStore
- The basic nodes:
- Some of the nodes listed above may not have full functionality yet, please open a GitHub issue if you find any problem or missing feature.
- The support for animations is not yet implemented, including the focus change animation on grid and list nodes.
- All other nodes are either mocked or not implemented yet, and if used will be created as a plain
Node. - The component
roRenderThreadQueueintroduced in Roku OS 15 is still not implemented.
- The following components are also not implemented yet:
- Text to Speech components:
roAudioGuide,roMicrophoneandroTextToSpeech - Signing Algorithm components:
roDSAandroRSA
- Text to Speech components:
- Audio playback is implemented via
roAudioResources,SoundEffect,roAudioPlayerandAudionode, but with some limitations:- Only one instance of
roAudioPlayerorAudionode should be used, if more are created those will share the content playlist. - If the
roAudioPlayerorAudionode instance is destroyed the audio keeps playing, make sure to stop the playback before discarding the object. - No
Timed Metadatasupport.
- Only one instance of
- The component
roAudioMetadataonly supports MP3 (for now). - The component
roImageMetadataonly supports JPEG images (for now). - Video playback is implemented via
roVideoPlayerandVideonode, but with some limitations:- If the instance of
roVideoPlayerorVideois destroyed the video keeps playing, make sure tostopbefore discarding the object. - The following
roVideoPlayermethods are not supported, implemented as mock:setCGMS,setMaxVideoDecodeResolution,setTimedMetadataForKeys,getCaptionRenderer - Check what formats (container and codec) can be used on each browser, using
roDeviceInfo.canDecodeVideo(), to make sure your video can be played. - Subtitles are only supported for HLS streams and only in
Videonode, theroVideoPlayerdoes not support subtitles for now. - BIF (Base Index Frames) thumbnails are not yet supported.
- DASH streams are not yet supported.
- If the instance of
- The component
roUrlTransferis implemented with basic functionality but with the following limitations:- To make a web app access urls from domains other than the one it is hosted, the Cross-Origin Resource Sharing (CORS) browser policy requires the server called to respond with the header
Access-Control-Allow-Origin, read more.- A simple way to overcome this limitation is to use a CORS proxy like the cors-anywhere, see customization documentation to learn how to configure
brs-engineto use it. - If you are using a Chromium based browser (Chrome, Edge, Brave, etc) you can install this extension to bypass CORS.
- A simple way to overcome this limitation is to use a CORS proxy like the cors-anywhere, see customization documentation to learn how to configure
- The async methods are actually synchronous and evaluated when
WaitMessageorGetMessageare called. - Custom/Self-Signed SSL certificates are not supported, the engine will use default browser client certificate database.
- As custom certificates are not supported these methods are just mocked and do nothing:
EnablePeerVerification,EnableHostVerification,SetCertificatesDepth. - Cookies are only partially supported, if
EnableCookiesis called andEnableFreshConnectionis set tofalse, then Cookies from previous calls will be preserved. - The other Cookies related methods are just mocked and do nothing:
GetCookies,AddCookies,ClearCookies. - The following methods are also only mocked but do nothing:
EnableResume,SetHttpVersionandSetMinimumTransferRate.
- To make a web app access urls from domains other than the one it is hosted, the Cross-Origin Resource Sharing (CORS) browser policy requires the server called to respond with the header
- The component
roAppMemoryMonitorwill only return measured data in Node.JS and Chromium browsers. For browsers the memory heap info only accounts for the main thread, as WebWorkers do not have support forperformance.memoryAPI. - The
roInputdeep link events are supported, but the events related to Voice Commands are not. - The
roFileSystemis fully functional, but the message port events are not yet implemented. - The complete Roku OS file system is available and shared among threads (main, render and tasks), with all volumes:
pkg:,common:/,tmp:,cachefs:andext1:. By default, the writeable volumestmp:andcachefs:are limited to 32 MB each, see customization documentation to learn how to change those limits. - The global functions
Eval(),GetLastRunCompileError()andGetLastRunRuntimeError()are not available. - The string
modcannot be used as variable or function parameter name, because it conflicts with remainder operatorMod(Roku devices allows that). - Screensaver functionality is not yet implemented.
- SDK 1.0 deprecated components are not supported, but will be implemented in the future as a legacy apps preservation initiative.
Mocked Components and Libraries
- RAF (Roku Ads Framework) library with that exposes
Roku_Adsis mocked with the most common methods available returning static values. - RED (Roku Event Dispatcher) and Google IMA3 libraries are also mocked.
- Channel Store components (
ChannelStore,roChannelStoreandroChannelStoreEvent) are mocked with support for thefakeServer()feature. - The
roStreamSocketandroDataGramSocketcomponents are mocked, and were only implemented to prevent crash on apps that use those. - Several components have their methods and events mocked, they return constant values to prevent crash. Those are mostly related to device behaviors that are not possible to replicate in a browser environment or simply not applicable to the engine.
Out of Scope
- Roku OS User Interface.
- Roku Channel Store features.
- Video playback with Ads.