HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
liftoff
GateOne
JavaScript2011–2024
liftoff / GateOne

GateOne

Gate One is an HTML5-powered terminal emulator and SSH client

12Distinct people
29Mentions
1Explicit recommenders
6.3KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Gate One is an HTML5-powered terminal emulator and SSH client

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

Just curious: Have you tried Gate One at all? https://github.com/liftoff/GateOne I wrote it to solve the problem of, "I need to SSH right now but I don't want to install…

riskable used a recommendation phrase. 2 indexed comments match. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:03:16 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year29 dated mentions

Observed mentions: 2011-10-13 19:36:15 UTC to 2024-04-05 16:28:37 UTC.

02468102011-01-01 00:00:00 UTC to 2012-01-01 00:00:00 UTC (exclusive): 2 mentions; 1 submissions, 1 comments20112012-01-01 00:00:00 UTC to 2013-01-01 00:00:00 UTC (exclusive): 4 mentions; 1 submissions, 3 comments2013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 10 mentions; 2 submissions, 8 comments2014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments20172018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2024

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20112011-01-01 00:00:00 UTC2012-01-01 00:00:00 UTC211
20122012-01-01 00:00:00 UTC2013-01-01 00:00:00 UTC413
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC1028
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC404
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC101
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC404
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC202
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC000
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC000
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC000
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC101
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC000
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC000
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC101

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
About Gate One Gate One is an HTML5 web-based terminal emulator and SSH client. Top features: No browser plugins required! Say goodbye to the security problems of Java, Flash, and ActiveX. Multi-user and multi-terminal: Hundreds of simultaneous users and terminals can be served from ho-hum hardware. Advanced terminal emulation including support for 256 colors, fancy text styles, and more. Supports capturing and displaying images and PDFs inline within terminals (see screenshots). Type in your native language! Gate One supports Unicode, international keyboard layouts, and localized strings (internationalization or i18n). Natural copy & paste: Highlight text and use your browser's native context menu. On Macs you can use ⌘-c and ⌘-v and on Linux desktops you can middle-click-to-paste. Shift-Insert works too! Terminal sessions can be resumed even if the browser is closed or disconnected. They can also be resumed from a completely different computer. You'll never have to worry about the office VPN disconnecting again! Supports server-side logging of user sessions via any combination of syslog, remote syslog, or directly to disk. Gate One can be embedded into any web application. A few lines of JavaScript is all it takes! There's an interactive tutorial covering how to embed available in the tests directory (hello_embedded). Many authentication mechanisms are supported: Anonymous, Kerberos (Single Sign-On with Active Directory!), PAM, Google Auth, and there's an OpenID-like WebSocket API for applications embedding Gate One (see the chat app in the tests directory for an example of how it works). Gate One is easy to customize: Themes and plugins can add features or override just about anything. In fact, Gate One's SSH functionality is implemented entirely via a plugin. Plugins can be written in any combination of Python, JavaScript, and CSS. The Gate One server can be stopped & started without users losing their running terminal applications (even SSH sessions stay connected!). The SSH plugin allows users to duplicate sessions without having to re-enter their username and password (it re-uses the existing SSH tunnel). It also supports key-based authentication and includes an SSH identity manager that supports RSA, DSA, ECDSA, and even X.509 certificates. The SSH plugin also provides a library of functions that other plugins can use to seamlessly execute background operations on the currently-connected terminal. You can capture this output from JavaScript and do whatever you want with it. The Bookmarks plugin lets you keep track of all of your hosts with support for tagging, sorting, and includes a super fast search. It was built to handle thousands of bookmarks and can be used with whatever URLs you want--it isn't limited to SSH! The Logging plugin includes a Log Viewer that allows users to sort, view, and even export recordings of their terminal sessions to self-contained HTML files that can be shared. Demonstrating anything on the command line can be as simple as performing the task and clicking a button! The Playback plugin allows users to rewind and play back their connected terminal sessions in real-time, just like a video! This can be done via the playback controls or by holding the shift key while scrolling. The Convenience plugin adds many convenient capabilities: IPv4 and IPv6 addresses become clickable elements that can perform a reverse DNS lookup. The output of 'ls -l' is transformed into clickable elements that can perform user and group lookups, convert bytes into human-readable strings, and even tell you what the 'chmod equivalent' is of the permissions field (e.g. clicking on 'crw-rw-rw-' would tell you, "(Character Device) with permissions equivalent to 'chmod 0666'"). Automatic syntax highlighting of syslog messages. The Example plugin demonstrates how to write your own plugins and shows off the SSH plugin's exec_remote_command() functionality. Gate One works with Python 2.6+, Python 3, and even pypy! The daemon that acts as the web server for Gate One is small and light enough to be included in embedded devices. License Gate One is dual licensed: AGPLv3 or Commercial Licensing. More information can be found at http://liftoffsoftware.com/ Screenshots The Grid View showing multiple terminals Displaying images inline in a terminal A demonstration of some of the Convenience plugin's capabilities The Example plugin showing off the real-time load graph and the 'top' widget Documentation The documentation for Gate One can be found here: http://liftoff.github.com/GateOne/ Also, all (this) documentation is in the "gateone/docs" directory. The HTML form is pre-built and ready-to-read. Demo Just press the ESC key on any page at http://liftoffsoftware.com/ to have Gate One drop down into view, Quake-style! Other Notable Bits Gate One's termio and terminal Python modules can be used together to automate, screen-scrape, and completely control terminal applications. The expect() function can be used as a replacement for pexpect that has some additional features and benefits: It can be used asynchronously: It won't block which means it is perfect for executing commands from a web application. It supports sophisticated decision trees and callbacks: You can completely re-define all patterns and callbacks on-the-fly based on whatever conditions you want.
Read the full README on GitHub

