Skip to content

Revenant 0.7.0

Choose a tag to compare

@github-actions github-actions released this 14 Sep 05:17
· 48 commits to master since this release

Highlights

A broad daily-driver release: application notifications and progress, interactive scrollback search, shell-aware navigation and output piping, modern color and title controls, audited identity, and seamless procedural terminal graphics.

Changes

Released 2026-09-14. Full history in CHANGELOG.md.

Features

  • Deliver OSC 9 and OSC 777 notifications to the desktop. Builds with libnotify, which release packages require, now show an unfocused terminal's notification requests through the desktop's notification service, with the application icon and the program name standing in for a missing title. Titles and bodies are passed as data: invalid UTF-8 and control bytes are replaced, markup is escaped, and they are cut at 256 and 1024 bytes. At most five notifications are attempted in ten seconds, a failed delivery pauses attempts for five seconds, and delivery recovers once a notification service is available again. Requests made while the terminal is focused are only logged, delivery never blocks the terminal, and the existing WM urgency hint is unchanged. -report-config states whether libnotify was compiled in and whether a notification service answers. (dd6d15d, 9e0c8ca, 9dfa887)

  • Show application progress. OSC 9;4 reports, as sent by tools such as build systems and package managers, now draw a small bar in the top-right corner of the terminal: normal progress in the foreground color, errors in red and paused work in amber, both keeping the last percentage when the application omits one, and indeterminate work as a moving block. Values above 100 show a full bar. Clearing the report, a full reset or the program exiting removes the bar. It never changes the window title, the title stack or title reports, needs no Window Ops permission and is independent of notifications. (e01f7b9, efa1b9b)

  • Search the scrollback. Ctrl+Shift+F, or the new start-search() action, opens a search bar over the bottom of the window. Typing finds the literal text across soft-wrapped lines as you type, highlights every visible match and scrolls to the nearest one above the view; Up and Down (or Shift+F3 and F3) move to older and newer matches, wrapping at the ends. Enter copies the active match to PRIMARY with its wraps joined and closes the bar, and Escape closes it and returns to where the search started. While the bar is open every key belongs to it, output keeps the view on the same text, and results stay those of the text present when the query was typed. (f81f108, a92e5a1, 3c1d664, 0552f1c)

  • Flash text after copying it. The new copyFlashDuration resource, in milliseconds and 0 (off) by default, briefly marks the cells a selection gesture has just copied to PRIMARY or CLIPBOARD. copyFlashColor paints them on a chosen color; without it they show their unselected colors for the flash. The copied bytes and selection ownership are unchanged. A new selection, another client taking the selection, or an application replacing it ends the flash at once, a repeated copy starts a new one, application OSC 52 writes never flash, and a synchronized-output batch never shows a partial flash. (8fac827, dcf46b9)

  • Draw box-drawing and block-element characters from the cell geometry. U+2500 through U+259F are rasterized as exact rectangles inside their own cell, so lines, corners, tees, double lines, dashes, arcs, diagonals, half and eighth blocks, quadrants and shades join pixel-for-pixel with their neighbors at every font size, in bold, under inverse video and selection, and never spill into the next cell. With Xft the primary face keeps its own glyphs and the procedural drawing is used only for characters the face lacks; the bitmap path, which previously showed ?, always draws them. The new forceBoxChars resource (+fbx on, -fbx off), the font menu's Procedural Glyphs entry, and the set-font-linedrawing() action force the procedural drawing for the whole range, and switching it off returns to the font's glyphs immediately. Every key is now decided one event-loop tick after Xt dispatches it, so a key bound to any local action, not only the default prompt gestures, is kept from the application together with its release. (7421d5b, 4b7af26, 83204b0)

  • Draw braille and Powerline separators from the cell geometry. Every braille pattern, U+2800 through U+28FF, is drawn as equal square dots in two columns of four, and U+E0B0 through U+E0BF, the Powerline arrows, half circles, slants and their thin outlines, span the full cell height so segments meet their neighbors' colors without a seam. They follow the box-drawing rules: Xft keeps the primary face's own glyphs, the bitmap path and forceBoxChars always draw them, and bold, inverse video, selection and the block cursor color them like text. Other Powerline and Nerd Font symbols, such as the branch icon U+E0A0, stay with the font, as does braille in a cell too narrow for a visible dot. (aefafe6, e7b3d91)

  • Extend procedural drawing to DEC scan lines, terminal corner triangles, Powerline flame separators U+E0D2/U+E0D4, Symbols for Legacy Computing, and the selected Unicode 16 Legacy Computing Supplement ranges used for separated quadrants and sextants, circle pieces, octants, and sixteenth blocks. They share the box-drawing routing and switch. U+1FB93, unrelated symbols, and private-use additions stay with the font. (d4941b5, 152469c)

  • Pipe the last command's output to a helper. The new pipeCommandOutput resource names a shell command, unset by default, and the new pipe-command-output() action (Ctrl+Shift+G) finds the most recently completed prompt through its OSC 133 marks, extracts exactly that command's output with wrapped lines joined and Unicode intact, and writes it to the helper's standard input from the event loop without blocking. The helper runs in the directory the shell last reported with OSC 7 when one is known. Output is data only: nothing in it is ever executed. An unset resource, a command that wrote nothing, a helper that stops reading, and exiting while the helper still runs are all handled and logged. (1f99bd0, b4e798f, 7c7fd93)

  • Navigate between shell prompts. Ctrl+Shift+Up and Ctrl+Shift+Down run the new previous-prompt() and next-prompt() translation actions, which move the viewport to the start of the previous or next prompt that a shell has marked with OSC 133, through scrollback, across wrapped and continuation prompt lines, and after resize reflow. A prompt inside the live area keeps the live view, a screen without history (the alternate screen) does nothing, and both actions accept a repeat count. Prompt positions come from an index of OSC 133 marks, so a deep history without prompts costs nothing to search. Binding the keys to xterm's insert-seven-bit() restores their delivery to applications. The backend also exposes the core's cell-exact command-output selection and its text for later output extraction. (75abb48, 0df3987)

  • Raise the X11 urgency hint for application notifications. An OSC 9 or OSC 777 notify request that arrives while the window is unfocused sets XUrgencyHint in WM_HINTS, leaving every other hint field alone, and the next focus-in clears it; a request while focused only logs. Title and body are recorded in the -debug log. No desktop notification is delivered, no permission setting applies, and no D-Bus or helper process is involved. (87fdc41, 2b8d4ba)

  • Log unsupported Application Program Commands. Every completed APC that libghostty does not implement (anything other than Kitty graphics and the glyph protocol) is recorded under -debug as unknown APC ignored with up to 256 payload bytes and a truncation flag; nothing is answered and surrounding output is unaffected. Unsupported OSC and CSI controls are still not visible, which remains an upstream libghostty limitation. (ab09071, 8fbfdb7)

  • Answer device-attribute queries with an audited identity instead of libghostty's default. DA1 reports CSI ? 62 ; 6 ; 21 ; 22 c (VT220 level with selective erase, left/right margins, and ANSI color, each backed by a rendered-cell test), DA2 reports CSI > 1 ; Pv ; 0 c with Pv derived from the Revenant version, and DA3 keeps the all-zero unit ID. Sixel, ReGIS, 132-column, locator, and rectangular-editing codes are not claimed; XTVERSION still names the product. The manual probe decodes the replies. (fd6dee5, 6dbedbd)

  • Track the shell's working directory from OSC 7 reports. The file:// URI is percent-decoded and kept only when it names an existing local directory on this host; reports for other hosts, other URI schemes, malformed escapes, or missing directories clear the retained path instead, as do reports longer than libghostty's 2048-byte OSC limit. Nothing acts on the path yet, and the terminal's own working directory never changes. (e2b2485)

  • Add the termName resource and -tn option. The configured name (default xterm-256color) becomes the child's TERM and the answer to an XTGETTCAP TN query, so the two can no longer disagree; the reply still obeys Tcap Ops, and -report-config shows the effective name. (cf5ae7c)

  • Answer ENQ with xterm's answerbackString resource. The string is sent verbatim for every ENQ (0x05) the application writes; the default is empty and sends nothing. (6c5d166)

  • Honor the startup cursor shape resources. cursorUnderLine (-uc) starts with an underline cursor and cursorBar (-barc) with a bar, underline winning when both are set. An application's DECSCUSR request overrides the startup shape, and CSI 0 SP q or a full reset returns to it; the blink policy is untouched. (b4a41b1)

  • Activate Allow Mouse Ops and Allow Tcap Ops in the Ctrl+right-click menu. Mouse Ops gates mouse/focus reporting; Tcap Ops gates XTGETTCAP replies with disallowedTcapOps exceptions. Prepare Font Ops resources and policy helpers while keeping its menu entry disabled until OSC 50 exists. Add probe-features.py with 18 manual fixtures and a maintainer dispatch guide for the remaining feature work. (e5a42da)

  • Paint colored underlines. SGR 58 selects an indexed or 24-bit underline color for every underline style, SGR 59 returns to the text color, and the color survives inverse video, selection, and translucent backgrounds in both the bitmap and Xft renderers. (2ba4bfa)

  • Render dynamic colors. OSC 10, 11, and 12 now repaint the default foreground, background, and cursor immediately, OSC 110, 111, and 112 restore the configured X resources, and queries report the displayed colors. Explicit SGR colors, reverse video, and opacity keep their rules. (9d97a91)

  • Report the color scheme: CSI ? 996 n answers light or dark from the displayed background, and mode 2031 sends CSI ? 997 ; Ps n whenever a color change flips the scheme. (9d97a91)

  • Activate Allow Color Ops in the Ctrl+right-click menu, with allowColorOps defaulting to true, and honor xterm's disallowedColorOps list when it is off: SetColor gates OSC 10-19 sets and 110-119 resets, GetColor their queries, and GetAnsiColor OSC 4/5 queries, while ordinary palette writes stay ungated. Add tools/probe-dynamic-colors.py for manual foreground, background, cursor, and scheme checks. (9d97a91)

  • Activate Allow Title Ops in the Ctrl+right-click menu, with the allowTitleOps resource defaulting to true. Turning it off blocks application title changes and applying saved labels on pop; title reports and stack permissions remain controlled separately by Window Ops. (d890a24, 9f2a51a)

  • Support the XTWINOPS title stack and title reports. CSI 22 ; Ps t saves and CSI 23 ; Ps t restores the window title and icon name through xterm's ten-entry ring, including direct slot access; CSI 20 t and CSI 21 t report the icon name and title as OSC L / OSC l replies. All four consult the Window Ops policy (PushTitle, PopTitle, GetIconTitle, GetWinTitle, or xterm's numbers 20-23) and the live Allow Window Ops toggle; xterm's defaults leave the stack available and the reports silent. (d890a24, 9f2a51a)

  • Support OSC 52 selection access with xterm's permission model. Applications can set or clear CLIPBOARD, PRIMARY, or the SELECT name, and query them, through the existing X11 selection machinery. The new allowWindowOps and disallowedWindowOps resources gate SetSelection and GetSelection with xterm's defaults, which leave OSC 52 disabled; maxStringParse bounds the encoded payload. A denied query stays unanswered, as in xterm. The Ctrl+right-click Allow Window Ops toggle changes selection permissions immediately and restores the configured restrictions when turned off. (62966be, bcc82f4)

  • Honor synchronized output (DEC private mode 2026): dirty updates are held while an application batches a redraw and painted once it releases the mode, so batched redraws no longer tear. A one-second timeout releases and resets a batch the application never closes. An expose during a hold repaints the last complete frame; a resize repaints the current state at the new grid while keeping the mode set and the pending update intact. (192b7e4)

