Skip to main content

TermCall

A CLI-based video/audio calling app for the terminal using WebRTC and Firebase.

Features

  • Peer-to-peer video and audio calls in your terminal
  • Remote video as colored ASCII art
  • Local video preview as Sixel graphics (Sixel-compatible terminal required)
  • Simple CLI interface for browsing users and making calls

Requirements

  • Python 3.8+
  • A Sixel-compatible terminal (e.g., xterm -ti vt340, mlterm) for local video preview
  • Webcam and microphone

Installation

  1. Install TermCall (after building the package):

    pip install termcall
    
  2. Install system dependencies (if needed):

    • macOS: brew install libjpeg
    • Ubuntu: sudo apt-get install libopencv-dev

Usage

After installation, run:

termcall
  • On first run, you will be prompted for your email and full name.
  • Browse users, initiate calls, and accept/decline incoming calls from the CLI menu.
  • During a call:
    • Remote video is shown as ASCII art
    • Local video preview (bottom right) uses Sixel graphics (if supported)
    • Controls: m to mute audio, v to mute video, q to quit call

Database & Security

  • TermCall connects to the public TermCall Firebase database automatically. You do NOT need to set up your own Firebase or provide any credentials.

Firebase Database Rules:

{
  "rules": {
    "users": {
      "$email": {
        // Anyone can read user profiles
        ".read": true,
        // Only allow writes if the provided token matches the stored token
        ".write": "(!data.exists() && newData.child('token').val() != null) || (data.child('token').val() === newData.child('token').val())"
      }
    },
    "call_requests": {
      "$request_id": {
        // Anyone can read call requests
        ".read": true,
        // Only allow the caller or callee (with correct token) to write/update/delete
        ".write": "(!data.exists() && newData.child('caller_email').val() != null && newData.child('callee_email').val() != null && newData.child('token').val() != null) || (data.child('token').val() === newData.child('token').val())"
      }
    },
    "signaling": {
      "$call_id": {
        "$peer_email": {
          // Anyone can read signaling data
          ".read": true,
          // Only allow the peer (with correct token) to write/update/delete
          ".write": "(!data.exists() && newData.child('token').val() != null) || (data.child('token').val() === newData.child('token').val())"
        }
      }
    }
  }
}
  • TermCall uses a central Firebase Realtime Database, maintained by the project owner.
  • The app connects via the public database URL using the Firebase REST API.
  • No admin credentials or serviceAccountKey.json are distributed.
  • Users do NOT need to set up their own Firebase project or credentials.

Future Improvements

  • Add authentication (e.g., anonymous or email/password) to restrict users to their own data

  • Update database rules to enforce per-user access

  • Modularize codebase for maintainability

  • Improve packaging and distribution (PyPI, Homebrew, etc.)

  • Monitor and mitigate abuse/spam

  • Migrate to Firebase Authentication (Long-Term):

    • Implement Firebase Authentication (email/password, anonymous, etc.) for all users.
    • Use auth.uid in database rules to enforce per-user access and secure all sensitive operations.
    • This enables robust, scalable security and is recommended for production deployments.

Distribution & Packaging

  • See Distribution.md for historical notes and advanced packaging options
  • The main user experience is via pip install and the termcall CLI

License

MIT License

Metadata

Release files for termcall 0.2.0

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

Source distribution (sdist)

Source distribution for termcall 0.2.0
File Size Uploaded
termcall-0.2.0.tar.gz 11.4 kB Details

Built distribution (wheel)

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

Total release size: 22.9 kB

Release files / termcall-0.2.0.tar.gz

Download URL termcall-0.2.0.tar.gz
Size 11.4 kB
Tags Source
SHA-256 checksum
How to use checksums
40a4c6bbba444b0a8eebe669092bd887b23bed4d1bdb42edbd5498bc2cc77f21
BLAKE2b-256 checksum
How to use checksums
15cbec022d0a404a46423da7f590ce838ee827a69f9ebd81b9484c769d86f077
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.6

Release files / termcall-0.2.0-py3-none-any.whl

Download URL termcall-0.2.0-py3-none-any.whl
Size 11.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
000621499eab17d38196c12a5b9fcd24d15143f462e224784e49f4e11e277e12
BLAKE2b-256 checksum
How to use checksums
bba193e42b467554fdcc3616ccb62bfbbb8594c8de720e50178ae21c0d401a2e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.9.6

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

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