Repository navigation
Revenant 0.7.0
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-configstates 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
copyFlashDurationresource, in milliseconds and 0 (off) by default, briefly marks the cells a selection gesture has just copied to PRIMARY or CLIPBOARD.copyFlashColorpaints 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 newforceBoxCharsresource (+fbxon,-fbxoff), the font menu's Procedural Glyphs entry, and theset-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
forceBoxCharsalways 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
pipeCommandOutputresource names a shell command, unset by default, and the newpipe-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()andnext-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'sinsert-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
notifyrequest that arrives while the window is unfocused setsXUrgencyHintin 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-debuglog. 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
-debugasunknown APC ignoredwith 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 reportsCSI > 1 ; Pv ; 0 cwithPvderived 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
termNameresource and-tnoption. The configured name (defaultxterm-256color) becomes the child'sTERMand the answer to an XTGETTCAPTNquery, so the two can no longer disagree; the reply still obeys Tcap Ops, and-report-configshows the effective name. (cf5ae7c) -
Answer ENQ with xterm's
answerbackStringresource. 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 andcursorBar(-barc) with a bar, underline winning when both are set. An application's DECSCUSR request overrides the startup shape, andCSI 0 SP qor 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
disallowedTcapOpsexceptions. Prepare Font Ops resources and policy helpers while keeping its menu entry disabled until OSC 50 exists. Addprobe-features.pywith 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 nanswers light or dark from the displayed background, and mode 2031 sendsCSI ? 997 ; Ps nwhenever a color change flips the scheme. (9d97a91) -
Activate Allow Color Ops in the Ctrl+right-click menu, with
allowColorOpsdefaulting to true, and honor xterm'sdisallowedColorOpslist when it is off:SetColorgates OSC 10-19 sets and 110-119 resets,GetColortheir queries, andGetAnsiColorOSC 4/5 queries, while ordinary palette writes stay ungated. Addtools/probe-dynamic-colors.pyfor manual foreground, background, cursor, and scheme checks. (9d97a91) -
Activate Allow Title Ops in the Ctrl+right-click menu, with the
allowTitleOpsresource 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 tsaves andCSI 23 ; Ps trestores the window title and icon name through xterm's ten-entry ring, including direct slot access;CSI 20 tandCSI 21 treport the icon name and title asOSC L/OSC lreplies. 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 theSELECTname, and query them, through the existing X11 selection machinery. The newallowWindowOpsanddisallowedWindowOpsresources gateSetSelectionandGetSelectionwith xterm's defaults, which leave OSC 52 disabled;maxStringParsebounds 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 probebuilds it as needed;just test-probechecks 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
-geometryto the application shell only, as the X Toolkit does, and keep popup menus from inheriting a loose*geometryvalue; a terminal started with-geometryno 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.