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 PyPI - Python Version Runs on Linux | MacOS | Windows Arch x86-64 | ARM | AppleSilicon PyPI - Downloads PyPI - License

What's New in 0.6.0

Comprehensive Color Utilities API

Version 0.6.0 adds a complete suite of color manipulation functions with Python bindings:

  • 18 New Python Functions: Complete color utility API for terminal applications
    • perceived_brightness_rgb(), adjust_contrast_rgb()
    • lighten_rgb(), darken_rgb()
    • color_luminance(), is_dark_color(), contrast_ratio()
    • meets_wcag_aa(), meets_wcag_aaa()
    • mix_colors(), complementary_color()
    • rgb_to_hsl(), hsl_to_rgb(), rgb_to_hex(), hex_to_rgb()
    • rgb_to_ansi_256(), adjust_saturation(), adjust_hue()
  • Color Space Support: RGB, HSL, Hex, and ANSI 256-color conversions
  • WCAG Accessibility: Built-in compliance checks (AA/AAA standards)
  • Advanced Manipulation: Saturation, hue adjustment, color mixing, complementary colors
  • iTerm2 Compatibility: Same NTSC brightness formula and contrast adjustment algorithms
  • Fast Native Code: Rust implementation for optimal performance

Bold Brightening Support (from 0.5.0)

Configurable bold brightening for improved terminal compatibility:

  • New set_bold_brightening() Method: Enable/disable bold text brightening for ANSI colors 0-7
  • iTerm2 Compatibility: Matches iTerm2's "Use Bright Bold" setting behavior
  • Automatic Color Conversion: Bold text with ANSI colors 0-7 automatically uses bright variants 8-15
  • Snapshot Integration: create_snapshot() automatically applies bold brightening when enabled
  • Comprehensive Documentation: New section in docs/ADVANCED_FEATURES.md with examples

Minimum Contrast Adjustment (iTerm2-Compatible)

New automatic contrast adjustment feature ensures text readability:

  • NTSC Perceived Brightness: Uses the same NTSC formula as iTerm2 (30% red, 59% green, 11% blue)
  • Hue Preservation: Adjusts brightness while preserving color hue using parametric interpolation
  • Configurable Threshold: Set minimum contrast from 0.0 (disabled) to 1.0 (maximum)
  • Screenshot Integration: Apply via minimum_contrast parameter in screenshot methods
  • Python & Rust APIs: Helper functions perceived_brightness_rgb() and adjust_contrast_rgb()
  • Automatic Direction Selection: Intelligently chooses to lighten or darken text for optimal contrast

Enhanced Color Configuration

  • Bold Brightening API: Programmatic control over bold color rendering
  • Minimum Contrast Adjustment: iTerm2-compatible automatic contrast adjustment for improved readability
  • Snapshot Accuracy: Screen snapshots now correctly reflect bold brightening state
  • Backward Compatible: Features are opt-in and don't affect existing code

Description

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

"Buy Me A Coffee"

Table of Contents

Technology

  • Rust (1.75+)
  • Python (3.12+)
  • PyO3 for Python bindings
  • VTE for ANSI parsing
  • portable-pty for cross-platform PTY support

Prerequisites

  • Rust 1.75 or higher
  • Python 3.12 or higher
  • uv package manager
  • maturin (for building Python wheels)

Features

Core VT Compatibility (iTerm2 Feature Parity)

  • VT100/VT220/VT320/VT420 Support: Comprehensive terminal emulation matching iTerm2's capabilities
  • Rich Color Support:
    • Basic 16 ANSI colors
    • 256-color palette
    • 24-bit RGB (true color)
  • Text Attributes: Bold, italic, underline (with styles: straight, double, curly, dotted, dashed), strikethrough, blink, reverse, dim, and hidden
  • Advanced Cursor Control: Full VT100 cursor movement and positioning
  • Line/Character Editing: VT220 insert/delete operations (IL, DL, ICH, DCH, ECH)
  • Rectangle Operations: VT420 fill/copy/erase/modify rectangular regions (DECFRA, DECCRA, DECSERA, DECERA, DECCARA, DECRARA, DECRQCRA, DECSACE)
  • Scrolling Regions: DECSTBM for restricted scrolling areas
  • Tab Stops: Configurable tab stops (HTS, TBC, CHT, CBT)
  • Terminal Modes:
    • Application cursor keys (DECCKM)
    • Origin mode (DECOM)
    • Auto wrap mode (DECAWM)
    • Multiple alternate screen variants (47, 1047, 1049)
  • Mouse Support: Multiple mouse tracking modes (X10, Normal, Button, Any) and encodings (Default, UTF-8, SGR, URXVT)
  • Modern Features:
    • Alternate screen buffer
    • Bracketed paste mode
    • Focus tracking
    • OSC 8 hyperlinks (full support - clickable in TUI)
    • OSC 52 clipboard operations (copy/paste over SSH without X11)
    • OSC 9 / OSC 777 notifications (desktop-style alerts)
    • Shell integration (OSC 133)
    • Sixel graphics (DCS format with half-block rendering)
    • Kitty Keyboard Protocol (progressive enhancement for keyboard handling)
  • Scrollback Buffer: Configurable history of scrolled lines
  • Terminal Resizing: Dynamic size adjustment
  • Unicode Support: Full Unicode including emoji and wide characters
  • High Performance: Written in Rust for speed and safety
  • Python Integration: Easy-to-use Python API via PyO3

PTY Support

  • Interactive Shell Sessions: Spawn and control shell processes
  • Bidirectional I/O: Send input and receive output from running processes
  • Process Management: Start, stop, and monitor child processes
  • Dynamic Resizing: Resize terminal and send SIGWINCH to child process
  • Environment Control: Custom environment variables and working directory
  • Event Loop Integration: Non-blocking update detection for efficient event loops
  • Context Manager Support: Automatic cleanup with Python with statements
  • Cross-Platform: Works on Linux, macOS, and Windows via portable-pty

Utility Functions

  • Text Extraction: Smart word/URL detection, line unwrapping, selection boundaries
  • Content Search: Find text with case-sensitive/insensitive matching, "find next" support
  • Buffer Statistics: Get detailed metrics (memory usage, cell counts, graphics count)
  • Static Utilities: Strip ANSI codes, measure text width, parse colors from strings

Screenshot Support

  • Multiple Formats: PNG, JPEG, BMP, SVG (vector graphics!), and HTML
  • Embedded Font: JetBrains Mono bundled - no font installation required!
  • Programming Ligatures: Supports =>, !=, >=, and other code ligatures
  • Box Drawing: Perfect rendering of box drawing characters (┌─┐│└┘)
  • High-Quality Rendering: True font rendering with antialiasing for raster formats
  • SVG Vector Output: Infinitely scalable screenshots with selectable text
  • HTML Output: Styled HTML with full color support and text attributes (includes full document or content-only mode)
  • Color Emoji Support: Full color emoji rendering with automatic font fallback (NotoColorEmoji, Apple Color Emoji, Segoe UI Emoji)
  • Flag Emoji Support: Proper rendering of flag emojis (🇺🇸 🇨🇳 🇯🇵) via text shaping
  • Cursor Rendering: Capture cursor position with 3 styles (Block, Underline, Bar) and custom colors
  • Sixel Graphics: Inline graphics rendering with full alpha blending support
  • Minimum Contrast Adjustment: iTerm2-compatible automatic contrast adjustment ensures text readability on any background
  • Configurable: Custom fonts, sizes, padding, and quality settings
  • Full Styling: Preserves all colors, text attributes, and decorations
  • Wide Character Support: Renders CJK characters and emoji correctly
  • Python & Rust APIs: Easy-to-use interfaces for both languages
  • TUI Integration: Built-in Ctrl+Shift+S hotkey in the TUI application

Installation

From Source

