{"id":23708139,"url":"https://github.com/ayecue/greybel-js","last_synced_at":"2026-02-04T12:30:18.279Z","repository":{"id":41152925,"uuid":"373325484","full_name":"ayecue/greybel-js","owner":"ayecue","description":"GreyScript transpiler/minifier/interpreter for Grey Hack written in JS.","archived":false,"fork":false,"pushed_at":"2025-02-16T03:20:56.000Z","size":8565,"stargazers_count":29,"open_issues_count":2,"forks_count":8,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-16T03:24:33.683Z","etag":null,"topics":["greyhack","greyscript","interpreter","lexer","minifier","transpiler"],"latest_commit_sha":null,"homepage":"http://editor.greyscript.org","language":"TypeScript","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/ayecue.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"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":"2021-06-02T23:10:59.000Z","updated_at":"2025-02-16T03:20:57.000Z","dependencies_parsed_at":"2023-10-23T00:23:46.552Z","dependency_job_id":"71600487-dcce-4702-88ec-0cefca32e22a","html_url":"https://github.com/ayecue/greybel-js","commit_stats":{"total_commits":377,"total_committers":1,"mean_commits":377.0,"dds":0.0,"last_synced_commit":"38b5fcc4328134469e4959c706cbd84d904e9fa3"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayecue%2Fgreybel-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayecue%2Fgreybel-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayecue%2Fgreybel-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ayecue%2Fgreybel-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ayecue","download_url":"https://codeload.github.com/ayecue/greybel-js/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239748259,"owners_count":19690233,"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","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":["greyhack","greyscript","interpreter","lexer","minifier","transpiler"],"created_at":"2024-12-30T17:49:06.690Z","updated_at":"2026-02-04T12:30:18.237Z","avatar_url":"https://github.com/ayecue.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Greybel-JS\r\n\r\nCLI that provides a set of tools for working with GreyScript. GreyScript is a scripting language used within [GreyHack](https://store.steampowered.com/app/605230/Grey_Hack/).\r\n\r\n## Links\r\n\r\n**Project Resources**\r\n- [Changelog](https://github.com/ayecue/greybel-js/blob/main/CHANGELOG.md): View the latest changes and updates.\r\n- [greybel-js CLI](https://github.com/ayecue/greybel-js): Command-line interface for Greybel.\r\n- [GreyScript Documentation](https://documentation.greyscript.org): API documentation for GreyScript.\r\n- [Greybel UI Demo](https://editor.greyscript.org): Online editor to write specifically GreyScript.\r\n- [VSCode Extension](https://github.com/ayecue/greybel-vs): VSCode extension for GreyScript.\r\n- [Language server](https://github.com/ayecue/greybel-languageserver/blob/main/packages/node/README.md): LSP supporting GreyScript.\r\n\r\n**Projects Using Greybel**\r\n- [minizod](https://github.com/cantemizyurek/minizod): A lightweight, Zod-inspired validation library for MiniScript.\r\n- [Viper 3.0](https://github.com/cantemizyurek/viper-3.0): Viper is a hacking shell tool for game named Grey Hack.\r\n- [Minesweeper](https://github.com/ayecue/minesweeper-gs): A Minesweeper game created in GreyScript. (Demo project)\r\n- [JSON Parser](https://github.com/ayecue/json): JSON parsing functionality. (Demo project)\r\n- [TEdit](https://github.com/ayecue/tedit): Text editor built with GreyScript. (Demo project)\r\n\r\n**Grey Hack Tools**\r\n- [Image Transformer](https://github.com/ayecue/gh-image-transformer): Tool for transforming images in Grey Hack.\r\n- [Website Image Generator](https://github.com/ayecue/gh-website-image-generator): Tool for generating Grey Hack website images.\r\n\r\n**Community**\r\n- [awesome-greyhack](https://github.com/stevenklar/awesome-greyhack): List with several resources related to Grey Hack.\r\n- [Greybel Discord](https://discord.gg/q8tR8F8u2M): Join the community on Discord for support and discussion.\r\n\r\n## Features\r\n\r\n- **Easily manage imports for small and large projects**  \r\n  - [Import files directly into the game without needing to copy-paste](#auto-create-files-in-game)\r\n  - [Handle dependencies between different code files](#dependency-management-transpiler)\r\n  - [Use environment variables during the transpilation process](#environment-variables-transpiler)\r\n  - [Syntax enhancements for easier coding](#syntax)\r\n  - **Minimize your scripts** to save up to 40% on large projects  \r\n    - Optimize literals (strings, booleans, numbers)\r\n    - Minify namespace names\r\n    - Remove unnecessary whitespace and tabs\r\n    - Obfuscate code (as a side effect of the above optimizations)\r\n  - **Beautify your code** for easier readability (helpful for deobfuscation)\r\n\r\n- **Run and test your code outside of GreyHack**  \r\n  - [Manage file dependencies in the interpreter](#dependency-management-interpreter)\r\n  - [Simulate a local mock environment for testing](#local-environment)\r\n  - [Full support for the GreyScript API](#greyscript-api-support)\r\n  - [Debug your code with ease](#debugger-cli)\r\n  - [Support for TextMesh Pro Rich Text](#textmesh-pro-rich-text-support-cli)\r\n  - [Use environment variables in your code execution](#environment-variables-interpreter)\r\n\r\n- **Interactive REPL for GreyScript**  \r\n  - Easily experiment with your code in a live environment\r\n\r\n- **Web UI for enhanced coding experience**  \r\n  - [Share your code easily](#share-code)\r\n  - [Save your work directly in the web interface](#save-code)\r\n  - [Debug your code within the web UI](#debugger-web-ui)\r\n  - [TextMesh Pro Rich Text support in the web UI](#textmesh-pro-rich-text-support-web-ui)\r\n\r\n\r\n# Install\r\n\r\n```\r\nnpm i -g greybel-js\r\n```\r\n\r\n# Transpiler\r\n```\r\nTranspiler CLI\r\nExample: greybel build \u003cmyscriptfile\u003e [output]\r\n\r\nArguments:\r\n\tfilepath                    File to compile\r\n\toutput                      Output directory\r\n\r\nOptions:\r\n  -V, --version                                  output the version number\r\n  -si, --silence                                 Silences any uncessary noise.\r\n  -ev, --env-files \u003cfile...\u003e                     Specifiy environment variables file.\r\n  -vr, --env-vars \u003cvar...\u003e                       Specifiy environment variable definition.\r\n  -en, --exclude-namespaces \u003cnamespace...\u003e       Exclude namespaces from optimization. This option is only used in combination with uglifying.\r\n  -dlo, --disable-literals-optimization          Disable literals optimization. This option is only used in combination with uglifying.\r\n  -dno, --disable-namespaces-optimization        Disable namespace optimization. This option is only used in combination with uglifying.\r\n  -u, --uglify                                   Minify your code.\r\n  -b, --beautify                                 Beautify your code.\r\n  -o, --obfuscation                              Allows the namespace optimization to use a wider range of characters in order to safe more\r\n                                                 space.\r\n  -id, --ingame-directory \u003cingameDirectory\u003e      In-game directory target path.\r\n  -i, --installer                                Create installer for GreyScript. Only use this option when there is at least one import_code\r\n                                                 in place.\r\n  -mc, --max-chars \u003cnumber\u003e                      Max amount of characters allowed per file. Installer files will be split depending on the\r\n                                                 amount defined in this option. By default the maximum is 160k chars.\r\n  -ac, --auto-compile                            Enables auto-compile within the installer or create-ingame feature. This option will also\r\n                                                 delete all files in-game after building.\r\n  -ai, --allow-import                            Enables allowImport on auto-compile.\r\n  -acp, --auto-compile-purge                     Specify this option if you would like all of the imported folders to be deleted after the\r\n                                                 auto-compilation process is completed regardless of any files may remaining in those folders.\r\n  -acn, --auto-compile-name \u003cname\u003e               Specify this option if you would like define a special name for the in-game binary.\r\n  -ci, --create-ingame                           Enable transfer of your code files into Grey Hack.\r\n  -dbf, --disable-build-folder                   Disable the default behaviour of putting the output into a build folder. It will instead just\r\n                                                 put it wherever you set the output destination to.\r\n  -h, --help                                     display help for command\r\n```\r\n\r\n## Examples:\r\n### Most common build command:\r\n```\r\ngreybel build /my/code/file.src\r\n```\r\n\r\n## Auto Create Files In-Game\r\n\r\nYou can automatically create transpiled files directly in the game using the `--create-ingame` flag.\r\n\r\n#### Message Hook\r\n\r\nThe message-hook agent allows you to send messages to the game server through the game client. To use this feature, you need to first install [BepInEx](https://github.com/BepInEx/BepInEx) and then the plugin. Below, you can find installation instructions for both versions of BepInEx.\r\n\r\n##### BepInEx 5.x.x\r\n1. **Download BepInEx 5.x.x**: [BepInEx v5.4.23.2](https://github.com/BepInEx/BepInEx/releases/tag/v5.4.23.2)\r\n    - Install by extracting BepInEx files into your Grey Hack game folder (location of the game executable). See the [Installation Guide](https://docs.bepinex.dev/articles/user_guide/installation/index.html) if needed.\r\n2. **Add the Plugin**: Download [GreyHackMessageHook5.dll](https://gist.github.com/ayecue/b45998fa9a8869e4bbfff0f448ac98f9/raw/af926c972880e331ec0c9d7f0cce1bea055c02bc/GreyHackMessageHook5.dll) and move it to the plugins folder in BepInEx.\r\n3. **Configure Launch Options (macOS/Linux Only)**:\r\n    - Go to Steam Library \u003e Grey Hack \u003e Properties \u003e Launch Options.\r\n      - **macOS**: `\"/path/to/Steam/steamapps/common/Grey Hack/run_bepinex.sh\" %command%`\r\n      - **Linux**: `\"/path/to/.steam/steam/steamapps/common/Grey Hack/run_bepinex.sh\" || %command%`\r\n4. **Launch Grey Hack** via Steam to load BepInEx 5 with the plugin.\r\n\r\n##### BepInEx 6.x.x\r\n1. **Download BepInEx 6.x.x**: [BepInEx version 6.0.0-pre.1 UnityMono](https://github.com/BepInEx/BepInEx/releases/tag/v6.0.0-pre.1)\r\n    - Install by extracting BepInEx files into your Grey Hack game folder (location of the game executable). See the [Installation Guide](https://docs.bepinex.dev/master/articles/user_guide/installation/unity_mono.html) if needed.\r\n2. **Add the Plugin**: Download [GreyHackMessageHook.dll](https://gist.github.com/ayecue/b45998fa9a8869e4bbfff0f448ac98f9/raw/af926c972880e331ec0c9d7f0cce1bea055c02bc/GreyHackMessageHook.dll) and move it to the plugins folder in BepInEx.\r\n3. **Configure Launch Options (macOS/Linux Only)**:\r\n    - Go to Steam Library \u003e Grey Hack \u003e Properties \u003e Launch Options.\r\n      - **macOS**: `\"/path/to/Steam/steamapps/common/Grey Hack/run_bepinex.sh\" %command%`\r\n      - **Linux**: `\"/path/to/.steam/steam/steamapps/common/Grey Hack/run_bepinex.sh\" || %command%`\r\n4. **Launch Grey Hack** via Steam to load BepInEx 6 with the plugin.\r\n\r\nWith all that done you can now start the game and start either a single-player or multiplayer session. You'll be now able to sync files with the game without getting disconnected.\r\n\r\nAlso, keep in mind that if you use BepInEx 6.x.x you'll use bleeding edge meaning that it won't be as stable as BepInEx 5.x.x leading to potential crashes. If you suffer too many crashes with 6.x.x may try out version 5.x.x!\r\n\r\n**Note**: For this agent to work you **have to have Grey Hack running**.\r\n\r\n## Dependency Management (Transpiler)\r\n\r\nGreybel allows you to split your code into multiple files, improving readability and making code reusable.\r\n\r\nFor small or medium-sized projects, it’s recommended to use [include](#include) and [import](#import). For larger projects, use [import_code](#import_code) to avoid exceeding the **160,000** character limit in GreyHack, as the transpiler bundles your files efficiently.\r\n\r\nGreybel also detects cyclic dependencies, throwing an error with the problematic file.\r\n\r\nFor a detailed guide, refer to [this page](https://main.greyscript.org/manuals/useful-tools-for-greyscript.html#manage-your-dependencies).\r\n\r\n### Import\r\n\r\nImports exported namespaces from another file with these features:\r\n- Supports relative imports\r\n- Loads code only when required\r\n- Doesn’t pollute the global scope\r\n- Only imported once, no matter how many times referenced\r\n- Exports only what is needed\r\n- Appends code to the root file (may exceed GreyHack’s character limit; use [import_code](#import_code) if this is an issue)\r\n\r\nFor an example, check out the [sample code](/example/import).\r\n\r\n### Include\r\n\r\nImports the content of a file with these features:\r\n- Supports relative includes\r\n- Easy to use\r\n- Pollutes the global scope\r\n- Includes the file content every time, which may cause redundancy\r\n- Could exceed the character limit in GreyHack; use [import_code](#import_code) instead\r\n\r\nFor an example, check out the [sample code](/example/include).\r\n\r\n### import_code\r\n\r\nImports code from a file with these features:\r\n- Keeps files separate in-game, preventing the character limit issue\r\n- Supports nested `import_code`\r\n- Supports relative imports\r\n\r\nFor an example, check out the [sample code](/example/import-code).\r\n\r\nWhen using the `--installer` flag, Greybel creates installer files for your project. These files bundle all your code and logic for easy pasting into the game. After that, you can compile and execute them. The `--auto-compile` flag adds automatic compilation and source file removal.\r\n\r\nYou can also specify an in-game directory using the `--ingame-directory` CLI parameter, with `/root/` as the default.\r\n\r\n**Note**: Nested `import_code` is supported. It’s recommended to place `import_code` at the top of files, as the import order of nested files is not guaranteed.\r\n\r\n## Environment Variables (Transpiler)\r\n\r\nGreybel supports the injection of environment variables while transpiling. There are two ways of environment variables.\r\n\r\n1. Use the `--env-files` CLI parameter to [define environment variables configuration files](/example/environment-variables/env.conf).\r\n2. Use the `--env-vars TEST=\"hello world\"` CLI parameter to define variables on the fly.\r\n\r\nHere is an [example](/example/environment-variables) of environment variable injection.\r\n\r\n## Syntax\r\n\r\nAny valid MiniScript or GreyScript syntax is supported. Additionally, some minor syntax sugar is added to those languages. If you use those keep in mind to transpile your code first. Using these is completely optional though.\r\n\r\n### No trailing comma is required in maps or lists\r\n```\r\nmyList = [\r\n\tfalse,\r\n\tnull\r\n]\r\n\r\nmyMap = {\r\n\t\"test\": {\r\n\t\t\"level2\": {\r\n\t\t\t\"bar\": true\r\n\t\t}\r\n\t}\r\n}\r\n```\r\n\r\n### Math - shorthand\r\n```\r\na /= b\r\na *= b\r\na -= b\r\na += b\r\n```\r\n\r\n### Bitwise - shorthand\r\n```\r\na = b \u003c\u003c c\r\na = b \u003e\u003e c\r\na = b \u003e\u003e\u003e c\r\na = b | c\r\na = b \u0026 c\r\n```\r\n\r\n### Block comment\r\n```\r\n/*\r\n\tMy block comment\r\n*/\r\nprint(\"test\")\r\n```\r\n\r\n### Filename expression\r\n```\r\nprint(#filename)\r\n```\r\nThe filename expression will be replaced with the string literal containing the name of the file before transpiling. Can be useful for debugging.\r\n\r\n### Line expression\r\n```\r\nprint(#line)\r\n```\r\nThe line expression will be replaced with the number literal containing the line of the expression before transpiling. Can be useful for debugging.\r\n\r\n### Envar expression\r\n```\r\nprint(#envar MY_TEST_VAR)\r\n```\r\nThe envar expression will be replaced with the value of the provided environment variable. Make sure you defined an environment variable for the provided namespace if there is no value found it will instead use `null`.\r\n\r\n### Inject expression\r\n```\r\nprint(#inject \"path/to/file\";)\r\n```\r\nThe inject expression will be replaced with the content of whatever file exists at the provided path. In case the file does not exist it will be replaced with `null`. Content that gets injected will automatically be escaped.\r\n\r\n# Interpreter\r\n```\r\nInterpreter CLI\r\nExample: greybel execute \u003cmyscriptfile\u003e\r\n\r\nArguments:\r\n\tmyscriptfile\t\t\tFile to execute\r\n\r\nOptions:\r\n  -si, --silence              Silences any uncessary noise.\r\n  -p, --params \u003cparams...\u003e    Defines params used in script execution.\r\n  -i, --interactive           Enter params in interactive mode instead of arguments.\r\n  -d, --debug                 Enable debug mode which will cause to stop at debugger statements.\r\n  -s, --seed \u003cseed\u003e           Define seed value which is used to generate entities.\r\n  -ev, --env-files \u003cfile...\u003e  Specifiy environment variables file.\r\n  -vr, --env-vars \u003cvar...\u003e    Specifiy environment variable definition.\r\n```\r\n\r\nFor Windows, you can use something like PowerShell or [ConEmu](https://conemu.github.io/). Or just use the UI. GitBash is not recommended due to a [TTY issue with node](https://github.com/ayecue/greybel-js/issues/34).\r\n\r\n## Dependency Management (Interpreter)\r\n\r\nDependencies will be dynamically loaded into the execution without any limitations. Cyclic dependencies are supported as well.\r\n\r\n## Environment Variables (Interpreter)\r\n\r\nGreybel supports the injection of environment variables for the interpreter as well. The way CLI parameters are used is identical to the ones of transpiling.\r\n\r\n1. Use the `--env-files` CLI parameter to [define environment variables configuration files](/example/environment-variables/env.conf).\r\n2. Use the `--env-vars TEST=\"hello world\"` CLI parameter to define variables on the fly.\r\n\r\nHere is an [example](/example/environment-variables) of environment variable injection.\r\n\r\n## Local environment\r\n\r\n[Greybel GreyHack Intrinsics](https://github.com/ayecue/greybel-gh-mock-intrinsics) will automatically generate a local environment. It will also generate other computers, networks, filesystems etc on the fly. Generating is by default based on a seed called `test`. The seed can be modified with the seed option. While using the same seed-generated entities should stay consistent.\r\n\r\nThe local computer setup is hard coded. The admin credentials are `root:test`. You will also have `crypto.so` and `metaxploit.so` on your local computer available.\r\n\r\nExamples:\r\n```\r\nmetax = include_lib(\"/lib/metaxploit.so\") //returns metaxploit interface\r\nprint(metax) //prints metaxploit\r\n\r\nmyShell = get_shell(\"root\", \"test\") //get local root shell\r\n```\r\n\r\n## Greyscript API support\r\n\r\nThe intrinsics to support the Greyscript API are provided by [Greybel Intrinsics](https://github.com/ayecue/greybel-intrinsics) and [Greybel GreyHack Intrinsics](https://github.com/ayecue/greybel-gh-mock-intrinsics). Keep in mind that not all of these functions are completely mocked. Also, only API that is available in the stable build will be implemented.\r\n\r\nNot yet supported:\r\n- `AptClient` - only polyfill which \"returns not yet supported\"\r\n- `Blockchain` - only polyfill which \"returns not yet supported\"\r\n- `Wallet` - only polyfill which \"returns not yet supported\"\r\n- `SubWallet` - only polyfill which \"returns not yet supported\"\r\n- `Coin` - only polyfill which \"returns not yet supported\"\r\n\r\n## Debugger (CLI)\r\nPauses execution and enables you to inspect/debug your code. Additionally, you'll be able to inject code.\r\n```\r\nindex = 1\r\nprint(\"Hello world!\")\r\ndebugger\r\nprint(\"Another string!\")\r\n```\r\n\r\n## TextMesh Pro Rich Text support (CLI)\r\n[TextMesh Pro Rich Text](http://digitalnativestudios.com/textmeshpro/docs/rich-text/) is partially supported.\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003eSupports\u003c/summary\u003e\r\n\r\n* color\r\n* mark\r\n* underline\r\n* italic\r\n* bold\r\n* strikethrough\r\n* lowercase\r\n* uppercase\r\n\u003c/details\u003e\r\n\r\nNote: For the CLI feature Greybel will try to transform TextMesh Pro Rich-Text tags into ANSI-Codes. Due to the nature of TextMesh Pro Rich-Text tags some formatting will get lost. If you are looking for a proper preview of your output in Grey Hack please check out [the preview output feature from the VSCode extension](https://github.com/ayecue/greybel-vs?tab=readme-ov-file#preview-output).\r\n\r\n## TestLib\r\nAdds testing methods for setting up envs and debugging. Keep in mind that this library is not available in the actual game.\r\n```\r\ntestLib = include(\"/lib/testlib.so\")\r\n\r\n// returns all active shell sessions\r\nsessions = testLib.sessions\r\n\r\n// can be used to generate routers, get_router will do the same\r\nrouter = testLib.get_or_create_router(\"12.12.12.12\")\r\n\r\n// can be used to get all computers with root access which are related to router\r\ncomputers = testLib.get_computers_connected_to_router(router)\r\ncomputer = computers.values[0]\r\n\r\n// can be used to receive root shell of certain computer\r\nshell = testLib.get_shell_for_computer(computer)\r\n\r\n// can be used to receive root shell of certain file\r\nshell = testLib.get_shell_for_file(computer.File(\"/lib\"))\r\n\r\n// can be used to receive computer with root access of certain file\r\ncomputer = testLib.get_computer_for_file(computer.File(\"/lib\"))\r\n\r\n// can be used for debugging purposes, will return current stack trace\r\ntest = function\r\n\tprint(testLib.get_stack_trace)\r\nend function\r\n\r\ntest\r\n```\r\n\r\n# Import\r\n```\r\nImport CLI\r\nExample: greybel import \u003cmyscriptfile\u003e\r\n\r\nArguments:\r\n\ttargetpath                  File or folder to import\r\n\r\nOptions:\r\n  -V, --version                                  output the version number\r\n  -id, --ingame-directory \u003cingameDirectory\u003e      In-game directory target path.\r\n  -h, --help                                     display help for command\r\n```\r\n\r\n# REPL\r\n```\r\nREPL CLI\r\nExample: greybel repl\r\n```\r\n\r\nFor Windows, you can use something like PowerShell or [ConEmu](https://conemu.github.io/). Or just use the UI. GitBash is not recommended any more due to a [TTY issue with node](https://github.com/ayecue/greybel-js/issues/34).\r\n\r\nREPL also features a [local environment](#local-environment) and [GreyScript API support](#greyscript-api-support)\r\n\r\n# Web-UI\r\n```\r\nWeb UI CLI\r\nExample: greybel ui\r\n```\r\n\r\nSimple UI which can be used for [minifying](#transpiler) and [executing](#interpreter) code. There is also a [VSCode extension](https://github.com/ayecue/greybel-vs) which includes a lot of neat features. Like for example a debugger with breakpoints etc.\r\n\r\n![Web UI](/assets/emulator-ui-preview.png?raw=true \"Web UI\")\r\n\r\n## Share code\r\n\r\nThis functionality can be used to share code with others without saving it. Keep in mind that the URL might become very long and may even exceed the URI size accepted by the online UI. If you want to share code without this limitation use the [save code functionality](#save-code) instead.\r\n\r\n## Save code\r\n\r\nThis functionality can be used to save and also share code with others. Every time save is pressed a new id will get generated and appended to the browser URL which enables you to just copy and paste the URL and share your code with others.\r\n\r\n## Debugger (Web-UI)\r\n\r\n![Debugger UI](/assets/debugger-ui-preview.png?raw=true \"Debugger UI\")\r\n\r\n## TextMesh Pro Rich Text support (Web-UI)\r\n[TextMesh Pro Rich Text](http://digitalnativestudios.com/textmeshpro/docs/rich-text/) is partially supported.\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003eSupports\u003c/summary\u003e\r\n\r\n* color\r\n* mark\r\n* underline\r\n* italic\r\n* bold\r\n* strikethrough\r\n* lowercase\r\n* uppercase\r\n* align\r\n* cspace\r\n* lineheight\r\n* margin\r\n* nobr\r\n* pos\r\n* size\r\n* voffset\r\n* indent\r\n\u003c/details\u003e\r\n\r\nNote: For the UI feature Greybel will try to transform TextMesh Pro Rich-Text tags into HTML. But due to the nature of TextMesh Pro Rich-Text tags some formatting will get lost. If you are looking for a proper preview of your output in Grey Hack please check out [the preview output feature from the VSCode extension](https://github.com/ayecue/greybel-vs?tab=readme-ov-file#preview-output).\r\n\r\n# Todo\r\n\r\n* implement missing intrinsics\r\n* improve mock environment\r\n\r\n# Contact\r\n\r\nIf you have any questions, feature requests or need help feel free to join the [dedicated Greybel Discord](https://discord.gg/q8tR8F8u2M).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fayecue%2Fgreybel-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fayecue%2Fgreybel-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fayecue%2Fgreybel-js/lists"}