Roadmap¶
What each release delivered, and where this goes next: the plan to 1.0.0, after the 0.0.24 cohort (published 2026-11-03) and with 0.0.25, the last release before 0.1.0, next. Ordered by what unblocks people, not by what is most interesting to build.
Two rules constrain everything here:
- The core stays a faithful mirror. Anything upstream
richdoes not have goes inrich-ext,rich-art, or a new crate — never incrates/rich. This is what keeps an upstream sync a mechanical diff rather than a merge conflict. See AGENTS.md. - Byte-parity is the correctness oracle. A feature that cannot be checked
against real Python
richneeds its own argument for why it is correct.
0.0.2 — released 2026-08-11¶
The correctness milestone shipped. It paid down the confirmed rendering, markup, colour, and CLI correctness debt; see the 0.0.2 changelog for the released work.
0.0.3 — released 2026-09-10¶
The patch release accepted:
- correctness fixes confirmed against current
mainand, where applicable, the pinned upstream oracle; - documentation and package-metadata consistency fixes; and
- release hardening that makes the documented CI, parity, packaging, or clean-room verification gates more reliable.
New features were deferred from 0.0.3. Subsequent fixes go
under Unreleased, naming every affected crate.
Completed source scope (2026-09-10)¶
The 0.0.3 fixes are merged into main through PR #111: Markdown image and container parity, independent release selection, tested TOML pin parsing, JSON precision/depth, optional escape-safe JSON presentation, safe GIF redirection, CSV streaming, title markup, notebook layout, graphical diff exports and native Windows paging.
See release notes and UAT closeout.
The selected changes are under the 0.0.3 changelog heading; Unreleased now tracks
subsequent work. Registry publication and verification are tracked by the
protected release workflow, separately from the completed source merge.
Deferred from 0.0.3 into 0.0.4¶
- #65: GIF half-block rendering.
- #74: further CSV memory reductions and long-line wrapping performance.
- #62: image/encoding diagnostics and additional encoding support.
- #45: syntax-highlighting performance.
0.0.4 — released 2026-09-10¶
The 0.0.4 development plan scopes these four issues above into small PRs: reproduce current baselines, improve diagnostics, add explicit GIF blocks, reduce CSV memory and wrapping costs, then optimize the measured syntax bottlenecks. It defines acceptance cases, per-crate version decisions, real CLI evidence, independent review and docs-site updates.
Diagnostics (#62), GIF rendering (#65), CSV/wrapping (#74) and opt-in syntax parsing reuse (#45) are merged into main and published in all four 0.0.4 packages. The release notes record measurements, limitations and successful exact-version consumer verification.
0.0.5 — published 2026-09-13¶
rs-rich-ext and rs-rich-cli 0.0.5 were published on 2026-09-13; core and art
stayed at 0.0.4. They shipped the --sanitize opt-in (#64), the version-checked
golden capture, the differential corpus harness and the library_bench probe.
The 0.0.5 preparation plan proposed four bounded workstreams: issue #15 golden-test gaps, #34 reproducible differential fuzzing, #35 library benchmarks with CI artifacts, and #64 explicit input sanitization. Start with the oracle/case contract; benchmark work can proceed independently. Keep default rendering unchanged and sanitizer policy in extensions.
The plan audits existing evidence and dependency PRs, defines acceptance gates, and preserves independent package selection.
0.0.6 — CLI foundations and streaming automation¶
The 0.0.6 plan scopes the next release to rich-cli
automation: task-oriented subcommands that preserve existing flat flags,
stable exit-code classes, a shared JSON report envelope, and bounded JSONL/log
streaming from files and stdin.
This deliberately defers the larger intuiTUIve/TUI, watch, batch, config and dependency-upgrade work so the command/output contract can land first.
0.0.7 — rich-art image commands¶
The image workstream adds the reusable rich-art::ImageArt capability facade,
ASCII, Braille, half-block and Sixel backends, and rich image / --image
CLI routing with width, height and explicit mode selection. Existing GIF and
diff report envelopes remain unchanged; unsupported graphics modes downgrade
only where documented or return an actionable error.
0.0.7 — watch and workflow foundations¶
The 0.0.7 CLI workstream adds the first binary-boundary watch convenience:
rich --watch RESOURCE polls local files without busy-looping, keeps running
through atomic-save gaps and parse failures, and recovers on a later valid
frame. Fetch-enabled builds may poll URLs with configurable intervals and
response caching. Redirected output remains a deterministic one-shot snapshot.
Rendering stays in the existing CLI/core paths; no new core refresh behavior is
introduced.
Batch and configuration¶
The CLI now plans explicit files, directories, and globs deterministically,
reuses the existing render/export pipeline per item, refuses silent overwrites,
and reports aggregate machine-readable status. TOML profiles are discovered
from platform roots (or selected explicitly), with command-line values taking
precedence. Since CLI 0.0.8, full TOML and every inactive profile are strictly
validated; scalar-only parsing is historical. --jobs N runs bounded subprocess
workers for file exports, spooling output to disk and replaying in input order.
Terminal-only batches remain serial. --dry-run inspects plans without writing
exports; config show / config validate expose effective configured settings.
0.0.8 — published workflow and crop controls¶
CLI 0.0.8 / art 0.0.6 completed independent publication and exact-version registry verification. It shipped strict TOML profiles, parallel file-export batches, dry-run/config inspection, automatic paging, crop anchors and the guided suite tour. Core 0.0.4 and ext 0.0.6 stayed unchanged.
0.0.9 — published 2026-09-22¶
The accepted plan delivered CLI 0.0.9 and art 0.0.7: named themes and explicit style overrides, terminal-only human batch progress, Ctrl+C worker cleanup, listable/selectable demo sections and read-only doctor diagnostics. Art adds opt-in ANSI256 and Floyd–Steinberg preprocessing for ASCII/half-block still images. Truecolor/no-dither remains the default; GIF, diff, Braille and Sixel preprocessing remain outside this slice of #125.
The expanded scope (#192) added core 0.0.5 and ext 0.0.7: render targets and capabilities, layout constraints, typed events and diagnostics, coordinated Live regions, render snapshots, batch naming and hardened publication (#196), and image transforms with Bayer dithering. All four packages were published on 2026-09-22; see the expanded release notes.
0.0.10 — progress you can ship with (published)¶
Every workstream is merged to main, and the cohort was published on 2026-09-23. The
release test and release runs are recorded in the 0.0.10 release notes.
The 0.0.10 plan targets core parity over new surface area:
Progress time, rate and spinner columns with a task-driving API (#6), upstream's
theme stack (#3), wider golden and differential coverage around both (#15, #34),
the four 0.0.9 leftovers (#134, #146, #149, #151) and release hardening (Trusted
Publishing, Node 24 actions, pending dependency bumps). Also in scope: multi-file
debounced watch (#139), ANSI16/grayscale image modes, image adjustments and quadrant
blocks (#125, #126, #124 follow-up), and ~~~ strikethrough parity (#9). Core moves to 0.0.6, so
ext, art and CLI move with it (0.0.8, 0.0.8, 0.0.10). The Python wrapper (#197)
proceeds as a separate spike.
Confidence tooling for expanded CLI surfaces¶
The confidence slice adds bounded, deterministic support around the selected batch/profile/watch/image work:
- #150/#135:
scripts/snapshot_cli.pyprovides injectable width and terminal capability profiles with PTY terminal forcing for color modes, option-terminator (--) positioning, stable environment variables, newline normalization, and readable failure diffs. The initial corpus covers the currently stable Markdown and JSON stdin paths. - #34: the differential corpus and generator now include box renderables
(
Panelbox variations) and vary the safe-box capability profile in addition to width, color, markup, styles and overflow. 0.0.10 adds Table, Rule, Padding and Align generators, per-colour-system oracle isolation, a failure-kind-preserving shrinker and a nightly 20,000-case run onmain. Its first runs filed #442–#449 (see parity). - #35:
library_benchaccepts explicit width and color-system arguments and records them in its JSON artifact. CI publication and threshold enforcement remain deferred; output hashes stay the blocking correctness signal.
Image behavior remains covered by the existing focused rich-cli integration
tests. Snapshot cases for the merged batch/profile/watch/image workflows remain
follow-up work; capability/RenderTarget decisions (#147/#148) remain separate.
0.0.11 — developer ergonomics and core usability (published 2026-09-24)¶
All 12 workstreams of the 0.0.11 plan and the release test's
fixes shipped. The published cohort is core 0.0.7, the new rs-rich-macros 0.0.1, ext 0.0.9, art 0.0.9
and CLI 0.0.11. See the 0.0.11 release notes.
The plan covered milestone 2 plus everything unfinished from 0.0.10 (#6, #9, #34, #126, #144, and the new #498 and #499). Delivered:
- core parity fixes for the fuzzer's findings (#442–#449), Markdown styled
table cells (#9), the rest of Progress (#6: Live-driven display,
track(),RenderableColumn, transient and disabled displays) andLogRender(#10); - diagnostics and stack traces with
anyhowadapters, structured data and serde helpers withrich inspect, therichf!/#[derive(Rich)]macros,claphelp and errors,tracingspans andRichHandler; - a shared diff engine with test helpers and
rich diff/rich bench compare, capability and accessibility policies withrich ansi explainandrich doctor, workflow renderables, and theview,hex,unicode,envandcapturecommands; - Atkinson dithering, OKLab distance, Sixel/GIF colour modes, alpha backgrounds
(#498) and
--theme-file(#499).
0.0.24 — Cornacai, Textual parity, Noctiluca for scripts and agents (published 2026-11-03)¶
The 0.0.24 plan opened the two tracks to 1.0.0 (the
apps, and the stable set's groundwork) and took almost all of both: the
new cornacai and rs-rich-acp crates, intuiTUIve caught up with
Textual (the Markdown viewer, the diff view, Textual's themes, keymaps,
modes, screenshots), Noctiluca's control socket for scripts and agents,
edition 2024, a threat model and a security policy, and the docs on
Zensical (see the release notes). What is left of
the tracks, lumis 0.17 and Memo's illustrations move to
0.0.25.
0.0.23 — faster frames, Noctiluca's media, the marketplace live (published 2026-10-27)¶
The 0.0.23 plan took what 0.0.22 handed on (rs-rich-doom's
core gaps, rich-rst 2.2.0, Noctiluca's media, rendering performance) and
grew as the maintainer brought items forward: console.py in full, sound in
tapes, the API checks and fuzzing from stages 3 and 4 of the
plan to 1.0.0, the marketplace's official keys and its
going live, WebP, and Noctiluca on real sites. What ships: every library
row in Module status complete or a divergence, byte-identical
fast paths in the core, best painting, pictures and video in Noctiluca,
and a signed, live marketplace with its own site (see the
release notes). AVIF and lumis 0.17 move to
0.0.24.
0.0.22 — parity, the marketplace, round 7's last items (published 2026-10-25)¶
The 0.0.22 plan finishes stage 2 of the
plan to 1.0.0: every partial row in
Module status ported or recorded as a divergence, scope.py
ported and every divergence given a verdict; the rs-rich-marketplace
crate, rich plugin and rich plugin browse, publishing and CI signing;
the recorder on macOS, APNG written only when asked and rs-rich-doom on the
current crates; and the gaps three demo clones share.
What ships: the parity workstreams (every library row but console.py
complete, scope.py, every divergence's verdict, the fuzzer on the
documents), rs-rich-marketplace 0.0.1 with rich plugin, APNG only when
asked, the shared gaps and four live controls, and Noctiluca 0.0.1, a
terminal web browser (see the release notes). The
macOS recorder stays a known issue; rs-rich-doom's core gaps and
rich-rst 2.2.0 move to 0.0.23.
0.0.21 — parity, the marketplace's foundation, round 7's leftovers (published 2026-10-21)¶
The 0.0.21 plan, stage 2 of the plan to 1.0.0:
every partial row in Module status ported or recorded as a
divergence, scope.py ported; the marketplace's listing format and a
crate that resolves, downloads and locks plugins; Chrome's DevTools over a
pipe on Linux and macOS (Windows keeps the port); and what the demo loop's
seventh round found: four intuiTUIve bugs, csv's filter regression, the
recorder's frame rate on macOS and whether APNG stays a default output.
What ships: round 7's four bugs and csv's filter, the DevTools pipe on
Unix, the marketplace's listing format, and the widgets, text editing,
playground and leaner builds added during the release (see the
release notes). Parity, the marketplace crate, the
shared gaps, the macOS recorder and the APNG decision move to 0.0.22.
0.0.20 — the intuiTUIve demo loop (published 2026-10-19)¶
Rounds 2 to 7 of the demo loop: eleven
well-known terminal apps rebuilt on intuiTUIve, what they lacked added as
generic core pieces and plugins, and each rebuilt on them. Tables, trees
and lists that follow state; completion, a command line, a query language
and natural dates with time zones; sprites, pixel buffers, held keys,
timers and frame pacing; styles that do not pile up; rich record
following terminal graphics, recording every frame and holding keys, with
APNG output; and core's Text::markup() (core 0.0.10). The first release
published by one release run. See the release notes.
0.0.19 — layout, editing, isolation and docs (published 2026-10-19)¶
The 0.0.19 plan is stage 1 of the
plan to 1.0.0: flex alignment and wrapping, a text-area
widget, a process per browser session, a Surface drawing handle in
rs-rich-ext, and an example and a picture on every docs page, with
recordings of everything 0.0.18 added. Core does not change. Chrome's
DevTools over a pipe moved on, and ships in 0.0.21 on Linux and macOS
only (see above).
0.0.18 — intuiTUIve grows up (published 2026-10-11)¶
The 0.0.18 plan takes the terminal-app framework from a working slice to something others can build on, after the 0.0.17 cohort (rs-rich-intuituive 0.0.2):
- the gap assessment's rough spots and widget gaps: starting focus, horizontal scrolling, sortable tables with a cell cursor, a virtual tree, tooltips, drag-and-drop and hover styles, and the kitty keyboard protocol;
- a stylesheet with selectors and states that sets layout as well as style;
- termion and termwiz backends (#677, #678);
- accessibility: cursor tracking for screen readers, a text mode, and a role and name per node;
- serving to a browser in a new
rs-rich-webcrate, intuiTUIve apps first and then any terminal program (rich serve); - a terminal pane that runs any program inside an app, and a web view,
each over a swappable backend, in a new
rs-rich-embedcrate; - a full Python binding,
rs_rich.tui.
Core does not change.
0.0.16 — data and developer tooling (release test passed)¶
The 0.0.16 plan is the first slice of milestone 6, tracked in #660. Every workstream is merged and the release test passed; see the 0.0.16 release notes. It delivers:
- a new
rs-rich-datacrate with CSV, JSONL, serde and (behind a feature) Arrow adapters, opt-in type inference, column statistics and conditional styles (#214, #267, #261, #215), virtualised and SQL-shaped tables (#260, #235); rich profilefor CSV and JSONL files (#343–#346, #269);- one schema model for JSON Schema, Arrow and SQL DDL, with diffs, a timeline and ER diagrams (#268, #342, #347, #247), and DOT cluster frames;
- a record inspector (#270), three-way merge conflicts (#339), and Cargo feature, size, build-time, advisory and licence reports (#419–#421, #330, #331, #418).
rich --csv and core do not change.
0.0.15 — terminal charts and diagrams (published 2026-10-05)¶
The 0.0.15 plan is the first slice of milestone 5, tracked in #642:
- charts you compose, in
rich_ext::chart: sparklines, bars and histograms (#221), Braille line and scatter charts (#257), gauges and bullet charts (#251), heatmaps (#250), status matrices (#254), KPI cards (#256) and timelines (#252), each with an ASCII form and a reading without colour; - diagrams through one graph layout, lifted out of the Mermaid crate into a
new
rs-rich-diagram: box-drawing primitives (#227), network graphs (#258), a DOT plugin (#240), Cargo dependency graphs (#248) and a JSON Schema visualiser (#244); rich chart,rich dot,rich depsandrich schema, Python bindings (rs_rich.chart,rs_rich.diagram), and the small 0.0.14 follow-ups.
Every workstream is merged (see the plan's Delivered table). Core does not change, and stays at 0.0.9.
0.0.14 — composable interactive views and micro assets (published 2026-10-04)¶
The 0.0.14 plan covers the second slice of milestone 4 and the micro-assets epic (#565):
- building blocks you compose: containers, splits, tabs and modal layers as components, focus routing, a keymap registry, a public kit, and the built-in components rebuilt from it; your own components in Rust, Python and plugins (#478, #479, #480);
- overlays and chrome on top: an action menu in a modal, a command palette, help and shortcut overlays, a status bar and breadcrumbs (#453, #473–#475, #481, #482);
- explorers and utilities:
rich explorefor JSON, YAML and TOML, tree filtering, OSC 52 copy, dynamic reload and a theme picker (#428, #434, #460, #464, #465, #485, #488); - micro assets in a new
rs-rich-microcrate::micro:name:inline images and animations through Kitty, iTerm2 and Sixel, with emoji, half-block and text fallback, a layered registry with trusted project packs, a.richmicropackage format, a built-in library andrich micro(#566–#587).
Core does not change, and stays at 0.0.9. Published on 2026-10-04; see the 0.0.14 release notes.
0.0.13 — interactive CLI, first slice (published 2026-09-29)¶
The 0.0.13 plan covers the first slice of milestone 4:
- frames with a cell diff in
rich-ext, the ext phase of the render-tree design (#226); - a new
rs-rich-interactcrate: a terminal session that always restores the terminal, key and mouse input, a viewport, an item model, a degradation policy for pipes and CI, and a headless test driver (#451, #452, #489, #492, #495); - first components: fuzzy selector, input, form, confirmation sheet and a pager with search (#287, #288, #289, #291, #457, #470), each runnable as a blocking call or inside a small event loop, the first step towards intuiTUIve;
rich choose/filter/input/confirm/pager, and the rich-cli 1.8.1 options the binary still lacks (#493, #494, #542);- the same components from Python;
- tapes: scripted terminal recordings for the docs (#598), and
rich recordwith the newrs-rich-recordcrate, to record any terminal program into screenshots, casts, GIF and MP4 (#599, #600).
Core gained one opt-in extension point, the semantic-regions trait, and moved
to 0.0.9. Published as rs-rich 0.0.9, rs-rich-ext 0.0.11,
rs-rich-interact 0.0.1, rs-rich-record 0.0.1, rs-rich-cli 0.0.13 and
rs-rich 0.0.2 on PyPI.
0.0.12 — plugin platform and extensibility (published 2026-09-26)¶
The 0.0.12 plan covers milestone 3:
- pluggable code highlighters with syntect and lumis adapters (#521–#526);
- a public plugin API on the extension registry (#14, #232 phase 1);
- Markdown fence extensions, with Mermaid flowcharts as the first plugin (#222);
- composable transforms (#216);
- a render-tree design spike (#226);
- native image sizing (#519).
Core gains extension points only, and its default output stays upstream's.
0.0.2 planning record¶
The milestone centered on rewriting the markup tag scanner against RE_TAGS.
The scanner is hand-rolled and diverges from upstream's
((\\*)\[([a-z#/@][^[]*?)]) in three ways:
| divergence | effect |
|---|---|
Backslashes counted individually, not by parity (divmod(n, 2)) |
\\[b]x[/b] errors where upstream renders bold |
[ accepted inside a tag body (upstream's [^[]*? forbids it) |
text swallowed and spurious errors, in both directions |
| Zero-length spans discarded | a segment boundary upstream produces is lost |
One rewrite closes all three, and closes DIVERGENCES §2 — which today documents a gap without fixing it.
0.1.0 — the gaps that block real adoption¶
Superseded by the plan to 1.0.0, where 0.1.0 is the API review release. Kept for the record:
~~Theme stack~~ — done in 0.0.10 (core 0.0.6): push_theme, pop_theme
and a use_theme guard that derefs to the console; see §14.
~~Windows legacy console~~ — not planned: #12 is closed and the console without VT processing is unsupported (DIVERGENCES §38).
~~Progress time/rate columns and Live integration~~ — done: time, rate and
spinner columns in 0.0.10 (core 0.0.6); the Live-driven display, track() and
RenderableColumn in 0.0.11 (core 0.0.7). See §16 and
§17.
Independent per-crate versioning already applies below 0.1.0. A 0.0.x
dependency bump requires updating its dependents and publishing changed
manifests; unrelated crates need not bump. See BRANCHING.md.
Confidence, not features¶
The highest-leverage work on this list is not a feature.
Differential fuzzing against real Python rich¶
Two adversarial reviews found 18 confirmed defects in code that had passing tests and looked finished. Every one was found the same way: generate an input, run both implementations, compare bytes. That is what a fuzzer does, tirelessly and without getting bored.
Done. scripts/diff_rich.py generates markup, styles, widths, overflow
and box renderables, compares the port against real rich byte for byte, and
shrinks any mismatch. It has run nightly on main (20,000 cases) since 0.0.10;
its first runs filed #442–#449, all fixed in 0.0.11. See
parity.
Benchmarks¶
CLI timing and CSV memory measurements now exist in the
benchmarks and runtime audit. Partly
done in 0.0.11: rich_ext::qa::bench records benchmark runs and
rich bench compare gates on regressions (exit 5). A tracked library
microbenchmark suite with thresholds enforced in CI remains follow-up work.
Beyond rich — things Python cannot do¶
These are additions, so they live outside the faithful core. Ordered by how much they'd change day-to-day use.
~~Compile-time checked markup~~ — delivered in 0.0.11¶
rs-rich-macros 0.0.1 (through ext's macros feature) provides richf!,
style!, theme_key! and markup!; see Macros. The
original proposal:
// Unbalanced tag, unknown style name → a compile error, not a silent no-op.
console.print(richf!("[bold]{name}[/]"));
A proc-macro that parses markup at compile time. Python fundamentally cannot do this — and it prevents a bug class this project has hit repeatedly: an unknown tag name renders as a no-op upstream, so a typo silently produces unstyled text. Making that a compile error is a genuine improvement on the original, not just a port of it.
~~Derive-driven rendering~~ — delivered in 0.0.11¶
Delivered as #[derive(Rich)] and the serde-driven data::print_json,
print_table, print_tree and Explorer; see
Structured data. The original proposal:
#[derive(Table)]
struct Release { name: String, #[table(justify = "right")] downloads: u64 }
console.print(&releases.as_table());
Plus a serde-driven Pretty that renders any Serialize value as a tree or
table. This is the honest Rust answer to upstream's inspect/repr modules,
which don't map onto a language without runtime reflection — type-driven
instead of repr-parsing, and better than the original for it.
~~clap integration~~ — delivered in 0.0.11¶
Delivered as ext's clap feature on top of cli_doc; see
CLI authoring. The original proposal: render clap help, errors and usage through rich. clap is close to universal
in Rust CLIs, so this is the single widest-reach item here — and it is the kind
of thing people would adopt the crate for.
~~Inline images via terminal graphics protocols~~ — delivered¶
rich-art draws images with Sixel (since 0.0.7, art 0.0.5), Kitty's
graphics protocol and iTerm2's inline images, behind its sixel, kitty
and iterm features; micro assets, intuiTUIve's art plugin and
rich record build on them. See Images.
Diagnostics integration¶
miette / color-eyre / anyhow reporters rendered through rich, so error
output matches the rest of an application's styling. The Diagnostic type and
its anyhow adapter shipped in 0.0.11 (see Diagnostics);
miette and color-eyre remain.
~~A snapshot-testing helper~~ — delivered¶
Delivered in ext's testing feature rather than a separate crate:
RenderSnapshot (ext 0.0.7), then assert_rich_eq! and qa::screenshot in
0.0.11; see QA tooling. The original proposal, rich-test:
assert terminal output in users' test suites, with readable diffs
and SVG artifacts on failure. It dogfoods Console::export_svg — the same
mechanism that generates every image in these docs.
Deliberately not planned¶
Jupyter integration and inspect/repr of Python objects
(#19,
§19). These don't map onto Rust. Reimagining them is a design
project rather than a port, nobody has asked, and the derive/serde work above is
the useful half of the same idea.
Open questions¶
Is byte-parity still the north star at 1.0? It has been an excellent
correctness oracle. But §3 — byte offsets in Text spans,
where upstream uses code points — is a case where the faithful choice is
arguably the wrong Rust API. There will be more. Better decided deliberately than
by drift.
Upstream sync cadence. rich 15.x will move. Watch releases and sync
promptly, or sync on demand when something is needed? The sync-upstream skill
handles the mechanics either way.