Faby is the first programming language conceived end-to-end by an AI model. Token-minimal. Deterministic. Parallel by default. Built so that machines write it flawlessly — and humans read it effortlessly.
The community token of the Faby project. One token, one language, one mission: fund the first AI-native toolchain — built in public, owned by the community.
*measured against equivalent programs during the Genesis design phase. Numbers will be published with the reference implementation.
“Code is no longer written only by people. It is generated, reviewed, refactored and verified by machines. So why does every language still optimize for typing speed on a 1970s keyboard?”
Tokens are the new keystrokes. Faby's grammar is engineered so that every construct costs the fewest possible tokens for a language model to generate — without sacrificing human readability. Less ceremony, more meaning.
Ambiguity is a bug. Faby has exactly one way to express each construct and one canonical formatting. faby fmt is the identity function on valid code. Diffs become purely semantic; merge conflicts over style cease to exist.
Intent lives inside the program. Natural-language intent blocks are first-class syntax, permanently attached to the code they describe — so an AI can verify that what the code does still matches what it was meant to do.
Correctness is checkable. Contracts (ensure/expect) compile to static proofs where possible and runtime guards otherwise. Generated code arrives with its own evidence.
Each one exists for a reason an AI cares about — and each one makes the language better for humans too.
The unit of computation is the flow — a pure-by-default transformation with explicit effects. The last expression is the return value. No boilerplate, no ceremony.
intent "…" attaches the natural-language purpose to code as checkable syntax. Tooling flags drift between what code says and what it was meant to do.
ensure and expect clauses declare what must hold. The compiler proves what it can statically and guards the rest at runtime.
The |> operator makes data flow read left-to-right, top-to-bottom — the way both models and humans actually reason about transformations.
Errors are values handled inline: ? retry(3), ? skip, ? default(x), ? fail. Failure policy is visible at the exact call site.
spawn gives structured concurrency with ownership-based data-race freedom. If it compiles, it doesn't race.
Types carry meaning, not just shape: Email, Url, refinements like Int where self > 0. The type system encodes the domain.
The faby CLI is compiler, runtime, formatter, package manager, REPL and AI assistant in a single static binary.
Model calls are a standard-library primitive — typed, cached, testable. use ai and inference becomes just another flow.
Faby is designed to be obvious. Significant newlines, no semicolons, no parentheses noise — every character earns its place.
-- Faby: significant newlines, no semicolons, last expression returns.
flow greet(name: Text) -> Text
"Hello, {name} — welcome to Faby."
flow main
let names = ["World", "Fable-5", "Future"]
for name in names
print(greet(name))
-- Pattern matching is exhaustive by design:
flow describe(n: Int) -> Text
match n
0 -> "zero"
1 | 2 -> "small"
_ if n < 0 -> "negative"
_ -> "large"use http
use db
type User
id: Id
name: Text
email: Email -- semantic type: validated at the boundary
intent "serve the user API with health checks"
flow main
http.serve(port: 8080)
route GET "/health" -> { status: "ok", uptime: sys.uptime() }
route GET "/users/:id" -> db.find(id) ? http.not_found
route POST "/users" -> create_user(body)
flow create_user(u: User) -> User
expect u.name.len > 0
ensure result.id != Id.none
db.insert(u) ? retry(3) ? fail use ai
use web
intent "summarize any webpage into three sharp bullet points"
flow summarize(page: Url) -> [Text]
ensure result.len == 3
let doc = web.fetch(page) ? retry(3) ? fail
ai.complete(
model: "claude-fable-5",
prompt: "Summarize in exactly 3 bullets:\n{doc.text}",
) |> lines |> take(3)
flow main
let pages = args() |> map(Url.parse) ? skip
spawn for page in pages -- all pages, concurrently
summarize(page) |> each(print)use csv
use stats
type Reading
sensor: Text
value: Float where self >= 0.0 -- refinement type
at: Time
intent "clean sensor data and report anomalies per sensor"
flow main
let readings =
csv.load("sensors.csv") ? skip -- bad rows just drop out
let report = spawn readings
|> group_by(.sensor)
|> map_values(detect_anomalies)
for (sensor, anomalies) in report
print("{sensor}: {anomalies.len} anomalies")
flow detect_anomalies(xs: [Reading]) -> [Reading]
let mean = xs |> map(.value) |> stats.mean
let dev = xs |> map(.value) |> stats.stddev
xs |> filter(abs(.value - mean) > 3.0 * dev) Faby compiles to native code through its own IR, runs interpreted for instant iteration, and targets WASM for the browser and the edge. The same flow runs everywhere.
Typed model calls, intent verification and recovery operators make Faby the natural substrate for AI agents that must not silently fail.
Declarative routing, contract-checked handlers and structured concurrency — a production backend in a screenful of code.
Pipelines, refinement types and parallel-by-default collections turn messy data work into verifiable transformations.
Single static binaries, deterministic builds, no runtime dependency. Ship a tool, not a dependency tree.
A compact WASM target brings contracts and semantic types to browsers, workers and embedded runtimes.
Canonical form plus intent blocks means AI-maintained repositories stay reviewable by humans — forever.
Everything specified so far in the Genesis release — from your first flow to the concurrency model. The spec is young, precise, and growing.
What Faby is, why it exists, and how an AI designs a language differently.
↗SetupOne command, one binary. The faby CLI on macOS, Linux and Windows.
↗Language TourBindings, flows, string interpolation, and the one-canonical-form rule.
↗Language TourRecords, refinement types, and types that carry domain meaning.
↗Language TourThe |> operator and inline recovery: retry, skip, default, fail.
↗Advancedspawn, structured parallelism, and ensure/expect verification.
Every command, flag, exit code and CI recipe — published now. The @faby/cli NPM package releases later today.
The entire toolchain is one static binary. Install it, write a flow, run it. No package manager, no config files, no build scripts.
Open Full Documentation →# install — the NPM package drops later today $ npm i -g @faby/cli # create your first flow $ echo 'flow main\n print("Hello, Faby.")' > hello.fy # run it $ faby run hello.fy Hello, Faby. # let the compiler explain any code to you $ faby explain hello.fy
Core grammar, the flow model, semantic types, contracts, recovery operators and the concurrency story — specified and published. You are reading it.
The first executable Faby: faby run, the REPL, and the canonical formatter shipping as one binary.
Full semantic-type inference, refinement checking, and static verification of ensure/expect clauses where decidable.
Ahead-of-time compilation through the Faby IR to native machine code and WASM. Deterministic, reproducible builds.
Frozen core spec, the standard library, the package index — and a compatibility guarantee that both humans and models can rely on.
Faby v0.1 “Genesis” is an open design. Read the spec, challenge the decisions, and help shape the first language of the AI era.
Follow the build.
Faby is built in public. Design decisions, toolchain progress and the $FABY token — everything drops here first.
@fabylanguage
Language updates, spec drops, roadmap milestones and the official $FABY announcements.
↗pump.fun$FABY Token — LIVE
The community token is live on pump.fun. Only trust the contract address published on this site and @fabylanguage.