Requires Rust 1.75+ and Python 3.12+:

# Install maturin (build tool) using uv
uv tool install maturin

# Build and install the package
maturin develop --release

Building a Wheel

maturin build --release
uv pip install target/wheels/par_term_emu_core_rust-*.whl

Terminfo Installation (Optional)

For optimal terminal compatibility, you can install the par-term terminfo definition. This allows applications to fully utilize all terminal capabilities (true color, Sixel graphics, etc.):

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

# Or install system-wide (requires sudo)
sudo ./terminfo/install.sh --system

# Then use the terminal type
export TERM=par-term
export COLORTERM=truecolor

See terminfo/README.md for detailed information.

Note: If not installed, the terminal defaults to xterm-256color compatibility mode, which works well with most applications.

Shell Integration (Optional but Recommended)

Shell integration enhances your terminal experience with semantic prompt markers. This enables features like prompt navigation, command status tracking, and smart selection.

# Install for your current shell (auto-detects bash/zsh/fish)
cd shell_integration
./install.sh

# Or install for all available shells
./install.sh --all

# Or install for a specific shell
./install.sh bash   # or zsh, or fish

After installation, restart your shell or run:

source ~/.par_term_emu_core_rust_shell_integration.bash  # for bash
source ~/.par_term_emu_core_rust_shell_integration.zsh   # for zsh
source ~/.par_term_emu_core_rust_shell_integration.fish  # for fish

See shell_integration/README.md for detailed information, advanced usage, and customization options.

Quick Start

from par_term_emu_core_rust import Terminal

# Create a terminal with 80 columns and 24 rows
term = Terminal(80, 24)

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

# Get the content
print(term.content())

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

PTY Quick Start

from par_term_emu_core_rust import PtyTerminal
import time

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

    # Send a command
    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 on exit

Usage Examples

Basic Text Processing

from par_term_emu_core_rust import Terminal

term = Terminal(80, 24)

# Write plain text
term.process_str("Hello, Terminal!\n")

# Write bytes
term.process(b"Binary data\n")

# Get content
content = term.content()
print(content)

Colors and Styling

term = Terminal(80, 24)

# Basic colors (30-37 for foreground, 40-47 for background)
term.process_str("\x1b[31mRed text\x1b[0m\n")
term.process_str("\x1b[42mGreen background\x1b[0m\n")

# Bright colors (90-97, 100-107)
term.process_str("\x1b[91mBright red\x1b[0m\n")

# 256-color palette
term.process_str("\x1b[38;5;208mOrange text\x1b[0m\n")

# 24-bit RGB colors
term.process_str("\x1b[38;2;255;128;0mRGB orange\x1b[0m\n")

# Text attributes
term.process_str("\x1b[1mBold\x1b[0m ")
term.process_str("\x1b[3mItalic\x1b[0m ")
term.process_str("\x1b[4mUnderline\x1b[0m\n")

Cursor Control

term = Terminal(80, 24)

# Position cursor at row 5, column 10 (1-indexed)
term.process_str("\x1b[5;10HHello")

# Move cursor
term.process_str("\x1b[2A")    # Up 2 rows
term.process_str("\x1b[3B")    # Down 3 rows
term.process_str("\x1b[4C")    # Forward 4 columns
term.process_str("\x1b[5D")    # Back 5 columns

# Hide/show cursor
term.process_str("\x1b[?25l")  # Hide
term.process_str("\x1b[?25h")  # Show

# Check cursor state
visible = term.cursor_visible()
col, row = term.cursor_position()

Screen Manipulation

term = Terminal(80, 24)

term.process_str("Some content\n")

# Clear operations
term.process_str("\x1b[2J")    # Clear entire screen
term.process_str("\x1b[K")     # Clear from cursor to end of line
term.process_str("\x1b[1K")    # Clear from beginning of line to cursor
term.process_str("\x1b[2K")    # Clear entire line

# Scroll
term.process_str("\x1b[5S")    # Scroll up 5 lines
term.process_str("\x1b[5T")    # Scroll down 5 lines

Scrollback Buffer

term = Terminal(40, 10, scrollback=1000)

# Write more lines than terminal height
for i in range(20):
    term.process_str(f"Line {i}\n")

# Get scrollback
scrollback = term.scrollback()
print(f"Scrollback has {len(scrollback)} lines")

for line in scrollback:
    print(f"Scrolled: {line}")

Terminal Resizing

term = Terminal(80, 24)

# Write some content
term.process_str("Content before resize\n")

# Resize terminal
term.resize(100, 30)

# Content is preserved
print(term.size())  # (100, 30)

Cell Inspection

term = Terminal(80, 24)
term.process_str("\x1b[1;31mRed bold text\x1b[0m")

# Get character at position
char = term.get_char(0, 0)
print(f"Character: {char}")

# Get colors
fg_color = term.get_fg_color(0, 0)
bg_color = term.get_bg_color(0, 0)
if fg_color:
    r, g, b = fg_color
    print(f"Foreground: RGB({r}, {g}, {b})")

# Get attributes
attrs = term.get_attributes(0, 0)
if attrs:
    print(f"Bold: {attrs.bold}")
    print(f"Italic: {attrs.italic}")
    print(f"Underline: {attrs.underline}")

Buffer Export

term = Terminal(80, 24, scrollback=1000)

# Write multiple lines with styling
for i in range(50):
    term.process_str(f"\x1b[1;{31 + i % 7}mLine {i}\x1b[0m\n")

# Export as plain text (no styling)
plain_text = term.export_text()
with open("session.txt", "w") as f:
    f.write(plain_text)

# Export with ANSI styling preserved
styled_text = term.export_styled()
with open("session.ansi", "w") as f:
    f.write(styled_text)

# Export as HTML with full styling
html_output = term.export_html(include_styles=True)
with open("session.html", "w") as f:
    f.write(html_output)  # Full HTML document with styles

# Export HTML content only (for embedding)
html_content = term.export_html(include_styles=False)
# Returns just the styled <span> elements, no <html>/<head>/<body>

# Also works with PTY sessions
with PtyTerminal(80, 24) as pty:
    pty.spawn_shell()
    pty.write_str("ls -la\n")
    time.sleep(0.5)

    # Save entire session (scrollback + screen)
    session_log = pty.export_styled()
    with open("pty_session.log", "w") as f:
        f.write(session_log)

Screenshots

Take high-quality screenshots of terminal output with true font rendering:

from par_term_emu_core_rust import Terminal

term = Terminal(80, 24)

# Add some colorful content
term.process_str("\x1b[1;31mHello, World!\x1b[0m\n")
term.process_str("\x1b[32m✓ Success\x1b[0m\n")

# Take screenshot as PNG bytes (default)
png_bytes = term.screenshot()

# Save to file (format auto-detected from extension)
term.screenshot_to_file("output.png")

# Or explicitly specify format
term.screenshot_to_file("output.jpg", format="jpeg", quality=90)

# SVG format for infinitely scalable vector graphics
term.screenshot_to_file("output.svg", format="svg")  # Selectable text!

# HTML format for styled terminal output (embeddable or standalone)
term.screenshot_to_file("output.html", format="html")  # Full HTML document

# Custom configuration
term.screenshot_to_file(
    "output.png",
    font_size=16.0,           # Larger text
    padding=20,               # More padding around edges
    include_scrollback=True   # Include scrollback history
)

# Capture scrolled view (e.g., 10 lines back from current position)
term.screenshot_to_file(
    "output.png",
    scrollback_offset=10      # Capture from 10 lines back
)

# Customize theme colors
term.screenshot_to_file(
    "output.png",
    link_color=(0, 123, 255),     # Custom hyperlink color
    bold_color=(255, 255, 0),     # Custom bold text color
    use_bold_color=True           # Apply custom bold color
)

