Updates
What actually landed, by date
Condensed from the language repo's own CHANGELOG.md — every entry below shipped and was verified against real Leptos 0.7, not aspirational. Also available as RSS.
2026-07-23
Arrays of structs, closures, and pattern matching as an expression
- A
litter/breed name, optionally []-suffixed, is now a real prop/purr param or return type — DocEntry[] entries is a real Vec<DocEntry>. - Closure literals (
|param, ..| expr) lower to real Rust closures — the missing piece a real .filter()/.map() needs, since Kittine had no way to write one before this. pounce> now also works as an expression, not just a statement — return (pounce> result Ok(v) >> v Err(e) >> 0) unwraps a Result-shaped value and returns it in one step, closing the last open gap in error handling.- See it live: the Language reference page's search box is real now — a
litter-typed array of doc entries, filtered by a real closure, rendered as a reactive <For>. No hand-written JavaScript.
2026-07-22
Phase 2 begins: maps, JSON, a reference operator, log levels
stash{ key: expr, .. } — a real String-keyed map (HashMap::from([..])), typed like an array (#n{} / #w{} / #f{}), reusing litter's own struct-literal grammar so parsing/formatting/lint all came for free.- Every
litter/breed now derives serde::Serialize/Deserialize — round-trip through JSON (or YAML/CSV) via a plain serde_json::to_string(&value) call, no dedicated syntax. - A new
&expr reference operator — Kittine had no way to spell a Rust reference at all before this, which blocked calling real APIs that need one. warn<expr>/error<expr> join craft<expr> as real leptos::logging severity levels.- See it live on the Language reference page's
stash/&expr cards.
2026-07-22
Reading an event handler's actual value
- The reserved
event identifier, used anywhere inside an on<Event> handler, now reads what the browser event actually carries: onInput={<{name}> >> event} mutates a signal to whatever was typed, not just a fixed literal. - The handler's closure only binds
ev (instead of discarding it as _) when the expression actually reads event — every other handler is unaffected. - See it live on the Language reference page's
event card.
2026-07-21
A real package manager, and a live in-browser playground
kittine.toml/kittine.lock plus kittine-compiler add/install/publish, backed by a real hosted registry (kittine-registry) — sha256-verified downloads, no server of its own.- The Playground:
kittine-compiler itself, compiled to WebAssembly, compiling .kitty to real Rust entirely client-side.
2026-07-19
Phase 1 closes: traits, structs, enums, pattern matching, generics
claw / bare .. for .. — a real trait system, plus bounded generics (<#t: Named>).litter (structs), breed (enums), pounce> (pattern matching), and single-parameter generics.- Scalar type tags (
#n/#w/#f) became optional, inferred from body usage when omitted. - The type-tag sigil itself was redesigned from
<<Word>>-style brackets down to #w — shorter than every Rust type it stands for. - A formal EBNF grammar (
GRAMMAR.md) and kebab-case JSX attributes (data-*/aria-*).
2026-07-18
Real SSR, routing, and every operator this site needed
- Server-side rendering via
cargo-leptos + Axum — a second toolchain alongside Vite, zero compiler changes. - Routing composed from
leptos_router with zero new syntax, including dynamic segments and programmatic navigation. - Comparisons (
< <= > >= !=) and logical && / ||, usable generally, not just in conditions. hold (plain local bindings), re-exports (export import), private visibility, array-typed props/returns.- List rendering in views (
spin → a reactive <For>), component children, and a real move-conflict bug fixed by actually compiling against Leptos.
2026-07-17
Initial release: the core language
func components, <{name}> >> value signals, if>/orif>/else> control flow, spin loops.- The embedded JSX-like
return ( ... ) view syntax, and craft<...> logging. - A VS Code extension with TextMate-grammar syntax highlighting for
.kitty files.