# iyi > A friendly, fast programming language for people and their agents. Compiled, > native through LLVM, compatible with Crystal, and built so that a compiler is > something an agent can talk to. iyi is Turkish for "good". Source: https://github.com/iyilang/iyi (Apache 2.0). Site: https://iyi.dev. Latest release: 0.18.0, 2026-10-18. ## What it is One rule, four sides. A module is the unit of compilation and it compiles against its dependencies' declarations, never their bodies (R-1). Everything a module exports writes its types down (R-2). `import x::{...}` brings exported names into a file because that file asked (R-2b). There are no open classes; `impl Trait for Type` lives with the trait or the type (R-3). - Developer experience: change one line in a 7,207-line project of 30 modules and rebuild in 0.13 s, against 1.17 s under Crystal's rules on the same compiler binary: 9x less. Measured by `python3 bench/incremental.py` on AMD Ryzen AI 9 465 under WSL2, LLVM 19.1.7. - Agent experience (AX): a module's interface is a file (.iyimod). `iyi mod context` grounds an edit at 52 to 59% of the sources' size; a model writing against it spent 31 to 43% fewer prompt tokens over twenty-six measured runs (`python3 bench/context_pack.py`). The loop is one verb per step, and every step of it is recorded from a real run at https://iyi.dev/agents/: iyi mod context --json app.iyi exit 0, answers on stdout iyi check -f json app.iyi exit 1, answers on stderr iyi fix app.iyi exit 0, answers on stdout iyi check app.iyi exit 0, answers on stdout iyi test --affected app/greeter.iyi exit 0, answers on stdout iyi test --affected other.iyi exit 0, answers on stdout iyi test --json . exit 0, answers on stdout iyi mod diff before/app/greeter.iyimod after-body/app/greeter.iyimod exit 0, answers on stdout iyi mod diff before/app/greeter.iyimod after-api/app/greeter.iyimod exit 0, answers on stdout Both servers are in the binary, with nothing to install: `iyi mcp` serves 5 of those verbs over MCP stdio as the tools `check`, `fix`, `context`, `test`, `doc`, and `iyi lsp` speaks LSP over stdio to an editor. The answer over the wire is byte for byte the answer in a shell: npm run record:agent compares them on every recording and refuses to write the record when they differ. - Portability: compiles for 9 targets and is run on five every build (x86-64 glibc, x86-64 musl, aarch64 under emulation, aarch64-darwin natively, wasm32-wasi under wasmtime). 8 CI jobs execute on a Windows machine, and since 0.18.0 a release publishes a Windows zip beside the two tarballs. - Performance and efficiency: native code through LLVM; a hello world is 36 KB and starts in 1.6 ms, against 1,553 KB and 3.2 ms with Crystal's library (`python3 bench/machine_probe.py` on macOS arm64, LLVM 22). ## Install curl -fsSL https://raw.githubusercontent.com/iyilang/iyi/master/install.sh | sh ~/.local/bin/iyi run ~/.local/share/iyi/samples/hello.iyi The latest release into ~/.local, on Linux x86-64 or macOS arm64, with both libraries and the samples. On Windows, PowerShell installs the same release from the zip into %LOCALAPPDATA%\Programs\iyi: irm https://raw.githubusercontent.com/iyilang/iyi/master/install.ps1 | iex & "$env:LOCALAPPDATA\Programs\iyi\bin\iyi.exe" run "$env:LOCALAPPDATA\Programs\iyi\share\iyi\samples\hello.iyi" That machine also needs the Visual C++ build tools, because an iyi program is linked by cl.exe. Details: https://iyi.dev/install/ ## Crystal compatibility The same compiler builds .cr files unchanged. `iyi build --crystal` gives an iyi program Crystal's standard library, `require`, and shards (Kemal, db, ameba, sqlite3 among those swept through it). A Crystal program cannot require an iyi module; iyi consumes Crystal, not the other way around. ## Pages - [Home](https://iyi.dev/): the one line, a listing that runs, the Crystal section. - [Why iyi](https://iyi.dev/why/): the four sides, each with its measurement and machine. - [Learn](https://iyi.dev/learn/): eight lessons on the rule, each running a real program. - [Reference](https://iyi.dev/reference/): the standard library, 31 prelude types and 110 std modules, as `iyi doc` prints them. - [Install](https://iyi.dev/install/): the one-line installer, the by-hand version, and from source. - [Playground](https://iyi.dev/playground/): the tour, 33 short programs that run in the browser. - [Playground evidence](https://iyi.dev/playground/evidence/): what ran, what checked it. - [For your agents](https://iyi.dev/agents/): the loop above as a transcript, every frame a real run. - [Download](https://iyi.dev/download/): every artifact, the `uname` pair it is for, and how to verify it. - [Targets](https://iyi.dev/targets/): what CI type-checks, audits and runs, per triple. - [Project](https://iyi.dev/project/): contributing, security, the code of conduct, the notices. The design record and the release notes live in the repository: SPEC.md and CHANGELOG.md are read there, which is where they are kept current. ## The tour - Welcome: [hello](https://iyi.dev/playground/hello/) - Basics: [modules](https://iyi.dev/playground/modules/), [exports](https://iyi.dev/playground/exports/), [variables](https://iyi.dev/playground/variables/), [types](https://iyi.dev/playground/types/), [conversions](https://iyi.dev/playground/conversions/), [constants](https://iyi.dev/playground/constants/), [functions](https://iyi.dev/playground/functions/), [returns](https://iyi.dev/playground/returns/), [nil](https://iyi.dev/playground/nil/) - Flow control: [loops](https://iyi.dev/playground/loops/), [ranges](https://iyi.dev/playground/ranges/), [conditions](https://iyi.dev/playground/conditions/), [case](https://iyi.dev/playground/case/), [defer](https://iyi.dev/playground/defer/) - Data: [structs](https://iyi.dev/playground/structs/), [classes](https://iyi.dev/playground/classes/), [arrays](https://iyi.dev/playground/arrays/), [hashes](https://iyi.dev/playground/hashes/), [tuples](https://iyi.dev/playground/tuples/), [blocks](https://iyi.dev/playground/blocks/) - Methods and traits: [methods](https://iyi.dev/playground/methods/), [traits](https://iyi.dev/playground/traits/), [dispatch](https://iyi.dev/playground/dispatch/), [defaults](https://iyi.dev/playground/defaults/), [unions](https://iyi.dev/playground/unions/), [errors](https://iyi.dev/playground/errors/), [strings](https://iyi.dev/playground/strings/) - Generics: [generic-functions](https://iyi.dev/playground/generic-functions/), [generic-types](https://iyi.dev/playground/generic-types/), [bounds](https://iyi.dev/playground/bounds/) - Concurrency: [tasks](https://iyi.dev/playground/tasks/), [channels](https://iyi.dev/playground/channels/) ## Provenance Numbers generated by bench/site_facts.py from the iyi repository at a146f81de. Programs recorded by iyi 0.18.0 (built on Crystal 1.22.0-dev [2a9653052] (2026-10-18)) at 2a9653052ab7. Where iyi loses is published on the why page beside where it wins.