Skip to content

0.0.21 cohort: widgets, text editing and a playground in the docs

Memo celebrating, trunk up, with confetti cells Published on 2026-10-21, every crate by one release run, with rs-rich 0.0.9 on PyPI (uploaded early on 2026-10-22, UTC). See Publication.

0.0.21 fixes what the demo loop's seventh round found and adds what the clones and a consumer asked for: stock form controls, a log pane fed by tracing, text editing with Emacs and Vim keys, effect presets, new charts, Huh-style forms, Mermaid sequence and ER diagrams, and Syntax and Markdown without syntect. The docs gain a playground: guide blocks, CLI examples and whole apps run in the reader's tab. rs-rich has a mark of its own, and intuiTUIve a section of its own with Memo, its mascot. The 0.0.21 plan says what moved on to 0.0.22.

  • Round 7's four bugs, fixed. The focus after a modal, a styled layers node covering its children's gaps, layout::squarify keeping the largest tile, and a text box keeping its keys inside a previews_keys container. The clones lose their workarounds.
  • csv's million-row filter is fast again. TableSource::rows reads in bulk and rich_ext::transform::Pattern runs a regex on a &str: 15.4 s to 3.8 s in the unoptimised build (2.3 s to 0.27 s in release).
  • Form controls. button, checkbox, switch_toggle, radio, slider, select_field, collapsible and spinner (with loading_when), with roles and values for assistive technology. See Buttons and form controls.
  • Logs in a pane. intuiTUIve's Log keeps a scrollback, follows the newest line, filters by level, target and query, and has a targets panel; the off-by-default tracing plugin feeds it from the app's own events through rs-rich-ext's new ChannelSink.
  • Text editing. A kill ring, search with a find bar, word wrap, tabs, an undo limit and caret shapes; rebindable keys with Emacs and Vim presets (Vim behind a vim feature). See Editing text.
  • Effect presets. intuiTUIve's fx module: fades, dissolve, sweep, slide, glitch, rain, shimmer and skeleton placeholders, composed in sequence or in parallel, played once, on a condition or as a transition, and straight to their end in accessible mode.
  • Charts, QR codes and gradients. PieChart (and donuts), stacked bars and areas, QrCode behind the new qr feature, and GradientText; rich chart --kind pie and --kind stacked. See Charts.
  • Huh-style forms and rich spin. Form gains multi-select, notes, descriptions, file and dynamic-choice fields and pages over a new Paginator; rich spin -- COMMAND runs a command under a spinner, after gum spin.
  • Mermaid sequence and ER diagrams, drawn as text, and labels at an edge's ends in rs-rich-diagram (DOT's taillabel and headlabel).
  • For ODS, a consumer's review. rs-rich-ext writes renderables as GitHub Markdown (Markdown for GitHub), takes plain-text table cells, and highlights SQL with no syntect. Core's new code feature renders Syntax and Markdown without syntect (Divergences #39), and Table, Panel, Rule and Markdown gain read-only getters that mirror upstream's attributes.
  • No DevTools port on Linux and macOS. rs-rich-embed's Chrome engine speaks DevTools over a pipe there; Windows keeps the port, still a known limit.
  • The marketplace's listing format. A JSON Schema, a validator in CI and a design note; rs-rich-plugin-api exposes the checks a resolver makes against the host's plugin API and ABI. The crate that resolves and installs, and rich plugin, are 0.0.22's.
  • A playground in the docs. Try it on guide blocks (rs-rich in wasm), a terminal for CLI examples (rich on WASI), and Run it for choose, filter, pager, explore and four intuiTUIve apps. See the Playground.
  • Builders are #[must_use] in every crate but the mirror, so a dropped builder warns.
  • rs-rich's own identity. A mark, favicon, wordmark, section icons and hero in gold; intuiTUIve as a top-level section with its own mark, a widget index, and Memo and Tui.

A default build of rs-rich still renders exactly like upstream rich 15.0.0: the code feature only changes a build without syntect, and the getters only read.

Independent package versions

Package Version Release role
rs-rich 0.0.11 The code feature (Syntax and Markdown without syntect); read-only getters on Table, Panel, Rule and Markdown; table::Column and table::Row public
rs-rich-macros 0.0.5 Lint only; requires core 0.0.11
rs-rich-plugin-api 0.0.5 is_supported_api_version and abi::is_supported, the checks the marketplace resolves against; #[must_use]
rs-rich-art 0.0.14 #[must_use]; requires core 0.0.11
rs-rich-diagram 0.0.4 Labels at an edge's ends (Edge::start_label, end_label)
rs-rich-mermaid 0.0.7 Sequence and ER diagrams drawn as text
rs-rich-lumis 0.0.5 Lint only; requires the versions above
rs-rich-ext 0.0.18 markdown_export, plain-text cells, the sql highlighter, the code feature; pie, stacked and gradient charts, qr; ChannelSink and Record::from_event; transform::Pattern
rs-rich-micro 0.0.7 #[must_use]; requires ext 0.0.18
rs-rich-record 0.0.9 A held key repeats only while it is held; #[must_use]
rs-rich-interact 0.0.9 Text editing, editor keymaps and the vim feature; Huh-style form fields, pages and Paginator; the EventLoop push API; the syntax feature
rs-rich-ratatui 0.0.6 #[must_use]; requires ext 0.0.18 (and interact 0.0.9 behind its interact feature)
rs-rich-intuituive 0.0.6 Round 7's four bugs and TableSource::rows; form controls, the log pane and the tracing plugin, text editing, fx effect presets; the syntax feature and wasm32 builds
rs-rich-embed 0.0.4 Chrome's DevTools over a pipe on Linux and macOS
rs-rich-web 0.0.4 The server feature; input and dom build for wasm32
rs-rich-data 0.0.5 #[must_use]; requires the versions above
rs-rich-cli 0.0.21 rich spin; rich chart --kind pie and --kind stacked; Mermaid sequence and ER diagrams; builds for wasm32-wasip1; requires the versions above

The Python package, rs-rich 0.0.9 on PyPI, builds against these crates and adds bindings for the Markdown export, plain-text cells, the SQL highlighter, Table.columns and rows, Mermaid sequence and ER diagrams, line-end labels, and the multi-select and file form fields.

Migration

Breaking changes in 0.0.x crates (the CHANGELOG has each):

  • rich_interact::Value gains List and Path. An exhaustive match on it needs the two arms; Answers gains list and path. In Python, a form's path answer is a pathlib.Path.
  • rich_diagram::Edge has two new public fields, start_label and end_label (Option<String>): a struct literal names them (None for none), or start from Edge::new(from, to) and set the fields you need.
  • Builders are #[must_use]. Nothing stops compiling, but a dropped builder, or a dropped setter on a Copy handle such as Transport::tick or Timer::max_catch_up, now warns (unused_must_use). A handle's setter still makes its change: write let _ = to keep the old behaviour without the warning. Under -D warnings the warning is an error.
  • Builds without default features. The defaults are unchanged, but what a feature turns on moved:
  • core's markdown turns on the new code feature, not syntax: with default-features = false, add syntax for syntect's highlighting in code blocks. rs-rich-ext forwards the same split (code, syntax, markdown; sql turns on code).
  • rs-rich-interact, rs-rich-intuituive and rs-rich-web have a new default syntax feature: a build without default features leaves syntect out unless it names syntax.
  • rs-rich-web's serving code (serve, serve_command, Server, the page, the session processes) is behind the new default server feature.
  • Behaviour: with nothing focused, the arrow keys scroll a scrollable Log under the pointer; without a terminal, rich spin runs the command with its output let through.

Release test

  • The release gate (scripts/validate_release.py --tag release-0.0.21) on main at c25f65e with the notes on top, in a Linux container: fmt; clippy -D warnings with default features, --all-features, and the CLI without default features; cargo test --all (5,548 passed, 8 ignored, none failed), the CLI without default features (545 passed) and the plugin loaders (29 passed); the four release script suites (142 tests); the version tables, RELEASES.toml and the CLI reference up to date; cargo check --workspace --locked; check_packages.py (all 17 crates packaged and verified); release.py plan release-0.0.21 selecting all 17. The tests were built without debug info, as the container's disk could not hold a debug build of the workspace's tests.
  • The golden fixtures (34 files, 4,561 cases) regenerate byte for byte from rich 15.0.0.
  • The docs tapes: all 67 tapes, 253 screenshots, match with a release build of the CLI and the examples, built with CI's features.
  • The docs: mkdocs build --strict for both sites.
  • The declared MSRV: CI's checks on Rust 1.90 (the workspace with every feature, and the CLI with CI's features) and on 1.91 (rs-rich-lumis, and the CLI with every feature).
  • CI on #764's head (22718fd, which holds #763 too): 68 checks passed, including the feature matrix and the macOS and Windows jobs this pass did not run.

