Kittine, a custom language for Rust-powered web apps

gidellav1 pts0 comments

Kittine — a language that compiles to real Rust, in far less syntaxBuilt with Kittine — this page is compiled Kittine (.kitty) source, not hand-written HTML or a JavaScript framework.GitHubGet started

GitHubGet started<br>Close

Kittine<br>A language layered on top of Rust and Leptos, in far less syntax than Rust itself. Write .kitty, get back real #[component] Rust — then rustc, wasm-bindgen and cargo-leptos take it the rest of the way. No virtual JS runtime hiding underneath.<br>Get startedSee it next to raw RustView source<br>Compiles to real RustTargets Leptos 0.7One compiler, zero changes — CSR via Vite or SSR via cargo-leptosThis page is built with it

Why Kittine<br>The language is the point. The website is just proof.<br>01Language first<br>Every feature this site needed — logical operators, method calls, path-qualified expressions, plain local bindings, custom loop keys, re-exports — got designed, parsed, code-generated and tested inside the compiler before a single page used it. Nothing here is a workaround.

02Rust underneath, on purpose<br>Kittine doesn't reinvent a runtime, a package manager, or a build system. It reinvents the syntax you write and hands the rest to cargo, rustc, wasm-bindgen and Leptos — the same tools that already compile every other Rust web app on your machine.

03No virtual DOM tax<br>Leptos is fine-grained reactive: signals update exactly the DOM nodes that depend on them, no diffing pass, no virtual tree. Kittine's >> value syntax compiles straight down to that model — the reactivity is real, not simulated.

04Compiler-verified, not vibes-verified<br>Every construct on this page — the reactive counter you can click below, the install tabs, the code comparison toggle — was compiled by the real kittine-compiler binary, checked against real Leptos 0.7, and run through a real dev server before it shipped.

Kittine + Rust<br>The same counter, two syntaxes, one pipeline<br>Nothing below is a mockup. The left panel is real Kittine source; the right panel is the literal Rust that kittine-compiler emits for it today — line for line, taken from this project's own example-ssr crate.<br>.kitty sourcegenerated Rust<br>func Counter() {<br>>> 0

return (<br>>> count + 1}><br>"Clicks: "

}#[component]<br>pub fn Counter() -> impl IntoView {<br>let (count, set_count) = signal(0f64);<br>view! {<br>set_count.update(|n| *n += 1f64)><br>"Clicks: "<br>{move || count.get()}

Toggling the tabs above is Kittine itself: one signal, one reactive data attribute, zero JavaScript — the same fine-grained reactivity model Leptos gives Rust, just with less punctuation.<br>Structs, enums, and pattern matching<br>Newer syntax, same pipeline: litter / breed declare real Rust structs and enums, and pounce> compiles straight to a real match — no new runtime concept, just less to type.<br>.kitty sourcegenerated Rust<br>breed Shape {<br>Circle(#n),<br>Square(#n),<br>Idle

pounce><br>Circle(r) >> craftr * 2><br>Square(s) >> crafts><br>else> craft#[derive(Clone, Debug)]<br>pub enum Shape {<br>Circle(f64),<br>Square(f64),<br>Idle,

match shape.get() {<br>Shape::Circle(r) => {<br>leptos::logging::log!("{}", (r.clone() * 2f64));<br>Shape::Square(s) => {<br>leptos::logging::log!("{}", s.clone());<br>_ => {<br>leptos::logging::log!("idle");<br>A litter or breed can also carry one generic type parameter, optionally bounded by a claw — Kittine's term for a trait — the same way litter NamedHolder { value #t } compiles to a real Rust struct NamedHolder trait bound.

How it compiles<br>One source file, two real render targets<br>Every .kitty file goes through the exact same compiler. What differs downstream is what builds and serves the Rust it emits.<br>.kitty source

kittine-compiler

Leptos 0.7 Rust

rustc + wasm-bindgen

Vite dev server

Browser (CSR)

rustc + cargo-leptos

Axum server

Browser (SSR, HTML first)

Ecosystem<br>Everything a Kittine project actually ships with<br>availablekittine-compiler<br>The hand-written lexer, recursive-descent parser and code generator. A plain CLI: lex, parse, emit Rust. No syn crate, no intermediate AST magic — output stays readable enough to diff by eye.

availablevite-plugin-kittine<br>Hooks Vite's transform pipeline: compiles the touched .kitty file, runs cargo build --target wasm32-unknown-unknown, then wasm-bindgen --target web — all on save, with incremental rebuilds.

availableSSR via cargo-leptos<br>An alternative to the Vite pipeline for server-rendered pages: the identical compiler output, run through cargo-leptos and Axum instead, for real pre-rendered HTML and fast first paint.

availableVS Code extension<br>TextMate-grammar syntax highlighting for .kitty files. No language server yet — that's next, not pretended to already exist.

availableStructs, enums, pattern matching, traits<br>litter (structs) and breed (enums) declare real Rust types; pounce> pattern-matches a breed value; claw/bare .. for .. are a real trait system, with one type parameter per struct/enum optionally bounded by one. See it next to the generated Rust on the Rust & Leptos page.

availableTest suite<br>97 tests covering every language construct through full...

rust kittine real leptos kitty compiler

Related Articles