TermFace
Secure terminal video call. Your webcam rendered as color ASCII art, with end-to-end encrypted peer-to-peer calls.
What's New in v2.0
- Authenticated encryption — XSalsa20-Poly1305 (libsodium), enabled for shared sessions or an explicit key
- Opus audio codec — 24kHz at 32kbps (10x compression over raw PCM), echo cancellation, noise gate
- zstd compression — 3-5x compression for ASCII frames over the wire
- TCP media transport — reliable delivery with flow control (no more UDP packet drops)
- Session strings — share
happy-sunset-oceaninstead of IP addresses - Multi-client grid renderer — ready for a future relay-based group-call service
- Auto-reconnection — exponential backoff with up to 5 retries
- Call quality stats — real-time RTT, bandwidth, and duration display
- LAN discovery — automatic peer discovery on local network
Install
From PyPI
pip install TermFace
If you use pipx, install and update it with:
pipx install TermFace
pipx upgrade TermFace
After the initial install, update TermFace without Git or a project folder:
termface update
The updater uses the same Python interpreter that launched TermFace, so it updates the correct installation on Windows, macOS, and Linux.
From Source
git clone https://github.com/Yash12b/TermFace.git
cd TermFace
pip install -e ".[dev]"
Quick Start
ASCII Webcam (local)
ascii-cam
# or
termface ascii
Video Call
# Person A (call receiver) — start first, wait for incoming
termface facetime
# Person B (caller) — connect to A's IP
termface facetime --target 192.168.1.100
With Session Strings
# Person A starts with a session string
termface facetime --session happy-sunset-ocean
# Person B joins using the same session string
termface facetime --session happy-sunset-ocean --target 192.168.1.100
All Options
termface facetime --help
termface ascii --help
Controls (during call)
| Key | Action |
|---|---|
t |
Chat (type message, Enter to send) |
f |
Send file |
1-4 |
Color mode: mono / grayscale / color / invert |
e |
Toggle edge detection |
b |
Toggle background blur |
r |
Toggle recording / background removal |
s |
Screenshot (ASCII .txt + .png) |
c |
Cycle character set |
+/- |
Brightness |
[/] |
Contrast |
q |
Hang up / quit |
Architecture
terminal_webcam/
├── protocol.py # Binary protocol (10-byte header, length-prefixed)
├── crypto.py # libsodium XSalsa20-Poly1305 encryption
├── audio.py # Opus codec + echo cancellation + noise gate
├── video.py # ASCII renderer + zstd compression + background effects
├── network.py # TCP multiplexed transport + auto-reconnect
├── discovery.py # LAN discovery + session strings + STUN
├── quality.py # Adaptive quality + call stats
├── terminal_facetime.py # Main app
└── webcam_ascii.py # Local webcam viewer
Security
- Authenticated encryption using libsodium when a shared session or key is supplied
- XSalsa20-Poly1305 AEAD cipher
- Key rotation every 256 messages
- Shared session strings should be treated as secrets and exchanged over a trusted channel
- Calls using
--sessionderive the same encryption key from the shared session string. Direct IP calls can use--encrypt-key; otherwise they run without encryption.
Testing
pip install -e ".[dev]"
pytest tests/ -v
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
No source distribution files available for this release.See tutorial on generating distribution archives.
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
termface-2.0.7-py3-none-any.whl
(36.2 kB
view details)
File details
Details for the file termface-2.0.7-py3-none-any.whl.
File metadata
- Download URL: termface-2.0.7-py3-none-any.whl
- Upload date:
- Size: 36.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2db9cc41acbc40f351af39e5bbf5118e611e2839aa106332a1d1d56c22605608
|
|
| MD5 |
98dff59eac8f463201e9add97a579d32
|
|
| BLAKE2b-256 |
e5324114ca1dc1adabbba92933ad36dda9ada44f357a21e93b302bcb0fc76caf
|