Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]¶
[0.4.0] - 2026-11-06¶
Fixed¶
- Text: wrapping keeps trailing whitespace that fits the width, like
Rich (
"Q? "keeps its space;"hello world"at width 6 wraps to"hello "/"world"), instead of always dropping it. - Syntax:
Theme::AnsiDark/Theme::AnsiLightuse the terminal's own 16 colours with no background (Rich'sansi_dark/ansi_light, the default for tracebacks);indent_guides,stylize_range,line_range(the whole file is highlighted, a window is shown) andcode_width, all as in Rich;Theme::backgroundandTheme::style_for_scopeexpose a theme's colours. The line-number column width follows Rich (start_line + newline count). - Columns:
row_gapadds blank lines between rows (the vertical part of Rich'spadding). - Text: a word whose parts have different styles now wraps as one word
(it used to be split at the style change); the
…of an ellipsis takes the style of the text it ends, like Rich. - Markdown (breaking layout change): rendering is a port of Rich's
rich.markdown— centredh1,•bullets and right-aligned1numbers,▌quotes, code blocks highlighted with one cell of background padding (no panel unlesscode_block_panel), tables in Rich's SIMPLE box,-rules, Rich's default styles and Rich's spacing between blocks. Plain text output matches Rich 15 on the test document. Fixes a paragraph losing its wrapped lines.MarkdownConfiggainsstrike_style,hr_style,table_border_style,table_header_style,hyperlinksandjustify. - Syntax:
Theme::Monokainamed a theme syntect doesn't ship, so it fell back to a light theme (white background). Monokai is now built in with Pygments' monokai colours (builtins green, operators and->pink); across Python/Rust/JS/JSON samples onlyselfas a parameter differs in colour from Rich (a tokenizer difference). - Syntax: layout follows Rich — gutter
1 code/❱ 2 code(was→ 1 │ code), line numbers blended into the background, code area padded with the theme background to the width, a final empty line when the code ends with a newline, andSyntaxreports its natural width. - Syntax: language names are matched case-insensitively
(
Syntax::new(code, "python")now highlights; previously only"py"or"Python"did). - Build: The
markdownfeature no longer fails to compile withoutsyntax;markdownnow impliessyntax(matching Rich, where markdown renders code blocks). - Build: Removed unused
terminal_sizedependency (crossterm is used for terminal size) and unusedinsta/tempfiledev-dependencies. - MSRV: Added
rust-version = "1.81"toCargo.toml, an MSRV job to CI, and pinned lockfile dependencies to versions compatible with Rust 1.81. The README badge now claims the verified MSRV (1.81+, was 1.70+). - CI: Added a feature-matrix job (
--no-default-features, each feature alone, and combinations) so single-feature breakage can never ship again, plus a security-audit job and acargo publish --dry-runjob. Fixed token-less codecov upload and the broken empty-token README badge. - Docs: Deduplicated the "Macro Summary" table in crate documentation.
- Text: Embedded
\nin printed text is now a hard line break instead of collapsing to a space; wrapping preserves runs of inner spaces and lines no longer exceed the available width by a trailing space. - Text:
print!/println!now matchstdsemantics —printadds no trailing newline,printlnexactly one (previouslyprintlndouble-spaced). - Markup: Unknown
:word:shortcodes keep their colons ("12:30:45"no longer renders as"1230:45");:+1:resolves;]]no longer breaks tag parsing; the emoji-syntax doc was corrected. - Style:
Color::parseno longer panics on non-ASCII hex (e.g.#日本);not boldnegates the attribute instead of enabling it. - Layout: Ratio distribution clamps to the remaining space, fixing a
u16underflow panic with many flexible children.Layoutsizes are nowusize. - Console: Color detection honors TTY state (piped output is plain text),
NO_COLOR,TERM=dumb,CLICOLOR_FORCE, andFORCE_COLOR(1/2/3 levels). - Prompt: EOF on stdin returns the default or an error instead of spinning
forever (
Prompt::try_ask/PromptError);secret()reads hidden input via raw mode;case_sensitivebuilder wired into choice matching. - Pager: raw mode is restored on panics via an RAII
RawModeGuard; the cursor is always re-shown; key release events no longer double-scroll; resize events update the page height. - Traceback:
RUST_BACKTRACE=1now delegates to the previous panic hook so backtraces are preserved. - Progress:
auto_refresh/refresh_per_secondspawn a real background refresh thread;BarColumn::expand(true)receives its share of the spare width; Live/Progress height tracking counts soft-wrapped terminal lines. - Table: cells keep their styles and support multi-line content with
aligned borders;
ColumnWidth::Fixed/Min/Maxare honored;Column::wrapwraps at the column width;Row::styleis applied; truncated cells are exactly the column width (ellipsis off-by-one). - Markdown: nested ordered lists keep their numbering after an inner list closes.
- Tree:
from_directoryno longer follows symlink cycles, hides dotfiles by default, and supportsDirectoryTreeOptions(max depth, hidden files, symlink following). - Width: rules, SVG export, bar-chart labels/values and panel padding now measure display width (CJK/emoji) instead of bytes.
- Panel: subtitle styling is separate (
subtitle_style).
Changed¶
- Features:
regex,serde, andserde_jsonare now optional, gated behind a newjsonfeature (theJsonandhighlightermodules require it).fullincludesjson. The incoherentstdfeature was removed (Tree::from_directoryis now always available). - API:
Jsonand the highlighter module require thejsonfeature. - API:
Prompt::askpanics only on EOF without a default; preferPrompt::try_askwhich returnsResult<T, PromptError>. - API: Deprecated alignment enums
table::ColumnAlignandrule::RuleAlignin favor oftext::Alignment;box_drawing::Boxrenamed toBoxStyle(old name kept as a deprecated alias);Table::set_titledeprecated in favor ofTable::title;Measurement::measuredeprecated in favor of the free functionmeasure::measure. - API: Removed placeholder options that never worked:
InspectConfig::methods,TracebackConfig::show_locals,Live::refresh_rate, and the deadCapturedOutputtype.NestedProgressnow implementsRenderable(indented bar tree). - API:
Panel::newnow fits the content by default (expand(false), matching Rich);ConsoleisClone(cheap, Arc-backed) and gainedtheme()/get_theme()— themecustomcolors are usable as markup tags (e.g.[brand]). Prelude/root re-exports now coverAlign,Padding,Theme,Span,Segment,Layout,Live,Direction,BarChart,RenderGroupandMeasurement. -
Performance: wrapping merges adjacent same-style spans (one span per style run, not per word); console output is queued and flushed once per print; JSON highlighter regexes compile once per process; JSON rendering no longer deep-clones the value tree unless sorting; Markdown and Syntax cache parsed/highlighted output across frames; 256-color mapping is closed-form (proven identical to the brute-force scan by test).
-
Markup (breaking): tag grammar now matches Rich. A tag is
[followed bya-z,#,/or@, so[1, 2],[INFO]andlist[]print literally; unknown lowercase tags are consumed like in Rich. The escape is now\[(Rich's) instead of[[/]], which no longer have special meaning. - Theme: markup tags resolve theme style names (
[warning]), including the semantic colors (primary,success, ...).
Added¶
- Table: Rich's cell padding model —
padding_sides,pad_edge,collapse_padding, andTable::grid()(borderless layout grid, like Rich'sTable.grid); cells are measured with their own padding. - Box:
BorderStyle::Custom(BoxStyle)for any box definition. - Panel:
title_text/subtitle_texttake styled text;heightfixes the total height (content padded or cropped, like Rich). - Panel: any renderable as content (
Panel::renderable), so tables, trees and panels nest like in Rich;width,title_align/subtitle_align(default center, like Rich),content_style(Rich'sstyle),padding_spec(four sides). Fit width and title placement now follow Rich's algorithm exactly (╭─ Title ─╮), andPanelreports its measured width. - Table: column widths now use Rich's algorithm (natural widths, shrink
the widest wrapping columns first, then even reduction;
expandspreads spare space, byColumn::ratiowhen set) — layouts match Rich 15 exactly intests/table_rich_parity.rs. Cells can be any renderable (table::Cell,Row::cells,Table::add_row_renderables); headers can be styled text or renderables (Column::header_text,Column::header_renderable). New:caption(+ style/align), title style/alignment (title_text, default italic like Rich),show_edge,width,min_width,row_styles, table-levelheader_style,Row::end_section,Column::no_wrap,Column::overflow. Without a border (show_border(false)) columns are separated by padding only, like Rich'sbox=None. - Rule: ends with a newline (the next print no longer joins its line);
layout ports Rich's algorithm — left/right titles sit at the edge, long
titles are cut with
…; newcharacters(multi-character patterns like"=-") andtitle_text(styled title). - Layout widgets follow Rich:
Alignaligns multi-line content as one block (Align::newadded);Paddingrenders its child at the inner width and pads every line (newexpand, default true, andstyle); newconstrain::Constraincaps a renderable's width;Columnsuses Rich's column-count search, accepts any renderables (Columns::renderables) and gainscolumn_first,right_to_left,align,width. Columns defaults now match Rich (Fitmode, gap 1, no expand). All report measured widths. - Tree: labels can be any renderable (
TreeNode::renderable); rendering follows Rich's algorithm — labels wrap at the width left after the guides with│continuation lines,hide_rootdrops the root's guide level, label styles are inherited by descendants, and the tree reports its measured width. ASCII guides use Rich's`--for the last branch. - Text:
Overflow::WrapEllipsis/Overflow::WrapCrop— wrap at words and cut only over-long words (Rich'soverflow="ellipsis"/"crop"). - Renderable:
render_lines,segments_to_lines,fit_line,line_widthhelpers and theSharedRenderablealias;Textmeasures its widest line as its natural width (was the sum of all lines). - Markup:
markup::escape(), the counterpart of Rich'srich.markup.escape. - Theme: named styles —
Theme::styles,Theme::add_style,Theme::lookup_style(like Rich'sTheme({"warning": "bold red"})). - Testing: golden-file snapshot tests (
tests/snapshot_golden.rs, regenerate withFAST_RICH_UPDATE_SNAPSHOTS=1); unit tests for all previously uncovered modules (live,inspect,progress/columns,align,theme,padding,box_drawing,progress/mod,progress/spinner_data).
[0.3.3] - 2026-08-09¶
Changed¶
- Repository Cleanup: Removed duplicate GitHub Actions CI workflow to avoid duplicated checks.
Removed¶
- Python Bindings: Removed legacy Python binding surface from the crate codebase while keeping Python-only benchmark and verification tooling.
Fixed¶
- CI Stability: Resolved duplicate
Rustfmtstatus checks on pushes.
[0.3.2] - 2026-01-11¶
Added¶
- Print Macros: Drop-in
print!/println!replacements that shadow std macros with rich markup support. print!,println!,eprint!,eprintln!- styled output macrosprint_raw!,println_raw!,eprint_raw!,eprintln_raw!- raw output (no parsing)rprint!,rprintln!- non-shadowing aliases- Spinner Styles: 80+ spinner styles for
SpinnerColumn: SpinnerColumn::new().with_style(SpinnerStyle::Moon)- Emoji spinners: Moon, Earth, Clock, Hearts, Star
- ASCII spinners: Arrow, BouncingBar, GrowHorizontal, Aesthetic
SpinnerStyle::all_names()to list available styles
Enhanced¶
- Progress Bars: Significantly improved
Progressmodule (Python-rich parity): - Added
BarColumnwith distinct characters for filled, pointer, and empty states. - Implemented pulsing animation for indeterminate tasks (unknown total).
- Added
refresh(),start(), andstop()methods for flicker-free rendering. - Added
run()method for context-manager style usage. - Added sub-character precision (smooth updates) using 8th-block unicode characters.
- Added
expandoption for full-width progress bars.
Fixed¶
- Documentation: Fixed
track()demo glitch where output would wrap and stack incorrectly. - Example:
docs_trackexample works reliably on all terminal widths.
[0.3.1] - 2026-01-01¶
Fixed¶
- CI: Resolved
Rustfmtfailures and Windows-specific line ending mismatches in byte-level tests.
Added¶
- README: Polished Documentation section with high-fidelity badges and corrected links.
[0.3.0] - 2025-12-31¶
Added¶
- Professional Visuals: Integrated high-fidelity terminal animations via VHS.
- Visual README: Overhauled landing page with centered branding and feature gallery.
- Interactive Tapes: Added
.tapefiles for automating all project demonstrations. - Security Audit: Completed full codebase scan for secrets and sensitive data.
- Project Logo: Official Rocket Crab branding integrated across all docs.
[0.2.0] - 2025-12-30¶
Added¶
- Layout: New tiling layout engine (
Layout,split_row,split_column). - Live: Live display updating (
Livecontext manager). - Prompt: Interactive user input handling (
Prompt.ask). - Inspect: Object introspection tool (
inspect()) for Rust and Python objects. - Filesize: Utilities for human-readable file sizes (
decimal,binary). - Bindings: Full Python bindings for all new modules.
- Benchmarks: Comparisons for
LayoutandInspectscenarios. - CI: Strict enforcing of atomic commits and formatting.
[0.1.1] - 2025-12-30¶
Improved¶
- Syntax Highlighting Performance: Optimized
Syntaxrendering speed by 3.5x (14.5s -> 4.2s for 1000 iterations) by usingOnceLockfor global syntax/theme set caching. This resolved a major bottleneck where large binary dumps were reloaded on every instantiation.
[0.1.0] - 2025-12-30¶
Added¶
- Core Library: Implemented Rust port of Rich's core components:
Consolewith style and color support.Tablewith auto-sizing and unicode borders.Treefor hierarchical data.PanelandRulelayouts.Progressbars with spinners.Markdownrendering viapulldown-cmark.Syntaxhighlighting viasyntect.Tracebackbeautiful error reporting.Logginghandler.- Python Bindings: Full ABI3-compatible Python extension module (
fast_rich) exposing all core components. - Benchmarks: Comprehensive suite proving 2x-24x performance improvements over Python
rich. - Logging: 24x faster.
- Columns: 23x faster.
- Table: 17x faster.
- Tree: 11x faster.
- Markdown: 9x faster.
Fixed¶
- Fixed duplicate
dev-dependenciesinCargo.toml. - Resolved all Clippy warnings in core and bindings.