Tools

  • Add a standalone Go probe with 53 command/TUI cases, arrow-key and mouse navigation, named settings, scrollable help, TDN feature references, JSON evidence, shared terminal cleanup, and migrated font/emoji samples and palettes. just probe builds it as needed; just test-probe checks decoders and real PTY behavior. Assessment prompts are opt-in with --assess; emoji tests have individual sections, a mode-2027 comparison and Run all. Keep the original scripts for comparison. TDN feature slugs now open scenario menus, with stable case IDs, curated breadcrumbs, and entry commands on TDN pages. Page dense samples for 80x24, remove redundant completion pauses, and add clickable ancestors plus selectable test locations for reporting problems. Standardize inspection on Space/Enter to continue and q/Escape to exit a test with cleanup; add F2 selection mode for copying menu text directly; document the input-capture and text-editor exceptions. (db672d4)

Documentation

  • Document the control-string family and its ECMA-48 and DEC structure, including ESC and CSI anatomy, terminator history, tmux passthrough, and Kitty unscroll. (48335cb)
  • Give TDN features stable identifiers and specification references. Store compatibility in independently maintained terminal YAML files, and generate feature pages, comparison filters, profile tables, and a JSON export from the same data. Preserve imported claims as unverified and retain evidence. (1a8a295)

