Skip to main content
Capture your terminal sessions as video-like recordings that can be replayed, shared, and embedded anywhere.

What is Session Recording?

Rexec can record your terminal sessions in real-time, capturing every command, output, and timing. Recordings are stored in standard asciinema format and can be:
  • Replayed in the browser
  • Downloaded as .cast files
  • Shared via public links
  • Embedded in documentation

Key Features

High Fidelity

Records exact terminal output with timing information for accurate playback.

Lightweight

Text-based format, not screen recording. Tiny file sizes (~10KB per minute).

Shareable

Generate public links or embed in docs/blog posts.

Searchable

Text content is searchable — find specific commands in recordings.

Starting a Recording

From the Web UI

  1. Open any terminal session
  2. Click the Record button (🔴) in the terminal header
  3. Optional: Set a title for the recording
  4. Click “Start Recording”
  5. Terminal output is now being captured
Recording captures all terminal output, including colors, formatting, and timing information.

Automatic Recording

Enable auto-recording for terminals:
  1. Go to Settings → Recording
  2. Enable “Auto-record new sessions”
  3. Choose auto-record duration limit (e.g., 2 hours)
  4. All new terminals start recording automatically

Stopping a Recording

  1. Click the Stop Recording button (⏹️)
  2. Recording is saved automatically
  3. Appears in Recordings library

Recording Limits

TierMax DurationStorageConcurrent Recordings
Free1 hour1GB total1 active
Pro4 hours10GB total5 active
EnterpriseUnlimitedCustomUnlimited
Recordings that exceed duration limits are automatically stopped and saved.

Viewing Recordings

Recordings Library

Access all your recordings:
  1. Go to Recordings in the sidebar
  2. See list of all recordings with:
    • Title
    • Duration
    • Date recorded
    • File size
  3. Click any recording to play

Playback Controls

Player features:
  • ▶️ Play/Pause
  • ⏩ Speed control (0.5x, 1x, 1.5x, 2x, 3x)
  • ⏭️ Skip idle time (auto-skip pauses >2 seconds)
  • 🔍 Full-text search
  • 📋 Copy commands from transcript
  • ⬇️ Download as .cast file

Playback Example

# Recording shows:
$ git clone https://github.com/example/repo
Cloning into 'repo'...
remote: Enumerating objects: 1234, done.
[Animation of progress bar exactly as it appeared]

$ cd repo && npm install
[Shows npm install with real-time progress]

Sharing Recordings

Share recordings with anyone:
  1. Open recording in player
  2. Click “Share”
  3. Toggle “Make Public”
  4. Copy share link: https://rexec.io/r/abc123...
  5. Send link to anyone
Public recordings are viewable without login. Perfect for documentation and tutorials.

Embedding

Embed recordings in web pages:
<!-- Embed with asciinema-player -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/asciinema-player.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/asciinema-player.min.css" />

<div id="recording"></div>
<script>
  AsciinemaPlayer.create(
    'https://rexec.io/r/abc123.cast',
    document.getElementById('recording'),
    {
      speed: 1.5,
      theme: 'monokai',
      autoPlay: true
    }
  );
</script>

Privacy Settings

  • Only you can view
  • Requires login
  • Not listed publicly
Think carefully before making recordings public. They may contain sensitive data like API keys or passwords.

Storage Options

Rexec supports multiple storage backends:

Database Storage (Default)

Recordings stored in PostgreSQL:
# Pros:
- Simple setup
- No external dependencies
- Works out of the box

# Cons:
- Limited by DB size
- Not optimal for >10GB

S3-Compatible Storage

# .env configuration
S3_BUCKET=rexec-recordings
S3_REGION=us-east-1
S3_ACCESS_KEY_ID=AKIA...
S3_SECRET_ACCESS_KEY=...
Cloudflare R2 is recommended for high-volume deployments (zero egress fees, global CDN).

File Format

Recordings use asciinema format v2 (industry standard):
// Header
{
  "version": 2,
  "width": 120,
  "height": 30,
  "timestamp": 1703347200,
  "title": "My Recording",
  "env": {"SHELL": "/bin/bash"}
}
// Events (one per line)
[0.123, "o", "$ ls\r\n"]
[0.456, "o", "file1.txt  file2.txt\r\n"]
[2.789, "o", "$ echo hello\r\n"]
[2.890, "o", "hello\r\n"]

Format Specification

Each event line:
[<time>, <type>, <data>]
  • time: Seconds since recording start (float)
  • type: "o" (output), "i" (input), "r" (resize)
  • data: Terminal data (text with ANSI codes)

Compatibility

Asciinema format works with:

Managing Recordings

Editing Metadata

Update recording details:
  1. Open recording
  2. Click Settings (⚙️)
  3. Edit:
    • Title
    • Description
    • Privacy (public/private)
  4. Click Save

Downloading

Download recordings as .cast files:
# Via UI
Recordings [Select recording] Download

# Via API
curl -O https://rexec.io/api/recordings/{id}/stream \
  -H "Authorization: Bearer $REXEC_TOKEN"