# Enable minimum contrast adjustment (iTerm2-compatible)
term.screenshot_to_file(
    "output.png",
    minimum_contrast=0.5          # Auto-adjust text colors for readability (0.0-1.0)
)                                 # 0.0 = disabled (iTerm2 default), 0.5 = moderate, 1.0 = maximum

# Specify custom font (for raster formats)
term.screenshot_to_file(
    "output.png",
    font_path="/path/to/font.ttf"
)

Supported Formats

  • PNG: Lossless, best for text and screenshots (default)
  • JPEG: Smaller file size, configurable quality (1-100)
  • BMP: Uncompressed, large file size
  • SVG: Vector format with infinitely scalable, selectable text - perfect for documentation!
  • HTML: Styled HTML output with full color support and text attributes - embeddable or standalone document

TUI Integration

Note: TUI integration features are available in the sister project par-term-emu-tui-rust, which includes screenshot hotkeys and other interactive features.

Color Utilities

Comprehensive color manipulation functions for terminal applications:

from par_term_emu_core_rust import (
    # Brightness and contrast
    perceived_brightness_rgb, adjust_contrast_rgb,

    # Basic adjustments
    lighten_rgb, darken_rgb,

    # Accessibility (WCAG)
    color_luminance, is_dark_color, contrast_ratio,
    meets_wcag_aa, meets_wcag_aaa,

    # Color mixing and manipulation
    mix_colors, complementary_color,

    # Color space conversions
    rgb_to_hsl, hsl_to_rgb, rgb_to_hex, hex_to_rgb,
    rgb_to_ansi_256,

    # Advanced adjustments
    adjust_saturation, adjust_hue
)

# iTerm2-compatible contrast adjustment
adjusted = adjust_contrast_rgb((64, 64, 64), (0, 0, 0), 0.5)
print(f"Adjusted for readability: {adjusted}")  # (128, 128, 128)

# Calculate perceived brightness (NTSC formula)
brightness = perceived_brightness_rgb(128, 128, 128)
print(f"Brightness: {brightness:.2f}")  # 0.50

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

# Color manipulation
lightened = lighten_rgb((128, 64, 32), 0.5)  # Lighten by 50%
darkened = darken_rgb((200, 150, 100), 0.3)  # Darken by 30%
mixed = mix_colors((255, 0, 0), (0, 0, 255), 0.5)  # Purple

# Color space conversions
h, s, l = rgb_to_hsl((255, 0, 0))  # Red to HSL
rgb = hsl_to_rgb(120, 100, 50)  # Green from HSL
hex_str = rgb_to_hex((255, 128, 64))  # "#FF8040"
rgb = hex_to_rgb("#FF8040")  # (255, 128, 64)

# Advanced color theory
saturated = adjust_saturation((200, 100, 100), 50)  # +50% saturation
shifted = adjust_hue((255, 0, 0), 120)  # Red -> Green (120° shift)
complement = complementary_color((255, 0, 0))  # Cyan

# Terminal palette conversion
ansi_idx = rgb_to_ansi_256((255, 0, 0))  # Find nearest ANSI 256 color