Other

  • Advance the immutable libghostty input to 0c2a290d3a3e2a599be3a43435d778a5896667ee, from upstream's unreleased 1.4 development branch. (4c3ada3)
  • Require the complete no-skip suite before release bookkeeping and make packaging tests portable across shells, notification worker scheduling, libnotify icon encodings, host-name tools, container init behavior, and kernels that coalesce PTY reads. (4547b04, 01600a4, 2a74ce4, 479265b)

Bug fixes

  • Map -geometry to the application shell only, as the X Toolkit does, and keep popup menus from inheriting a loose *geometry value; a terminal started with -geometry no longer shows tiny, unusable menus. (d890a24)

Artifacts

File Size Notes
revenant-0.7.0-1-x86_64.pkg.tar.zst 1.3 MiB Arch Linux package; sudo pacman -U ./revenant-0.7.0-1-x86_64.pkg.tar.zst
revenant-0.7.0-1.fc44.x86_64.rpm 1.2 MiB Fedora package; sudo dnf install ./revenant-0.7.0-1.fc44.x86_64.rpm
revenant-0.7.0-linux-aarch64.tar.gz 1.1 MiB Linux aarch64 binary archive (dynamically linked): stripped revenant, xterm+ symlink, README, licenses
revenant-0.7.0-linux-x86_64.tar.gz 1.2 MiB Linux x86_64 binary archive (dynamically linked): stripped revenant, xterm+ symlink, README, licenses
revenant_0.7.0-1_amd64.deb 1.1 MiB Debian/Ubuntu package; sudo apt install ./revenant_0.7.0-1_amd64.deb

