TermFace
Secure terminal video call. Your webcam rendered as color ASCII art, with end-to-end encrypted peer-to-peer calls.
Features
Stable (TCP Transport)
- End-to-end encryption — X25519 key exchange + XSalsa20-Poly1305 (libsodium)
- Opus audio codec — 24kHz at 32kbps, echo cancellation, noise gate
- zstd compression — with backward-compatible header detection
- Session strings — share
happy-sunset-oceaninstead of IP addresses - 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
- Chat — in-call text messaging
- File transfer — with SHA-256 checksum verification and progress display
- Screenshots — save ASCII art as .txt and .png
- Recording — capture video/audio to AVI/WAV files
- Mute/camera controls — toggle mic and camera during calls
- Background effects — blur and removal (requires MediaPipe)
Experimental (WebRTC Transport)
- WebRTC data channel — for chat and control messages
- RTP media tracks — camera and microphone via aiortc
- Remote media rendering — receive and display remote video as ASCII
- ICE configuration — STUN/TURN server support
In Progress
- SFU integration — group calls via LiveKit/Janus (planned)
- Structured terminal UI — status bar, chat panel, participant list (planned)
Install
From PyPI
pip install TermFace
With optional dependencies:
# Full install (audio, screen, compression, WebRTC)
pip install "TermFace[full]"
# Just audio support
pip install "TermFace[audio]"
# Just WebRTC support
pip install "TermFace[webrtc]"
From Source
git clone https://github.com/Yash12b/TermFace.git
cd TermFace
pip install -e ".[dev]"
Quick Start
ASCII Webcam (local)
ascii-cam
Video Call
# Person A (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
WebRTC Call (Experimental)
# Requires: pip install "TermFace[webrtc]"
# Person A (answerer)
termface webrtc --role answerer --room myroom
# Person B (offerer)
termface webrtc --role offerer --room myroom --camera --microphone
Keyboard Controls
| Key | Action |
|---|---|
t |
Open chat (Enter to send, Esc to cancel) |
f |
Send file |
m |
Toggle microphone mute |
v |
Toggle camera on/off |
p |
Toggle push-to-talk mode |
1-4 |
Color mode: mono / grayscale / color / invert |
e |
Toggle edge detection |
b |
Toggle background blur |
r |
Toggle recording (connected) / background removal (idle) |
c |
Cycle character set |
+/- |
Adjust brightness |
[/] |
Adjust contrast |
s |
Take screenshot (saves .txt and .png) |
q |
Quit |
Architecture
┌─────────────────────────────────────────────┐
│ Terminal UI (ASCII rendering) │
├─────────────────────────────────────────────┤
│ Media Layer │
│ ├── VideoProcessor (capture → resize → JPEG)│
│ ├── AudioSystem (PyAudio + Opus codec) │
│ └── FrameCompressor (zstd compression) │
├─────────────────────────────────────────────┤
│ Protocol Layer │
│ ├── Frame (binary framing) │
│ ├── Encryptor (XSalsa20-Poly1305) │
│ └── MediaPacket (sequence numbers) │
├─────────────────────────────────────────────┤
│ Network Layer │
│ ├── TCPMediaServer/Client (TCP transport) │
│ ├── AiortcTransport (WebRTC, optional) │
│ └── DiscoveryService (STUN + LAN) │
├─────────────────────────────────────────────┤
│ Signaling Layer │
│ ├── SignalingClient/Server (TLS relay) │
│ └── Invite tokens (HMAC-SHA256) │
└─────────────────────────────────────────────┘
Security
- Encryption enabled by default for all calls with session strings
- X25519 key exchange for shared secret derivation
- XSalsa20-Poly1305 authenticated encryption (AEAD)
- Sequence numbers with replay protection
- Key rotation every 256 messages
- Invite tokens with expiration and room scoping
To disable encryption (not recommended):
termface facetime --no-encrypt
Diagnostics
# Check system requirements
termface doctor
# Update to latest version
termface update
Requirements
- Python 3.10+
- OpenCV (
opencv-python) - NumPy (
numpy) - PyNaCl (
PyNaCl) — for encryption
Optional:
- PyAudio + opuslib — for audio
- mss — for screen capture
- zstandard — for compression
- aiortc — for WebRTC
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
termface-3.4.0.tar.gz
(66.0 kB
view details)
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-3.4.0-py3-none-any.whl
(67.0 kB
view details)
File details
Details for the file termface-3.4.0.tar.gz.
File metadata
- Download URL: termface-3.4.0.tar.gz
- Upload date:
- Size: 66.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ab0698fd4a1283b942b07532c0f30bc0da406efdd0e9dbfcf6c812009e7ef98
|
|
| MD5 |
50c21c642d71253b5d8e96e4403e0681
|
|
| BLAKE2b-256 |
05b5cb5f607666c1af794b545029445bff16157516918d938d35740619edeab4
|
File details
Details for the file termface-3.4.0-py3-none-any.whl.
File metadata
- Download URL: termface-3.4.0-py3-none-any.whl
- Upload date:
- Size: 67.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a80aa3da856f55611155bb1a0087b844097454a02fc54ea26c43e0462a8427a
|
|
| MD5 |
bb1c11c0ecdba783ae31cf44abcc2d94
|
|
| BLAKE2b-256 |
356906c5b0cc8550fe408a2be0deddcdd0b76bad2bf514108d4db38b5a9c2065
|