Skip to main content

A comprehensive terminal emulator library in Rust with Python bindings - supports true color, alt screen, mouse reporting, bracketed paste, and full Unicode

Project description

Par Term Emu Core Rust

PyPI Crates.io PyPI - Python Version Runs on Linux | MacOS | Windows Arch x86-64 | ARM | AppleSilicon PyPI - Downloads Crates.io Downloads PyPI - License

A comprehensive terminal emulator library written in Rust with Python bindings for Python 3.12+. Provides VT100/VT220/VT320/VT420/VT520 compatibility with PTY support, matching iTerm2's feature set.

"Buy Me A Coffee"

What's New in 0.18.0

🎉 New Features

  • Environment Variable Support: All CLI options now support environment variables with PAR_TERM_ prefix

    • Examples: PAR_TERM_HOST, PAR_TERM_PORT, PAR_TERM_THEME, PAR_TERM_HTTP_USER
    • Configuration via environment for containerized deployments
  • HTTP Basic Authentication: New password protection for the web frontend

    • --http-user - Username for HTTP Basic Auth
    • --http-password - Clear text password
    • --http-password-hash - htpasswd format hash (bcrypt, apr1, SHA1, MD5 crypt)
    • --http-password-file - Read password from file (auto-detects hash vs clear text)

🧪 Test Coverage

  • Comprehensive Streaming Test Suite: 94 new tests for streaming functionality
    • Protocol message constructors, theme info, HTTP Basic Auth configuration
    • Binary protocol encoding/decoding with compression
    • Event types, streaming errors, JSON serialization
    • Unicode content and ANSI escape sequence preservation

🔧 Improvements

  • Python Bindings: Binary protocol functions now properly exported (encode_server_message, decode_server_message, encode_client_message, decode_client_message)

Usage Examples

# Environment variables
export PAR_TERM_HOST=0.0.0.0
export PAR_TERM_HTTP_USER=admin
export PAR_TERM_HTTP_PASSWORD=secret
par-term-streamer --enable-http

# CLI with htpasswd hash
par-term-streamer --enable-http --http-user admin --http-password-hash '$apr1$...'

What's New in 0.17.0

🎉 New Features

  • Web Terminal Macro System: New macro tab in the on-screen keyboard for creating and playing terminal command macros

    • Create named macros with multi-line scripts (one command per line)
    • Quick select buttons to run macros with a single tap
    • Playback with 200ms delay before each Enter key for reliable command execution
    • Edit and delete existing macros via hover menu
    • Stop button to abort macro playback mid-execution
    • Macros persist to localStorage across sessions
    • Visual feedback during playback (pulsing animation, stop button)
    • Option to disable sending Enter after each line (for text insertion macros)
    • Template commands for advanced scripting: [[delay:N]], [[enter]], [[tab]], [[esc]], [[space]], [[ctrl+X]], [[shift+X]], [[ctrl+shift+X]], [[shift+tab]], [[shift+enter]]
  • On-Screen Keyboard Enhancements:

    • Permanent symbols grid on the right side with all keyboard symbols (32 keys)
    • Added Space, Enter, http://, and https:// buttons to modifier row
    • Added tooltips to Ctrl shortcut buttons
    • Expanded symbol keys with full punctuation set

🔧 Improvements

  • On-Screen Keyboard Layout: Reorganized for better usability with more compact vertical layout and persistent symbols grid

📦 Dependency Updates

  • Web Frontend: Updated @types/node (25.0.1 → 25.0.2)

What's New in 0.16.3

