Termsteel is a versatile and sleek web terminal built in python and accessible from a web browser to interact without complexity with the terminal on your machine inspired on Pyxtermjs.

  • By Afi
  • Last update: Dec 14, 2022
  • Comments: 5


Termsteel is a versatile and sleek web terminal built in python and accessible from a web browser to interact without complexity with the terminal on your machine inspired on Pyxtermjs.


  • Easy-to-install: Install Termsteel quickly and easily with no hassle
  • Lightweight: Works seamlessly with minimal hardware and software requirements.
  • Design: a beautiful and responsive web interface to view and interact with your machine's terminal.
  • Scalable: able to handle a lot of data and supports many linux console applications
  • Free: open source software that makes it easy to access your machine.


Trailer :


Pre-installation Note

  • Termsteel only works on MacOS, Windows (Only with WSL & WSL2), or some Linux distributions that support the pty (pseudo-terminal manipulation tools), termios and fcntl will be able to run Termsteel. For more details see the list of supported OS/Distributions.

  • Termsteel requires a minimum of 1GB of RAM to function properly.

  • You will need python 3.0 or higher

  • To know how to install Termsteel in detail or on specific platform please refer to this documentation page

Easy install

To start using and installing Termsteel type the command:

pip install termsteel

See the Pipy page for more details

Alternative Install Methods (Highly recommend)

Method 1: Curl the installer script

If you are using Linux or Windows via WSL use this command :

curl -sSL https://raw.githubusercontent.com/afi-dev/Termsteel/main/installer.sh | sudo bash

If you are using MacOS use this command :

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/afi-dev/Termsteel/main/mac_installer.sh)"

Method 2: Manually download the installer script and run

If you are using Linux or Windows via WSL use this command :

wget https://raw.githubusercontent.com/afi-dev/Termsteel/main/installer.sh | sudo bash installer.sh

If you are using MacOS use this command :

curl -o mac_installer.sh https://raw.githubusercontent.com/afi-dev/Termsteel/main/mac_installer.sh && bash mac_installer.sh

Install for Developpement

If you just want to install the development version repo and run Termsteel:

git clone https://github.com/afi-dev/Termsteel.git
cd Termsteel && pip install -r requirements.txt && cd src && cd termsteel && python3 app.py

Run termsteel

If you installed from pip or from the install script use this :


Optional arguments you can use

termsteel [-h] [-p PORT] [--host HOST] [--debug] [--version] [-r]
                        [--command COMMAND] [--cmd-args CMD_ARGS]

