# Vary

A readable, statically-typed programming language that measures test strength.

- [Get Started](/docs/getting-started/)
- [Documentation](/docs/)
- [Syntax Overview](/docs/syntax-overview/)

## Why Vary

**A lie detector for tests.** Tests can lie. <a href="/docs/mutation/lie-detector/">Mutation testing</a> exposes the ones that do. <a href="/docs/mutation/testing/">vary mutate</a> shows which tests are weak, which mutations survived, and exactly what to fix.

**Contracts and assertions.** <a href="/docs/contracts/">Contracts</a> (<code>in</code> / <code>out</code>) declare what a function expects and what it promises. <a href="/docs/test-dsl/">observe</a> assertions check behaviour at runtime. Both are part of the language, not annotations you bolt on.

**One CLI for the entire workflow.** <a href="/docs/cli/">Run, check, test, format, and mutate</a> from a single binary. Everything ships with the compiler. No plugins or extra tools required. <a href="/docs/getting-started/">Get started in minutes</a>.

**Fast JVM execution.** Vary compiles to <a href="/docs/compiler/">JVM bytecode</a> and runs on any JVM. Mutation testing uses <a href="/docs/mutation/advanced/">bytecode patching</a>, so mutants run without recompiling.

## Recent Articles

- [What's new in Vary v122-alpha.1](/articles/whats-new-in-vary-v122/) — v122-alpha.1 ships vary var for adaptive review, a rewritten mutation engine with reachability tracing and a hot-swap backend, Frugal (a Parsimonious port for parsing), Dict generic codegen with operator overloading, fourteen new vary check rules, and vary explain.
- [Vary mutation testing speed: comparing to AST and PIT](/articles/vary-mutation-testing-speed-comparing-to-ast-and-pit/) — Vary does regular mutation-performance testing, not just feature work. On the current project-scale Frugal benchmark, the checked-in result is a stable 27-second run over 1,857 mutants with an 82.18 percent mutation score. On the current PIT-style comparison fixture, Vary measures at 0.92x of PIT's wall time, which falls within the acceptance target.
- [Inside PIT, Part 2: Why It Stays Fast](/articles/why-pit-stays-fast/) — PIT is good because it avoids repeated work at every layer: compact mutant representation, targeted execution, early exit, warm workers, and disciplined incremental reuse.
- [Inside PIT, Part 1: The Execution Model](/articles/how-pit-works/) — PIT is fast because it mutates bytecode, gathers coverage first, runs only relevant tests, stops on first kill, and uses warm worker JVMs with strong recovery behaviour.