🐛 Bug Fixes

  • Web Terminal tmux/TUI Fix: Fixed control characters (^[[?1;2c^[[>0;276;0c) appearing when running tmux or other TUI applications in the web terminal. The issue was caused by xterm.js generating Device Attributes responses when the backend terminal emulator already handles these queries.

🚀 Performance Optimizations

  • jemalloc Allocator: New optional jemalloc feature for 5-15% server throughput improvement (non-Windows only)
  • TCP_NODELAY: Disabled Nagle's algorithm for lower keystroke latency (up to 40ms improvement)
  • Output Batching: Time-based batching at 60fps reduces WebSocket overhead by 50-80% during burst output
  • Compression Threshold: Lowered to 256 bytes to compress more typical terminal output
  • WebSocket Preconnect: Reduces initial connection latency by 100-200ms
  • Font Preloading: Eliminates layout shift and font flash

📦 Dependency Updates

  • Web Frontend: Updated Next.js and type definitions
  • Pre-commit Hooks: Updated ruff linter

What's New in 0.16.2

🔧 Compatibility Fix

  • TERM Environment Variable: Changed default TERM from xterm-kitty to xterm-256color for better compatibility with systems lacking kitty terminfo

What's New in 0.16.0

🔒 TLS/SSL Support

  • Secure WebSocket Connections for production deployments:
    • New CLI options: --tls-cert, --tls-key, --tls-pem
    • Supports separate cert/key files or combined PEM
    • Enables HTTPS and WSS (secure WebSocket)
# Using separate cert and key files
par-term-streamer --enable-http --tls-cert cert.pem --tls-key key.pem

# Using combined PEM file
par-term-streamer --enable-http --tls-pem combined.pem

🚀 Performance: Binary Protocol

  • BREAKING: Protocol Buffers for WebSocket Streaming:
    • Replaced JSON with binary Protocol Buffers encoding
    • ~80% smaller messages for typical terminal output
    • Optional zlib compression for large payloads (screen snapshots)
    • Wire format: 1-byte header + protobuf payload

🐍 Python Bindings

  • TLS Configuration: StreamingConfig methods for TLS setup
  • Binary Protocol Functions: encode_server_message(), decode_server_message(), encode_client_message(), decode_client_message()

See CHANGELOG.md for complete version history.

What's New in 0.15.0

🎉 New Features

  • Streaming Server CLI Enhancements:
    • --download-frontend option to download prebuilt web frontend from GitHub releases
    • --frontend-version option to specify version to download (default: "latest")
    • --use-tty-size option to use current terminal size from TTY
    • No longer requires Node.js/npm to use web frontend - can download prebuilt version

Quick Start

# Build the streaming server
make streamer-build-release

# Download prebuilt web frontend (no Node.js required!)
./target/release/par-term-streamer --download-frontend

# Run server with frontend
./target/release/par-term-streamer --enable-http

# Open browser to http://127.0.0.1:8099

What's New in 0.14.0

🎉 New Features

  • Web Terminal Onscreen Keyboard: Mobile-friendly virtual keyboard for touch devices

    • Special keys missing from iOS/Android keyboards: Esc, Tab, arrow keys, Page Up/Down, Home, End, Insert, Delete
    • Function keys F1-F12 (toggleable), symbol keys (|, , `, ~, {, }, etc.)
    • Modifier keys (Ctrl, Alt, Shift) that combine with other keys
    • Quick Ctrl shortcuts: ^C, ^D, ^Z, ^L, ^A, ^E, ^K, ^U, ^W, ^R
    • Glass morphism design, haptic feedback, auto-shows on mobile
  • OSC 9;4 Progress Bar Support (ConEmu/Windows Terminal style):

    • Terminal applications can report progress that can be displayed in tab bars, taskbars, or window titles

What's New in 0.13.0

🎉 New Features

  • Streaming Server Enhancements:

    • --size CLI option for specifying terminal size in COLSxROWS format (e.g., --size 120x40 or -s 120x40)
    • --command / -c CLI option to execute a command after shell startup (with 1 second delay for prompt settling)
    • initial_cols and initial_rows configuration options in StreamingConfig for both Rust and Python APIs
  • Python Bindings Enhancements:

    • New MouseEncoding enum for mouse event encoding control (Default, Utf8, Sgr, Urxvt)
    • Direct screen buffer control: use_alt_screen(), use_primary_screen()
    • Mouse encoding control: mouse_encoding(), set_mouse_encoding()
    • Mode setters: set_focus_tracking(), set_bracketed_paste(), set_title()
    • Bold brightening control: bold_brightening(), set_bold_brightening()
    • Color getters for all theme colors (link, bold, cursor guide, badge, match, selection)

What's New in 0.12.0

🐛 Bug Fixes

  • Terminal Reflow Improvements: Multiple fixes to scrollback and grid reflow behavior during resize

What's New in 0.11.0

🎉 New Features

  • Full Terminal Reflow on Width Resize: Both scrollback AND visible screen content now reflow when terminal width changes
    • Previously, width changes cleared scrollback and clipped visible content
    • Now implements intelligent reflow similar to xterm and iTerm2:
      • Scrollback: Preserves all history with proper line wrapping/unwrapping
      • Visible Screen: Content wraps instead of being clipped when narrowing
      • Width increase: Unwraps soft-wrapped lines into longer lines
      • Width decrease: Re-wraps lines that no longer fit
    • Preserves all cell attributes (colors, bold, italic, etc.)
    • Handles wide characters (CJK, emoji) correctly at line boundaries
    • Significant UX improvement for terminal resize operations

What's New in 0.10.0

🎉 New Features

  • Emoji Sequence Preservation: Complete support for complex emoji sequences and grapheme clusters

    • ⚠️ vs ⚠ - Variation selectors (emoji vs text style)
    • 👋🏽 - Skin tone modifiers (Fitzpatrick scale)
    • 👨‍👩‍👧‍👦 - ZWJ sequences (family emoji)
    • 🇺🇸 🇬🇧 - Regional indicator flags
    • é - Combining diacritics and marks
    • New grapheme module for Unicode cluster detection
    • Enhanced Python bindings export full grapheme clusters
  • Web Terminal Frontend: Modern Next.js-based web interface

    • Built with Next.js, TypeScript, and Tailwind CSS v4
    • Theme support with configurable color palettes
    • Nerd Font support for file/folder icons
    • New Makefile targets for web frontend development
  • Terminal Sequence Support:

    • CSI 3J - Clear scrollback buffer command
    • Improved cursor positioning for snapshot exports

🐛 Bug Fixes

  • Graphics now properly preserved when scrolling into scrollback buffer
  • Sixel content saved to scrollback during large scrolling operations
  • Kitty Graphics Protocol animation parsing fixes (base64 encoding, frame actions)

⚠️ Breaking Changes (Rust API only)

  • Cell struct no longer implements Copy (now Clone only)
    • Required for variable-length grapheme cluster storage
    • All cell copy operations now require explicit .clone() calls
    • Python bindings are unaffected - no changes needed in Python code
    • Performance impact is minimal due to efficient cloning

What's New in 0.9.1

  • Theme Rendering Fix: Fixed theme color palette application in Python bindings

What's New in 0.9.0

  • Graphics Protocol Support: Comprehensive multi-protocol graphics implementation

    • iTerm2 Inline Images (OSC 1337): PNG, JPEG, GIF support with base64 encoding
    • Kitty Graphics Protocol (APC G): Advanced image placement with reuse and animations
    • Sixel Graphics: Enhanced with unique IDs and configurable cell dimensions
    • Unified GraphicsStore with scrollback support and memory limits
    • Animation support with frame composition and timing control
    • Graphics dropped event tracking for resource management
  • Pre-built Streaming Server Binaries: Download ready-to-run binaries from GitHub Releases

    • Linux (x86_64, ARM64), macOS (Intel, Apple Silicon), Windows (x86_64)
    • No compilation needed - just download and run
    • Includes separate web frontend package (tar.gz/zip) for serving the terminal interface
    • Published to crates.io for Rust developers: cargo install par-term-emu-core-rust --features streaming

See CHANGELOG.md for complete version history.

Features

Core Terminal Emulation

  • VT100/VT220/VT320/VT420/VT520 Support - Comprehensive terminal emulation matching iTerm2
  • Rich Color Support - 16 ANSI colors, 256-color palette, 24-bit RGB (true color)
  • Text Attributes - Bold, italic, underline (5 styles), strikethrough, blink, reverse, dim, hidden
  • Advanced Cursor Control - Full VT cursor movement and positioning
  • Line/Character Editing - VT220 insert/delete operations
  • Rectangle Operations - VT420 fill/copy/erase/modify rectangular regions (DECFRA, DECCRA, etc.)
  • Scrolling Regions - DECSTBM for restricted scrolling areas
  • Tab Stops - Configurable tab stops (HTS, TBC, CHT, CBT)
  • Unicode Support - Full Unicode including complex emoji sequences and grapheme clusters
    • Variation selectors (emoji vs text presentation)
    • Skin tone modifiers (Fitzpatrick scale U+1F3FB-U+1F3FF)
    • Zero Width Joiner (ZWJ) sequences for multi-emoji glyphs
    • Regional indicators for flag emoji
    • Combining characters and diacritical marks

Modern Features

  • Alternate Screen Buffer - Full support with automatic cleanup
  • Mouse Support - Multiple tracking modes and encodings (X10, Normal, Button, Any, SGR, URXVT)
  • Bracketed Paste Mode - Safe paste handling
  • Focus Tracking - Focus in/out events
  • OSC 8 Hyperlinks - Clickable URLs in terminal (full TUI support)
  • OSC 52 Clipboard - Copy/paste over SSH without X11
  • OSC 9/777 Notifications - Desktop-style alerts and notifications
  • Shell Integration - OSC 133 (iTerm2/VSCode compatible)
  • Kitty Keyboard Protocol - Progressive keyboard enhancement with auto-reset on alternate screen exit
  • Synchronized Updates (DEC 2026) - Flicker-free rendering
  • Tmux Control Protocol - Control mode integration support

Graphics Support

  • Sixel Graphics - DEC VT340 compatible bitmap graphics with half-block rendering
  • iTerm2 Inline Images - OSC 1337 protocol for PNG, JPEG, GIF images
  • Kitty Graphics Protocol - APC G protocol with image reuse, animations, and advanced placement
  • Unicode Placeholders - Virtual placements insert U+10EEEE characters for inline image display
  • Unified Graphics Store - Protocol-agnostic storage with scrollback support
  • Animation Support - Frame-based animations with timing and composition control
  • Resource Management - Configurable memory limits and graphics dropped tracking

PTY Support

  • Interactive Shell Sessions - Spawn and control shell processes
  • Bidirectional I/O - Send input and receive output
  • Process Management - Start, stop, and monitor child processes
  • Dynamic Resizing - Resize with SIGWINCH signal
  • Environment Control - Custom environment variables and working directory
  • Event Loop Integration - Non-blocking update detection
  • Cross-Platform - Linux, macOS, and Windows via portable-pty

Terminal Streaming (WebSocket)

  • Standalone Server - Pure Rust streaming server binary (no Python required)
  • Real-time Streaming - Sub-100ms latency terminal streaming over WebSocket
  • Multiple Clients - Support for concurrent viewers per session
  • Authentication - Optional API key authentication (header or URL param)
  • Configurable Themes - Multiple built-in color themes (iTerm2, Monokai, Dracula, Solarized)
  • Auto-resize - Client-initiated terminal resizing with SIGWINCH support
  • Browser Compatible - Works with any WebSocket client (xterm.js recommended)
  • Modern Web Frontend - Next.js/React application with Tailwind CSS v4 and xterm.js

Screenshots and Export

  • Multiple Formats - PNG, JPEG, BMP, SVG (vector), HTML
  • Embedded Font - JetBrains Mono bundled - no installation required
  • Programming Ligatures - =>, !=, >=, and other code ligatures
  • True Font Rendering - High-quality antialiasing for raster formats
  • Color Emoji Support - Full emoji rendering with automatic font fallback
  • Session Recording - Record/replay sessions (asciicast v2, JSON)
  • Export Functions - Plain text, ANSI styled, HTML export

Macro Recording and Playback

  • YAML Format - Human-readable macro storage format
  • Friendly Key Names - Intuitive key combinations (ctrl+shift+s, enter, f1, etc.)
  • Keyboard Events - Record and replay keyboard input with precise timing
  • Delays - Control timing between events
  • Screenshot Triggers - Trigger screenshots during playback
  • Playback Controls - Play, pause, resume, stop, and speed control
  • Macro Library - Store and manage multiple macros
  • Recording Conversion - Convert terminal recording sessions to macros

Utility Functions

  • Text Extraction - Smart word/URL detection, selection boundaries, bracket matching
  • Content Search - Find text with case-sensitive/insensitive matching
  • Buffer Statistics - Memory usage, cell counts, graphics count and memory tracking
  • Color Utilities - 18+ color manipulation functions (iTerm2-compatible)
    • NTSC brightness, contrast adjustment, WCAG accessibility checks
    • Color space conversions (RGB, HSL, Hex, ANSI 256)
    • Saturation/hue adjustment, color mixing

Documentation

Installation

From PyPI

uv add par-term-emu-core-rust
# or
pip install par-term-emu-core-rust

From Source

Requires Rust 1.75+ and Python 3.12+:

# Install maturin (build tool)
uv tool install maturin

# Build and install
maturin develop --release

Building a Wheel

maturin build --release
uv add --find-links target/wheels par-term-emu-core-rust
# or
pip install target/wheels/par_term_emu_core_rust-*.whl

Using as a Rust Library

The library can be used in pure Rust projects without Python. Choose your feature combination:

Use Case Cargo.toml What's Included
Rust Only par-term-emu-core-rust = { version = "0.10", default-features = false } Terminal, PTY, Macros
Rust + Streaming par-term-emu-core-rust = { version = "0.10", default-features = false, features = ["streaming"] } + WebSocket/HTTP server
Python Only par-term-emu-core-rust = "0.10" + Python bindings
Everything par-term-emu-core-rust = { version = "0.10", features = ["full"] } All features

Download pre-built streaming server (recommended):

Pre-built binaries and web frontend packages are available from GitHub Releases:

# Download binary (Linux example)
wget https://github.com/paulrobello/par-term-emu-core-rust/releases/latest/download/par-term-streamer-linux-x86_64
chmod +x par-term-streamer-linux-x86_64

# Download web frontend
wget https://github.com/paulrobello/par-term-emu-core-rust/releases/latest/download/par-term-web-frontend-v0.10.0.tar.gz
tar -xzf par-term-web-frontend-v0.10.0.tar.gz -C ./web_term

# Run
./par-term-streamer-linux-x86_64 --web-root ./web_term

Available binaries: Linux (x86_64, ARM64), macOS (Intel, Apple Silicon), Windows (x86_64)

Or install from crates.io:

cargo install par-term-emu-core-rust --features streaming

Or build from source:

cargo build --bin par-term-streamer --no-default-features --features streaming --release
./target/release/par-term-streamer --help

See docs/RUST_USAGE.md for detailed Rust API documentation and examples.

Optional Components

Terminfo Installation

For optimal terminal compatibility, install the par-term terminfo definition:

# Install for current user
./terminfo/install.sh

# Or install system-wide
sudo ./terminfo/install.sh --system

# Then use
export TERM=par-term
export COLORTERM=truecolor

See terminfo/README.md for details.

Shell Integration

Enhances terminal with semantic prompt markers, command status tracking, and smart selection:

cd shell_integration
./install.sh  # Auto-detects bash/zsh/fish

See shell_integration/README.md for details.

Quick Start

Basic Terminal Emulation

from par_term_emu_core_rust import Terminal

# Create terminal
term = Terminal(80, 24)

# Process ANSI sequences
term.process_str("Hello, \x1b[31mWorld\x1b[0m!\n")
term.process_str("\x1b[1;32mBold green text\x1b[0m\n")

# Get content and cursor position
print(term.content())
col, row = term.cursor_position()
print(f"Cursor at: ({col}, {row})")

PTY (Interactive Shell)

from par_term_emu_core_rust import PtyTerminal
import time

# Create PTY terminal and spawn shell
with PtyTerminal(80, 24) as term:
    term.spawn_shell()

    # Send commands
    term.write_str("echo 'Hello from shell!'\n")
    time.sleep(0.2)

    # Get output
    print(term.content())

    # Resize terminal
    term.resize(100, 30)

    # Exit shell
    term.write_str("exit\n")
# Automatic cleanup

Screenshots

term = Terminal(80, 24)
term.process_str("\x1b[1;31mHello, World!\x1b[0m\n")

# Save screenshot
term.screenshot_to_file("output.png")
term.screenshot_to_file("output.svg", format="svg")  # Vector graphics!
term.screenshot_to_file("output.html", format="html")  # Styled HTML

# Custom configuration
term.screenshot_to_file(
    "output.png",
    font_size=16.0,
    padding=20,
    include_scrollback=True,
    minimum_contrast=0.5  # iTerm2-compatible contrast adjustment
)

Color Utilities

from par_term_emu_core_rust import (
    perceived_brightness_rgb, adjust_contrast_rgb,
    contrast_ratio, meets_wcag_aa,
    rgb_to_hex, hex_to_rgb, mix_colors
)

# iTerm2-compatible contrast adjustment
adjusted = adjust_contrast_rgb((64, 64, 64), (0, 0, 0), 0.5)

# WCAG accessibility checks
ratio = contrast_ratio((0, 0, 0), (255, 255, 255))
print(f"Contrast ratio: {ratio:.1f}:1")
print(f"Meets WCAG AA: {meets_wcag_aa((0, 0, 0), (255, 255, 255))}")

# Color conversions
hex_color = rgb_to_hex((255, 128, 64))  # "#FF8040"
rgb = hex_to_rgb("#FF8040")  # (255, 128, 64)
mixed = mix_colors((255, 0, 0), (0, 0, 255), 0.5)  # Purple

Macro Recording and Playback

from par_term_emu_core_rust import Macro, PtyTerminal
import time

# Create a macro manually
macro = Macro("git_status")
macro.set_description("Check git status and show branch")
macro.add_key("g")
macro.add_key("i")
macro.add_key("t")
macro.add_key("space")
macro.add_key("s")
macro.add_key("t")
macro.add_key("a")
macro.add_key("t")
macro.add_key("u")
macro.add_key("s")
macro.add_key("enter")
macro.add_delay(500)  # Wait 500ms
macro.add_screenshot("git_status.png")  # Trigger screenshot

# Save to YAML
macro.save_yaml("git_status.yaml")

# Load and play back
term = PtyTerminal(80, 24)
term.spawn_shell()

# Load macro from file
loaded_macro = Macro.load_yaml("git_status.yaml")
term.load_macro("git_check", loaded_macro)

# Play the macro
term.play_macro("git_check", speed=1.0)  # Normal speed

# Tick to execute macro events
while term.is_macro_playing():
    if term.tick_macro():  # Returns True if event was processed
        time.sleep(0.01)  # Small delay for visual effect

    # Check for screenshot triggers
    triggers = term.get_macro_screenshot_triggers()
    for label in triggers:
        term.screenshot_to_file(label)

# Convert a recording to a macro
term.start_recording("test session")
term.write_str("ls -la\n")
time.sleep(0.5)
session = term.stop_recording()

# Convert and save
macro = term.recording_to_macro(session, "ls_command")
macro.save_yaml("ls_command.yaml")

Examples

See the examples/ directory for comprehensive examples:

Basic Examples

  • basic_usage_improved.py - Enhanced basic usage
  • colors_demo.py - Color support
  • cursor_movement.py - Cursor control
  • text_attributes.py - Text styling
  • unicode_emoji.py - Unicode/emoji support
  • scrollback_demo.py - Scrollback buffer usage

Advanced Features

  • alt_screen.py - Alternate screen buffer
  • mouse_tracking.py - Mouse events
  • bracketed_paste.py - Bracketed paste
  • synchronized_updates.py - Flicker-free rendering
  • shell_integration.py - OSC 133 integration
  • test_osc52_clipboard.py - SSH clipboard
  • test_kitty_keyboard.py - Kitty keyboard protocol
  • hyperlink_demo.py - Clickable URLs
  • notifications.py - Desktop notifications
  • rectangle_operations.py - VT420 rectangle ops

Graphics and Export

  • display_image_sixel.py - Sixel graphics
  • test_sixel_simple.py - Simple sixel examples
  • test_sixel_display.py - Advanced sixel display
  • screenshot_demo.py - Screenshot features
  • feature_showcase.py - Comprehensive TUI showcase

PTY Examples

  • pty_basic.py - Basic PTY usage
  • pty_shell.py - Interactive shells
  • pty_resize.py - Dynamic resizing
  • pty_event_loop.py - Event loop integration
  • pty_mouse_events.py - Mouse in PTY
  • pty_custom_env.py - Custom environment variables
  • pty_multiple.py - Multiple PTY sessions
  • pty_with_par_term.py - Integration with par-term

Terminal Streaming

  • streaming_demo.py - Python WebSocket streaming server
  • streaming_client.html - Browser-based terminal client

Macros and Automation

  • demo.yaml - Example macro definition

Standalone Rust Server:

# Build and run (default: ws://127.0.0.1:8080)
make streamer-run

# Run with authentication
make streamer-run-auth

# Or use cargo directly
cargo build --bin par-term-streamer --no-default-features --features streaming --release
./target/release/par-term-streamer --port 8080 --theme dracula

# With authentication
./target/release/par-term-streamer --api-key my-secret --theme monokai

# Install globally
make streamer-install
par-term-streamer --help

Available Themes: iterm2-dark, monokai, dracula, solarized-dark

Web Terminal Frontend

Using Pre-built Package (Recommended):

Download the pre-built static web frontend from GitHub Releases:

# Download and extract
wget https://github.com/paulrobello/par-term-emu-core-rust/releases/latest/download/par-term-web-frontend-v0.10.0.tar.gz
tar -xzf par-term-web-frontend-v0.10.0.tar.gz -C ./web_term

# Run streamer with web frontend
par-term-streamer --web-root ./web_term
# Open browser to http://localhost:8080

See web_term/README.md for detailed usage instructions.

Building from Source:

A modern Next.js-based web terminal frontend source is in web-terminal-frontend/:

cd web-terminal-frontend

# Install dependencies
npm install

# Development server (runs on port 8030)
npm run dev

# Build for production (outputs to out/)
npm run build

# Copy to web_term for serving
cp -r out/* ../web_term/

Features:

  • Modern UI with Tailwind CSS v4
  • xterm.js terminal emulator
  • WebSocket connection to streaming server
  • Theme selection and synchronization
  • Responsive design
  • Terminal resize support

See web-terminal-frontend/README.md for detailed setup and configuration.

TUI Demo Application

A full-featured TUI (Text User Interface) application is available in the sister project par-term-emu-tui-rust.

TUI Demo Application

Installation: uv add par-term-emu-tui-rust or pip install par-term-emu-tui-rust

GitHub: https://github.com/paulrobello/par-term-emu-tui-rust

Technology

  • Rust (1.75+) - Core library implementation
  • Python (3.12+) - Python bindings
  • PyO3 - Zero-cost Python/Rust bindings
  • VTE - ANSI sequence parsing
  • portable-pty - Cross-platform PTY support

Running Tests

# Run Rust tests
cargo test

# Run Python tests
uv sync  # Install dependencies including pytest
pytest tests/

Performance

  • Zero-copy operations where possible
  • Efficient grid representation
  • Fast ANSI parsing with VTE crate
  • Minimal Python/Rust boundary crossings

See docs/ARCHITECTURE.md for implementation details.

Security

When using PTY functionality, follow security best practices to prevent command injection and other vulnerabilities.

See docs/SECURITY.md for comprehensive security guidelines.

Contributing

Contributions are welcome! Please submit issues or pull requests on GitHub.

Development Setup

git clone https://github.com/paulrobello/par-term-emu-core-rust.git
cd par-term-emu-core-rust
make setup-venv  # Create virtual environment
make pre-commit-install  # Install pre-commit hooks (recommended)
make dev  # Build library
make checkall  # Run all quality checks

Code Quality

All contributions must pass:

  • Rust formatting (cargo fmt)
  • Rust linting (cargo clippy)
  • Python formatting (make fmt-python)
  • Python linting (make lint-python)
  • Type checking (pyright)
  • Tests (make test-python)

TIP: Use make pre-commit-install to automate all checks on every commit!

See CLAUDE.md for detailed development instructions.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

Paul Robello - probello@gmail.com

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

par_term_emu_core_rust-0.18.0.tar.gz (1.3 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

par_term_emu_core_rust-0.18.0-cp314-cp314-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.14Windows x86-64

par_term_emu_core_rust-0.18.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

par_term_emu_core_rust-0.18.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

par_term_emu_core_rust-0.18.0-cp314-cp314-macosx_10_12_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

par_term_emu_core_rust-0.18.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (6.6 MB view details)

Uploaded CPython 3.14macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

par_term_emu_core_rust-0.18.0-cp313-cp313-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.13Windows x86-64

par_term_emu_core_rust-0.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

par_term_emu_core_rust-0.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

par_term_emu_core_rust-0.18.0-cp313-cp313-macosx_10_12_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

par_term_emu_core_rust-0.18.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (6.6 MB view details)

Uploaded CPython 3.13macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

par_term_emu_core_rust-0.18.0-cp312-cp312-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.12Windows x86-64

par_term_emu_core_rust-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

par_term_emu_core_rust-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

par_term_emu_core_rust-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

par_term_emu_core_rust-0.18.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (6.6 MB view details)

Uploaded CPython 3.12macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file par_term_emu_core_rust-0.18.0.tar.gz.

File metadata

  • Download URL: par_term_emu_core_rust-0.18.0.tar.gz
  • Upload date:
  • Size: 1.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for par_term_emu_core_rust-0.18.0.tar.gz
Algorithm Hash digest
SHA256 c3df1e68b70e759ba3cdec7dfc12b9b94a3e59d7af7e256f6794cf76a5fa01ed
MD5 14acdb5f7269833f73616a22d5435633
BLAKE2b-256 bc73dad9ee4dd01e4dfb721d7500c1db2e4c77616bc0c7ff63873fdc42a560bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0.tar.gz:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 aff3698d79eb4ca73843041bed931a03df321e3c6042069598e91627c6a51b86
MD5 61edcac8455d4cc4aaae67d56cf47a9a
BLAKE2b-256 3c6ae171d20cd1f72eac21ad0b78a19ada73cdae8787d8dee157448d90750285

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp314-cp314-win_amd64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9fb10598e8fd319a8eda78d5c93fcc69cebe500ac5e46667889ddc34fa9029cc
MD5 13cadcc6583969596d6dbf7c477e6d11
BLAKE2b-256 e2f9b3be8940a382741c3cfc99e1f4305d94da7e77867dc1cde2098c5ad8fc36

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 025a2f36eac1085fcfea5d72e4565d4cd65b5217c020f7d994322470381a3db0
MD5 e7b5f2a510a54099a91255b528139ea2
BLAKE2b-256 7971759c327d3cbbf8af1b28ad436e14f1d1a53fc8ddbb31ddefb77573819cbf

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6e716c7747cabb5a8412d41040b42ac0b4eba0bd0fcc5ccf3789bdd083f4a7d4
MD5 5e431529af522ee0c0e8b8bf93304bb8
BLAKE2b-256 3e39188c37d5053432b6a4571810d77b1717ba72c00ec5bc82f6f3ae78c91930

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp314-cp314-macosx_10_12_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 d430c42070aa9246564bc94d03a748bd6f16109e23f942b50c4c13f9cf318104
MD5 4551dbb7d49486d8e67c0236be82d064
BLAKE2b-256 145cb92611109de3a75dcbec2c0d960bdc89d840deeadd9d21392a31723f5128

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 40bbb0f1890968e68b107f8d20c3cfeb0e6a637aa51b2e3ee4caf85327f5a2af
MD5 a307a23cf278b17b12b179460507490c
BLAKE2b-256 667b761d17760803f8a6f9f14a2ed6a146b05732e1ef9bf12f2ee81138d20e6c

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp313-cp313-win_amd64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f882787a34aeacc6effc42cc60e11b8a8e4ddae6db12c3e31040fbf5e40fa1c7
MD5 535f4fcebe47f50fef1e52f63ae683e9
BLAKE2b-256 12562ec0a49879cdef41502ca6c0dca9e99b660bfc746da55be28518c74679e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 581a88af12ef45b175dedb5387fe8c776b451d1897c9ed49b4e5d313b4a078d0
MD5 c1dee09bc922eb2d62c412404bd7c8d7
BLAKE2b-256 1a51921b8d92c10a27d0c499b2291271be6871425998b6f889a8c0370a2a08ac

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8bee98cf2efecfe9f00e5c5a6870d3164db3fea7411fafd534586b2a8e15cdab
MD5 7dd384203644faf70012f40a9005205f
BLAKE2b-256 75670138e633849641f7c1b5c5c67d4b93eef172d4b31ebfa981f612e422370f

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 9938d2496ad0b8eca197ac60c09f66903083b0117b99fc8f4cb98ce60afa562f
MD5 fa19c99c34968b8e7052c4e9cb87ee4c
BLAKE2b-256 8c8c725c6d91417a241d438225ceed21521074318b69e96f647ad7d4962bcc72

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7f2352d8fd17d45ed5dcdb0408349564caab54c655146e25f25ae84ec42d8430
MD5 e64402fcf6830f8518662ad755f50263
BLAKE2b-256 24d8dc984b3322f8b09d674a25a7852323697150ff25ef654aba23ca43ef145d

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp312-cp312-win_amd64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7b57451c85810c560c0af0181bbe164a76625f8859b2bb8127e8939a8c767b90
MD5 64da58caa063a182076784535afcae88
BLAKE2b-256 c6fad0c9b9daa32fe996c2d5765f797d1f2482bec14b528a24bfb17604e6e8d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6331c128c366c2806c8bc7f816cd802868eae3c20725b8eb9c8bc9f5d1f99227
MD5 a931698f302786743dada41733b1406e
BLAKE2b-256 7350fb32bd9d132ffc68a11e4b9d1a8bf2c8ee62930305b9fef7e2c8a20d89c8

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 30014427828d16459aee7ed02e5181be958806ff623ca9906908c6712ab402ea
MD5 989f6312ea37474d451c10926a07ed4c
BLAKE2b-256 b94716a13891033ddc1e4f4d52a4e7c440b4b4b83efb5cf5ebd560b2c160a8a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.18.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.18.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 d0c39bf930c1f964db394a759921d597472a7f437d2dce5ea9d0e76d8399c10b
MD5 815f1696215d5efc671ee94eb6d01162
BLAKE2b-256 c511ce5f95d4558486d3681d15f3fe7cbc5ad6931b20f7de8f8dcdf066a35b6b

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.18.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page