Hi all, I'm one of the maintainers of xterm.js, open to answer any questions!
Here's a little history on the project, some of which is already called out in other comments:
- Fabrice Bellard created jslinux[1].
- Christopher Jeffrey (@chjj) forked the terminal component into term.js[2], this eventually became unmaintained.
- Paris Kasidiaris (@parisk) forked it into xterm.js for use in SourceLair[3].
- I showed up around 2016 when investigating options for VS Code's integrated terminal and eventually joined as a maintainer, spending a good deal of my time at work on the project since then.
We currently have 5 active maintainers in the xterm.js team as well which I'd like to call out because the project has only come this far as a result of everyone's efforts.
I just want to say thanks, I have been experimenting with using xterm.js to connect to terminal API in jupyter notebooks and it has worked really well, plug and play (even editors like vim were working without any extra effort).
Before that I was experimenting with using it as a custom shell for running commands inside a web application. In that use case it was a bit more challenging because I had never written to an actual tty before (ansi escape codes for coloring log files has been about the limit of my experience). For that use case I just really needed to send and receive text. I ended up using this library [ https://github.com/wavesoft/local-echo ] to smooth that process out until I could learn about how to do things properly.
Are any suggestions on:
1. where to learn about how ttys work to do things the right way, or
2. suggested libraries like local-echo that can wrap over some of the trickier bits of just getting text on the screen?
Thanks again for maintaining such a great & useful library!
2. The library you mention is the one I'm aware of, I have a WIP for building a basic shell in JS that I will probably open source eventually if I have the time.
Xterm.js is really impressive in what it can do, but it was pretty tough to get started with as someone who just wanted to pipe shell input/output over HTTP requests to a server. I realize streamlining that usecase is probably out of scope for the Xterm team, but I think there's a space for either some tutorials or a higher-level wrapper library
Whenever people say that the “10x developer” is a myth, I point them to Fabrice Bellard, who would easily be 100 times more productive than your average developer at pretty much any task you give him. The sheer diversity of problems he’s solved with extremely high quality software is astounding.
True, he’s mind-bogglingly amazing. Also still probably not a helpful example to developing a sane working group or good office dynamics. He’s a unicorns unicorn.
First of all it is a wonderful project. It is included in VS Code and works flawlessly for me most of the time. Not to mention the countless web implementations around it
Maybe it's a pet peeve of mine but I do not understand how to select stuff when the Terminal application steals the select function.
Example: you open tmux with option "mouse on" - when you click and drag tmux "steals" the selecting function and makes it an internal selection/copy/paste feature. But if I happen to be connected via ssh or something I want the terminal emulator to ignore that stealing and let me select some text instead to my own clipboard. In most other terminal emulator there is some shortcut to do just that, I never understood if the option is present in xterm.js too.
VS Code has the terminal.integrated.macOptionClickForcesSelection setting which will let you to alt+drag to use xterm.js' selection as opposed to tmux's selection. On Linux and Windows I believe it's shift+drag.
I'm an educator and I to teach things like symmetric cryptography. I just used full virtual machines in class to demonstrate ccrypt to encrypt and decrypt files. Would xterm.js be a valid way to implement that kind of exercise to avoid relying on virtual machines? Do you know of any resources that would point me in the right direction for building educational exercises?
(Shameless but relevant example.) On https://CoCalc.com [1], you can create a project and click +New-->Terminal to get an *xerm.js based terminal*, then upload the ccrypt source code (download and upload the tarball from [2]), extract it, and build it in a few seconds via "./configure && make". You can then run it via "src/ccrypt". I'm also an educator, and created CoCalc mainly for teaching (it has course management functionality).
Hi, I'm Dennis, and I've been working on my own browser based OS for a decade. You can check out the "web native" CLI at https://denix.xyz/shell.os. Replace "shell" with "desk" to get to a friendly gui. Then we can start talking about browser-based encryption techniques. For simple command line utilities, porting via WebAssembly is always a thought. The way Denix works in the CLI is that you have to import command libraries. There is a library called crypto with 2 commands that you can import by typing into the prompt: "import crypto". Entering that command should give you the commands "encrypt" and "decrypt" in your runtime environment. It's been maybe a couple of years since I worked on that stuff, but I just tested "encrypt" and it seemed to be working. A word of caution: Denix is very much a chrome thing.
Thanks. I was curious because the demo on the homepage doesn't appear to be communicating with a backend. (The xterm.js code just seems to interact with https://xtermjs.org/js/demo.js.) So I guess this demo presented an experience that people should expect with xterm.js, but not necessarily the standard implementation.
If you don't need to rely on ccrypt and just want to emulate teh experience of using it, you could have an on rails experience by forking the demo file and adapting the commands part.
Thank you and everyone else involved. I tried reading the source code of many terminal emulators, found them to be really difficult to understand. This project helped me understand terminals better.
It should fare fairly well, at least for the most common sequences. We have detailed what VT features we support on the website[1]. Some things that stand out that I know won't work are blinking and double height/width text.
I cringe every time at the name "torture test". Prime95 uses it too for example. Is it really a torture for a software to demonstrate each of its features? Or for my CPU to work at near 100%? So insensitive.
I used to use it some years back when I was still on Windows and using Chrome. It was pretty good for a Windows environment. For a Linux/Mac environment, it doesn't come close to a proper terminal emulator. It'll do the job, but I recall there were a few things that were annoying.
I've used this to create recorded terminals to Kubernetes for an internal app I built. We'd basically proxy the kube exec socket endpoint with a write log so we can playback what folks did.
I wrote a VT100 emulator in PostScript for NeWS in 1987! I worked for a company called Wedge Computer (ha ha!), who ported NeWS to the Mac II running A/UX, which needed a way to connect to Unix servers from NeWS without running a terminal emulator client remotely. It could passed vttest!
just throwing a related idea in here in the hopes someone finds it interesting enough to develop.
Having a very simple cli app generator that allows one to have independent terminal applications that run just like normal app. Independent in the sense that you can open them as any other app, run on their own window, and and you can reach them through the app switcher.
If you're on a Mac, you can do this with AppleScript.
If you open the Script Editor, you can use this chunk of code to get started:
tell application "Terminal"
do script "~/test.sh"
end tell
This will run the script ~/test.sh in a new terminal window. Closing the window automatically is a bit more difficult, but it can also be done. You can save this as an Application, which will let you click to open it, just like any other application.
This is related to some issue with Safari's new WebGL 2 implementation they shipped recently[1]. Currently we disable the webgl renderer on Safari inside github.dev/codespaces to work around this.
Love xterm.js! We use it to stream logs and as an in-browser terminal for our upcoming CI[1]. It's blazing fast especially with the WebGL renderer turned on.
term.js was originally created by Fabrice Bellard -- see the headers of @chjj's term.js file [1]. Bellard wrote term.js since he needed a way to interact with his amazing port [2] of Linux to a web browser. Term.js had a non-open-source license and @chjj spent time a decade ago successfully convincing Bellard to relicense term.js open source (I watched and greatly appreciated this as it happened!). Xterm.js is a very significant rewrite and improvement of term.js, mostly done by Daniel Imms who is on the VS Code team at Microsoft; xterm.js is a great contribution of Microsoft to open source, and is used at VS Code's terminal. I watched all this happen over the years, visited Daniel at Microsoft, etc.; I think this is all very useful tech (e.g., we use it in JupyterLab and CoCalc).
Just to clarify, xterm.js is not a Microsoft project and tries to remain neutral, but MS is essentially sponsoring it through my work. Also, a good deal of my time spent working on it particularly early on was for the love/fun of it in my spare time. The WebGL renderer for example was a pure fun personal exercise.
This is a great project. I played with it a few years ago to create a tiled ssh client in Electron as a proof of concept for an idea I had and it was very easy to integrate. It has only gotten better since then with all the love from the Microsoft sponsored commits (it is used in VSCode).
Would somebody (if reading this) want to be generous and help me out? I'm not a programmer. I'd wish to use xterm.js in either a md or the mdx file (looking to incorporate a terminal in docusaurus site). My google-fu fails me for this.
A malicious website would have a hard time capturing (or injecting) info an OS terminal running on an entirely different process than it would on a browser with imperfect context separation.
That a terminal in the browser can't make ssh connections without a separate http or websocket bridge complicates that. Depends on that bridge and who/how/where it's running.
When was the last case when a malicious website or script could capture content or keystrokes directed at another tab? Really curious, because it seems an obvious attack vector.
At least in the last decade, I don’t think that’s even possible on the “big” browsers. There were vulnerabilities involving <iframe>s, but I don’t know enough about those.
Of course it is. In most cases you do not have any sort of guarantees regarding the browser (which it self usually is more complex piece of software than all your operating system and it's accessories calculated together - difficult to audit - known to collect metrics etc etc). In addition one can sandbox their local terminal pretty effectively - With Tomoyo or some other MAC technology. It's not so bad idea to actually isolate your browser too (with Mandatory Access Control) - It usually has no business for a global view on your filesystem or local network resources.
I tend to disagree. The fact, that a browser engine and JS is involved raises the bar significantly during security audits. It brings additional third-party players into the chain you have to trust. Meanwhile I suggest to read https://xtermjs.org/docs/guides/security/.
Here's a little history on the project, some of which is already called out in other comments:
- Fabrice Bellard created jslinux[1].
- Christopher Jeffrey (@chjj) forked the terminal component into term.js[2], this eventually became unmaintained.
- Paris Kasidiaris (@parisk) forked it into xterm.js for use in SourceLair[3].
- I showed up around 2016 when investigating options for VS Code's integrated terminal and eventually joined as a maintainer, spending a good deal of my time at work on the project since then.
We currently have 5 active maintainers in the xterm.js team as well which I'd like to call out because the project has only come this far as a result of everyone's efforts.
[1]: https://bellard.org/jslinux/
[2]: https://github.com/chjj/term.js
[3]: https://www.sourcelair.com/
EDITS: Formatting