Not in this release

The plan's larger workstreams were not started in this cohort, and move to 0.0.22 with the marketplace's commands:

  • Parity (workstreams 3 to 6): the partial rows of PORTING, scope.py, the divergences' verdicts and the differential fuzzer's new renderers.
  • The rs-rich-marketplace crate (resolving, downloading, the lockfile); only the listing format and the host's version checks shipped.
  • The gaps three clones share (workstream 2) and a re-run of the clones against it.
  • The recorder's frame rate on macOS, the APNG default (still an open decision) and rs-rich-doom on the 0.0.20 crates.

Known limits

See Known issues, which applies to this release. Still open from 0.0.20: the recorder keeps fewer frames on macOS, a tape without Output also writes an APNG and Chrome's DevTools port on Windows.

Publication

  1. On 2026-10-21, on main at 29084d4, the 17 record tags (rs-rich-v0.0.11, rs-rich-macros-v0.0.5, rs-rich-plugin-api-v0.0.5, rs-rich-art-v0.0.14, rs-rich-diagram-v0.0.4, rs-rich-mermaid-v0.0.7, rs-rich-lumis-v0.0.5, rs-rich-ext-v0.0.18, rs-rich-micro-v0.0.7, rs-rich-record-v0.0.9, rs-rich-interact-v0.0.9, rs-rich-ratatui-v0.0.6, rs-rich-intuituive-v0.0.6, rs-rich-embed-v0.0.4, rs-rich-web-v0.0.4, rs-rich-data-v0.0.5, rs-rich-cli-v0.0.21), then release-0.0.21 and python-v0.0.9, each with Release: 0.0.21 and Commit: lines.
  2. The one release.yml run for release-0.0.21 published every crate, in RELEASES.toml's order, and verified each version from crates.io (21:53 to 22:48 UTC; run).
  3. The Python package, python-v0.0.9 on 29084d4, through pypi-release.yml: built with the crates, then published to PyPI, finishing at 03:28 UTC on 2026-10-22 (run).
  4. The docs workflow ran on the tag push and succeeded.