Play back terminal recordings over SSH

Tailpipe is an SSH server that streams prerecorded terminal sessions. Your users SSH in, watch the show, and interact with playback controls.


          

Features

Everything you need to serve interactive terminal demos.

SSH Native

No browser needed. Connect with any SSH client and start watching immediately.

Asciinema Playback

Plays back .cast files in asciinema v2 and v3 formats with frame-accurate timing.

Multi-User

Configure different recordings per SSH username with a default fallback for unknown users.

Simple Config

One TOML file configures everything — cast files, headers, footers, and per-user overrides.

Headers & Footers

Bookend recordings with branded intro and outro sequences. Disable per-user as needed.

Pure Rust

Built with russh, tokio, and ratatui. Async, fast, and memory-safe.

Interactive Playback

Pause, seek, and navigate recordings with keyboard controls.

Space Pause / Resume
Seek ±5 seconds
o Toggle overlay
q Quit
▮▮ PAUSED
01:23 / 02:34
spacepause/resume <-/->seek ±5s otoggle overlay qquit

Configure in seconds

One TOML file is all you need.

tailpipe.toml
[server]
port = 4242
host_key = "/etc/tailpipe_ed25519.key"
header = "/srv/casts/header.cast"
footer = "/srv/casts/footer.cast"

# SSH in as demo@ to see demo.cast
[user.demo]
castfile = "/srv/casts/demo.cast"

# SSH in as custom@ to see custom.cast
[user.custom]
castfile = "/srv/casts/custom.cast"
header = "none"
footer = "none"

# fallback for unknown usernames
[user.default]
castfile = "/srv/casts/default.cast"

Optional host key

Generates an ephemeral ed25519 key if you don't provide one. Great for development.

Per-user recordings

Map SSH usernames to different cast files. Unknown users fall back to the default section.

Flexible headers & footers

Set server-wide intro/outro sequences or override them per user. Set to "none" to disable.

Get started

Up and running in under a minute.

1

Install

$ cargo install tailpipe
2

Configure

$ vim tailpipe.toml
3

Run

$ tailpipe tailpipe.toml
4

Connect

$ ssh demo@localhost -p 4242