A programming language where humans and AI reason together about programs.
R7RS Scheme · LLVM bitcode · fully self-hosted
The problem with vibe coding isn’t the vibe — it’s the code.
When you ask a model to generate code in a language that resists clean abstraction, you get code that resists understanding. Not because the model failed, but because the language offers no tools for transparency. The generated code is opaque by nature: you can read it, but you cannot reason about it without re-deriving every implicit assumption the language makes.
Scheme is different. Its macro system makes program structure explicit — any expression can be mechanically expanded to a small set of well-understood primitives. There is no hidden compiler magic, no implicit transformation you have to take on faith. Vibe coding with Scheme is a more powerful experience because the language itself is designed for the kind of transparency that human–AI collaboration demands.
R7RS Small Scheme via macro expansion.
Every language feature that can be a macro must be a macro.
Only an irreducible set of primitive forms (define, lambda,
if, set!, quote, define-syntax)
are implemented natively. Everything else expands to those primitives through
well-defined, inspectable transformations.
Binding registry with human-language descriptions. Every binding in a Vibe program — every function, variable, macro, and type — is paired with a plain-language description of what it does. An LLM introspects a program by combining macro expansion (to see structure) with registry lookup (to see meaning). No “trust the code” — understand the code.
Together, these goals close the loop: macros make programs structurally transparent; the registry makes them semantically transparent. Structure all the way down, meaning all the way up.
User Programs ───────────────────────────────────── Standard Library (R7RS 6.x) ───────────────────────────────────── Derived Forms via Macros let, cond, and, or, begin, do, ... ───────────────────────────────────── Primitive Forms define, lambda, if, set!, quote ───────────────────────────────────── Kernel DSL (llvm:*) llvm:define-function, llvm:call, ... ───────────────────────────────────── LLVM Bitcode ───────────────────────────────────── Native Machine Code
Each layer is built entirely from the layer below it. The kernel DSL is the trusted core — the only code that must be understood by reading its implementation rather than its expansion. Everything above is transparent by construction.
Macro expander today:
syntax-rules with optional literals, multiple clauses,
top-level install-after-expand (e.g. prelude define-vibe-syntax),
nested list subpatterns, and final ... (ellipsis) in patterns and templates.
Bootstrap seeds are versioned on GitHub Releases; the default seed matches the expander capabilities needed for current main.
Full hygiene and non-final ellipsis patterns are still planned (see design docs).
vibe_kernel binaries (./build.sh release-seed)