CLAY

computational substrate

ability Console {
  print: string => unit
}

let hello<Console> = (name: string): unit =>
  Console.print("Hi " ++ name)

let greet: string =
  handle hello("World") {
    done(x) => "done";
    Console.print(msg, resume) => msg
  }
A real ability declaration, handled and evaluated — packages/compiler/test/abilities.test.ts, UCM-verified.

Content-addressed

Every definition's hash is its identity, forked from Unison's semantics. Names are mutable metadata pointing at immutable code, so using someone else's code should never break the way dependency hell breaks things today.

Local-first, in the browser

Parsing, hashing and typechecking run where you're editing — phones, tablets and locked-down laptops included — via a Rust kernel compiled to WebAssembly, not a server you have to trust or reach.

A familiar syntax

A ReScript/ReasonML-flavoured surface over Unison's term AST: ordinary let, functions, if, and (new, 2026-09-25) ability/handle — no Haskell-style syntax required.

Clay is an early, experimental prototype — a walking skeleton, not a finished language. The docs say plainly what's implemented today versus still just designed.