SHA-256:

b446aedb6515517cb8fb93f1241d3ead99d0366bf97720d298a9f34f539e0982  revenant-0.7.0-1-x86_64.pkg.tar.zst
684e56ba28c07a33929ea2b2251b1e2874ba3c9f5e9065a0428ba602236b0ffd  revenant-0.7.0-1.fc44.x86_64.rpm
634d54c13166edb5346d40b378e5dbce961514889beb6a316f5eb473cdffdd0e  revenant-0.7.0-linux-aarch64.tar.gz
d27661d27cad311197b236bd5ba43bec67ce3e353fb5c6cbe2148c62a2819ab3  revenant-0.7.0-linux-x86_64.tar.gz
7e1f7c379e72e0f7701d309aeca70c5a4b3e28874e538012b333e144dab001c7  revenant_0.7.0-1_amd64.deb

CPU floor: x86_64 builds target x86_64-v3 (AVX2 — Intel Haswell 2013+, AMD Zen 2019+); aarch64 builds target generic ARMv8. Older CPUs fail with an illegal-instruction error; open an issue if that affects you.

Each file carries a signed build provenance attestation from the workflow run; verify a download with gh attestation verify FILE --repo toppk/revenant.

All builds link the pinned libghostty-vt from tools/fetch-libghostty and were built by the Release workflow.