Changelog
All notable changes to rustweb are documented here. The format follows
Keep a Changelog; versioning follows
SemVer. See VERSIONING.md for the full policy.
[Unreleased]
[1.1.1] - 2026-09-12
No crate changes. Fixes release.yml publish order to include rustweb-ui
so that v1.1.0 workflow and future tags publish all 8 crates.
[1.1.0] - 2026-09-12
Added UI primitives crate rustweb-ui (Button/Input/Dialog/Tabs + Theme) and showcase integration in todo-app. No breaking changes.
[1.0.0] - 2026-09-12
Stable VDOM diff + hydration, router, CLI, testing, and benchmark/a11y
harnesses — all exit criteria satisfied. See docs/src/release-v1.md.
No API changes since 1.0.0-rc.1.
[1.0.0-rc.1] - 2026-09-11
Release candidate: the public API is frozen for 1.0.0. The only remaining
gates before the final v1.0.0 tag are non-codeable — production burn-in and
real-browser benchmarks (see docs/src/release-v1.md).
Added
rustweb-testing::a11y: offline static accessibility audit returning
severity-ranked, path-located violations with fix hints (rules:
interactive-name,form-label,image-alt,heading-order,
list-structure,landmark-main). Enforced throughcargo teston every
CI job.examples/todo-app:example_is_a11y_cleangates the shipped example to
zero blocking a11y violations.
Changed
docs/src/a11y.mdanddocs/src/release-v1.mdupdated: fuzz is validated at
10M iterations and the a11y static audit is now a code-complete, PR-enforced
exit criterion; the only remaining v1.0 gates are real-browser benchmarks and
production burn-in.
[0.2.0] - 2026-09-11
Added
crates/core:ComponentError::Panicked,RenderError::Panicked,
run_guardedandrun_render_guardedpanic boundary (crates/core/src/runtime.rs).crates/core:UnnecessaryRenderDetectorprofiler andRenderSamplepayload
for measuring view/patch time and skipping redundant renders
(crates/core/src/perf.rs).crates/core:Schedulerwith per-tick budget to keepMsgping-pong loops
recoverable (crates/core/src/scheduler.rs).crates/dom:Renderer::updatethat diffs, applies patches, and
debug-asserts the committed tree equals the desired tree
(crates/dom/src/renderer.rs).crates/dom:EventDelegator::root_listener_count— 100 bindings share 1
root click listener (crates/dom/src/events.rs).crates/macro:html!rejects ARIA typos at compile time with Levenshtein
suggestions (crates/macro/src/lib.rs).crates/router:LazyRoutefactories run exactly once and are unit-tested
(lazy_loads_once).tests/fuzz_diff.rs: deterministic fuzz harness (seed + iters) asserting
apply-success rate and SSR match rate over 100k+ iterations.tests/ssr_golden.rs: golden-format tests freezing the SSR marker contract
(data-rwh,data-rwe-*,data-rwh-checksum,<!--rwc:-->,<!---->).examples/todo-app: full runtime loop demo (create → view → Msg::Add/Toggle → update → diff → apply → SSR → verify_hydration) driven byRenderer..github/workflows:release.yml(tag-triggered publish in dependency
order),audit.yml(cargo-audit + cargo-deny + weekly schedule),docs.yml
(mdBook + GitHub Pages),dependabot.yml(weekly cargo + actions).SECURITY.md,deny.toml,.github/CODEOWNERS, issue/PR templates.
Changed
crates/dom/src/diff.rs: remove paths now use OLD-tree navigation while
create/move/set paths use NEW-tree navigation. This eliminates cross-parent
index drift when both structural and content patches coexist.crates/dom/src/diff.rs: mixed keyed/unkeyed child lists fall through to
positional diff (documented limitation, no cross-parent structural ambiguity).- Attribute diffing switched to ordered comparison;
set_attr_atnow
remove-then-push so SSR attribute order stays deterministic and matches the
post-patch tree. - Root
Cargo.toml:thiserror = "2"(2.0.20),rustweb-macro:syn = "3"
(3.0.5). CI actions upgraded tocheckout@v7,
upload-pages-artifact@v5,deploy-pages@v5,action-gh-release@v3. - All Markdown rewritten to professional English; comments stripped repo-wide.
docs/book.tomllanguageid→en.
Deprecated
- None.
Removed
- None.
Fixed
- GitHub Pages docs workflow: 403 on first upload because Pages was not
enabled; switched mdBook installer totaiki-e/install-action@mdbook
(peaceiris action pinned to deprecated Node 20). cargo fmt --all -- --checkfailures after comment stripping.- 16 clippy warnings that had been silenced by
-D warnings; resolved in
source rather than with#[allow](one exception:
#[allow(clippy::derivable_impls)]onDefault for Cmdto avoid
introducing a spuriousC: Defaultbound).
Migration (v0.1 → v0.2)
- No source-level breaking changes for user code. Public types,
html!
expansion, and SSR marker format are additive. - If you pinned
rustweb-cli build --features ssr, feature names are
unchanged. - If you rely on
apply_patches_to_treefor cross-parent mixed structural
patches, prefer callingRenderer::update(it owns the diff+apply pairing
and debug-asserts committed==next).