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
- End-to-end encryption — X25519 key exchange + XSalsa20-Poly1305 (libsodium) with perfect forward secrecy
- 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 — group calls with grid layout (coming soon)
- 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
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 X25519 + XSalsa20-Poly1305
├── 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
- E2E encryption by default using libsodium
- X25519 key exchange with ephemeral keys
- XSalsa20-Poly1305 AEAD cipher
- Key rotation every 256 messages
- Perfect forward secrecy — compromised key doesn't reveal past sessions
- Optional — both sides can use a shared passphrase for additional security
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.0-py3-none-any.whl
(534.6 kB
view details)
File details
Details for the file termface-2.0.0-py3-none-any.whl.
File metadata
- Download URL: termface-2.0.0-py3-none-any.whl
- Upload date:
- Size: 534.6 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 |
b766b381852a9dc2810c405c7fa59053b54789263757149a3349aaae0d16e012
|
|
| MD5 |
97819d7b4effb7b7510a685f3dc86131
|
|
| BLAKE2b-256 |
6a1b9b4cabf33e34ace452d5ff716b88984d414b301566e710d84ebfba4b9fa6
|