{"id":39807129,"url":"https://github.com/intersystems-community/webterminal","last_synced_at":"2026-01-18T12:39:35.925Z","repository":{"id":9458632,"uuid":"11339953","full_name":"intersystems-community/webterminal","owner":"intersystems-community","description":"The first and the most powerful web-based terminal for InterSystems IRIS®, InterSystems Caché®, Ensemble®, HealthShare®, TrakCare® and other products built on top of InterSystems Data Platforms.","archived":false,"fork":false,"pushed_at":"2024-04-24T21:27:43.000Z","size":5169,"stargazers_count":78,"open_issues_count":24,"forks_count":33,"subscribers_count":36,"default_branch":"master","last_synced_at":"2024-04-24T22:30:00.357Z","etag":null,"topics":["cacheobjectscript-udl","intersystems","intersystems-cache","intersystems-ensemble","intersystems-iris","terminal","terminal-emulators"],"latest_commit_sha":null,"homepage":"https://intersystems-community.github.io/webterminal","language":"ObjectScript","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/intersystems-community.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}},"created_at":"2013-07-11T11:10:04.000Z","updated_at":"2024-04-24T21:27:47.000Z","dependencies_parsed_at":"2023-01-11T20:12:16.700Z","dependency_job_id":null,"html_url":"https://github.com/intersystems-community/webterminal","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/intersystems-community/webterminal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intersystems-community%2Fwebterminal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intersystems-community%2Fwebterminal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intersystems-community%2Fwebterminal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intersystems-community%2Fwebterminal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/intersystems-community","download_url":"https://codeload.github.com/intersystems-community/webterminal/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intersystems-community%2Fwebterminal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28536003,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T10:13:46.436Z","status":"ssl_error","status_checked_at":"2026-01-18T10:13:11.045Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["cacheobjectscript-udl","intersystems","intersystems-cache","intersystems-ensemble","intersystems-iris","terminal","terminal-emulators"],"created_at":"2026-01-18T12:39:35.323Z","updated_at":"2026-01-18T12:39:35.911Z","avatar_url":"https://github.com/intersystems-community.png","language":"ObjectScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Web Terminal\n\n[![Gitter](https://img.shields.io/badge/chat-on%20telegram-blue.svg)](https://t.me/joinchat/FoZ4M0jbeW8PVp2l5tqrgg)\n\nWeb-based terminal for InterSystems products. Access your database from everywhere!\n\n+ Visit the [project's page](http://intersystems-community.github.io/webterminal) for more details. \n+ **Download** the latest version from [here](http://intersystems-community.github.io/webterminal/#downloads).\n+ Read more and discuss WebTerminal on [InterSystems Developer Community](https://community.intersystems.com/post/cach%C3%A9-webterminal-v4-release).\n+ Read [complete documentation](http://intersystems-community.github.io/webterminal/#docs) about WebTerminal.\n\n### Preview\n\nSyntax highlighting \u0026 intelligent autocomplete!\n\n![2016-09-18_212035](https://cloud.githubusercontent.com/assets/4989256/18618027/33a4b544-7de6-11e6-9bf5-a535a2dc4bca.png)\n\nEmbedded SQL mode!\n\n![2016-09-18_212244](https://cloud.githubusercontent.com/assets/4989256/18618029/33a7183e-7de6-11e6-9a98-cceacca7b078.png)\n\nEven more features!\n\n![2016-09-18_212325](https://cloud.githubusercontent.com/assets/4989256/18618028/33a4c246-7de6-11e6-9ee9-4970223b0b31.png)\n\n### Key Features\n\u003ctable\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd class=\"info\"\u003eNative browser application\u003c/td\u003e\n\t\t\u003ctd\u003eAllows to access Caché terminal both from desktop and mobile devices.\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd class=\"info\"\u003eAutocompletion\u003c/td\u003e\n\t\t\u003ctd\u003eType faster. Autocomplete is available for class names, variable and global names, methods, properties, etc.\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd class=\"info\"\u003eTracing\u003c/td\u003e\n\t\t\u003ctd\u003eMonitor any changes in globals or files.\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd class=\"info\"\u003eSQL mode\u003c/td\u003e\n\t\t\u003ctd\u003eA convenient way to execute SQL queries.\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd class=\"info\"\u003eSyntax highlighting\u003c/td\u003e\n\t\t\u003ctd\u003eIntelligently highlighted input both for ObjectScript and SQL.\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd class=\"info\"\u003eFavorites\u003c/td\u003e\n\t\t\u003ctd\u003eSave commands you execute frequently.\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd class=\"info\"\u003eSecurity\u003c/td\u003e\n\t\t\u003ctd\u003eAll you need is to protect /terminal/ web application, and all sessions are guaranteed to be secure.\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd class=\"info\"\u003eSelf-updating\u003c/td\u003e\n\t\t\u003ctd\u003eWebTerminal of version 4 and higher prompts to update automatically when new version is available, so you will never miss the important update.\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd class=\"info\"\u003eExplore!\u003c/td\u003e\n\t\t\u003ctd\u003eEnjoy using WebTerminal!\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\nInstallation\n------------\n\nDownload the latest version from the \u003ca href=\"http://intersystems-community.github.io/webterminal/#downloads\"\u003eproject page\u003c/a\u003e and import downloaded XML file into any namespace. Compile imported items and the WebTerminal is ready!\n\nUsage\n-----\n\nAfter installation, you will be able to access application at `http://[host]:[port]/terminal/` (slash at the end is required).\nType `/help` there to get more information.\n\nIntegration and WebTerminal's API\n---------------------------------\n\nTo embed WebTerminal to any other web application, you can use `\u003ciframe\u003e` tag. Example:\n\n```html\n\u003ciframe id=\"terminal\" src=\"http://127.0.0.1:57772/terminal/?ns=SAMPLES\u0026clean=1\"\u003e\u003c/iframe\u003e\n```\n\nNote that terminal URL may include optional GET parameters, which are the next:\n\n+ `ns=USER` Namespace to open terminal in. If the logged user has no access to this namespace,\nthe error message will appear and no namespace changes will occur.\n+ `clean` Start the WebTerminal without any additional information printed. It is not recommended to\nuse this option if you are using terminal as a stand-alone tool (for everyday use), as you can miss\nimportant updates.\n\nTo use WebTerminal's API, you need to get WebTerminal instance first. Use iframe's\n`onTerminalInit` function to get it.\n\n```js\ndocument.querySelector(\"#terminal\").contentWindow.onTerminalInit(function (terminal) {\n    // now work with terminal object here!\n});\n```\n\nThis function is triggered after WebTerminal establish an authorized connection.  \nThe next table demonstrates available API. Left column are `terminal` object properties.\n\n\u003ctable\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eFunction\u003c/td\u003e\n\t\t\u003ctd\u003eDescription\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n        \u003ctd\u003eexecute(\u003cb\u003ecommand\u003c/b\u003e, [\u003cb\u003eoptions\u003c/b\u003e], [\u003cb\u003ecallback\u003c/b\u003e])\u003c/td\u003e\n        \u003ctd\u003e\n            Executes the ObjectScript \u003cb\u003ecommand\u003c/b\u003e right as if it is entered\n            to the terminal. However, \u003cb\u003eoptions\u003c/b\u003e provide an\n            additional flags setup.\u003cbr/\u003e\n            \u003cb\u003eoptions.echo\u003c/b\u003e (\u003cb\u003efalse\u003c/b\u003e by default) - prints the\n            \u003cb\u003ecommand\u003c/b\u003e on the screen.\u003cbr/\u003e\n            \u003cb\u003eoptions.prompt\u003c/b\u003e (\u003cb\u003efalse\u003c/b\u003e by default) - prompts\n            the user after execution (prints \"NAMESPACE \u003e \" as well). If \u003cb\u003ecallback\u003c/b\u003e is passed, \n            the output buffer will come as a first argument of the \u003cb\u003ecallback\u003c/b\u003e function.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n            \u003ctd\u003eonOutput([\u003cb\u003eoptions\u003c/b\u003e], \u003cb\u003ecallback\u003c/b\u003e)\u003c/td\u003e\n            \u003ctd\u003e\n                By default, \u003cb\u003ecallback\u003c/b\u003e(\u003cu\u003estrings\u003c/u\u003e) will be called before the user is\n                prompted for input, and \u003ccode\u003estrings\u003c/code\u003e array will always contain an array of \n                chunks of all the text printed between the prompts. For example, if user writes \n                \u003ccode\u003ewrite 123\u003c/code\u003e and presses \"Enter\", the \u003ccode\u003estrings\u003c/code\u003e will contain\n                this array: \u003ccode\u003e[\"\\r\\n\", \"123\", \"\\r\\n\"]\u003c/code\u003e. However, when user enters\n                \u003ccode\u003ewrite 1, 2, 3\u003c/code\u003e, \u003ccode\u003estrings\u003c/code\u003e will result with \n                \u003ccode\u003e[\"\\r\\n\", \"1\", \"2\", \"3\", \"\\r\\n\"]\u003c/code\u003e. You can join this array with \n                \u003ccode\u003ejoin(\"\")\u003c/code\u003e array method to get the full output.\u003cbr/\u003e\n                Optional \u003ccode\u003eoptions\u003c/code\u003e object may include \u003ccode\u003estream\u003c/code\u003e property, which\n                is \u003ccode\u003efalse\u003c/code\u003e by default. When set to \u003ccode\u003etrue\u003c/code\u003e, \u003cb\u003ecallback\u003c/b\u003e \n                will be fired every time something is printed to the terminal simultaneously.\n            \u003c/td\u003e\n        \u003c/tr\u003e\n\t\u003ctr\u003e\n        \u003ctd\u003eonUserInput(\u003cb\u003ecallback\u003c/b\u003e)\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cb\u003ecallback\u003c/b\u003e(\u003cu\u003etext\u003c/u\u003e, \u003cu\u003emode\u003c/u\u003e) is fired right after user presses enter. \n            Argument \u003ccode\u003etext\u003c/code\u003e is a \u003ccode\u003eString\u003c/code\u003e of user input, and\n            \u003ccode\u003emode\u003c/code\u003e is a \u003ccode\u003eNumber\u003c/code\u003e, which can be compared\n            with one of the terminal mode constants, such as \u003ccode\u003eMODE_PROMPT\u003c/code\u003e.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eremoveCallback(\u003cb\u003ecallback\u003c/b\u003e)\u003c/td\u003e\n        \u003ctd\u003e\n            Remove any previously assigned \u003cb\u003ecallback\u003c/b\u003e. Any function which accepts callback\n            returns it, and you can pass the callback here once you no longer need it to stop it\n            from firing.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eprint(\u003cb\u003etext\u003c/b\u003e)\u003c/td\u003e\n        \u003ctd\u003e\n            Prints \u003cb\u003etext\u003c/b\u003e which can include special characters and\n            escape sequences. This function is input-safe, and you can\n            print event when terminal is requesting for input without\n            disrupting input. In this case the input will reappear\n            right after \u003cb\u003etext\u003c/b\u003e printed. \n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003ctable\u003e\n    \u003ctr\u003e\n\t\t\u003ctd\u003eConstant\u003c/td\u003e\n\t\t\u003ctd\u003eDescription\u003c/td\u003e\n\t\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003eMODE_PROMPT\u003c/td\u003e\u003ctd\u003eRegular input (ObjectScript command)\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003eMODE_SQL\u003c/td\u003e\u003ctd\u003eInput in SQL mode (SQL command)\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003eMODE_READ\u003c/td\u003e\u003ctd\u003ePrompt issued by ObjectScript \u003ccode\u003eread c\u003c/code\u003e command\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003eMODE_READ_CHAR\u003c/td\u003e\u003ctd\u003ePrompt issued by ObjectScript \u003ccode\u003eread *c\u003c/code\u003e command\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003eMODE_SPECIAL\u003c/td\u003e\u003ctd\u003eSpecial CWT's input (commands like /help, /config etc)\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\nThe next example demonstrates a way to intercept terminal's input:\n\n```js\nlet iFrame = document.querySelector(\"#terminal\");\n\nfunction myInitHandler (terminal) {\n    terminal.execute(\"set hiddenVariable = 7\", {\n        echo: false // the default is false, this is just a demo\n    });\n    terminal.onUserInput((text, mode) =\u003e {\n        if (mode !== terminal.MODE_PROMPT)\n            return;\n        terminal.print(\"\\r\\nYou've just entered the next command: \" + text);\n    });\n    terminal.onOutput((chunks) =\u003e {\n        // If you \"write 12\", chunks are [\"\\r\\n\", \"12\", \"\\r\\n\"].\n        // If you \"write 1, 2\", chunks are [\"\\r\\n\", \"1\", \"2\", \"\\r\\n\"].\n        if (chunks.slice(1, -1).join(\"\") === \"duck\") { // if the user enters: write \"duck\"\n            alert(`You've found a secret phrase!`);\n        }\n    });\n}\n\n// At first, handle iFrame load event. Note that the load handler won't work\n// if this code is executed at the moment when iFrame is already initialized.\niFrame.addEventListener(\"load\", function () {\n    iFrame.contentWindow.onTerminalInit(myInitHandler); // handle terminal initialization\n});\n```\n\nWebTerminal Project Development\n-------------------------------\n\nWe are glad to see anyone who want to contribute to Web Terminal development! Check our \n[developer's guide](http://intersystems-community.github.io/webterminal/#docs.5).\n\nTo be short, the \"hot start\" is extremely easy. Having latest [Git](https://git-scm.com/) and\n[NodeJS](https://nodejs.org/en/) installed (tested on NodeJS v4-8), execute the following:\n\n```sh\ngit clone https://github.com/intersystems-community/webterminal\ncd webterminal # enter repository directory\nimport         # build \u0026 import the project. YOU NEED TO EDIT CONSTANTS IN THIS FILE FIRST\n```\n\nNow, in `build` folder you will find `WebTerminal-v*.xml` file. Every time your\nchanges are ready to be tested, just run `import` again. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fintersystems-community%2Fwebterminal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fintersystems-community%2Fwebterminal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fintersystems-community%2Fwebterminal/lists"}