When the model is wrong, the compiler names the fix.
Playground · Cheatsheet · Specification · Quick start · Evidence · How it works · Status
Almide is a statically-typed language for code that AI writes and edits. The claim is not that the model gets it right. It is that when the model is wrong, the compiler says so at author time and names the fix. Programs compile to native binaries (via Rust) and to WebAssembly, with byte-identical output on every contracted behaviour. almide verify checks the ownership, bounds, name and capability witnesses of the wasm module almide build ships, pinned to that file by its SHA-256 (what is proven, what is trusted).
A model adds a case to a type and, as models do, touches nothing else:
type Shape =
| Circle(Float)
| Square(Float)
| Triangle(Float, Float) // the edit
fn area(s: Shape) -> Float =
match s {
Circle(r) => 3.14159 * r * r
Square(w) => w * w
}
error[E010]: non-exhaustive match: missing Triangle(_, _)
--> shape.almd:7:9
in match
here: match s {
hint: add arms for Triangle(_, _):
Triangle(arg1, arg2) => _
Or use `_ => todo()` to compile incrementally.
The diagnostic is the fix: the model's next turn is Triangle(b, h) => 0.5 * b * h, and the program then prints the same bytes natively and on wasm. The same question asked against Python, on eight injected modification mistakes: demo/make-verify.
Try it in your browser → — no installation.
curl --proto '=https' --tlsv1.2 -fsSL https://raw.githubusercontent.com/almide/almide/main/tools/install.sh | sh # macOS / Linux
irm https://raw.githubusercontent.com/almide/almide/main/tools/install.ps1 | iex # Windows (PowerShell)The installer checks the archive against the release's almide-checksums.sha256; every release asset is Sigstore-attested (SECURITY.md shows how to verify one). Each archive also carries almide-verify, the certificate checker almide verify hands its witnesses to. From source, with Rust 1.96+: make install.
fn main() -> Unit = {
println("Hello, world!")
}
almide run hello.almd # native
almide run hello.almd --target wasm # same bytes, on wasmtime- Multi-target — one source, a native binary (via Rust) or WebAssembly (direct emit, no LLVM), byte-identical output on every behaviour in the contract ledger (contracts)
- Diagnostics that name the fix — every error carries its location and its context, and a concrete repair where one is known (codes)
- Explicit effects —
effect fnwithexpr!propagation; a bare fallible call is an error, never silent (cheatsheet) - Types — generics, records, variants with exhaustive
match, bidirectional inference,Codecauto-derive (spec) - Memory without annotations — Perceus-style ownership inference, no GC, no lifetimes (memory safety)
- Fan — structured concurrency on threads natively, in the same output order on wasm (ADR-0024)
- Standard library — self-hosted
.almdmodules, each public function inspected on both targets (reference) - Tooling built in —
almide test,almide fmt,almide check, modules with diamond resolution (how it works)
- Cheatsheet — syntax, stdlib and idioms; the page a model should load first (see also
llms.txt) - Specification · grammar · standard library · design philosophy · stability policy
- What is measured — LLM writability, byte identity, memory safety, size and speed, each dated and gated · benchmark methodology
- Behavior contracts — every native ⇄ wasm promise and its evidence · proven vs trusted
- How it works — the pipeline and the Trust Spine · architecture
- Project status — pre-1.0; the LLM-facing surface changes only through a dialect epoch with a migration diagnostic (stability policy) · roadmap
- Written in Almide — agents, parsers, graphics and libraries outside this repository · editors: vscode-almide, tree-sitter-almide
Issues and pull requests are welcome. After cloning, run brew install lefthook && lefthook install; commits are in English (the commit-msg hook enforces it). Conventions: CLAUDE.md.
Licensed under either of MIT or Apache 2.0 at your option.