The interpreter exposes a clean C API over the de Bruijn core: parse_source (lex+parse), infer_type (bidirectional typecheck), normalize (eager, step-sound), and the serialize.c writers (JSON/TOML/YAML). All allocation flows through the arena.
#include dhall.h // parse + typecheck + normalize a source string DhallError err; Term t = parse_source(src, &err); Term ty = infer_type(t, &err); Term nf = normalize(t);
The same core, compiled to wasm, is what powers the <dhall-playground> in your browser (via src/wasm.c and the LSP in src/lsp.c).
A Language Server Protocol server gives editors live diagnostics and hover types, reusing the interpreter core for everything it reports. dhake dhall-lsp.com builds it; dhake test-lsp runs the end-to-end checks.