Skip to content

Repository files navigation

Video term

Build Release Latest release Go version License: MIT

Video calls in your terminal. Places and receives WebRTC calls and renders the remote video as ANSI half-block art — no browser needed. Works peer-to-peer with other video-term instances (e.g. a Raspberry Pi home camera) or any client speaking the same signaling protocol.

┌──────────────┐   websocket    ┌───────────────────┐   websocket   ┌──────────────┐
│  video-term  │◄──signaling───►│  signaling server │◄──signaling──►│  video-term  │
│  (terminal)  │                └───────────────────┘               │ (home camera)│
│              │◄════════════ WebRTC (H264/Opus over SRTP) ════════►│              │
└──────────────┘                                                    └──────────────┘

Screenshots

Menu Enter peer ID Dialing
Main menu with own peer ID Dial screen with peer ID entered Outgoing call being established

Remote video rendered in the terminal during a call:

Live call session with ANSI video

Download

Prebuilt binaries of the latest release (version shown in the release badge above):

Platform Download
macOS Apple Silicon video-term-darwin-arm64
macOS Intel video-term-darwin-amd64
Windows amd64 video-term-windows-amd64.exe
Linux amd64 video-term-linux-amd64
Linux arm64 (RPi) video-term-linux-arm64

GStreamer (below) is required at runtime on every platform.

Requirements

  • Go 1.24+
  • GStreamer (gst-launch-1.0 on PATH)
    • macOS: brew install gstreamer
    • Debian/RPi: apt install gstreamer1.0-tools gstreamer1.0-plugins-{base,good,bad} gstreamer1.0-libav

Setup

cp .env.example .env   # then fill in your signaling server
make build

Usage

Interactive TUI (default):

./build/video-term-$(go env GOOS)-$(go env GOARCH)
  • The menu shows the peer ID assigned by the signaling server.
  • Call a peer: enter the remote peer's ID; video appears once connected.
  • Incoming calls ring in the TUI — a to accept, r to reject.
  • In a call: h hangs up. Logs go to LOG_FILE (default video-term.log).

Headless home-camera mode (auto-answers every incoming call):

./build/video-term-linux-arm64 -headless

Architecture

Package Responsibility
config .env + environment loading
signaling message protocol and client interface
signalws websocket implementation of the signaling client
peer Engine (signaling routing, call lifecycle) and Session (one call)
media GStreamer capture/decode/playback pipelines, RTP pumps, ANSI renderer
ui Bubbletea terminal interface

Media flows through local UDP sockets: GStreamer captures the camera/mic and sends RTP to localhost, where pumps forward it into pion tracks; incoming tracks are forwarded the same way to a GStreamer decode pipeline whose raw RGB output is rendered as ANSI in the terminal.

Default pipelines use avfvideosrc/vtenc_h264/osxaudiosrc on macOS and libcamerasrc/x264enc/alsasrc on Linux; override with GST_VIDEO_PIPELINE / GST_AUDIO_PIPELINE (see .env.example).

About

Video call right in your terminal using Pion(WebRTC), Gstreamer and asciicam

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages