$ odytty --evidence
Performance and memory evidence
This page reports the published v0.12.0 evidence. None of v0.15.0, v0.15.5, v0.15.6, or v0.15.7 optimizes rendering throughput, terminal storage, GPU allocation, or presentation timing (the v0.15.7 Wayland present-mode change prevents a stall and is not a speed change). No benchmark campaign or live GPU-memory capture was run for v0.15.0, and v0.15.5 claims no new campaign: its font change was compared before and after on one Linux workstation without a new cross-terminal comparison. v0.15.6 and v0.15.7 claim no new measurements, so these results are not v0.16.1 data. v0.15.8 reports only that an untouched macOS window's idle CPU returns to about zero; rendering speed and memory were not re-measured, and no idle-CPU claim is made for Linux or Windows. v0.16.0 and v0.16.1 claim no new measurements. W6 and the separate SE1/SE2 software endpoints do not become claims about universal latency or an overall winner.
Canonical published record: docs/benchmark-results.md · protocol · apparatus
$ odytty --status - current release state
OdyTTY is a broad, working terminal with a public release (currently v0.16.1). The current capabilities and boundaries below are the honest snapshot; the release-by-release story lives in the devlog.
v0.16.1 is published, released October 3, 2026. It adds AppImage update information and a companion zsync asset only. Other packages are rebuilt without behavior changes from v0.16.0. Read the patch notes.
v0.16.0 (October 2, 2026) shipped read-only panes, guarded broadcast input, macOS secure keyboard input, moves between windows, stacked and floating layouts, scrollback export, an Ambiguous width preference, and Windows input fixes. Read the feature release notes.
v0.15.8 (October 2, 2026) removed a per-tick event-loop proxy clone: an untouched macOS window's idle CPU returns to about zero. No Linux or Windows idle-CPU claim is made. Rendering speed and memory were not re-measured.
Historical v0.15.7 (September 27, 2026) fixed a Wayland stall after a hidden workspace and handed workspace autosave to the surviving window after a primary-window merge. It is a stall fix, not a speed change. Read the historical patch notes.
v0.15.6 (September 24, 2026) fixed a v0.15.5 regression in which a cursor jump of more than six cells paused partway through its glide in windows without splits, and made overflowing right-click menus scroll predictably with clickable border arrow marks. Read the v0.15.6 summary.
v0.15.5 (September 24, 2026) is a maintenance and reliability patch over v0.15.0. Normal-text font reading moves to the maintained Fontations skrifa library with the same rasterizer and unchanged sampled glyph output, and two Wayland fixes cover repaint recovery after a lost frame callback and a focused-idle CPU loop. Read the v0.15.5 summary and how text is drawn.
v0.15.0 (September 14, 2026) shipped a dedicated quick terminal, an opt-in owner-scoped local automation endpoint with an odytty control CLI, confirm-first external file drop, keyboard-first window merge, and the Electric Blue theme. The existing terminal-input and remote-upload security boundaries are unchanged. Read the v0.15.0 summary and feature guides.
Performance comparisons remain the published v0.12.0 measurements with their original machine, protocol, and scope. v0.16.0 and v0.16.1 claim no new measurements.
Historical v0.14.0 - profiles and navigation
v0.14.0 (September 8, 2026): profiles and navigation. Named launch profiles with a full Profile Manager, opt-in External palette following, and the unified Session Navigator shipped, and an external security review was closed. Detached and persistent Windows host sessions remained unsupported. See the Profiles, External palette, and Session Navigator guides, or the v0.14.0 release notes.
Historical v0.13.0 release and validation
Historical v0.13.0: safer command-aware work. Risky non-bracketed multiline or control-bearing paste is held behind a bounded escaped preview with explicit Paste, reversible Paste as One Line when available, or Cancel choices. Existing single-line and child-enabled bracketed-paste behavior is unchanged. OdyTTY does not classify shell commands as safe or dangerous - see the Paste Safety documentation.
Verified OSC 133 command ranges now support output-only and prompt-inclusive selection and copying, command-scoped search, previous/next failed-command navigation, and explicit plain-text export. Missing or stale shell integration disables these actions instead of guessing. OdyTTY remains a terminal grid, not a block-document terminal.
Bounded OSC 9/777 notifications and OSC 9;4 progress, one-shot “Notify When This Command Finishes,” and per-pane activity, silence, bell, process-finish, and command-failure monitoring ship without stealing keyboard focus. Existing BEL behavior remains separate.
The tagged commit passed blocking Linux, macOS, and Windows CI, the locked dependency audit, artifact smoke tests, Minisign checksum signing, and GitHub provenance verification. Pinned and always-latest artifact pairs have matching published hashes; Homebrew, Scoop, and AUR publication completed; and bounded post-publish checks confirmed that all three package-manager channels offered v0.13.0. Hosted three-OS CI and package smoke tests passed, but native maintainer-hardware runtime checks on macOS and Windows were unavailable and are not claimed.
Rendering, terminal storage, GPU allocation, and presentation timing did not change. No benchmark campaign or live GPU-memory capture was run for v0.13.0; all measurements below remain explicitly the published v0.12.0 evidence.
v0.12.2 restored multiline progress redraws. It added the ECMA-48
CSI Ps E and CSI Ps F cursor controls used by pacman's parallel-download
display. Read the
v0.12.2 release notes.
v0.12.0 is the measured-memory and stronger-evidence release. It adds runtime memory attribution, reduces retained memory in backgrounds, scrollback, post-processing, and runtime font fallback, closes two Kitty graphics gaps, advertises Sixel through DA1, and publishes GitHub build provenance alongside Minisign. Read the published v0.12.0 release notes and the supporting memory evidence.
Runtime memory attribution
ODYTTY_MEMORY_REPORT attributes host and requested GPU bytes to named subsystems,
while scripts/memory-capture.py decomposes process mappings and keeps driver cost
separate. The unexplained remainder stays explicit. Under the preregistered W6 protocol on the
recorded benchmark machine, five replicates produced medians of 89.0 MB current
and 130.7 MB peak, down 68.9% and 60.1% from the prior OdyTTY result. These are
machine-and-protocol results, not universal footprint claims. See
docs/memory.md.
Kitty graphics extensions
Kitty payloads now accept bounded RFC 1950 zlib compression through o=z, including
chunked transfers and animation frames. Image numbers through I= are accepted on
transmissions and the a=f, a=a, and a=c animation commands;
display and delete by number remain unsupported. OdyTTY's DA1 reply now advertises the existing
Sixel implementation with attribute 4. XTSMGRAPHICS remains unimplemented and silent.
See docs/graphics.md.
Release verification
Minisign authenticates SHA256SUMS with the OdyTTY release key. From v0.12.0,
GitHub's OIDC-backed attestation also binds each artifact digest to the release workflow,
repository, commit, and run. They are additive, and neither replaces the other. Neither is native
code signing: the macOS app is ad-hoc signed and not notarized; Windows executables are unsigned
and may trigger SmartScreen. Exact commands are in install verification.
Cell storage and rendering throughput
Scrollback no longer retains a full second physical-row projection. The ring stores a
28-byte StoredCell instead of the grid's 44-byte Cell, with combining
marks in a per-line sidecar only where present. Cell attributes and copy/search fidelity remain
intact. The output-frame path no longer rebuilds the deep-scrollback projection: the bounded
engineering diagnostic moved from 2.39 to 8.04 MiB/s on SE1 and 1.31 to 8.32 MiB/s on SE2.
Formal cross-terminal SE results are reported separately below.
Background and post-process textures
Background images are resampled to the drawable surface with bounded resize headroom instead of retaining source-resolution residency. Post-process textures are released when the effect stack becomes inactive, stay absent across inactive resizes, and are recreated if effects return. The recovered bytes depend on drawable geometry and adapter class; the evidence reports captures rather than one universal saving. The startup background pipeline also drops full-resolution intermediate buffers before later stages begin.
Font and glyph-atlas memory
Runtime fallback now shares parsed faces by file identity and face index. Font collections are read one selected face at a time and reconstructed as standalone font buffers instead of retaining a whole collection. On the documented 395,439,184-byte collection, selected-face reconstruction added 9,908,224 bytes of RSS versus 395,567,104 for the counterfactual whole-file read: 39.92 times less additional resident memory. Under the atlas survey's sustained color corpus, sharing fallback faces reduced the identical workload from 879.776 MB to 229.204 MB RSS while both atlas families totaled 7.571 MB. The CPU atlas bitmaps themselves remain because they are live insertion stores, not disposable upload-only staging.
Supported functionality
- Real local shells with tabs, workspaces, split panes, scrollback, search, and copy/paste
- Detachable, resumable sessions on Unix, plus cross-platform saveable named layouts and whole-window restore
- SSH connection manager with optional remote shell integration - long form in workflow
- Configured in-app: settings panel, live theme picker + builder, command palette, keybinding editor
- Inline media on the GPU: color emoji from bitmap strikes, COLR/CPAL v0 layers, and COLR v1 Paint graphs - including stock Windows Segoe UI Emoji - plus Kitty graphics with animation and Unicode placeholders, Sixel, iTerm2 inline images, and an image lightbox
- 145 themes, OS dark/light following, a minimum-contrast floor, colorblind modes, and default-on window transparency at 80% opacity
- DEC Special Graphics with G0/G1 and SO/SI, atomic bracketed-paste framing, risky-paste confirmation for non-bracketed multiline or control-bearing text, and safely encoded OSC 7 working directories
- Prompt-aware editing across Bash, Zsh, Fish, and PowerShell, with OSC 133 command-output select/copy/search/navigation/export when shell integration is verified, and ConPTY Win32 keyboard fidelity on Windows
- Bounded OSC 9/777 notifications, OSC 9;4 progress, one-shot command-finish alerts, and per-pane activity, silence, bell, process-finish, and command-failure monitors that never steal keyboard focus
- Settled terminal dimensions during interactive resize, font-size feedback during effective Ctrl+wheel zoom, and unseen-activity dots for background tabs and workspaces
- Animated smooth scrolling (glide) with a pixel-precise touchpad lane - details in rendering
- Default-on programming ligatures -
calt+ligaover ASCII plus a curated non-ASCII operator and arrow allowlist, optionalss01/ss02, and Arabic contextual joining forms in logical cell order (with aligatures = offopt-out and a scalar fallback), plus a smooth animated Block cursor with shape-aware glow - Ships today on all three platforms - Linux x86_64 gets
.deb,.rpm, binary tarball, and AppImage builds; Windows x86_64 gets a portable zip; macOS gets an Apple Silicon app - Linux launch integration: per-window Wayland/X11 identity, held initial commands, and the complete five-key desktop contract
- Releases from v0.11.0 onward ship a Minisign signature over
SHA256SUMS, with the public key in the repository and per-platform verification steps in the install section - Releases from v0.12.0 onward carry GitHub OIDC build provenance attestations; verification is additive to Minisign
- Kitty
o=zcompressed payloads,I=image-number addressing for transmissions and animation, and Sixel discovery through DA1 - Create a theme from the pane's current colors - snapshot live
OSC 4/10/11/12state into an editable theme draft
A slice of the surface - the full set is in highlights below and the folds after it.
Current limitations
- No macOS DMG, upstream Snap package, or upstream Nix package ships. Flatpak is a deliberate non-goal; AppImage is the single-file portable Linux option. The shipped RPM is cross-built and metadata-validated rather than tested across every RPM distribution
- Signed
SHA256SUMSis not OS code signing. The Windows build is unsigned (expect a possible SmartScreen prompt) and the macOS.appis ad-hoc signed, not Developer ID signed or notarized. Those platform signing paths are unavailable for the current distribution; first-launch specifics live with the Windows and macOS install steps. Releases before v0.11.0 remain unsigned - Windows omits detachable/resumable sessions and session-host reattach on restore (layouts still reopen fresh shells), detached SSH, headless
--interactivemode, the full “Open With” app list, and command-palette shell history. Stock Windows Segoe UI Emoji renders in color, but it ships no regional-indicator flag glyphs, so flag clusters fall back to visible letters exactly as they do in native Windows applications - OdyTTY cannot register as the Windows system default terminal. Launch it directly through Scoop, the Start menu, a shortcut, or
odytty; this is separate from choosing which shell opens inside OdyTTY - Multiple windows, live tab and pane movement, and guarded broadcast input ship today. Only the primary window writes the workspace snapshot; coordinated multi-window persistence remains future work. Dragging a tab or pane out of a window is not supported on any platform. Right-click menus, palette actions, and the merge picker are the route, and Wayland chooses new-window placement
- Restored remote panes reconnect fresh at the host's default directory - the recorded remote path is not re-entered in this version
- Shaping is a presentation overlay on a fixed cell grid, so full complex-script (Brahmic) shaping and bidi reordering are not implemented - right-to-left text is stored and drawn in logical cell order. Arabic joining works within that order, but harakat on an Arabic base still break a joining run. Open-ended
ssXXstylistic sets beyondss01/ss02stay deferred - SVG-in-OpenType color glyphs remain deferred; an SVG-only glyph takes the monochrome path
- With the default fonts, the tested CJK Han characters display as missing-glyph boxes on Linux, macOS, and Windows. They render when a covering font is supplied through the
symbol_fontsetting (ODYTTY_SYMBOL_FONT); automatic CJK font discovery is not included - Windows first shells normally wait for the real grid to reach ConPTY. The five-second backstop can still start a shell before a successful resize retry after repeated failures or minimization, so the first command can still land at the old wrapped column
- Kitty
I=addressing on display and delete commands remains unsupported; animated containers such as APNG and GIF decode as a single still frame, and placeholder tiles split an image uniformly rather than letterboxing. The iTerm2 chunkedMultipartFileform is unhandled, andinline=0downloads are never honored - W7's four-hour long-session workload is deferred. SE2 records OdyTTY with the largest peak, after-settle, and retained memory medians for that one 64,000,000-byte burst; it is not a time-based memory-growth result. See evidence
$ odytty --architecture - terminal pipeline
OdyTTY is not a theme over another terminal. The owned path is already the production path.
The VT parser is a clean-room build from the primary specifications (vt100.net, ECMA-48,
xterm ctlseqs); external crates handle only font reading and rasterization, the GPU API,
windowing, and clipboard transport - the same boundary mature independent terminals draw.
OdyTTY subsystems
src/pty/ owns Unix PTY allocation through rustix and the Windows
ConPTY backend. src/parser/
is a clean-room DEC/xterm parser. src/core/ owns terminal state. src/grid.rs
and src/render.rs build instanced cell geometry. src/graphics/ routes
Kitty, Sixel, and iTerm2 images.
src/native/ owns the app, GPU, and overlays.
External dependencies
External crates stay below the product line: wgpu for the GPU API,
winit for windows/events, the Fontations skrifa library for font
reading, ab_glyph_rasterizer and swash for glyph and emoji rasterization,
crossfont for Wayland client-side title-bar text, arboard for clipboard
transport, and Unicode width tables for character width data.
Excluded terminal libraries
vte, portable-pty, and crossterm are absent from the
dependency tree. Mature terminals are compatibility references, not implementation sources.
$ cargo test - test and benchmark evidence
The support claims are backed by bounded, deterministic tests where possible, with separate compatibility, parser/graphics fuzzing, dynamic-analysis, PTY, rendering, and performance tiers.
Evidence boundary: none of v0.15.0, v0.15.5, v0.15.6, or v0.15.7 optimizes rendering throughput, terminal storage, GPU allocation, or presentation timing (the v0.15.7 Wayland present-mode change prevents a stall and is not a speed change). No benchmark campaign or live GPU-memory capture was run for v0.15.0, and v0.15.5 claims no new campaign: its font change was compared before and after on one Linux workstation (benchmark rows, warm startup, and idle memory) without a new cross-terminal comparison. v0.15.6 and v0.15.7 claim no new measurements. v0.15.8 reports only that an untouched macOS window's idle CPU returns to about zero, with no idle-CPU claim for Linux or Windows and no rendering-speed or memory re-measurement. v0.16.0 and v0.16.1 claim no new measurements. Every performance result in this section remains published v0.12.0 evidence.
Theme and knob counts regenerate from OdyTTY's source and docs; the blocking CI matrix
is documented in the repository's release and contribution guides. Release and scheduled checks run
cargo-audit against both locked dependency graphs. Scheduled lanes retain four bounded
coverage-guided parser/graphics fuzz targets and run the promoted Miri subset plus Linux
AddressSanitizer and ThreadSanitizer checks. A tag-triggered release publishes only after the exact tagged commit already has
a completed, successful CI run; missing, queued, failed, cancelled, or wrong-commit runs fail closed.
Compatibility Tests
Unit and integration tests cover parser state, terminal behavior, settings, themes, keybindings, graphics placement, mouse protocols, cross-platform-safe harness paths, and CLI introspection. A retained compatibility corpus, pinned conformance runner, and bounded real-application matrix keep unavailable, skipped, unsupported, and executed surfaces distinct.
Smoke And Fuzz Tiers
PTY smoke, pixel smoke, GPU composite smoke, transcript smoke, protocol fuzz, and ignored deep fuzz tiers are available for the paths that need real process, rendering, or randomized evidence, and CI runs the matrix on every push.
Performance Evidence
cargo bench --bench perf tracks parser/feed/reflow/geometry behavior. The app also
carries optimized resize, retained-frame, and lazy scrollback paths, and cell geometry is
instanced - the builders emit one compact per-quad instance and the vertex
shaders expand the corners, over grow-only GPU buffers. Pixel output is unchanged; differential
tests pin the new geometry against the previous triangle stream. Before v0.12.0, the measured
deep-scrollback fix also removed a projection rebuild from the output-frame path; its engineering
diagnostic moved from 2.39 to 8.04 MiB/s for SE1-shaped input and 1.31 to 8.32 MiB/s for
SE2-shaped input. Those diagnostics explain the change and are not pooled with the formal
cross-terminal samples.
Comparative Benchmark
The v0.12.0 protocol 1.5.4 run records W6 and the software endpoints as separate evidence classes. W6 used five 600-second replicates per terminal after a 60-second settle. On the recorded Linux laptop, OdyTTY's medians were 0.0103% of one core, 89.0 MB current, and 130.7 MB peak. Workload-by-workload, the W6 current/peak medians were Alacritty 59.0/82.4 MB, OdyTTY 89.0/130.7 MB, Ghostty 93.7/165.6 MB, and Kitty 132.2/147.7 MB. No overall winner or composite score is declared.
alacritty ▓▓▓▓▓▓▓▓▓▓▓▓░░░░ 59.0 / 82.4 MB
odytty ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░ 89.0 / 130.7 MB
ghostty ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░ 93.7 / 165.6 MB
kitty ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░ 132.2 / 147.7 MB
SE1 and SE2 each report 30 measured samples per implementation. OdyTTY measured 7.965 MiB/s on SE1 and 8.511 MiB/s on SE2: last on SE1 and second on SE2 in this comparison set. These software endpoints exclude compositor presentation and display scanout; they are throughput evidence, never latency or responsiveness claims.
W1-W5
remain skip / unavailable-hardware because the optical apparatus does not exist.
W7 long-session measurement is a budget-exhausted skip: deferred and not reported as
completed. GPU memory and idle wake events are unsupported in the published W6 run and
are not approximated. WezTerm is outside this machine's preregistered comparison set because it
is known nonfunctional on the unit; it received no launch or probe, and that says nothing about
WezTerm elsewhere.
The measurements describe this recorded machine, environment, artifacts, and protocol only.
The program publishes
three documents: the preregistered
protocol
(workloads, oracles, noise controls, statistics, and reporting rules, fixed before any
measurement), the
apparatus
statement (what can and cannot be measured, and why the optical workloads are not redefined in
software), and the
results
with full method, environment, and limitations. The raw samples and anchored preregistration live
in bench-results/, and subsystem attribution is documented in
docs/memory.md.
cargo fmt --all -- --check
cargo build --locked
cargo clippy --all-targets --locked -- -D warnings
cargo test --locked
ODYTTY_FUZZ_ITERS=40000 cargo test --test protocol_fuzz -- --ignored --nocapture
cargo bench --bench perf