# Rename to .cast extension
mv stream my-recording.cast

Deleting

  1. Go to Recordings
  2. Select recording to delete
  3. Click Delete (🗑️)
  4. Confirm deletion
Deleted recordings cannot be recovered, even from backups.

Advanced Features

Trimming & Editing

Edit .cast files manually to trim or modify recordings:
# Download recording
curl -o recording.cast https://rexec.io/r/abc123.cast

# Edit with text editor (JSON lines format)
vim recording.cast

# Upload edited version
curl -X POST https://rexec.io/api/recordings/upload \
  -H "Authorization: Bearer $REXEC_TOKEN" \
  -F "[email protected]"

Idle Time Compression

Speed up long pauses automatically:
# Install asciinema CLI
pip install asciinema

# Compress idle time (max 2 seconds pause)
asciinema cat recording.cast | asciinema idle-time-limit 2 > compressed.cast

Converting to GIF/Video

Convert recordings to animated GIFs or MP4:
# Using asciicast2gif
npm install -g asciicast2gif
asciicast2gif recording.cast recording.gif

# Using svg-term
npm install -g svg-term-cli
svg-term --in recording.cast --out recording.svg

Recording Collaboration Sessions

When recording a collaboration session:
  • All participants’ input is captured
  • Multi-user activity shown during playback
  • Cursor colors preserved in recording
Enable recording before starting collaboration for full multi-user capture.

Security & Compliance

Sensitive Data

Recordings may contain:
  • Passwords typed in terminal
  • API keys in environment variables
  • Confidential file contents
  • Private repository URLs
Best practices:
  • Review recordings before sharing
  • Edit out sensitive sections
  • Use secret managers, not plaintext
  • Keep sensitive recordings private

Data Retention

Configure automatic deletion:
# In .env
RECORDINGS_RETENTION_DAYS=90  # Auto-delete after 90 days

Audit Logging

All recording events are logged:
  • Recording started (user, container, timestamp)
  • Recording stopped (duration, size)
  • Recording viewed (viewer, timestamp)
  • Recording shared (public/private toggle)
  • Recording downloaded (user, timestamp)
  • Recording deleted (user, timestamp)
View audit logs: Settings → Audit Logs

Performance Considerations

File Sizes

Typical recording sizes:
# Text-only commands
~5-10 KB per minute

# Mixed output (logs, builds)
~50-100 KB per minute

# Heavy output (npm install, docker build)
~500 KB - 2 MB per minute

Recording Overhead

Performance impact:
  • CPU: Less than 1% overhead
  • Memory: Approximately 2MB per active recording
  • Network: No impact (local storage)
Recording has negligible impact on terminal responsiveness.

API Integration

Start Recording

curl -X POST https://rexec.io/api/recordings/start \
  -H "Authorization: Bearer $REXEC_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "container_id": "abc123...",
    "title": "Production deployment"
  }'

Stop Recording

curl -X POST https://rexec.io/api/recordings/stop/abc123 \
  -H "Authorization: Bearer $REXEC_TOKEN"

List Recordings

curl https://rexec.io/api/recordings \
  -H "Authorization: Bearer $REXEC_TOKEN"
See API Reference for complete documentation.

Troubleshooting

Causes:
  • Terminal disconnected
  • Storage limit reached
  • Browser tab backgrounded (web-only)
Fix:
  • Check terminal connection
  • Free up storage space
  • Keep browser tab active during recording
Causes:
  • Terminal size mismatch
  • Corrupted recording file
  • Incompatible ANSI codes
Fix:
  • Adjust player terminal size
  • Try downloading and re-uploading
  • Use asciinema CLI for validation
Causes:
  • Long running commands with verbose output
  • Build logs or npm install captured
Fix:
  • Compress idle time with asciinema idle-time-limit
  • Edit recording to remove noisy sections
  • Use tee to log to file instead of recording

Best Practices

Recording Quality

  • Use descriptive titles (“Deploy v1.2.3 to prod”)
  • Trim idle time before sharing
  • Review content before making public
  • Keep recordings under 30 minutes for better UX

Storage Management

  • Enable auto-deletion for old recordings
  • Use S3/R2 for large volumes (>10GB)
  • Delete test recordings regularly
  • Compress idle time to reduce size

Sharing

  • Review for secrets before sharing
  • Use public links sparingly
  • Embed in docs for tutorials
  • Speed up playback (1.5x-2x) for demos

Use Cases

Documentation

Record CLI tutorials and embed in docs.

Bug Reports

Show exact steps to reproduce issues.

Onboarding

Create training videos for new team members.

Demos

Record product demos and share with prospects.

Compliance

Audit trail for production changes.

Debugging

Share complex debugging sessions with team.

Collaboration

Record multi-user sessions

Cloud Terminals

Record cloud terminal sessions

BYOS Agent

Record agent terminal sessions

SSH Access

Record SSH sessions via gateway

Build docs developers (and LLMs) love