{"id":13616357,"url":"https://github.com/sjbarag/brs","last_synced_at":"2026-01-30T06:45:00.141Z","repository":{"id":38830982,"uuid":"115140058","full_name":"sjbarag/brs","owner":"sjbarag","description":"An interpreter for the BrightScript language that runs on non-Roku platforms.","archived":false,"fork":false,"pushed_at":"2024-04-27T21:50:36.000Z","size":3200,"stargazers_count":115,"open_issues_count":104,"forks_count":43,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-01-26T19:32:52.787Z","etag":null,"topics":["brightscript","interpreter"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sjbarag.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-12-22T18:20:07.000Z","updated_at":"2026-01-25T23:45:03.000Z","dependencies_parsed_at":"2023-02-08T16:15:53.306Z","dependency_job_id":"4a134e1b-5132-4272-810c-b09924a5aa83","html_url":"https://github.com/sjbarag/brs","commit_stats":{"total_commits":734,"total_committers":39,"mean_commits":18.82051282051282,"dds":0.5190735694822888,"last_synced_commit":"9d986b6a70db8517f4bf97c64b870e003218dec3"},"previous_names":[],"tags_count":67,"template":false,"template_full_name":null,"purl":"pkg:github/sjbarag/brs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjbarag%2Fbrs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjbarag%2Fbrs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjbarag%2Fbrs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjbarag%2Fbrs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sjbarag","download_url":"https://codeload.github.com/sjbarag/brs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjbarag%2Fbrs/sbom","scorecard":{"id":828614,"data":{"date":"2025-08-11","repo":{"name":"github.com/sjbarag/brs","commit":"9d986b6a70db8517f4bf97c64b870e003218dec3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.3,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":5,"reason":"Found 14/26 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/nightly-build.yaml:1","Warn: no topLevel permission defined: .github/workflows/pull-request.yaml:1","Warn: no topLevel permission defined: .github/workflows/release.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly-build.yaml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/sjbarag/brs/nightly-build.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nightly-build.yaml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/sjbarag/brs/nightly-build.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull-request.yaml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/sjbarag/brs/pull-request.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull-request.yaml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/sjbarag/brs/pull-request.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/sjbarag/brs/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/sjbarag/brs/release.yaml/main?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"23 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-3xq5-wjfh-ppjc","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-44c6-4v22-4mhx","Warn: Project is vulnerable to: GHSA-4x5v-gmq8-25ch","Warn: Project is vulnerable to: GHSA-g4rg-993r-mgx7","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-w5p7-h5w8-2hfq","Warn: Project is vulnerable to: GHSA-cf4h-3jhx-xvhq","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T17:08:26.861Z","repository_id":38830982,"created_at":"2025-08-23T17:08:26.861Z","updated_at":"2025-08-23T17:08:26.861Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28906883,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T06:42:00.998Z","status":"ssl_error","status_checked_at":"2026-01-30T06:41:58.659Z","response_time":66,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["brightscript","interpreter"],"created_at":"2024-08-01T20:01:27.426Z","updated_at":"2026-01-30T06:45:00.109Z","avatar_url":"https://github.com/sjbarag.png","language":"JavaScript","funding_links":[],"categories":["HarmonyOS","Build Tools"],"sub_categories":["Windows Manager"],"readme":"\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n**Table of Contents**  *generated with [DocToc](https://github.com/thlorenz/doctoc)*\n\n- [BRS: Off-Roku BrightScript](#brs-off-roku-brightscript)\n  - [Installation](#installation)\n  - [Usage](#usage)\n    - [REPL](#repl)\n    - [Executing a file](#executing-a-file)\n  - [Sure, but why?](#sure-but-why)\n  - [So can I use this to watch TV without a Roku?](#so-can-i-use-this-to-watch-tv-without-a-roku)\n  - [Building from source](#building-from-source)\n    - [Prerequisites](#prerequisites)\n    - [Setup](#setup)\n    - [The build-test-clean dance](#the-build-test-clean-dance)\n      - [Build](#build)\n      - [Testing](#testing)\n      - [Cleaning](#cleaning)\n      - [All Together](#all-together)\n  - [Documentation](#documentation)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n# BRS: Off-Roku BrightScript\nAn interpreter for the BrightScript language that runs on non-Roku platforms.\n\n[![CircleCI](https://circleci.com/gh/sjbarag/brs.svg?style=svg)](https://circleci.com/gh/sjbarag/brs)\n[![NPM Version](https://badge.fury.io/js/brs.svg?style=flat)](https://npmjs.org/package/brs)\n\n## Installation\nThe BRS project is published as a `node` package, so use `npm`:\n\n```shell\n$ npm install -g brs\n```\n\nor `yarn` if that's your preference:\n\n```shell\n$ yarn global add brs\n```\n\n## Usage\nThis repo provides the `brs` executable, which operates in two ways.\n\n### REPL\nAn interactive BrightScript REPL (Read-Execute-Print Loop) is available by running `brs` with no arguments, e.g.:\n\n```\n$ brs\nbrs\u003e ?\"Dennis Ritchie said \"\"Hello, World!\"\"\"\nDennis Ritchie said \"Hello, World!\"\n```\n\nQuit by entering `^D` (Control-D).\n\n### Executing a file\nBRS can execute an arbitrary BrightScript file as well!  Simply pass the file to the `brs` executable, e.g.:\n\n```\n$ cat hello-world.brs\n?\"Dennis Ritchie said \"\"Hello, World!\"\"\"\n\n$ brs hello-world.brs\nDennis Ritchie said \"Hello, World!\"\n```\n\n## Sure, but why?\nThe [Roku](https://roku.com) series of media streaming devices are wildly popular amongst consumers, and several [very](https://netflix.com) [popular](https://hulu.com) [streaming](https://amazon.com/primevideo) [services](https://crackle.com) offer Channels for the Roku platform.  Unfortunately, Roku chanels *must* be written in a language called BrightScript, which is only executable directly on a Roku device.  BRS hopes to change that by allowing Roku developers to test their code on their own machines, thus improving the quality of their channels and the end-user's experience as a whole.\n\n## So can I use this to watch TV without a Roku?\nNope!  The BRS project currently has no intention of emulating the Roku user interface, integrating with the Roku store, or emulating content playback.  In addition to likely getting this project in legal trouble, that sort of emulation is a ton of work.\n\n## Building from source\nThe BRS project follows pretty standard `node` development patterns, with the caveat that it uses `yarn` for dependency management.\n\n### Prerequisites\nBRS builds (and runs) in `node`, so you'll need to [install that first](https://nodejs.org).\n\nOnce that's ready, install [yarn](https://yarnpkg.com).  Installing it with `npm` is probably the simplest:\n\n```shell\n$ npm install -g yarn\n```\n### Setup\n1. Clone this repo:\n   ```\n   $ git clone https://github.com/sjbarag/brs.git\n   ```\n\n2. Install dependencies:\n    ```shell\n    $ yarn install     # or just `yarn`\n    ```\n\n3. Get `brs` onto your `PATH`:\n    ``` shell\n    $ yarn link\n    ```\n### The build-test-clean dance\n#### Build\nThis project is written in TypeScript, so it needs to be compiled before it can be executed.  `yarn build` compiles files in `src/` into JavaScript and TypeScript declarations, and puts them in `lib/` and `types/` respectively.\n\n```shell\n$ yarn build\n\n$ ls lib/\nindex.js (and friends)\n\n$ ls types/\nindex.d.ts (and friends)\n```\n\nAlternatively, you can run the build step in \"watch\" mode. This will run `yarn build` for you automatically, every time it detects source file changes:\n```shell\n$ yarn watch\n```\nThis is often useful for testing that local changes work in your BrightScript project, without having to run `yarn build` over and over.\n\n#### Testing\nTests are written in plain-old JavaScript with [Facebook's Jest](http://facebook.github.io/jest/), and can be run with the `test` target:\n\n```shell\n$ yarn test\n\n# tests start running\n```\n\nNote that only test files ending in `.test.js` will be executed by `yarn test`.\n\n#### Cleaning\nCompiled output in `lib/` and `types/` can be removed with the `clean` target:\n\n```shell\n$ yarn clean\n\n$ ls lib/\nls: cannot access 'lib': No such file or directory\n\n$ ls types/\nls: cannot access 'types': No such file or directory\n```\n\n#### All Together\nThanks to the [npm-run-all](https://www.npmjs.com/package/npm-run-all) package, it's trivially easy to combine these into a sequence of tasks without relying on shell semantics:\n\n```shell\n$ yarn run-s clean build test\n```\n\n## Documentation\n\nFor the most part, `brs` attempts to emulate BrightScript as closely as possible. However, there are certain implementation gaps. Also, in the spirit of unit testing, there are a few extensions that will help with testing. All of our documentation for APIs, extensions, gaps, and more is hosted on our docs site, [hulu.github.io/roca](https://hulu.github.io/roca).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsjbarag%2Fbrs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsjbarag%2Fbrs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsjbarag%2Fbrs/lists"}