Skip to main content

Pyttyd

English | 中文

A web-based terminal sharing tool. Run it directly on the host machine to expose your local shell in the browser. Built with FastAPI and xterm.js, featuring authentication, splittable multi-pane terminals, a toolbar, and in-browser configuration management.

Security notice: A web terminal is equivalent to remote shell access. Use a strong password, deploy only on trusted networks, and put HTTPS reverse proxy in front for production.

Features

  • Modern login page with session authentication
  • Horizontally / vertically splittable multi-terminal layout
  • Toolbar: new, split, clear, copy/paste, reconnect, font size, theme toggle
  • CLI initialization and config management (pyttyd init / pyttyd config)
  • Web settings panel with save and one-click server restart
  • PTY window resize sync

Quick Start

pip install

pip install pyttyd

# Initialize (generates username, password, listen address, etc.)
pyttyd init

# Start the server
pyttyd

After initialization you should see output similar to:

Config file : ~/.config/pyttyd/config.json
Listen      : http://0.0.0.0:8221
Username    : admin_abc123
Password    : xxxxx

Open http://<host>:8221 in your browser and sign in.

# foreground (Ctrl+C to stop)
pyttyd

# background
pyttyd start
pyttyd status
pyttyd stop

Logs: ~/.config/pyttyd/pyttyd.log

Pyttyd is meant to run on the host OS (pip install or pip install -e .). It shares the machine's real shell, home directory, and environment — not an isolated container.

CLI

Command Description
pyttyd Start the web terminal server (foreground)
pyttyd start Start in background
pyttyd stop Stop background process
pyttyd status Show background process status
pyttyd init Initialize config with random username/password
pyttyd init --username admin --password secret Set credentials explicitly
pyttyd config show Show current configuration
pyttyd config show --json Output as JSON
pyttyd config set host 0.0.0.0 Update a single setting
pyttyd config set port 9000 Change listen port
pyttyd config edit Open config file in $EDITOR
pyttyd config path Print config file path
pyttyd config reset-password Reset login password
pyttyd version Show version

Configuration file

Default path: ~/.config/pyttyd/config.json

Override with an environment variable:

export PYTTYD_CONFIG=/etc/pyttyd/config.json
pyttyd

Main fields:

Field Description Default
host Listen address 0.0.0.0
port Listen port 8221
username Login username Generated on init
password_hash Password hash Generated on init
shell Default shell /bin/bash
cwd Working directory User home
title Page title Pyttyd
max_terminals Max concurrent terminals 4

Changes to host / port require a server restart (one-click restart in the web settings page).

Web UI

After login, the toolbar provides:

  • New — open a new terminal
  • Split H / Split V — split the active pane horizontally or vertically
  • Close — close the active pane
  • Clear / Copy / Paste / Reconnect — common actions
  • Settings — edit config in the browser; click Restart server to apply

Production recommendations

  1. Reverse proxy + HTTPS: Terminate TLS with Nginx or Caddy to avoid sending passwords and terminal data in plain text.
  2. Restrict access: Allow only trusted IPs in your firewall; do not expose the service directly to the public internet.
  3. Strong passwords: Rotate credentials regularly with pyttyd config reset-password.
  4. Process supervision: Use systemd to keep the service running on boot.

systemd example

[Unit]
Description=Pyttyd Web Terminal
After=network.target

[Service]
Type=simple
User=your-user
Environment=PYTTYD_CONFIG=/home/your-user/.config/pyttyd/config.json
ExecStart=/usr/local/bin/pyttyd
Restart=on-failure

[Install]
WantedBy=multi-user.target

Nginx reverse proxy example

location / {
    proxy_pass http://127.0.0.1:8221;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_read_timeout 86400;
}

Development

git clone https://github.com/zhanglaiya/pyttyd.git
cd pyttyd
pip install -e .

pyttyd init --force
pyttyd

Health check: GET /health

Platform

Linux and macOS only (requires POSIX PTY). Native Windows is not supported.

Tech stack

  • Backend: FastAPI, uvicorn
  • Frontend: xterm.js, vanilla JS/CSS
  • Terminal: POSIX PTY + bash

Related projects

  • ttyd — mature C implementation
  • gotty — Go implementation

License

Apache 2.0

Metadata

Release files for pyttyd 2.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyttyd 2.0.2
File Size Uploaded
pyttyd-2.0.2.tar.gz 368.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyttyd 2.0.2
File Interpreter ABI Platform
pyttyd-2.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 741.3 kB

Release files / pyttyd-2.0.2.tar.gz

Download URL pyttyd-2.0.2.tar.gz
Size 368.8 kB
Tags Source
SHA-256 checksum
How to use checksums
b470a39b219827c080f60845519d50a4141ae2be622d89782654f35354103b9d
BLAKE2b-256 checksum
How to use checksums
2cbbe0102959355d241f2e5611f1bd2c4fbd41c4ba1f5ad43de4860636672773
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release files / pyttyd-2.0.2-py3-none-any.whl

Download URL pyttyd-2.0.2-py3-none-any.whl
Size 372.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a08587684f5c4e722671d551ca012bd81e9b0893e6f73be6fd3d0b9ccbb09f06
BLAKE2b-256 checksum
How to use checksums
217a93500e8025a89272eab025a3c871af70a2fd7f6f687579a48694301d36e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release history Release notifications | RSS feed

This release

2.0.2 This release

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page