What Hacker News says

29 sources
It was Gate One: https://github.com/liftoff/GateOne (Note: Company no longer exists so it is unmaintained, fork at will =) It's been so long since I've looked at the code but I did write excellent documentation, most of which is generated from docstrings. Example: https://github.com/liftoff/GateOne/blob/master/gateone/core/... You can read the documentation here: https://liftoff.github.io/GateOne/ If you look at the bookmarks plugin you can see an example of how I performed this style of client<->server synchronization using an Update Sequence Number (USN): https://github.com/liftoff/GateOne/blob/6ae1d01f7fe21e2703bd... After the web client connects to the websocket all the plugin's `init()` methods are called and the bookmarks plugin's javascript file calls `userLoginSync()`: https://github.com/liftoff/GateOne/blob/6ae1d01f7fe21e2703bd.
Read the rest
.. It sends the current USN (which is retrieved from `localStorage`) to the server (the routing is quite sophisticated... Just know that the message ends up going to the correct function =) and if it's different from the USN on the server the server will send an updated list of bookmarks to the client at which point the client will take care of that via its own handler: https://github.com/liftoff/GateOne/blob/6ae1d01f7fe21e2703bd... If you examine the bookmarks.js from top to bottom (it's not THAT long) you should get the gist of where and how various states are stored. That plugin mostly deals with stuff in `localStorage` but if you poke around in Gate One you'll see vastly more sophisticated state synchronization and state update routines at work.
In LiveView Is Best with Svelte
There are many related attempts to make the terminal more modern, by including some HTML in it, improved auto-completion, and many other ideas. For example: - TermKit (https://github.com/unconed/TermKit, https://news.ycombinator.com/item?id=2559734) - GateOne (https://github.com/liftoff/GateOne) - DomTerm (https://domterm.org/) - Extraterm (https://extraterm.org/) - GraphTerm (https://github.com/mitotic/graphterm) - HTerm (https://news.ycombinator.com/item?id=7539648) - Terminology (https://www.enlightenment.org/about-terminology) I wonder about the state of these, or in general about terminal emulators. I really miss some extended features, like foldable text (https://gitlab.freedesktop.org/terminal-wg/specifications/-/...) or even just standardized image support (https://gitlab.freedesktop.org/terminal-wg/specifications/-/...). And mayb
Read the rest
e this could be further extended to also directly support sth like this autocomplete support. It becomes tricky when you think about how this works well together with tmux, SSH, Mosh, etc.
In Launch HN: Fig (YC S20) – Autocomplete for the Terminal
No need for an XMLHttpRequest when you've got a websocket open to retrieve such scripts. In fact, loading your scripts via a websocket can be faster than loading them via parallel vanilla HTTP requests because the websocket won't have the overhead associated with GETs (no new TCP connections or headers to slow you down). Furthermore, if you cache said scripts in, say, IndexedDB you can just perform out-of-date checks via the websocket and only re-sync those scripts that have changed on the server resulting in even faster load times. This works and it's great. How do I know? I implemented such a solution in Gate One a few years ago: https://github.com/liftoff/GateOne It also has the added benefit of making embedding a web application into another so much easier. Because you can just load a tiny little script on a page that makes just one c
Read the rest
onnection to an external websocket and can load everything from that in an instant.
In [dead]
This seems very similar to the system I came up with to reduce load times for JavaScript and CSS assets in Gate One a few years ago: https://github.com/liftoff/GateOne/blob/master/gateone/core/... Instead of letting the browser figure out which assets to load--using multiple GET requests--it delivers assets over the existing WebSocket connection and also caches those assets at the client in IndexedDB. So the client only ever has to download JavaScript/CSS assets once unless they change on the server (in which case they'll get re-synchronized automatically). The mechanism loads much faster than allowing the client browser to perform all those (latency-unfriendly) GET requests. It is also superior to file concatenation since you can change any individual asset without having to worry about the impact of all clients having to re-download t
Read the rest
hat one huge concatenated file.
In Polaris: Faster Page Loads Using Fine-grained Dependency Tracking [pdf]
...which creates another problem with optimization: As soon as you make a change--no matter how small--to a single one of those concatenated assets you now have to deliver the entire new combined asset to the client. If you make changes to your JS/CSS assets on a regular basis (rapid iteration anyone?) this means your clients might be best served via individual assets (depending on your traffic patterns). I have solved this problem myself by avoiding concatenation and using the browser's IndexedDB to store assets that can be loaded dynamically (JS, CSS, and client-side templates). Assets like this get downloaded over a WebSocket connection which provides the same advantage of SPDY in that no re-negotiation is necessary. You can see the implementation of this here: https://github.com/liftoff/GateOne/blob/master/gateone/core/... ...and t
Read the rest
he client side code is here: https://github.com/liftoff/GateOne/blob/master/gateone/stati... (Including the functions immediately following that one)
In Why we don’t use a CDN: A story about SPDY and SSL (2014)
> What use is there for client side JS crypto? Uploading encrypted files over HTTP. A JavaScript SSH client[1] for throwaway servers. Client-side password hashing to prevent passive MITMs to find raw passwords. These are not as secure as their native counterpart, and I don't claim they are. Nor do I claim they are resilient to active MITM attacks in the JS delivery. But they are protected from having their data logged in plain by passive MITM eavesdroppers, and that means that they may be useful to people who are aware of the security they don't have but appreciate the convenience of what they do have. This is all I'm saying. Just like OpenSSH without server keys is vulnerable to MITM attacks, but still both useful and protected from eavesdropping. Just like people use plain Diffie-Hellman to negotiate a shared key, despite lack of authen
Read the rest
tication. Sometimes the active attack is simply not considered a problem, or the risk is simply accepted [2]. This is not a recommendation. This is a discussion about people having different requirements and uses. Almost all JS crypto used on the public internet does it wrong. But that doesn't mean that JS crypto is 100% wrong in any conceivable case. Most people using it are just stupid. [1]: https://github.com/liftoff/GateOne [2]: Choosing which risks to accept or not is daily practice for anyone dealing with security issues.
In JavaScript Cryptography Considered Harmful
You want to know what AjaxTerm would be like today? Look at Gate One: https://github.com/liftoff/GateOne When I wrote my first web-based terminal (Escape From The Web) it was based on AjaxTerm. It kinda sucked for more than one terminal at a time so I went back to the drawing board and wrote Gate One. It turned out great (if I do say so myself!) and soon it will support running X11 applications as well (see: http://youtu.be/6zJ8TNcWTyo)
In Butterfly: Your everyday terminal in your web browser
Well right off the bat: You don't have to install anything. You also don't need to worry about updating a thousand clients if a security problem crops up--you just update the server and you're done. Also, in terms of "why" there's all sorts of neat things you can do with a web browser that aren't so easy with regular terminals. For example, displaying inline images (if you code it right). Gate One can display images, PDFs, and play back sound files right there in your terminal if you do something as simple as 'cat somefile.png' or 'cat somefile.ogg'. Source to Gate One (also has some screenshots of the aforementioned features): https://github.com/liftoff/GateOne The other nice thing is that you can use it through basically any proxy server (provided it doesn't "speed bump" you--breaking WebSocket connections).
In Butterfly: Your everyday terminal in your web browser
You mean like Gate One (https://github.com/liftoff/GateOne)? Right now it's just an HTML5 terminal/SSH client but soon it will also do X11 (video demo): http://www.youtube.com/watch?v=6zJ8TNcWTyo It will basically do the same thing as Mainframe2 except it'll be open source and you'll be able to run it (the server) wherever you like. I've been working on the X11 support quite a lot over the past few weeks... Hopefully the public beta will be ready soon.
In Mainframe2: Run any software in a browser
riskable·Nov 6, 2013Submission

Ask HN: How should I sell my HTML5 X11/remote desktop app?

I'm nearing beta-quality in my X11 app for Gate One (https://github.com/liftoff/GateOne). It is fast/efficient enough that you could open VLC in your browser and play back a video (proof: http://youtu.be/6zJ8TNcWTyo). Just like terminals you'll be able to embed it into your own site/app and open/host X11 applications (e.g. LibreOffice, RDP/VNC clients, web browsers, etc etc). Right now Gate One (and its Terminal app) are open source (AGPLv3) with a commercial license available. It's not making much money with that business model--despite hundreds of thousands of devices shipped with Gate One and several SaaS platforms using it. So I've come to HN to ask for advice: How should I license the X11 app? Something like a free trial with reminders that you need to pay (like Sublime Text 2)? If I do that how much should I charge? How do I
Read the rest
differentiate the pricing for businesses that just want to show off their application on their website from businesses that want to use it as a replacement for Citrix? I have my own ideas for all these things but I want to see what the HN community thinks.
2 points · Open discussion

Showing the 15 most recent of 29 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.