{"id":13444581,"url":"https://github.com/endbasic/endbasic","last_synced_at":"2025-10-07T09:50:51.070Z","repository":{"id":38377938,"uuid":"253313291","full_name":"endbasic/endbasic","owner":"endbasic","description":"BASIC environment with a REPL, a web interface, a graphical console, and RPi support written in Rust","archived":false,"fork":false,"pushed_at":"2025-06-11T20:03:11.000Z","size":5862,"stargazers_count":353,"open_issues_count":34,"forks_count":17,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-09-25T23:42:22.034Z","etag":null,"topics":["basic","gpio","graphics-programming","interpreter","language","learn-to-code","parser","programming-language","raspberry-pi","repl","rust","scripting-language","sdl2"],"latest_commit_sha":null,"homepage":"https://www.endbasic.dev/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/endbasic.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","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,"zenodo":null},"funding":{"github":"jmmv"}},"created_at":"2020-04-05T19:17:16.000Z","updated_at":"2025-09-04T18:19:22.000Z","dependencies_parsed_at":"2023-01-31T04:02:03.572Z","dependency_job_id":"a58cbc1c-9d3a-4f59-ae69-5cc6c9409be4","html_url":"https://github.com/endbasic/endbasic","commit_stats":{"total_commits":730,"total_committers":3,"mean_commits":"243.33333333333334","dds":"0.020547945205479423","last_synced_commit":"47f7c694b57b141b69ed6d3e270fc7c61ee9ac97"},"previous_names":["jmmv/endbasic"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/endbasic/endbasic","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/endbasic%2Fendbasic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/endbasic%2Fendbasic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/endbasic%2Fendbasic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/endbasic%2Fendbasic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/endbasic","download_url":"https://codeload.github.com/endbasic/endbasic/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/endbasic%2Fendbasic/sbom","scorecard":{"id":376755,"data":{"date":"2025-08-11","repo":{"name":"github.com/endbasic/endbasic","commit":"a2f457515fd4aa0c689e560151be74e14aa6b4a4"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Maintained","score":1,"reason":"1 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"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":"Code-Review","score":0,"reason":"Found 0/11 approved changesets -- score normalized to 0","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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/deploy-release.yml:1","Warn: no topLevel permission defined: .github/workflows/deploy-staging.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml: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":"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":"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/build.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:81: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:84: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:89: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy-release.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/deploy-release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy-release.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/deploy-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy-staging.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/deploy-staging.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy-staging.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/deploy-staging.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:83: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:100: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/endbasic/endbasic/test.yml/master?enable=pin","Info:   0 out of  19 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   6 third-party 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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: 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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact endbasic-0.11.1 not signed: https://api.github.com/repos/endbasic/endbasic/releases/175093067","Warn: release artifact endbasic-0.11.0 not signed: https://api.github.com/repos/endbasic/endbasic/releases/166321676","Warn: release artifact endbasic-0.10.0 not signed: https://api.github.com/repos/endbasic/endbasic/releases/87312028","Warn: release artifact endbasic-0.9.0 not signed: https://api.github.com/repos/endbasic/endbasic/releases/68676324","Warn: release artifact endbasic-0.8.1 not signed: https://api.github.com/repos/endbasic/endbasic/releases/58257936","Warn: release artifact endbasic-0.11.1 does not have provenance: https://api.github.com/repos/endbasic/endbasic/releases/175093067","Warn: release artifact endbasic-0.11.0 does not have provenance: https://api.github.com/repos/endbasic/endbasic/releases/166321676","Warn: release artifact endbasic-0.10.0 does not have provenance: https://api.github.com/repos/endbasic/endbasic/releases/87312028","Warn: release artifact endbasic-0.9.0 does not have provenance: https://api.github.com/repos/endbasic/endbasic/releases/68676324","Warn: release artifact endbasic-0.8.1 does not have provenance: https://api.github.com/repos/endbasic/endbasic/releases/58257936"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 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":3,"reason":"7 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-4www-5p9h-95mh","Warn: Project is vulnerable to: GHSA-9gqv-wp59-fq42","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h"],"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-18T14:26:28.799Z","repository_id":38377938,"created_at":"2025-08-18T14:26:28.799Z","updated_at":"2025-08-18T14:26:28.799Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278755146,"owners_count":26040033,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["basic","gpio","graphics-programming","interpreter","language","learn-to-code","parser","programming-language","raspberry-pi","repl","rust","scripting-language","sdl2"],"created_at":"2024-07-31T04:00:31.067Z","updated_at":"2025-10-07T09:50:51.052Z","avatar_url":"https://github.com/endbasic.png","language":"Rust","readme":"# The EndBASIC programming language\n\n![Test](https://github.com/endbasic/endbasic/actions/workflows/test.yml/badge.svg?branch=master)\n![Build release](https://github.com/endbasic/endbasic/actions/workflows/build.yml/badge.svg?branch=master)\n![Release checks](https://github.com/endbasic/endbasic/actions/workflows/release.yml/badge.svg?branch=master)\n![Deploy to staging](https://github.com/endbasic/endbasic/actions/workflows/deploy-staging.yml/badge.svg)\n![Deploy to release](https://github.com/endbasic/endbasic/actions/workflows/deploy-release.yml/badge.svg)\n\nEndBASIC is an interpreter for a BASIC-like language and is inspired by\nAmstrad's Locomotive BASIC 1.1 and Microsoft's QuickBASIC 4.5.  Like the former,\nEndBASIC intends to provide an interactive environment that seamlessly merges\ncoding with immediate visual feedback.  Like the latter, EndBASIC offers\nhigher-level programming constructs and strong typing.\n\nEndBASIC offers a simplified and restricted environment to learn the foundations\nof programming and focuses on features that can quickly reward the programmer.\nThese features include things like a built-in text editor, commands to\nrender graphics, and commands to interact with the hardware of a Raspberry\nPi.  Implementing this kind of features has priority over others such as\nperformance or a much richer language.\n\nEndBASIC is written in Rust and runs both on the web and locally on a variety of\noperating systems and platforms, including macOS, Windows, and Linux.\n\nEndBASIC is free software under the [Apache 2.0 License](LICENSE).\n\n**The latest version of EndBASIC is 0.11.1 and was released on 2024-09-14.**\n\n## Quick start on the web\n\nOpen EndBASIC in your browser by visiting:\n\n\u003e \u003chttps://repl.endbasic.dev/\u003e\n\nOr go the project's website at:\n\n\u003e \u003chttps://www.endbasic.dev/\u003e\n\nThe web interpreter should work on all major desktop browsers as well as mobile\ndevices (with some small known issues on Android).\n\nThe web interpreter runs fully locally: any programs you write are persisted in\nyour browser's local storage by default.  That said, you can choose to sign up\nfor the cloud service and upload your programs to share them with the world.\n\n## Quick start on your machine\n\nVisit the\n[release page](https://github.com/endbasic/endbasic/releases/tag/endbasic-0.11.1)\nto download prebuilt binaries.  Once downloaded, unpack the archive and run the\n`endbasic` binary to get started.\n\nBe aware that [the binaries are *not signed* right\nnow](https://github.com/endbasic/endbasic/issues/137) so it can be difficult to\nget these to run on Windows and macOS.\n\nThe binary releases are built with the recommended settings: they all include\ngraphics support, and the builds for the Raspberry Pi include support for its\nhardware.  To use the graphics console, you will need to launch the binary\nusing one of these forms:\n\n```shell\nendbasic --console=graphics            # Default console size, windowed.\nendbasic --console=graphics:800x600    # Custom resolution.\nendbasic --console=graphics:800x600fs  # Custom resolution, full screen.\nendbasic --console=graphics:fs         # Desktop resolution, full screen.\n```\n\n## Building from source\n\nOf course, you can also build and install EndBASIC from source by running the\nfollowing command (assuming you have a Rust toolchain installed):\n\n```shell\ncargo install endbasic\n```\n\nThe above will fetch EndBASIC from \u003chttps://crates.io/\u003e, build it with default\nsettings, and then install the resulting binary under `~/.cargo/bin/`.\n\nIf you want to enable graphics support (recommended), you will first have to\ninstall the `SDL2` and `SDL2_ttf` libraries.  Follow these steps depending on\nthe platform you are on:\n\n```shell\n# On Debian-based systems:\nsudo apt install libsdl2-dev libsdl2-ttf-dev\ncargo install --features=sdl endbasic\n\n# On FreeBSD systems:\nsudo pkg install sdl2 sdl2_ttf\ncargo install --features=sdl endbasic\n\n# On macOS systems with Homebrew:\nbrew install sdl2 sdl2_ttf\ncargo install --features=sdl endbasic\n\n# On Windows systems, this is tricky.  The easiest way is to clone this\n# repository and then do the following from PowerShell:\n.\\.github\\workflows\\setup-sdl.ps1\ncargo build --release --features=sdl endbasic\n```\n\nIf you want to enable support for the Raspberry Pi hardware (along with the\nrecommended graphics features), do this on the Raspberry Pi itself:\n\n```shell\nsudo apt install libsdl2-dev libsdl2-ttf-dev\ncargo install --features=rpi,sdl endbasic\n```\n\n## More information\n\nRefer to the [**User's Manual**](https://www.endbasic.dev/docs.html) for\ninformation on how to get started with EndBASIC.\n\nType `HELP` within the interpreter to access the **Reference Manual**.\n\nThe following documents provide more information about the structure of\nthis repository:\n\n*   For language features, see [`core/README.md`](core/README.md).\n*   For standard library contents, see [`std/README.md`](std/README.md).\n*   For usage details of the command-line interpreter, see\n    [`cli/README.md`](cli/README.md).\n*   For REPL information, see [`repl/README.md`](repl/README.md).\n*   For terminal support, see [`terminal/README.md`](terminal/README.md).\n*   For SDL support, see [`sdl/README.md`](sdl/README.md).\n*   For Raspberry Pi specific features, see [`rpi/README.md`](rpi/README.md).\n*   For the web interface, see [`web/README.md`](web/README.md).\n*   For changes across versions, see [`NEWS.md`](NEWS.md).\n\n## Why EndBASIC?\n\nEndBASIC started as part of my desire to teach programming to my own kids.\nI remember learning programming on an old Amstrad CPC 6128: the experience was\nunique in the sense that every command had immediate effect.  Changing colors,\ndrawing on the screen, or playing sounds were just a few keystrokes away after\nbooting the computer, without the need to deal with separate editors and\nterminals.  I've noticed a similar excitement in my kids when showing this to\nthem via an emulator, so I thought I would replicate this in a more modern\nfashion.  And here we are.\n\nBecause of this inspiration, EndBASIC's name stands for \"E. and D.'s BASIC\"\nfollowing my kids first name initials.\n","funding_links":["https://github.com/sponsors/jmmv"],"categories":["Dialects","Rust"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fendbasic%2Fendbasic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fendbasic%2Fendbasic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fendbasic%2Fendbasic/lists"}