Key Features:

  • iTerm2-Compatible Algorithms: Same NTSC brightness formula (30% red, 59% green, 11% blue) and contrast adjustment
  • WCAG Compliance: Built-in accessibility checks (AA/AAA standards with 4.5:1 and 7:1 ratios)
  • Color Space Support: RGB, HSL, Hex (#RRGGBB), and ANSI 256-color palette
  • Hue Preservation: Brightness adjustments use parametric interpolation to maintain color hue
  • Color Theory: Complementary colors, hue shifting, saturation adjustment
  • Accessibility Testing: Luminance calculation, dark color detection, contrast ratio checking
  • Fast Native Code: Rust implementation for optimal performance with Python bindings

Text Extraction & Smart Selection

Extract words, URLs, and lines with intelligent boundary detection:

term = Terminal(80, 24)
term.process_str("Visit https://example.com for more info\n")
term.process_str("Use snake_case or kebab-case naming\n")
term.process_str("Function call: foo(bar, {x: 1, y: \"hello\"})\n")

# Extract word at cursor position
word = term.get_word_at(5, 0)  # "https://example.com"

# Detect and extract URLs
url = term.get_url_at(10, 0)  # "https://example.com"

# Get word boundaries for double-click selection
bounds = term.select_word(5, 1)
if bounds:
    (start_col, start_row), (end_col, end_row) = bounds
    print(f"Word spans from ({start_col}, {start_row}) to ({end_col}, {end_row})")

# Custom word characters (default is iTerm2-compatible: "/-+\~_.")
# For snake_case/identifiers, you might want to include additional chars:
word = term.get_word_at(4, 1, word_chars="_-")  # "snake_case"

# Get full logical line (following wraps)
full_line = term.get_line_unwrapped(0)

# Find matching bracket/parenthesis
term.process_str("if (condition) { action(); }\n")
match_pos = term.find_matching_bracket(3, 3)  # Click on opening '('
if match_pos:
    col, row = match_pos
    print(f"Matching bracket at ({col}, {row})")  # Position of closing ')'

# Select content within delimiters (semantic selection)
term.process_str('message = "Hello, World!"\n')
content = term.select_semantic_region(15, 4, '"')  # Click inside quotes
print(content)  # "Hello, World!"

# Works with multiple delimiter types
term.process_str("data = {key: 'value', num: [1, 2, 3]}\n")
content = term.select_semantic_region(10, 5, "{}[]'\"")  # Click inside braces
print(content)  # "key: 'value', num: [1, 2, 3]"

Content Search

Search terminal content with case-sensitive or case-insensitive matching:

term = Terminal(80, 24)
for i in range(20):
    term.process_str(f"Line {i}: Error in module_{i}\n")

# Find all occurrences
matches = term.find_text("Error", case_sensitive=True)
print(f"Found {len(matches)} matches: {matches}")  # [(8, 0), (8, 1), ...]

# Case-insensitive search
matches = term.find_text("error", case_sensitive=False)

# Find next occurrence from position
next_match = term.find_next("Error", from_col=0, from_row=5)
if next_match:
    col, row = next_match
    print(f"Next match at ({col}, {row})")

# Implement "find next" button
current_pos = (0, 0)
while True:
    match = term.find_next("pattern", current_pos[0], current_pos[1])
    if not match:
        break
    print(f"Match at {match}")
    current_pos = match

Buffer Statistics & Analysis

Get comprehensive statistics about terminal content:

term = Terminal(80, 24, scrollback=10000)

# Get detailed statistics
stats = term.get_stats()
print(f"Dimensions: {stats['cols']}x{stats['rows']}")
print(f"Scrollback: {stats['scrollback_lines']}/{stats['total_cells']} cells")
print(f"Non-empty lines: {stats['non_whitespace_lines']}")
print(f"Graphics: {stats['graphics_count']}")
print(f"Memory: ~{stats['estimated_memory_bytes']} bytes")

# Count content lines (excluding empty lines)
content_lines = term.count_non_whitespace_lines()
print(f"Lines with content: {content_lines}")

# Check scrollback usage
used, capacity = term.get_scrollback_usage()
print(f"Scrollback: {used}/{capacity} lines ({used/capacity*100:.1f}%)")

Static Utility Methods

Use standalone utility functions for text processing:

# Strip ANSI codes from text
colored = "\x1b[31mRed\x1b[0m text"
clean = Terminal.strip_ansi(colored)
print(clean)  # "Red text"

# Measure display width (accounts for wide chars)
text = "Hello 世界"
width = Terminal.measure_text_width(text)
print(f"Display width: {width} columns")  # 11 (5 + 1 + 2 + 2 + 1)

# Handle ANSI codes in width calculation
text_with_ansi = "\x1b[31mHello\x1b[0m"
width = Terminal.measure_text_width(text_with_ansi)
print(f"Width: {width}")  # 5 (ANSI codes don't count)

# Parse colors from various formats
rgb = Terminal.parse_color("#FF5733")  # (255, 87, 51)
rgb = Terminal.parse_color("rgb(255, 87, 51)")  # (255, 87, 51)
rgb = Terminal.parse_color("red")  # (180, 60, 42) - iTerm2 red
rgb = Terminal.parse_color("invalid")  # None

API Reference

Terminal Class

Constructor

Terminal(cols: int, rows: int, scrollback: int = 10000)

Create a new terminal with specified dimensions.

  • cols: Number of columns (width)
  • rows: Number of rows (height)
  • scrollback: Maximum number of scrollback lines (default: 10000)

Methods

  • process(data: bytes): Process byte data (can contain ANSI sequences)
  • process_str(text: str): Process a string (convenience method)
  • content() -> str: Get terminal content as a string
  • size() -> tuple[int, int]: Get terminal dimensions (cols, rows)
  • resize(cols: int, rows: int): Resize the terminal
  • reset(): Reset terminal to default state
  • title() -> str: Get terminal title
  • cursor_position() -> tuple[int, int]: Get cursor position (col, row)
  • cursor_visible() -> bool: Check if cursor is visible
  • keyboard_flags() -> int: Get current Kitty Keyboard Protocol flags
  • set_keyboard_flags(flags: int, mode: int = 1): Set Kitty Keyboard Protocol flags (mode: 0=disable, 1=set, 2=lock)
  • query_keyboard_flags(): Query keyboard flags (response in drain_responses())
  • push_keyboard_flags(flags: int): Push flags to stack and set new flags
  • pop_keyboard_flags(count: int = 1): Pop flags from stack
  • clipboard() -> str | None: Get clipboard content (OSC 52)
  • set_clipboard(content: str | None): Set clipboard content programmatically
  • allow_clipboard_read() -> bool: Check if clipboard read is allowed
  • set_allow_clipboard_read(allow: bool): Set clipboard read permission (security flag)
  • scrollback() -> list[str]: Get scrollback buffer as list of strings
  • scrollback_len() -> int: Get number of scrollback lines
  • get_line(row: int) -> str | None: Get a specific line
  • get_line_cells(row: int) -> list | None: Get cells for a specific line with full metadata
  • get_char(col: int, row: int) -> str | None: Get character at position
  • get_fg_color(col: int, row: int) -> tuple[int, int, int] | None: Get foreground color (RGB)
  • get_bg_color(col: int, row: int) -> tuple[int, int, int] | None: Get background color (RGB)
  • get_underline_color(col: int, row: int) -> tuple[int, int, int] | None: Get underline color (RGB)
  • get_attributes(col: int, row: int) -> Attributes | None: Get text attributes
  • get_hyperlink(col: int, row: int) -> str | None: Get hyperlink URL at position (OSC 8)
  • is_line_wrapped(row: int) -> bool: Check if line is wrapped from previous line
  • is_alt_screen_active() -> bool: Check if alternate screen buffer is active
  • bracketed_paste() -> bool: Check if bracketed paste mode is enabled
  • focus_tracking() -> bool: Check if focus tracking mode is enabled
  • mouse_mode() -> str: Get current mouse tracking mode
  • insert_mode() -> bool: Check if insert mode is enabled
  • line_feed_new_line_mode() -> bool: Check if line feed/new line mode is enabled
  • synchronized_updates() -> bool: Check if synchronized updates mode is enabled (DEC 2026)
  • cursor_style() -> CursorStyle: Get cursor style (block, underline, bar)
  • cursor_color() -> tuple[int, int, int] | None: Get cursor color (RGB)
  • default_fg() -> tuple[int, int, int] | None: Get default foreground color
  • default_bg() -> tuple[int, int, int] | None: Get default background color
  • set_cursor_style(style: CursorStyle): Set cursor style
  • set_cursor_color(r: int, g: int, b: int): Set cursor color (RGB)
  • set_default_fg(r: int, g: int, b: int): Set default foreground color
  • set_default_bg(r: int, g: int, b: int): Set default background color
  • set_bold_brightening(enabled: bool): Enable/disable bold brightening (when enabled, bold text with ANSI colors 0-7 uses bright variants 8-15, matching iTerm2's "Use Bright Bold" setting)
  • query_cursor_color(): Query cursor color (response in drain_responses())
  • query_default_fg(): Query default foreground color (response in drain_responses())
  • query_default_bg(): Query default background color (response in drain_responses())
  • current_directory() -> str | None: Get current working directory (OSC 7)
  • accept_osc7() -> bool: Check if OSC 7 (CWD) is accepted
  • set_accept_osc7(accept: bool): Set whether to accept OSC 7 sequences
  • disable_insecure_sequences() -> bool: Check if insecure sequences are disabled
  • set_disable_insecure_sequences(disable: bool): Disable insecure/dangerous sequences
  • shell_integration_state() -> ShellIntegration: Get shell integration state (OSC 133)
  • get_paste_start() -> tuple[int, int] | None: Get bracketed paste start position
  • get_paste_end() -> tuple[int, int] | None: Get bracketed paste end position
  • paste(text: str): Simulate bracketed paste
  • get_focus_in_event() -> str: Get focus-in event sequence
  • get_focus_out_event() -> str: Get focus-out event sequence
  • drain_responses() -> list[str]: Drain all pending terminal responses (DA, DSR, etc.)
  • drain_notifications() -> list[tuple[str, str]]: Drain OSC 9/777 notifications (title, message)
  • take_notifications() -> list[tuple[str, str]]: Take notifications without removing
  • has_pending_responses() -> bool: Check if responses are pending
  • has_notifications() -> bool: Check if notifications are pending
  • resize_pixels(width_px: int, height_px: int): Resize terminal by pixel dimensions
  • graphics_count() -> int: Get count of Sixel graphics stored
  • graphics_at_row(row: int) -> list[Graphic]: Get Sixel graphics at specific row
  • clear_graphics(): Clear all Sixel graphics
  • create_snapshot() -> ScreenSnapshot: Create atomic snapshot of current screen state (includes bold brightening if enabled)
  • flush_synchronized_updates(): Flush synchronized updates buffer (DEC 2026)
  • simulate_mouse_event(...): Simulate mouse event for testing
  • export_text() -> str: Export entire buffer (scrollback + current screen) as plain text without styling
  • export_styled() -> str: Export entire buffer (scrollback + current screen) with ANSI styling
  • export_html(include_styles: bool = True) -> str: Export current screen as HTML with full styling (full document or content only)
  • screenshot(format, font_path, font_size, include_scrollback, padding, quality, render_cursor, cursor_color, sixel_mode, scrollback_offset, link_color, bold_color, use_bold_color) -> bytes: Take screenshot and return image bytes (automatically respects bold_brightening setting)
  • screenshot_to_file(path, format, font_path, font_size, include_scrollback, padding, quality, render_cursor, cursor_color, sixel_mode, scrollback_offset, link_color, bold_color, use_bold_color): Take screenshot and save to file (automatically respects bold_brightening setting)

Text Extraction Utilities

  • get_word_at(col: int, row: int, word_chars: str | None = None) -> str | None: Extract word at cursor position (default word_chars: "/-+~_." iTerm2-compatible)
  • get_url_at(col: int, row: int) -> str | None: Detect and extract URL at cursor position
  • get_line_unwrapped(row: int) -> str | None: Get full logical line following wrapping
  • select_word(col: int, row: int, word_chars: str | None = None) -> tuple[tuple[int, int], tuple[int, int]] | None: Get word boundaries for smart selection (default word_chars: "/-+~_." iTerm2-compatible)
  • find_matching_bracket(col: int, row: int) -> tuple[int, int] | None: Find matching bracket/parenthesis. Supports (), [], {}, <>. Returns position of matching bracket or None
  • select_semantic_region(col: int, row: int, delimiters: str) -> str | None: Extract content between delimiters. Supports (), [], {}, <>, "", '', ``. Returns content or None

Content Search

  • find_text(pattern: str, case_sensitive: bool = True) -> list[tuple[int, int]]: Find all occurrences of text in visible screen
  • find_next(pattern: str, from_col: int, from_row: int, case_sensitive: bool = True) -> tuple[int, int] | None: Find next occurrence from position

Buffer Statistics

  • get_stats() -> dict[str, int]: Get terminal statistics (cols, rows, scrollback_lines, total_cells, non_whitespace_lines, graphics_count, estimated_memory_bytes)
  • count_non_whitespace_lines() -> int: Count lines containing non-whitespace characters
  • get_scrollback_usage() -> tuple[int, int]: Get scrollback usage (used_lines, max_capacity)

Static Utility Methods

These methods can be called on the class itself (e.g., Terminal.strip_ansi(text)):

  • Terminal.strip_ansi(text: str) -> str: Remove all ANSI escape sequences from text
  • Terminal.measure_text_width(text: str) -> int: Measure display width accounting for wide characters and ANSI codes
  • Terminal.parse_color(color_string: str) -> tuple[int, int, int] | None: Parse color from hex (#RRGGBB), rgb(r,g,b), or name

Color Utilities Module

Comprehensive color manipulation functions available as standalone module functions:

Brightness and Contrast

  • perceived_brightness_rgb(r: int, g: int, b: int) -> float: Calculate perceived brightness (0.0-1.0) using NTSC formula (30% red, 59% green, 11% blue)
  • adjust_contrast_rgb(fg: tuple[int, int, int], bg: tuple[int, int, int], min_contrast: float) -> tuple[int, int, int]: Adjust foreground color for minimum contrast ratio (0.0-1.0), preserving hue

Basic Adjustments

  • lighten_rgb(rgb: tuple[int, int, int], amount: float) -> tuple[int, int, int]: Lighten color by percentage (0.0-1.0)
  • darken_rgb(rgb: tuple[int, int, int], amount: float) -> tuple[int, int, int]: Darken color by percentage (0.0-1.0)

Accessibility (WCAG)

  • color_luminance(rgb: tuple[int, int, int]) -> float: Calculate relative luminance (0.0-1.0) per WCAG formula
  • is_dark_color(rgb: tuple[int, int, int]) -> bool: Check if color is dark (luminance < 0.5)
  • contrast_ratio(fg: tuple[int, int, int], bg: tuple[int, int, int]) -> float: Calculate WCAG contrast ratio (1.0-21.0)
  • meets_wcag_aa(fg: tuple[int, int, int], bg: tuple[int, int, int]) -> bool: Check if contrast meets WCAG AA standard (4.5:1)
  • meets_wcag_aaa(fg: tuple[int, int, int], bg: tuple[int, int, int]) -> bool: Check if contrast meets WCAG AAA standard (7:1)

Color Mixing and Manipulation

  • mix_colors(color1: tuple[int, int, int], color2: tuple[int, int, int], ratio: float) -> tuple[int, int, int]: Mix two colors (ratio: 0.0=color1, 1.0=color2)
  • complementary_color(rgb: tuple[int, int, int]) -> tuple[int, int, int]: Get complementary color (opposite on color wheel)

Color Space Conversions

  • rgb_to_hsl(rgb: tuple[int, int, int]) -> tuple[int, int, int]: Convert RGB to HSL (H: 0-360, S: 0-100, L: 0-100)
  • hsl_to_rgb(h: int, s: int, l: int) -> tuple[int, int, int]: Convert HSL to RGB
  • rgb_to_hex(rgb: tuple[int, int, int]) -> str: Convert RGB to hex string (#RRGGBB)
  • hex_to_rgb(hex_str: str) -> tuple[int, int, int]: Convert hex string to RGB
  • rgb_to_ansi_256(rgb: tuple[int, int, int]) -> int: Find nearest ANSI 256-color palette index (0-255)

Advanced Adjustments

  • adjust_saturation(rgb: tuple[int, int, int], amount: int) -> tuple[int, int, int]: Adjust saturation by amount (-100 to +100)
  • adjust_hue(rgb: tuple[int, int, int], degrees: int) -> tuple[int, int, int]: Shift hue by degrees (0-360)

PtyTerminal Class

A terminal emulator with PTY (pseudo-terminal) support for running interactive shell sessions.

Constructor

PtyTerminal(cols: int, rows: int, scrollback: int = 10000)

Create a new PTY-enabled terminal with specified dimensions.

  • cols: Number of columns (width)
  • rows: Number of rows (height)
  • scrollback: Maximum number of scrollback lines (default: 10000)

PTY-Specific Methods

  • spawn(cmd: str, args: list[str] = [], env: dict[str, str] | None = None, cwd: str | None = None): Spawn a command with arguments
  • spawn_shell(shell: str | None = None): Spawn a shell (defaults to /bin/bash)
  • write(data: bytes): Write bytes to the PTY
  • write_str(text: str): Write string to the PTY (convenience method)
  • is_running() -> bool: Check if the child process is still running
  • wait() -> int | None: Wait for child process to exit and return exit code
  • try_wait() -> int | None: Non-blocking check if child has exited
  • kill(): Forcefully terminate the child process
  • update_generation() -> int: Get current update generation counter
  • has_updates_since(generation: int) -> bool: Check if terminal updated since generation
  • send_resize_pulse(): Send SIGWINCH to child process after resize
  • get_default_shell() -> str: Get the default shell path

Note: PtyTerminal inherits all methods from Terminal class listed above.

Context Manager Support

with PtyTerminal(80, 24) as term:
    term.spawn_shell()
    term.write_str("echo 'Hello'\n")
    # Automatic cleanup on exit

Attributes Class

Represents text attributes for a cell.

Properties

  • bold: bool: Bold text
  • dim: bool: Dim text
  • italic: bool: Italic text
  • underline: bool: Underlined text
  • blink: bool: Blinking text
  • reverse: bool: Reverse video
  • hidden: bool: Hidden text
  • strikethrough: bool: Strikethrough text

CursorStyle Enum

Cursor display styles (DECSCUSR):

  • CursorStyle.BlinkingBlock: Blinking block cursor (default)
  • CursorStyle.SteadyBlock: Steady block cursor
  • CursorStyle.BlinkingUnderline: Blinking underline cursor
  • CursorStyle.SteadyUnderline: Steady underline cursor
  • CursorStyle.BlinkingBar: Blinking bar/I-beam cursor
  • CursorStyle.SteadyBar: Steady bar/I-beam cursor

UnderlineStyle Enum

Text underline styles:

  • UnderlineStyle.None_: No underline
  • UnderlineStyle.Straight: Straight underline (default)
  • UnderlineStyle.Double: Double underline
  • UnderlineStyle.Curly: Curly underline (for spell check)
  • UnderlineStyle.Dotted: Dotted underline
  • UnderlineStyle.Dashed: Dashed underline

ShellIntegration Class

Shell integration state (OSC 133 and OSC 7):

  • in_prompt: bool: True if currently in prompt (marker A)
  • in_command_input: bool: True if currently in command input (marker B)
  • in_command_output: bool: True if currently in command output (marker C)
  • current_command: str | None: The command that was executed
  • last_exit_code: int | None: Exit code from last command (marker D)
  • cwd: str | None: Current working directory from OSC 7

Graphic Class

Sixel graphic metadata:

  • row: int: Display row
  • col: int: Display column
  • width: int: Width in pixels
  • height: int: Height in pixels
  • data: bytes: Image data

ScreenSnapshot Class

Immutable snapshot of screen state:

  • content() -> str: Get full screen content
  • cursor_position() -> tuple[int, int]: Cursor position at snapshot time
  • size() -> tuple[int, int]: Terminal dimensions

Supported ANSI/VT Sequences

This terminal emulator provides comprehensive VT100/VT220/VT320/VT420 compatibility, matching iTerm2's feature set.

Cursor Movement (VT100)

  • ESC[<n>A: Cursor up n lines (CUU)
  • ESC[<n>B: Cursor down n lines (CUD)
  • ESC[<n>C: Cursor forward n columns (CUF)
  • ESC[<n>D: Cursor back n columns (CUB)
  • ESC[<n>E: Cursor next line (CNL)
  • ESC[<n>F: Cursor previous line (CPL)
  • ESC[<n>G: Cursor horizontal absolute (CHA)
  • ESC[<row>;<col>H: Cursor position (CUP)
  • ESC[<row>;<col>f: Cursor position (HVP - alternative)
  • ESC[<n>d: Line position absolute (VPA)
  • ESC[s: Save cursor position (ANSI.SYS)
  • ESC[u: Restore cursor position (ANSI.SYS)
  • ESC 7: Save cursor (DECSC)
  • ESC 8: Restore cursor (DECRC)

Display Control (VT100)

  • ESC[<n>J: Erase in display (ED)
    • n=0: Clear from cursor to end
    • n=1: Clear from beginning to cursor
    • n=2: Clear entire screen
    • n=3: Clear entire screen and scrollback
  • ESC[<n>K: Erase in line (EL)
    • n=0: Clear from cursor to end of line
    • n=1: Clear from beginning of line to cursor
    • n=2: Clear entire line

Line/Character Editing (VT220)

  • ESC[<n>L: Insert n blank lines (IL)
  • ESC[<n>M: Delete n lines (DL)
  • ESC[<n>@: Insert n blank characters (ICH)
  • ESC[<n>P: Delete n characters (DCH)
  • ESC[<n>X: Erase n characters (ECH)

Rectangle Operations (VT420)

Advanced text editing operations that work on rectangular regions of the screen:

  • ESC[<Pc>;<Pt>;<Pl>;<Pb>;<Pr>$x: Fill Rectangular Area (DECFRA)

    • Pc: Character code to fill (e.g., 88 for 'X', 42 for '*')
    • Pt: Top row (1-indexed)
    • Pl: Left column (1-indexed)
    • Pb: Bottom row (1-indexed)
    • Pr: Right column (1-indexed)
    • Fills rectangle with specified character using current text attributes
  • ESC[<Pts>;<Pls>;<Pbs>;<Prs>;<Pps>;<Ptd>;<Pld>;<Ppd>$v: Copy Rectangular Area (DECCRA)

    • Pts, Pls, Pbs, Prs: Source rectangle (top, left, bottom, right)
    • Pps: Source page (use 1 for current screen)
    • Ptd, Pld: Destination position (top, left)
    • Ppd: Destination page (use 1 for current screen)
    • Copies rectangular region to new location
  • ESC[<Pt>;<Pl>;<Pb>;<Pr>${: Selective Erase Rectangular Area (DECSERA)

    • Pt: Top row (1-indexed)
    • Pl: Left column (1-indexed)
    • Pb: Bottom row (1-indexed)
    • Pr: Right column (1-indexed)
    • Selectively erases rectangle (respects character protection attribute)
  • ESC[<Pt>;<Pl>;<Pb>;<Pr>$z: Erase Rectangular Area (DECERA)

    • Pt: Top row (1-indexed)
    • Pl: Left column (1-indexed)
    • Pb: Bottom row (1-indexed)
    • Pr: Right column (1-indexed)
    • Unconditionally erases rectangle (ignores protection)
  • ESC[<Pt>;<Pl>;<Pb>;<Pr>;<Ps>$r: Change Attributes in Rectangular Area (DECCARA)

    • Pt, Pl, Pb, Pr: Rectangle coordinates (top, left, bottom, right)
    • Ps: SGR attributes to apply (0=reset, 1=bold, 4=underline, 5=blink, 7=reverse, 8=hidden)
    • Changes text attributes in rectangle
  • ESC[<Pt>;<Pl>;<Pb>;<Pr>;<Ps>$t: Reverse Attributes in Rectangular Area (DECRARA)

    • Pt, Pl, Pb, Pr: Rectangle coordinates (top, left, bottom, right)
    • Ps: Attributes to reverse (0=all, 1=bold, 4=underline, 5=blink, 7=reverse, 8=hidden)
    • Toggles attributes in rectangle
  • ESC[<Pi>;<Pg>;<Pt>;<Pl>;<Pb>;<Pr>*y: Request Checksum of Rectangular Area (DECRQCRA)

    • Pi: Request ID
    • Pg: Page number (use 1 for current screen)
    • Pt, Pl, Pb, Pr: Rectangle coordinates
    • Response: DCS Pi ! ~ xxxx ST (16-bit checksum in hex)
  • ESC[<Ps>*x: Select Attribute Change Extent (DECSACE)

    • Ps = 0 or 1: Stream mode (attributes wrap at line boundaries)
    • Ps = 2: Rectangle mode (strict rectangular boundaries, default)
    • Affects how DECCARA and DECRARA apply attributes

Use Cases: Efficient text manipulation in editors (vim, emacs), drawing box characters, clearing specific screen regions without affecting surrounding content, attribute modification without changing text, verification of screen regions via checksums.

Scrolling (VT100/VT220)

  • ESC[<n>S: Scroll up n lines (SU)
  • ESC[<n>T: Scroll down n lines (SD)
  • ESC[<top>;<bottom>r: Set scrolling region (DECSTBM)
  • ESC M: Reverse index (RI) - scroll down at top
  • ESC D: Index (IND) - scroll up at bottom
  • ESC E: Next line (NEL)

Colors and Attributes (VT100/ECMA-48)

  • ESC[0m: Reset all attributes (SGR 0)
  • ESC[1m: Bold
  • ESC[2m: Dim
  • ESC[3m: Italic
  • ESC[4m: Underline (basic, defaults to straight)
  • ESC[4:0m: No underline (explicit)
  • ESC[4:1m: Straight underline (default)
  • ESC[4:2m: Double underline
  • ESC[4:3m: Curly underline (spell check, errors)
  • ESC[4:4m: Dotted underline
  • ESC[4:5m: Dashed underline
  • ESC[5m: Blink
  • ESC[7m: Reverse
  • ESC[8m: Hidden
  • ESC[9m: Strikethrough
  • ESC[22m: Normal intensity (not bold or dim)
  • ESC[23m: Not italic
  • ESC[24m: Not underlined
  • ESC[25m: Not blinking
  • ESC[27m: Not reversed
  • ESC[28m: Not hidden
  • ESC[29m: Not strikethrough
  • ESC[30-37m: Foreground colors (basic)
  • ESC[40-47m: Background colors (basic)
  • ESC[90-97m: Bright foreground colors (aixterm)
  • ESC[100-107m: Bright background colors (aixterm)
  • ESC[38;5;<n>m: 256-color foreground
  • ESC[48;5;<n>m: 256-color background
  • ESC[38;2;<r>;<g>;<b>m: RGB/true color foreground
  • ESC[48;2;<r>;<g>;<b>m: RGB/true color background
  • ESC[39m: Default foreground color
  • ESC[49m: Default background color

Tab Stops (VT100)

  • ESC H: Set tab stop at current column (HTS)
  • ESC[<n>g: Tab clear (TBC)
    • n=0: Clear tab at current column
    • n=3: Clear all tabs
  • ESC[<n>I: Cursor forward tabulation (CHT)
  • ESC[<n>Z: Cursor backward tabulation (CBT)

Terminal Modes (DEC Private Modes)

  • ESC[?1h/l: Application cursor keys (DECCKM)
  • ESC[?6h/l: Origin mode (DECOM)
  • ESC[?7h/l: Auto wrap mode (DECAWM)
  • ESC[?25h/l: Show/hide cursor (DECTCEM)
  • ESC[?47h/l: Alternate screen buffer
  • ESC[?1047h/l: Alternate screen buffer (alternate)
  • ESC[?1048h/l: Save/restore cursor
  • ESC[?1049h/l: Save cursor and use alternate screen

Mouse Support (xterm)

  • ESC[?1000h/l: Normal mouse tracking
  • ESC[?1002h/l: Button event mouse tracking
  • ESC[?1003h/l: Any event mouse tracking
  • ESC[?1005h/l: UTF-8 mouse encoding
  • ESC[?1006h/l: SGR mouse encoding
  • ESC[?1015h/l: URXVT mouse encoding

Advanced Features

  • ESC[?1004h/l: Focus tracking
  • ESC[?2004h/l: Bracketed paste mode
  • ESC[?2026h/l: Synchronized updates (DEC 2026) - Batch screen updates for flicker-free rendering

Kitty Keyboard Protocol

Progressive enhancement for keyboard handling with flags for disambiguation and event reporting:

  • CSI = flags ; mode u: Set keyboard protocol mode
    • flags: Bitmask (1=disambiguate, 2=report events, 4=alternate keys, 8=report all, 16=associated text)
    • mode: 0=disable, 1=set, 2=lock, 3=report
  • CSI ? u: Query current keyboard flags (response: CSI ? flags u)
  • CSI > flags u: Push current flags to stack and set new flags
  • CSI < count u: Pop flags from stack (count times)

Note: Flags are maintained separately for main and alternate screen buffers with independent stacks.

Device Queries (VT100/VT220)

  • ESC[<n>n: Device Status Report (DSR)
  • ESC[c: Device Attributes (DA)

OSC Sequences

  • OSC 0;<title>ST: Set window title (icon + title)
  • OSC 2;<title>ST: Set window title
  • OSC 7;<cwd>ST: Set current working directory
  • OSC 8;;<url>ST: Hyperlinks (iTerm2/VTE compatible) - Full support with clickable TUI rendering
  • OSC 52;c;<data>ST: Clipboard operations (xterm/iTerm2 compatible) - Works over SSH without X11!
    • <data>: base64 encoded text to copy to clipboard
    • ?: Query clipboard (requires set_allow_clipboard_read(true) for security)
    • Empty data clears clipboard
  • OSC 133;<marker>ST: Shell integration (iTerm2/VSCode)
    • A: Prompt start
    • B: Command start
    • C: Command executed
    • D;<exit_code>: Command finished
  • OSC 9;<message>ST: Notifications (iTerm2/ConEmu style) - Send desktop-style notifications
    • Simple format with message only (no title)
  • OSC 777;notify;<title>;<message>ST: Notifications (urxvt style) - Structured notifications
    • Supports both title and message
    • Use for desktop notifications, alerts, or completion notices

Control Characters

  • BEL (0x07): Bell
  • BS (0x08): Backspace
  • HT (0x09): Horizontal tab
  • LF (0x0A): Line feed
  • CR (0x0D): Carriage return

Reset Sequences

  • ESC c: Reset to initial state (RIS)

Examples

See the examples/ directory for complete usage examples:

Terminal Emulation Examples

Basic Examples

  • basic_usage_improved.py: Enhanced basic usage with visual output
  • colors_demo.py: Color support demonstration
  • cursor_movement.py: Cursor control examples
  • scrollback_demo.py: Scrollback buffer usage
  • text_attributes.py: Text styling examples
  • unicode_emoji.py: Unicode and emoji support demonstration

Advanced Features

  • alt_screen.py: Alternate screen buffer
  • mouse_tracking.py: Mouse event handling
  • bracketed_paste.py: Bracketed paste mode demonstration
  • synchronized_updates.py: Synchronized updates (DEC 2026) for flicker-free rendering
  • shell_integration.py: Shell integration (OSC 133)
  • test_osc52_clipboard.py: OSC 52 clipboard operations (SSH clipboard support)
  • test_kitty_keyboard.py: Kitty Keyboard Protocol demonstration
  • test_underline_styles.py: Underline styles (SGR 4:x) for modern text decoration
  • notifications.py: OSC 9 / OSC 777 notification support (desktop-style alerts)
  • rectangle_operations.py: VT420 rectangle operations (DECFRA, DECCRA, DECSERA, DECERA, DECCARA, DECRARA, DECRQCRA, DECSACE)
  • hyperlink_demo.py: OSC 8 hyperlinks (clickable URLs in terminal)

Graphics and Visual

  • display_image_sixel.py: Display images using Sixel graphics
  • test_sixel_simple.py: Simple Sixel graphics demonstration
  • test_sixel_display.py: Advanced Sixel graphics testing
  • screenshot_demo.py: Comprehensive screenshot feature demonstration

TUI Applications

  • test_tui_clipboard.py: TUI clipboard integration demonstration
  • feature_showcase.py: Comprehensive feature showcase with TUI

PTY Examples

  • pty_basic.py: Basic PTY usage - spawn commands and capture output
  • pty_shell.py: Interactive shell sessions
  • pty_custom_env.py: Custom environment variables and working directory
  • pty_resize.py: Dynamic terminal resizing with SIGWINCH
  • pty_with_par_term.py: Using custom par-term terminfo for optimal compatibility
  • pty_multiple.py: Managing multiple concurrent PTY sessions
  • pty_event_loop.py: Event loop integration with update tracking
  • pty_mouse_events.py: Mouse event handling in PTY sessions

TUI Demo Application

Note: A full-featured TUI (Text User Interface) application for this terminal emulator is available in the sister project par-term-emu-tui-rust. The TUI provides an interactive terminal application with themes, clipboard integration, and more.

Installation: pip install par-term-emu-tui-rust

Security

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

See SECURITY.md for detailed security guidelines including:

  • Command injection prevention
  • Environment variable security
  • Input validation
  • Resource limits
  • Privilege management

Running Tests

# Run Rust tests
cargo test

# Run Python tests (requires pytest)
uv pip install pytest
pytest tests/

Performance

The library is implemented in Rust for high performance:

  • Zero-copy operations where possible
  • Efficient grid representation
  • Fast ANSI sequence parsing using the vte crate
  • Minimal Python/Rust boundary crossings

Architecture

The library consists of several key components:

Terminal Emulation Core

  • Cell: Represents a single terminal cell with character, colors, and attributes
  • Grid: Manages the 2D terminal buffer and scrollback
  • Cursor: Tracks cursor position and visibility
  • Color: Handles various color formats (named, 256-color, RGB)
  • Terminal: Main terminal emulator that ties everything together

PTY Support

  • PtySession: Manages PTY and child process lifecycle
  • PtyError: Error types for PTY operations
  • Reader Thread: Background thread that processes PTY output
  • Update Generation: Efficient change detection for event loops

Python Bindings

  • PyTerminal: Python wrapper for Terminal (ANSI parsing)
  • PyPtyTerminal: Python wrapper for PtySession (interactive shells)
  • PyO3: Zero-cost bindings between Rust and Python

Version History

0.6.0 (Current)

  • Comprehensive Color Utilities API: 18 new Python functions for color manipulation
    • Brightness and contrast: perceived_brightness_rgb(), adjust_contrast_rgb()
    • Basic adjustments: lighten_rgb(), darken_rgb()
    • WCAG accessibility: color_luminance(), is_dark_color(), contrast_ratio(), meets_wcag_aa(), meets_wcag_aaa()
    • Color mixing: mix_colors(), complementary_color()
    • Color space conversions: rgb_to_hsl(), hsl_to_rgb(), rgb_to_hex(), hex_to_rgb(), rgb_to_ansi_256()
    • Advanced adjustments: adjust_saturation(), adjust_hue()
  • iTerm2 Compatibility: Matching NTSC brightness formula and contrast adjustment algorithms
  • Python Bindings: All color utilities exposed via par_term_emu_core_rust module
  • Fast Native Implementation: Rust-based for optimal performance

0.5.0

  • Added set_bold_brightening() method for configurable bold color brightening
  • Enhanced create_snapshot() to automatically apply bold brightening when enabled
  • Bold brightening converts ANSI colors 0-7 to bright variants 8-15 for bold text
  • Matches iTerm2's "Use Bright Bold" setting for improved terminal compatibility

0.4.0

  • Initial stable release with comprehensive VT100/VT220/VT320/VT420 support
  • Full PTY support with process lifecycle management
  • Sixel graphics rendering with configurable limits
  • Screenshot generation in PNG, JPEG, SVG, and BMP formats
  • Shell integration (OSC 133) support
  • Atomic screen snapshots for TUI applications

Contributing

Contributions are welcome! Please feel free to submit issues or pull requests.

Development Setup

  1. Clone the repository and set up the environment:

    git clone https://github.com/paulrobello/par-term-emu-core-rust.git
    cd par-term-emu-core-rust
    make setup-venv  # Create virtual environment and install dependencies
    
  2. Install pre-commit hooks (recommended):

    make pre-commit-install
    

    This will automatically run all quality checks (formatting, linting, type checking, tests) before each commit.

  3. Build and test:

    make dev          # Build the library in development mode
    make test-python  # Run tests
    

Code Quality

All contributions must pass the following checks:

  • Rust formatting: cargo fmt
  • Rust linting: cargo clippy -- -D warnings
  • Python formatting: make fmt-python
  • Python linting: make lint-python
  • Python type checking: pyright
  • Python tests: make test-python

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

For more detailed development instructions, see CLAUDE.md.

License

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

Author

Paul Robello - probello@gmail.com

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.6.0.tar.gz (886.1 kB 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.6.0-cp314-cp314-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.14Windows x86-64

par_term_emu_core_rust-0.6.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

par_term_emu_core_rust-0.6.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

par_term_emu_core_rust-0.6.0-cp314-cp314-macosx_10_12_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

par_term_emu_core_rust-0.6.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.4 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.6.0-cp313-cp313-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.13Windows x86-64

par_term_emu_core_rust-0.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

par_term_emu_core_rust-0.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

par_term_emu_core_rust-0.6.0-cp313-cp313-macosx_10_12_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

par_term_emu_core_rust-0.6.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.3 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.6.0-cp312-cp312-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.12Windows x86-64

par_term_emu_core_rust-0.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

par_term_emu_core_rust-0.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

par_term_emu_core_rust-0.6.0-cp312-cp312-macosx_10_12_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

par_term_emu_core_rust-0.6.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.3 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.6.0.tar.gz.

File metadata

  • Download URL: par_term_emu_core_rust-0.6.0.tar.gz
  • Upload date:
  • Size: 886.1 kB
  • 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.6.0.tar.gz
Algorithm Hash digest
SHA256 0b5e7439f067030337d54956445e7bc4feede743a6c42c9bbd25b04c1807a33f
MD5 72820db7ed8b7a0358c8144807cd4e39
BLAKE2b-256 adc9655ff9beafa519406099437586e165619e2de36078f43168675b84f3e4a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 5a40163204fb8015b741130ff87de863ddabbe357cdb5b160b0832153b9daac7
MD5 2333a72f251f8d24ccfe06a4c7991dac
BLAKE2b-256 f5f2ed723480cceda9d9276d291827b8d3aa5f28f040376369e351912dc8409d

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 040b38e859678f0806fa1c580c36846980d7c1d085d34e3e91a539e4408303f4
MD5 0ed591cbee7ab2ff3d5de514417c0cba
BLAKE2b-256 1787ebd000fb30cdfdc8b4cb2e9afce1174047f14e9ecd0e0739f6d5b6d40468

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 385680f76606b9bb08b64718e0ff5a727137ceb01510d03c891c757520449cd4
MD5 2039864fddeb475b2c708b39aa4e69d6
BLAKE2b-256 003a42319192e63575fd2bc5880fda31fc324a40f05b05b6352a4d53efb315ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2fadf40c4482bb9a1af5db40762502567ca603c338864e2b5612658cb2d8b34d
MD5 5fe8ca0902620a45028e40cfa87c9669
BLAKE2b-256 f4b2f0ae8cd295106964db1051772d4bd70558655ce8710de471e518d9f50aed

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.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.6.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 bb4a659e8dcad8e046c3b2f425619801157704bdc8bb3d06e24597fc7ac8cd65
MD5 229ded07aeca28bc8c4a9b7358dbca14
BLAKE2b-256 c32523b521407a135bc60d2be8d955d7c6af07d052cac8ddff9800acc740aef0

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 beb490c075e0c6cc889a84f40bc100b7edeb27778e31cfb87ad9b949a87eb6ab
MD5 412757f621bda539574df36c5b62d951
BLAKE2b-256 210d87dddf0a9d4b5157a13c4b6697609bfa677b373a6a1a977308147714131e

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e837ae62380a1deba58d97355d919dbc1268248e9f5fca162376676b33784edf
MD5 219a8589066ba79bd728a8afa20b134d
BLAKE2b-256 8d375b12cc6b2b5f8db0b203ec33d88455f1b0878338587088f91093f3374da8

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c95407b3c96ee7bd3e112be0e1da94e3a40b4e9eaa83cd7151b21a0cfabef4e2
MD5 9359cef0c22fab4d62e0cc4ba24f5c81
BLAKE2b-256 27e9094ad14082b9671785eadb959c986466bf3283fb0cf08f1d5702298fbf8a

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 955101409fd71d0a5e0d43377c243da7f13bdb0733f1185311910e99b7f5d934
MD5 809418d9215882d455b55c54da7da305
BLAKE2b-256 61cd144b09d3771a648aebbe6b1a807f0de211e5b93ecb4ed6560f2c6bba4358

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.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.6.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 ddfa19f26b20267817800c8d2275a64b076dfbb0cc5f935087632a18692fab19
MD5 2b881927404608dec61fb0047ba80e50
BLAKE2b-256 799ee633fd0d80ea74a239dddce3bc833bfb7dfa11987edc0dd34c73993ce3b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e62c2169bf923f7938b88287b077b4f055f4814d4527a639ce1b9faf8e18d0cb
MD5 008833d068123819058e8a5b9a3a682b
BLAKE2b-256 47e82b21810658bfc849af0d8db879b468e9ee1b03e547e252cd6d5347fcaa4b

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 711e0d573c9d0bb7d20fb9882c33ad000481088c77579e08e6fb37b97cb6327a
MD5 3911985e76ea11aec70c419649091170
BLAKE2b-256 e73845c0ba086c99b659f0b252a3d139f84bb3a7e9220400c5696912638132b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 16d7ddfddb18126a1fe98e31ccf77e611c57c983cc1c4a4f468a812f572573cf
MD5 dbb562590576fe0fe78b0dbc71820636
BLAKE2b-256 7975fdfdd72e92dab158672b389f1df4369e420b4dbed97a4a286a4d76bb5ae1

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.6.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 fa42b0f79de0b97c3d413a562602abaea328dfa7467aca4fcafeccf06344cec7
MD5 d4f4c0c03f0d8a91a3f4ab2f6aeca8dc
BLAKE2b-256 7a8d936e8ebfcbcc3c51694f735f712e750cd7ecd2e698d32c874381147c2d70

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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.6.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.6.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 30a6e9b0ee712fd360f3e067f0030d8e4553dae17d89db841ddbb59efca8063a
MD5 6be5ff4c8111315858a98b3a921a32a7
BLAKE2b-256 d8a7dd22f0b8fec3c0820babe0ee561aea5a9ec8441222995b860922b6b15aeb

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.6.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