vilan 0.13.0
Server-side rendering: render and replace. A full-stack app can now serve its first paint as real HTML — for the crawler, and for the human who sees content before any JavaScript arrives. The model is deliberately simple: on the server, import std::ui resolves to a render-only implementation of the same API, so the same component functions build an HTML string instead of DOM — each bind_* embeds its signal's current value, event handlers are accepted and ignored — and render(view) hands your route handler the markup to splice into its shell. On the client, mount now replaces the container's contents when it boots, so the server HTML gives way to the live, bound tree in place. There is no hydration — no node adoption, no mismatch errors, no second set of rules — and that is a design decision, not a gap: the eventual path is resumability, which makes hydration's machinery obsolete anyway. The two ui implementations are held together by a differential test that renders one shared component through both and requires byte-for-byte agreement. The new examples/ssr is the working loop, and the SSR guide explains the one rule that matters (build pure, bind reactive) and where v1 fits: self-contained and server-data-seeded apps — views that read a live rpc client while building are client-side by nature.
Snippets in completion. for, fun, struct, and match now complete as tab-through templates alongside their bare keywords — parameter names, field stubs, and match arms pre-placed — degrading to plain keywords in editors without snippet support.
The CLI dresses for the terminal. Build, watch, test, fmt, and upgrade output is colored when you're looking at it — green successes, bold red errors, cyan dev-loop lines — and byte-for-byte plain the moment it's piped or NO_COLOR is set.