Releases: HalFrgrd/evp
Release list
v0.18.0
v0.17.0
🚀 v0.17.0 Changelog
GIF engine overhaul
• Pure Rust GIF Engine: Replaced gifski / pngquant dependencies with the pure-Rust gif crate,
simplifying the build toolchain.
• Cohesive Theme Palette: Generates a 256-color palette directly from the active theme using CIELAB
colorspace trilinear interpolation, reserving index 255 for transparency.
• Delta Frame Compression: Emits only the minimum bounding box containing changed pixels for each frame.
This achieves up to 67% file size reduction in generated GIFs.
Cursor
• Typing Cursor Optimization: Temporarily halts cursor blinking while actively typing or moving (resets
to solid/visible). Blinking only resumes once stationary for 300ms (affects both SVG and GIF renderers).
v0.16.0
EVP v0.16.0 Release Notes
🚀 Key Highlights
🖱️ Mouse Modifiers Support
EVP now fully supports mouse clicks, drags, movements, and scrolls combined with modifier keys (Ctrl, Alt, Shift, Super/Cmd/Windows).
- Tapes Syntax: You can now prefix mouse actions in your
.tapescripts:Shift+Click 10 20Ctrl+RightClick 10 20Shift+Ctrl+MouseDrag 0 0 10 10Ctrl+MouseScroll 10 20 Up
- Interactive Recording: The
evp recordsession has been upgraded to capture these modifier combinations live as you interact with your terminal subshell. - Under the Hood: Mapped directly to libghostty input parameters via
map_mods_to_ghosttyin src/runner.rs. - Testing: The test suite (tests/mouse_events.rs) and the internal key/mouse helper tool (evp_helper_tool/src/main.rs) have been updated to exercise and assert modifier behavior.
⏱️ Wait / Synchronization Upgrades
The Wait instruction has been streamlined and made more robust:
- Scope Suffix Syntax: Replaced the legacy space-separated syntax (e.g.
Wait Screen/Wait Line) with the unified command-modifier suffix syntax:Wait+Screen /regex/Wait+Line /regex/- Timeout overrides can also be appended, e.g.
Wait+Screen@10s /regex/.
- Spaces in Regex Patterns: Fixed a tokenization issue where regular expressions containing spaces (e.g.
/evp: evp finished/) would get split. The parser (src/script/parser.rs) now correctly reassembles space-separated regex segments during parsing.
⚡ Performance Optimizations
1. Lazy Font Loading and Decompression
Previously, all embedded fallback fonts were parsed and decompressed from WOFF2 to TTF at startup.
- On-Demand Font Decompression: Embedded fallback faces are now lazily loaded and decompressed using
OnceLockin src/font.rs on the first glyph request viaFontInfo::get_fontandFontInfo::get_ttf_bytes. - Global caching: The primary loaded font family is now cached globally in a static
OnceLock<LoadedFontFamily>, avoiding costly layout metrics calculations on consecutive rendering passes.
2. Fast GIF Encoding
gifskiis now configured withfast: trueto accelerate color quantization and frame compilation.
3. Matrix-Parallelized CI Example Builds
- GitHub Actions workflow (.github/workflows/ci.yml) was refactored to compile and render example
.tapefiles concurrently using a Matrix strategy, significantly lowering build times.
🎨 Visual Enhancements & Styling
Window Title Bar Refinement
- Solid Window Controls: The three macOS-style window bar controls are now always rendered as solid, filled circles instead of outlines, improving aesthetic clarity.
- Readable Title: The window title size was increased (up to 76.5% of bar height in GIFs and 53.5% in SVGs) and rendered with
normalfont weight instead ofbold. - Text Color: The title text color has changed from
#8e8e93to a warmer#626268for improved contrast and look.
Output & Terminal Enhancements
- Metadata Embedding: Output GIF comments and SVG XML tags now embed diagnostic metadata:
<!-- Created with EVP v0.16.0 (sha: <git_sha>, frames: 42, cols: 80, rows: 24, fps: 30, render_time: 154ms) --> - Screenshots: Screenshots now officially support
.txtand.asciiexports alongside.png,.svg, and.json.
📊 Telemetry System
- Timing Registry: A new
ScopeTimerin src/telemetry.rs collects execution durations for major blocks (font_init,pty_spawn,runner_execution,enforce_require, etc.). - Telemetry in Stats: Timing durations are now exposed in the
.statsoutput files, allowing developers to inspect frame capture/drop metrics alongside execution cost. - Automated Summary: A Python script (scripts/generate_stats_summary.py) runs post-CI build to parse all
.statsfiles and generate a Markdown speed summary.
v0.15.0
The headline feature of this release is the introduction of Interactive Session Recording (evp record), which allows you to record your live terminal sessions directly to a .tape file and a corresponding .gif!
Headline Feature: Interactive Session Recording (evp record)
You can now record your live terminal sessions in real time! EVP turns your host terminal into raw mode, captures all keystrokes, mouse clicks, drags, movements, and scrolling, and compiles them directly:
- Usage:
# Record your session (saves to demo.tape and demo.gif by default) > evp record # Customize the outputs, shell, theme, and geometry: > evp record --output my_demo.tape --output demo.svg --shell zsh --theme "Catppuccin Mocha" --cols 100 --rows 40
- Robust Wrapped Header Layout: Features a dynamic cell-by-cell simulated flow layout for the interactive header. If the terminal window is narrow, the header text gracefully wraps onto multiple lines without breaking.
- Dynamic Geometric Offsets: Cursor positioning and terminal grid partitions dynamically adjust to match the calculated height of the wrapped header text.
- Coordinate-based Click/Hover Tracking: Mouse hover and left-click coordinates dynamically check against coordinates printed during layout rather than relying on hardcoded columns.
- Interactive Recording Demo: Added an interactive demo tape (
examples/evp_record_demo.tape) compiling inside Docker and integrated it into theREADME.md.
Other Improvements in v0.15.0
⚡ Performance & Startup Latency Fixes
- Instantaneous PTY Spawning: Removed a blocking passwd database query (
getpwuid_r) from the fallback shell path resolver. This eliminates a 5–8 second latency/hang in Docker containers and sandboxed GitHub Actions runner environments.
📦 Workspace modularization
- Crate Separation: Extracted the helper program out of the main package binaries list into a separate workspace package: evp_helper_tool/.
- Dynamic Integration Tests: Refactored the test suite to locate target executables dynamically at test runtime (
common::get_helper_bin_path()) across debug, release, and musl target profiles.
🚀 CI/CD & GHA Release Pipeline
- Emulation-free Cross-Compilation: Ported
ci/libghostty-pkgconfig.Dockerfileto compile natively on the host runner (--platform=$BUILDPLATFORM) and cross-compile to the target architecture. This avoids slow and buggy QEMU emulation hangs when compiling the static Ghostty library foraarch64. - Draft-to-Pre-release workflow: Rewrote the GitHub Actions release workflow to register a draft release first, upload compiled targets natively using the
ghCLI, and publish as a pre-release only when all targets build successfully.
🔧 Installer & Script Cleanups
- API Rate-Limit Bypass: Updated
install.shto resolve the latest version tag using HTTP redirect headers (curl -sI) instead of querying the GitHub JSON API, avoiding API rate-limiting blocks. - Cross-platform checksum verification: Standardized install script validation to support both Linux
sha256sumand macOSshasum. - Code Deduplication: Centralized script comment headers, physical keyboard shift key modifier translation, and target backend output resolution (
RendererBackend::for_path).
v0.14.0
Full Changelog: v0.13.0...v0.14.0
Full Changelog: v0.13.0...v0.14.0
Full Changelog: v0.13.0...v0.14.0
Full Changelog: v0.13.0...v0.14.0
v0.13.0
v0.12.0
v0.11.0
v0.10.0
v0.9.0
What's Changed
Full Changelog: v0.8.1...v0.9.0