Releases: vibecook-dev/ghosttea
Release list
Ghosttea 0.12.0
Ghosttea is a native Ghostty-powered terminal runtime and desktop experience for Electron applications.
This release publishes 10 npm packages and 7 Rust crates under one shared version.
Added
- Terminal frames carry link targets in a new TRF1 section 12: explicit OSC 8
destinations, plus URLs and file or folder paths matched in the visible text,
each with the viewport cell spans it covers, including wrapped and Unicode
text. OSC 8 destinations take precedence over URL-looking labels.
@vibecook/ghosttea-frameexportsdecodeLinkTargetswith the
TerminalLinkandTerminalLinkSpantypes. - React hosts that supply
platform.openExternal(url)get modifier links:
holding Command on macOS, or Ctrl elsewhere, underlines the link under the
pointer, and a click opens it. A successful click is consumed before TUI
mouse reporting; releasing the modifier, window blur, dragging, and changing
terminal output cancel an in-progress click. The underline overlay works with
both WebGPU and Canvas rendering. The runtime also exposes
links(sessionHandle),openLink(uri), and alink-targetsevent. - Path matching recognizes absolute paths,
~/,./,../,$HOME/, and
$PWD/prefixes, quoted paths containing spaces, the~/…directory in
Codex's footer, and relative source references such assrc/main.rs:42:10
or../shared/lib.rs#L42. A line or column suffix is highlighted but is not
part of the openedfile://URL. Relative paths resolve against the shell's
latest OSC 7 working directory, falling back to the session's launch
directory, and~against the launch environment'sHOME(or
USERPROFILE). Embedders drivingTerminalModeldirectly supply that
context withTerminalModel::set_link_context. - Electron hosts open links through
installGhostteaLinkHostfrom
@vibecook/ghosttea-electron/mainandcreateGhostteaLinkBridgefrom
@vibecook/ghosttea-electron/preload. The main-process handler rejects
subframe senders and any sender its trust callback refuses, and both sides
validate destinations with the newterminalLinkUrlfrom
@vibecook/ghosttea-protocol, which accepts onlyhttp,https,mailto,
ftp,ftps, and absolutefile://URLs. File links open in the operating
system's default application. link-urlis now applied configuration, defaulttrue.link-url = false
turns off automatic URL and path matches while OSC 8 links stay clickable,
an empty value restores the default, and an invalid value is diagnosed as an
error. Clients receive it as the optionalrenderer.linkUrl.GhostteaWorkspaceacceptssplitSizing."halves", the default, splits
the active pane in two;"equal"rebalances the row or column that receives
the new pane so its members share it equally, counting a perpendicular
subtree as one member that keeps its own ratios.SplitSizingis exported
from@vibecook/ghosttea-react/workspace.GhostteaWorkspacePlatform.backdropBluraccepts an optional
GhostteaBackdropBlurBridge(load,save,subscribe), exported from
@vibecook/ghosttea-react/workspace. When a host supplies one, Appearance
settings shows a Background blur switch. The desktop application uses it for
a native macOS window blur that is on by default, persisted per profile, and
applied to every open window as soon as it changes.
Changed
- Local sessions report their launch working directory as
cwdfrom creation,
instead ofnulluntil the shell reports one with OSC 7. Terminal metadata
falls back to it the same way.
Fixed
- Rapid cross-pane activation no longer lets a stale request move focus. A
workspace keeps one pending animation-frame focus request, replaces it on the
next activation, and cancels it when the workspace deactivates or unmounts. - A pane remounted by a split reclaims the resize seat it held. A split
re-parents the active pane's surface under a new view id, and a local
session's legacycontrol-changedframe cannot report an empty seat, so the
split pane stopped following resizes. The runtime now clears its cached
controller when one of its own views detaches while holding the seat, and
offers the seat to the session's remaining views. - A pane hidden by a zoom resizes again when the zoom lifts. Releasing control
no longer clears the view's control epoch: the daemon had kept the seat all
along, and the missing epoch made the reclaim fail the
one-claim-per-attachment guard. - WebGPU rendering extends edge-cell backgrounds through the canvas padding and
any fractional trailing cell. Edges come from the committed frame's grid
rather than the canvas size, and the original rectangle is expanded rather
than overlaid, so translucent backgrounds are not blended twice. - The prebuilt
ghostteaddaemons build against rustls 0.23.45, which fixes
RUSTSEC-2026-0285 (TLS 1.3 handshake messages accepted across encryption
level boundaries) in the TLS stack under the Truffle mesh transport, and
against chacha20 0.10.2 in place of the yanked 0.10.1. Crates.io consumers
resolve their own versions.
Compatibility
- This is a 0.x minor release because adding public fields to Rust structs is
source-breaking for downstream exhaustive struct literals, the same reason
0.10.0 was one.ghosttea_core::frame::TextSnapshot.linksand
ghosttea_config::RendererConfig.link_urlare new. Update such literals to
set them;links: Noneencodes a frame without link targets. - The wire stays compatible. Section 12 is additive and TRF1 remains version
1: the 0.11.x decoders (TypeScriptdecodeFrame, the React render worker,
and SwiftRetainedTRF1State) select sections by kind and skip it.
Configuration JSON stays compatible in both directions:link_urlhas a
serde default oftruewhenlinkUrlis absent, and 0.11.x clients
validate only the renderer fields they know. - Link targets need a 0.12.0 daemon. Producers without link metadata,
including older daemons and logical replicas, omit section 12, and their
terminals show no links. platform.openExternalis optional. Without it the runtime reports no
links, so they never surface: nothing is underlined or opened.
Packages
npm:
@vibecook/ghosttea@vibecook/ghosttea-client@vibecook/ghosttea-electron@vibecook/ghosttea-frame@vibecook/ghosttea-native-tabs@vibecook/ghosttea-protocol@vibecook/ghosttea-react@vibecook/ghosttead@vibecook/ghosttead-darwin-arm64@vibecook/ghosttead-win32-x64
crates.io:
ghostteaghosttea-configghosttea-coreghosttea-textghosttea-truffleghosttea-vtghosttea-vt-sys
Publish order is a dependency order rather than this one; it is recorded in PUBLISHING.md.
Requirements
Node 22+ and Rust 1.88+. Native Ghostty VT artifacts are published for aarch64-apple-darwin and x86_64-pc-windows-msvc.
GhostteaAppleNative xcframework a5fa7ef2afc2
CI-built and attested from f17a0ff.
Ghosttea 0.11.1
Ghosttea is a native Ghostty-powered terminal runtime and desktop experience for Electron applications.
This release publishes 10 npm packages and 7 Rust crates under one shared version.
Added
- Routed React hosts can supply
getSessionfor the existing frame-driven
metadata cadence. Routed frame commits now coalesce exact-summary reads at
200 ms, prevent overlapping reads for a session, and reject stale completions
after a newer event, registration, exit, or removal. @vibecook/ghosttea-reactexportsRoutedSessionEventand
applySessionEventfor full-summary, activity, exit, and removal projection.
Activity and exit use the same CustomEvent ordering as the port transport,
exit events preserve every termination fact, and removal never terminates or
invents exit evidence.- Routed hosts can opt into strict inbound extension messages with
onExtensionMessage. Only unknown tagged objects received after control-leg
authentication reach the callback, together with authenticated cell and
connection-set identity; malformed, known-invalid, wrong-leg, binary,
oversized, and pre-authentication messages retain their protocol close. - The repository includes a private Electron compositor pipeline lab for
comparing scene/view architectures and exercising renderer scheduling under
controlled workloads.
Compatibility
- All new routed host members are optional. Omitting them preserves 0.11.0
behavior, and the existing port-pair transport and Ghosttea wire contracts
are unchanged.
Packages
npm:
@vibecook/ghosttea@vibecook/ghosttea-client@vibecook/ghosttea-electron@vibecook/ghosttea-frame@vibecook/ghosttea-native-tabs@vibecook/ghosttea-protocol@vibecook/ghosttea-react@vibecook/ghosttead@vibecook/ghosttead-darwin-arm64@vibecook/ghosttead-win32-x64
crates.io:
ghostteaghosttea-configghosttea-coreghosttea-textghosttea-truffleghosttea-vtghosttea-vt-sys
Publish order is a dependency order rather than this one; it is recorded in PUBLISHING.md.
Requirements
Node 22+ and Rust 1.88+. Native Ghostty VT artifacts are published for aarch64-apple-darwin and x86_64-pc-windows-msvc.
GhostteaAppleNative xcframework 3f583406767d
CI-built and attested from 5337bcf.
Ghosttea 0.11.0
Ghosttea is a native Ghostty-powered terminal runtime and desktop experience for Electron applications.
This release publishes 10 npm packages and 7 Rust crates under one shared version.
Added
ghosttea::ServiceHandle::sessionsnow yields a cloneable in-process
ServiceSessionscapability over the exact registry and frame hub served by
the legacy sockets. It supports stable session snapshots and lookup,
policy-identical spawning, and typed created/exited/removed lifecycle events.
Session::spawn_with_private_env_prefixesis public for hosts that must
construct a session outside the service policy path.@vibecook/ghosttea-protocolexports the TPv3 routed-terminal contract:
grants and tickets, direction-checked tagged messages, RFC 8785 canonical
grant input, close classification, scene ordering, CRC-32C, and binary
presentation-envelope framing. A compatibility verifier covers the complete
published VibeField TP fixture corpus.@vibecook/ghosttea-reactgains an additivetransport: "routed"mode.
Main owns activation authority, the pooled control WebSockets, grant renewal,
independent presentation/input leases, recovery, demand, and geometry CAS;
the render worker owns pooled frames WebSockets, envelope-before-apply and
inner-TRF identity validation, cumulative byte credits, bounded seed/catch-up
staging, atomic swaps, and negotiated resume.- Terminal surfaces can remove input locally with
inputPolicy="read-only"or
readWrite={false}, apply themes per view, and read monotonic production
rendering counters without opening a sample window or draining the GPU.
Workspace divider drags now expose a throttled live-update/final-commit seam,
and pane zoom preserves mounted canvases and activation identity.
Fixed
- Focus is now scheduling state only. It cannot claim resize authority, the
runtime refuses resize calls without an explicit controller request, and a
controlsResize={false}surface skips observer-driven resize calls as well.
Compatibility
- The existing UDS control/frame wire and port-pair renderer transport are
unchanged; port-pair remains the default rollback path. - The published TPv3 T1 contract has no terminal-input message tag. Routed
input therefore remains closed unless a host supplies an encoder for an
extension negotiated with its cell, instead of Ghosttea inventing an
incompatible wire verb.
Packages
npm:
@vibecook/ghosttea@vibecook/ghosttea-client@vibecook/ghosttea-electron@vibecook/ghosttea-frame@vibecook/ghosttea-native-tabs@vibecook/ghosttea-protocol@vibecook/ghosttea-react@vibecook/ghosttead@vibecook/ghosttead-darwin-arm64@vibecook/ghosttead-win32-x64
crates.io:
ghostteaghosttea-configghosttea-coreghosttea-textghosttea-truffleghosttea-vtghosttea-vt-sys
Publish order is a dependency order rather than this one; it is recorded in PUBLISHING.md.
Requirements
Node 22+ and Rust 1.88+. Native Ghostty VT artifacts are published for aarch64-apple-darwin and x86_64-pc-windows-msvc.
GhostteaAppleNative xcframework 882149c68985
CI-built and attested from 69fe965.
Ghosttea 0.10.1
Ghosttea is a native Ghostty-powered terminal runtime and desktop experience for Electron applications.
This release publishes 10 npm packages and 7 Rust crates under one shared version.
Fixed
- Windows inherited-session environment filtering now matches the operating
system's ASCII-case-insensitive key lookup. Case variants of Ghosttea and
Terminald built-ins, built-in private prefixes, and host-provided private
prefixes are removed before a ConPTY child starts; Unix environment names
remain byte-sensitive.
Validation
- Windows process-tree custody tests now wait on handles to the exact process
objects instead of polling reusable numeric PIDs. The ordinary Windows
release gate therefore proves job-object teardown without PID-reuse false
positives; this hardening changes the witness, not runtime custody behavior.
Packages
npm:
@vibecook/ghosttea@vibecook/ghosttea-client@vibecook/ghosttea-electron@vibecook/ghosttea-frame@vibecook/ghosttea-native-tabs@vibecook/ghosttea-protocol@vibecook/ghosttea-react@vibecook/ghosttead@vibecook/ghosttead-darwin-arm64@vibecook/ghosttead-win32-x64
crates.io:
ghostteaghosttea-configghosttea-coreghosttea-textghosttea-truffleghosttea-vtghosttea-vt-sys
Publish order is a dependency order rather than this one; it is recorded in PUBLISHING.md.
Requirements
Node 22+ and Rust 1.88+. Native Ghostty VT artifacts are published for aarch64-apple-darwin and x86_64-pc-windows-msvc.
Ghosttea 0.10.0
Ghosttea is a native Ghostty-powered terminal runtime and desktop experience for Electron applications.
This release publishes 10 npm packages and 7 Rust crates under one shared version.
Added
- Control protocol 1.15 adds an optional per-session
scrollbackBytescap.
Zero disables scrollback, omission retains the daemon default, values must be
non-negative JavaScript safe integers, and the effective local cap is echoed
in session summaries. Clients requesting an override reject daemons older
than 1.15 instead of pretending an unknown field was enforced. - Control protocol 1.16 adds stable structured request failures. Both browser
and Node clients now reject withGhostteaRequestError, preserving the
byte-identical legacy message while exposingstage,code, andosError
when the daemon can classify them. PTY spawn failures carry typed operating
system errors; portable-pty open failures honestly identify only the
openptystage because that dependency has already stringified its errno. ghosttea-vtnow exposes read-only packed-mode lookup, pending-wrap state,
whole-screen and state-only recovery fragments, complete saved cursors per
primary/alternate screen, sparse screen-selected row/state snapshots, and
URI plus explicit/implicit hyperlink identity. These APIs recover inactive
screens without activating them and preserve hyperlink groups across Ghostty
page migrations.
Changed
TerminalSnapshotnow carries row wrap/semantic metadata and URI hyperlink
runs.TerminalScreenSnapshotand the new saved-cursor/state types retain
cursor style, protection, pending wrap, charset, keyboard, prompt, viewport,
and hyperlink state needed for lossless replacement-terminal recovery.- Ghostty VT artifacts are content-addressed by the pinned upstream commit,
exact checksum-locked patch set, and build recipe. Bundles carry those source
patches, and release tags promote the exact reviewed macOS and Windows
candidates instead of rebuilding different non-reproducible bytes behind
recorded checksums. macOS builds still pin Zig scheduling, target CPU, and
the exact Xcode archive normalizer to minimize host and runner-toolchain drift.
Compatibility
- This is a 0.x minor release because adding public fields to Rust snapshot
structs is source-breaking for downstream exhaustive struct literals. Update
such literals to initializeTerminalSnapshot.row_metadataand
TerminalSnapshot.hyperlinks, or use defaults/construction helpers. - Older daemons remain usable when no per-session scrollback override is
requested. Their missing session-summary field is accepted; remote replicas
reportscrollbackBytes: null. Existing error message andError.name
behavior is unchanged, while callers may opt into the structured metadata.
Packages
npm:
@vibecook/ghosttea@vibecook/ghosttea-client@vibecook/ghosttea-electron@vibecook/ghosttea-frame@vibecook/ghosttea-native-tabs@vibecook/ghosttea-protocol@vibecook/ghosttea-react@vibecook/ghosttead@vibecook/ghosttead-darwin-arm64@vibecook/ghosttead-win32-x64
crates.io:
ghostteaghosttea-configghosttea-coreghosttea-textghosttea-truffleghosttea-vtghosttea-vt-sys
Publish order is a dependency order rather than this one; it is recorded in PUBLISHING.md.
Requirements
Node 22+ and Rust 1.88+. Native Ghostty VT artifacts are published for aarch64-apple-darwin and x86_64-pc-windows-msvc.
ghostty-vt-222a4b1b224b
Full Changelog: v0.9.4...ghostty-vt-222a4b1b224b
GhostteaAppleNative xcframework 881e968585c0
CI-built and attested from 52f430a.