par-term
A cross-platform, GPU-accelerated terminal emulator frontend built with Rust, powered by par-term-emu-core-rust. Designed for high performance, modern typography, and rich graphics support.

Table of Contents
- Getting Started
- What's New
- Features
- Documentation
- Installation
- Installing Shaders
- Keyboard Shortcuts
- Configuration
- Technology
- Contributing
- License
Getting Started
New to par-term? The Getting Started Guide walks you through installation, essential keyboard shortcuts, fonts, and split panes — everything you need to be productive in under 10 minutes.
- Getting Started Guide — Install, launch, and configure par-term
- Installation — Platform-specific install instructions below
- Configuration Reference — All 200+ configuration options
- Keyboard Shortcuts — Complete keyboard shortcut reference
What's New
0.39.0
A maintenance release. No new features and no behavioural fixes, but it clears two high-severity security advisories and removes 18 crates from the dependency graph.
- Two
quick-xmladvisories are cleared (RUSTSEC-2026-0194 and -0195) by updating past the constraint that pinned it. Real exposure was low — the crate reaches par-term only through a build-time proc-macro parsing bundled Wayland protocol XML, on Linux — butcargo auditis clean again. - The dead
mermaidfeature is gone, along withmermaid-rs-rendererandresvg. Nothing had referenced them since 0.31.0 removed the content prettifier, yet the feature stayed in the default set, so every build compiled and linked an entire SVG rasterization stack. Drops 18 crates. - Rust 1.97.1, with the minimum supported version raised to 1.97, and 105 dependencies refreshed.
make packageandmake secret-scanwork again — the first had been broken since the initial commit, copying aLICENSE-MITfile that never existed.
Breaking for library consumers only: the MSRV is now 1.97, and
--features mermaidno longer exists. Users of the released binaries are unaffected.
Release notes for every earlier version live in CHANGELOG.md.
0.38.0
The result of a full security, architecture, quality and documentation audit — the largest release so far. Three changes break a working setup; they are listed first.
Upgrading from 0.37.1 or earlier: Check for Updates will not install it — download by hand once. Those releases published no per-binary checksums and those builds carry no signing key, so both self-update gates refuse. Self-update works normally from 0.38.0 onward. See the migration guide.
Breaking
- Importing preferences from a URL now requires HTTPS -- an
http://import URL stops working. The same path also used to abort the process outright on any HTTPS URL, so in practice it only ever worked over plaintext. - A profile's command asks for confirmation before it runs -- profile matching is driven by the hostname a remote shell reports, so it is remote-controlled input. There is no opt-out.
Cmd/Ctrl+Shift+Pnow toggles the profile drawer, which is what the settings table always advertised; Manage Profiles keeps its menu entry but loses the accelerator.
Added
- Linux has a menu bar -- New Window, Close Window, Quit and Select All were menu-only actions on a platform with no menu, so there was no way to reach them at all. All four are now bindable on every platform.
- The session survives a panic -- the event loop publishes a pre-serialized capture every few seconds and the panic hook writes it, so a crash no longer costs every tab its working directory.
- Duplicate Tab has a default binding (
Cmd/Ctrl+Shift+J), and tab reordering appears in the menu. XDG_CONFIG_HOMEis honoured on Linux and macOS, and macOS user data moves under~/.config/par-term/with a one-time automatic migration.
Security and stability
- A malicious mDNS hostname could reach a shell through Quick Connect; every SSH argument is now validated and quoted.
- Any emoji, CJK character or accented letter could crash the terminal -- six sites used a grid column index as a UTF-8 byte offset. They survived 1,965 green tests because every test input in the repository was ASCII.
- A failed pane demote destroyed every terminal in the source tab, silently.
- Scripting did nothing unless the Settings window was open -- the entire script runtime sat behind that branch.
- Update downloads are signature-verified and release assets are signed, notarized and checksummed.
- Every pane is submitted to the GPU in one submit instead of one each, and the full cell grid is no longer deep-cloned on idle frames.
Features
Core Terminal Frontend
- Cross-platform Support: Native performance on macOS (Metal), Linux (Vulkan/X11/Wayland), and Windows (DirectX 12).
- Multi-Window & Multi-Tab: Multiple windows with independent tab sessions per window.
- GPU-Accelerated Rendering: Powered by
wgpuwith custom glyph atlas for blazing-fast text rasterization. - Inline Graphics: Full support for Sixel, iTerm2, and Kitty graphics protocols.
- Real PTY Integration: Full pseudo-terminal support for interactive shell sessions.
- Advanced Sequence Support: VT100/VT220/VT320/VT420/VT520 compatibility via
par-term-emu-core-rust. - Intelligent Reflow: Full content reflow on window resize, preserving scrollback and visible state.
Modern UI & Visuals
- Custom GLSL Shaders: 73 included shaders with hot reload, per-shader config, terminal-aware uniforms, and cubemap support.
- Background Images: Support for PNG/JPEG backgrounds with configurable opacity and scaling modes.
- Window Transparency: True per-pixel alpha with macOS blur support and text clarity options.
- Visual Bell: Flash-based alerts for terminal bell events.
- Dynamic Themes: Support for iTerm2-style color schemes (Dracula, Monokai, Solarized, etc.).
- Standalone Settings: Dedicated settings window (F12) for live configuration editing.
Typography & Fonts
- Styled Font Variants: Explicit support for separate Bold, Italic, and Bold-Italic font families.
- Unicode Range Mapping: Assign specific fonts to Unicode ranges (perfect for CJK, Emoji, or Symbols).
- Text Shaping: HarfBuzz-powered shaping for ligatures, complex scripts, and emoji sequences.
- Grapheme Clusters: Proper rendering of flag emoji, ZWJ sequences, skin tone modifiers.
- Box Drawing: Geometric rendering for pixel-perfect TUI borders and block characters.
- Smart Fallback: Automatic system font discovery and fallback chain.
Selection & Clipboard
- Advanced Selection: Block/Rectangular, Line-based, and Word-based selection modes.
- Multi-platform Clipboard: Seamless integration with system clipboards via
arboard. - Middle-click Paste: Standard Unix-style middle-click paste support.
- Automatic Copy: Optional "copy on select" behavior.
Hyperlinks & URL Detection
- OSC 8 Support: Native support for application-provided hyperlinks.
- Regex Detection: Automatic detection of URLs in terminal output.
- Interactive Links: Ctrl+Click to open links in your default browser, with hover highlighting and tooltips.
Assistant Panel & ACP Agents
- Assistant Panel: DevTools-style side panel for terminal state inspection and ACP agent chat.
- Bundled + Custom ACP Agents: Built-in agent definitions plus custom agents via
config.yamlor~/.config/par-term/agents/*.toml. - Per-Agent Environment Variables: Configure local/provider-specific env vars (for example Ollama/OpenRouter endpoints) for each agent.
- Local Claude via Ollama: Supports
claude-agent-acpwith Ollama Claude-compatible launch mode (seedocs/ASSISTANT_PANEL.md).
Documentation
Getting Started
- Getting Started Guide - Install, launch, and configure par-term in under 10 minutes.
- Quick Start Fonts Guide - Get up and running with custom fonts.
- Configuration Examples - Annotated YAML configuration examples.
- Environment Variables - All recognized environment variables.
Features
- Keyboard Shortcuts - Complete keyboard shortcut reference.
- Mouse Features - Text selection, URL handling, and pane interaction.
- Semantic History - Click file paths to open in your editor.
- Automation - Regex triggers, actions, and coprocesses.
- Profiles - Profile system for saving terminal configurations.
- Session Logging - Recording sessions in Plain/HTML/Asciicast formats.
- Search - Terminal search with regex, case-sensitive, and whole-word modes.
- Paste Special - 29 clipboard transformations for pasting.
- Copy Mode - Vi-style keyboard-driven text selection and navigation.
- Snippets & Actions - Text snippets with variables, custom actions, and keybinding management.
- Progress Bars - OSC 9;4 and OSC 934 progress bar rendering and shader integration.
- Accessibility - Minimum contrast enforcement and display options.
- Integrations - Shell integration and shader installation system.
- Window Management - Window types, multi-monitor, and transparency.
- Window Arrangements - Save and restore window layouts with auto-restore.
- Command Separators - Horizontal lines between shell commands with exit-code coloring.
- SSH Host Management - SSH quick connect, host discovery, and SSH profiles.
- Status Bar - Configurable status bar with widgets and system monitoring.
- Tabs - Tab management, duplicate tab, and tab behavior.
- Assistant Panel - ACP agent chat, custom agents (UI/TOML/YAML), shader assistant, and Claude+Ollama setup/troubleshooting.
- File Transfers - OSC 1337 file transfers with shell utilities.
- Self-Update - In-place update capability via CLI and Settings UI.
- Debug Logging - Configurable log levels and troubleshooting.
Shaders
- Shader Gallery - Visual gallery of 73 included shaders with screenshots.
- Shader Reference - Complete list of bundled shaders.
- Custom Shaders Guide - Create custom GLSL shaders with hot reload and per-shader config.
- Compositor Details - Deep dive into the rendering architecture.
Technical
- Architecture Overview - High-level system architecture and components.
- API Documentation Index - Public types across all workspace crates.
- Environment Variables - Runtime environment variable reference.
- Feature Matrix - iTerm2 vs par-term feature-by-feature comparison.
- Core Library - Documentation for the underlying terminal engine.
Installation
Homebrew (macOS)
Cargo Install
If you have a Rust toolchain installed, install directly from crates.io:
This builds and installs the binary to ~/.cargo/bin/par-term.
From Source
Requires Rust 1.97+ (stable, 2024 edition) and modern graphics drivers:
# Clone the repository
# Build with the optimized dev-release profile (~1m20s clean, ~1-2s incremental, ~90-95% of full release performance)
# Run
# Or build the full release binary (~3 min, for distribution)
# Install Claude ACP bridge for Assistant Panel (Claude connector)
Note: The legacy package
@zed-industries/claude-code-acpwas renamed/deprecated upstream. Use@zed-industries/claude-agent-acp(claude-agent-acpbinary).
macOS Bundle
To create a native macOS .app bundle with a dock icon:
To build and install the app bundle plus the CLI binary and Claude ACP bridge in one step:
Linux Dependencies
On Linux, you need GTK3 and X11/Wayland libraries. Install the appropriate packages for your distribution:
Ubuntu/Debian:
Fedora/RHEL:
Arch Linux:
macOS Gatekeeper Notice
If macOS reports that par-term "is damaged and can't be opened", this is caused by the Gatekeeper quarantine attribute applied to unsigned binaries. Remove it with:
# For the release binary
# For the .app bundle
Note: The Homebrew cask install (
brew install --cask paulrobello/tap/par-term) handles this automatically.
Installing Shaders
par-term includes 73 custom GLSL shaders for background effects and cursor animations. These need to be installed to your config directory.
Built-in Installer (Recommended)
Use the built-in CLI command to download and install all shaders from the latest release:
# Install shaders (with confirmation prompt)
# Install without prompts
# Force overwrite existing shaders
Shell Script
Alternatively, use the shell script installer. The recommended approach is to download the script first, inspect it, and then run it:
# Recommended: download, inspect, then run
# Review the script before executing:
Note: The one-liner pipe-to-shell pattern executes remote code without review. Use the download-then-inspect workflow above when security matters.
# Convenience only — inspect the script first when possible
|
Manual Install
- Download
shaders.zipfrom the latest release - Extract to your config directory:
- macOS/Linux:
~/.config/par-term/shaders/ - Windows:
%APPDATA%\par-term\shaders\
- macOS/Linux:
From Source
If building from source, copy the shaders folder manually:
# macOS/Linux
# Windows (PowerShell)
Using Shaders
Once installed, enable shaders in your config.yaml:
# Background shader
custom_shader: "starfield.glsl"
custom_shader_enabled: true
# Cursor shader
cursor_shader: "cursor_glow.glsl"
cursor_shader_enabled: true
See the Shader Gallery for previews of all included shaders.
Linting Shaders
Validate shader metadata, channel references, and control comments from Settings > Effects > Custom Shaders with Run Lint (and clear the current output with Clear Lint), or from the CLI with:
Add --readability to print a readability score plus suggested custom_shader_brightness and custom_shader_text_opacity defaults. By default, readability mode prompts before writing those suggestions into shader metadata:
Keyboard Shortcuts
Essential shortcuts to get started. On macOS, keybindings use Cmd; on Linux/Windows, they use Ctrl+Shift to avoid conflicts with terminal control codes.
| Shortcut | Action |
|---|---|
Cmd/Ctrl + T |
New tab |
Cmd/Ctrl + W |
Close tab (or window if single tab) |
Cmd/Ctrl + N |
New window |
Cmd/Ctrl + C |
Copy selection |
Cmd/Ctrl + V |
Paste from clipboard |
Cmd/Ctrl + F |
Open search |
Cmd/Ctrl + D |
Split pane horizontally |
F5 |
Reload configuration |
F11 |
Toggle fullscreen |
F12 / Cmd + , |
Open Settings |
See the full keyboard shortcuts reference for the complete list, including copy mode, pane management, shader toggles, SSH quick connect, and all customizable keybindings.
Configuration
Configuration is stored in YAML format:
- Unix:
~/.config/par-term/config.yaml - Windows:
%APPDATA%\par-term\config.yaml
cols: 80
rows: 24
font_size: 13.0
font_family: "JetBrains Mono"
theme: "dark-background"
window_opacity: 0.95
scrollbar_position: "right"
# Tab bar settings
tab_bar_mode: "always" # always (default), when_multiple, never
tab_bar_height: 28.0
tab_show_close_button: true
tab_inherit_cwd: true
dim_inactive_tabs: true
inactive_tab_opacity: 0.6
# Transparency settings
keep_text_opaque: true
transparency_affects_only_default_background: true
blur_radius: 8 # macOS only
# Power saving
pause_shaders_on_blur: true
unfocused_fps: 30
# Cursor lock options (prevent apps from overriding)
lock_cursor_visibility: false
lock_cursor_style: false
lock_cursor_blink: false
# Custom shader settings
custom_shader: "starfield.glsl"
custom_shader_enabled: true
shader_hot_reload: true # Auto-reload on file changes
# Per-shader overrides (optional)
shader_configs:
starfield.glsl:
animation_speed: 0.8
brightness: 0.3
See examples/config-complete.yaml for a full list of options.
Technology
- Terminal Engine: par-term-emu-core-rust
- Graphics:
wgpu(WebGPU for Rust) - Text:
swash+rustybuzz(custom glyph atlas) - UI:
eguifor settings and overlays - Windowing:
winit - Async:
tokio
Contributing
Contributions are welcome! See CONTRIBUTING.md for the full development setup, build commands, testing workflow, commit message format, and PR process.
Before submitting a pull request:
For documentation contributions, follow the conventions in docs/DOCUMENTATION_STYLE_GUIDE.md.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Author
Paul Robello - probello@gmail.com
Links
- GitHub: https://github.com/paulrobello/par-term
- Core Library: https://github.com/paulrobello/par-term-emu-core-rust