optional arguments:
  -h, --help            show this help message and exit
  -p PORT, --port PORT  port to run server on (default: 5000)
  --host HOST           host to run server on (it is highly recommended to use the ip of your machine from your local
                        network) (default:
  --debug               debug the server (default: False)
  --version             print version and exit (default: False)
  -r, --reset           reset Termsteel to default password (default: False)
  -c COMMAND, --command COMMAND
                        Command to run in the terminal, i.e: htop (default: bash)
  --cmd-args CMD_ARGS   arguments to pass to command (i.e. --cmd-args='arg1 arg2 --flag') (default: )

Default credentials

The default login credentials for accessing the dashbaord are:

  • username : Admin

  • password : Termsteel

You can change them directly from the web dashboard in setting from the password tab

⚠️ Please remember not to leave these credentials as default and change your password to a secure password containing upper case, lower case, special characters and numbers.

Lost login credentials

If you have lost your login credentials you can still reset Termsteel to the default credentials, to do this you can reset Termsteel directly by typing the following command :

termsteel --reset

Or you have to modify config.json and set "reset" to true then restart Termsteel.


I invite you to participate, to contribute to projects by suggesting new features, creating pull requests or issues.

If you have something to add, whether it's a typo or a brand new feature, I'm glad to consider it! Please be sure to follow our code of conduct and state your sentences clearly so that they are understandable to everyone when you submit your request.

Support this project

Termsteel is completely free and open-source, so feel free to participate in its creation. By the way, you can support my work by supporting me by making a donation, it's always a pleasure and it motivates me to make more beautiful projects.

License & Conditions

Useful link




  • 1

    Cannot run termsteel: ModuleNotFound 'termios'

    When installing termsteel:

    pip install termsteel

    then running termsteel I get the following error:

    Traceback (most recent call last):
      File "C:\users\rapha\appdata\local\programs\python\python38-32\lib\runpy.py", line 192, in _run_module_as_main
        return _run_code(code, main_globals, None,
      File "C:\users\rapha\appdata\local\programs\python\python38-32\lib\runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "C:\Users\rapha\AppData\Local\Programs\Python\Python38-32\Scripts\termsteel.exe\__main__.py", line 4, in <module>
      File "C:\users\rapha\appdata\local\programs\python\python38-32\lib\site-packages\termsteel\app.py", line 9, in <module>
        import pty
      File "C:\users\rapha\appdata\local\programs\python\python38-32\lib\pty.py", line 11, in <module>
        import tty
      File "C:\users\rapha\appdata\local\programs\python\python38-32\lib\tty.py", line 5, in <module>
        from termios import *
    ModuleNotFoundError: No module named 'termios'

    I am using Python 3.8 on Windows 10 with WSL 2

  • 2

    Sound output of Terminal Applications

    Thank you for this awesome tool. Is there a straight-forward way to integrate the sound output of Terminal Applications running on Termsteel? Thank you again.

  • 3

    Error Install with Flask-JWT-Login


    i tried to install but i got:

    Preparing metadata (setup.py) ... error error: subprocess-exited-with-error

    × python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [6 lines of output] Traceback (most recent call last): File "", line 2, in File "", line 34, in File "C:\Users\ user .... \AppData\Local\Temp\pip-install-dagqibp8\flask-jwt-login_372ce447414e4e20ac0341d4898d6c5e\setup.py", line 12, in long_description=open('README.md').read(), FileNotFoundError: [Errno 2] No such file or directory: 'README.md' [end of output]

    note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed

  • 4

    Selection on Install


    I was unable to select any options during the installation.


    Tried to connect from multiple terminals, but none of them let me choose from the options.

  • 5

    Bump pyjwt from 1.6.4 to 2.4.0

    Bumps pyjwt from 1.6.4 to 2.4.0.

    Release notes

    Sourced from pyjwt's releases.



    What's Changed

    New Contributors

    Full Changelog: https://github.com/jpadilla/pyjwt/compare/2.3.0...2.4.0


    What's Changed

    ... (truncated)


    Sourced from pyjwt's changelog.

    v2.4.0 <https://github.com/jpadilla/pyjwt/compare/2.3.0...2.4.0>__


    - [CVE-2022-29217] Prevent key confusion through non-blocklisted public key formats. https://github.com/jpadilla/pyjwt/security/advisories/GHSA-ffqj-6fqr-9h24


    - Explicit check the key for ECAlgorithm by @estin in https://github.com/jpadilla/pyjwt/pull/713
    - Raise DeprecationWarning for jwt.decode(verify=...) by @akx in https://github.com/jpadilla/pyjwt/pull/742


    - Don't use implicit optionals by @rekyungmin in https://github.com/jpadilla/pyjwt/pull/705
    - documentation fix: show correct scope for decode_complete() by @sseering in https://github.com/jpadilla/pyjwt/pull/661
    - fix: Update copyright information by @kkirsche in https://github.com/jpadilla/pyjwt/pull/729
    - Don't mutate options dictionary in .decode_complete() by @akx in https://github.com/jpadilla/pyjwt/pull/743
    • Add support for Python 3.10 by @hugovk in https://github.com/jpadilla/pyjwt/pull/699
    • api_jwk: Add PyJWKSet.getitem by @woodruffw in https://github.com/jpadilla/pyjwt/pull/725
    • Update usage.rst by @guneybilen in https://github.com/jpadilla/pyjwt/pull/727
    • Docs: mention performance reasons for reusing RSAPrivateKey when encoding by @dmahr1 in https://github.com/jpadilla/pyjwt/pull/734
    • Fixed typo in usage.rst by @israelabraham in https://github.com/jpadilla/pyjwt/pull/738
    • Add detached payload support for JWS encoding and decoding by @fviard in https://github.com/jpadilla/pyjwt/pull/723
    • Replace various string interpolations with f-strings by @akx in https://github.com/jpadilla/pyjwt/pull/744
    • Update CHANGELOG.rst by @hipertracker in https://github.com/jpadilla/pyjwt/pull/751

    v2.3.0 &amp;lt;https://github.com/jpadilla/pyjwt/compare/2.2.0...2.3.0&amp;gt;__


    - Revert &amp;quot;Remove arbitrary kwargs.&amp;quot; `[#701](https://github.com/jpadilla/pyjwt/issues/701) &amp;lt;https://github.com/jpadilla/pyjwt/pull/701&amp;gt;`__
    • Add exception chaining [#702](https://github.com/jpadilla/pyjwt/issues/702) &amp;lt;https://github.com/jpadilla/pyjwt/pull/702&amp;gt;__

    v2.2.0 &amp;lt;https://github.com/jpadilla/pyjwt/compare/2.1.0...2.2.0&amp;gt;__

    &lt;/tr&gt;&lt;/table&gt; </code></pre> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary>

    <ul> <li><a href="https://github.com/jpadilla/pyjwt/commit/83ff831a4d11190e3a0bed781da43f8d84352653"><code>83ff831</code></a> chore: update changelog</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/4c1ce8fd9019dd312ff257b5141cdb6d897379d9"><code>4c1ce8f</code></a> chore: update changelog</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/96f3f0275745c5a455c019a0d3476a054980e8ea"><code>96f3f02</code></a> fix: failing advisory test</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/9c528670c455b8d948aff95ed50e22940d1ad3fc"><code>9c52867</code></a> Merge pull request from GHSA-ffqj-6fqr-9h24</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/24b29adfebcb4f057a3cef5aaf35653bc0c1c8cc"><code>24b29ad</code></a> Update CHANGELOG.rst (<a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/751">#751</a>)</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/31f5acb8fb3ec6cdfe2b1b0a4a8f329b5f3ca67f"><code>31f5acb</code></a> Replace various string interpolations with f-strings (<a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/744">#744</a>)</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/5581a31c21de70444c1162bcfa29f7e0fc86edda"><code>5581a31</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/748">#748</a>)</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/3d4d82248f1120c87f1f4e0e8793eaa1d54843a6"><code>3d4d822</code></a> Don't mutate options dictionary in .decode_complete() (<a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/743">#743</a>)</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/1f1fe15bb41846c602b3e106176b2c692b93a613"><code>1f1fe15</code></a> Add a deprecation warning when jwt.decode() is called with the legacy verify=...</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/35fa28e59d99b99c6a780d2a029a74d6bbba8b1e"><code>35fa28e</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/740">#740</a>)</li> <li>Additional commits viewable in <a href="https://github.com/jpadilla/pyjwt/compare/1.6.4...2.4.0">compare view</a></li> </ul> </details>

    <br />

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.