The Elo Language
A simple, well-designed, portable, and safe data expression language
Elo compiles to JavaScript, Ruby, and SQL. Built for No-Code tools where non-technical users need to manipulate data easily and safely.
Simple by Design
A pure data language: everything is a value, no reference semantics, no new. One equality operator that just works. Designed to be safe for non-technical users.
Truly Portable
One expression compiles to semantically equivalent JavaScript, Ruby, and SQL. Frontend, backend, and database all speak the same data language.
Built for Real Data
First-class dates, times, and durations with intuitive syntax. Data schemas that validate and coerce input. Business logic that just works, everywhere.
What Makes Elo Different
Built for real-world data problems, Elo brings powerful features in a simple syntax
let signup = D2024-06-15 in TODAY > signup + P30D
First-Class Dates & Durations
Dates, times, and durations are native types with intuitive literal syntax. Add 30 days to a date? Just write + P30D. No parsing, no conversion, no library imports.
let Event = {
name: String,
date: Datetime,
capacity: Int(c | c > 0)
} in _ |> Event Data Schemas That Work
Turn untrusted input into safe, validated data. Elo coerces and checks everything so your code always runs on data you can trust.
_ |> filter(i ~> i.price > 100) |> map(i ~> i.price * 1.21) |> reduce(0, fn(a, b ~> a + b))
Functional & Portable
Pipeline operators, lambdas, and a comprehensive standard library. Write once, compile to JavaScript, Ruby, and SQL—same semantics everywhere.
guard positive: _.age > 0, adult: _.age >= 18 in 'Welcome!'
Guards for Safe Reasoning
Validate assumptions at runtime with labeled guards. Make your logic explicit, fail fast on invalid data, and reason confidently about what your code guarantees.
orders
|> restrict(o ~> o.status == 'pending')
|> extend({total: o ~> o.qty * o.price})
|> project([.customer, .total]) Coming Soon: Relational Algebra
Inspired by Tutorial D and powered by Bmg, Elo will bring true relational algebra to your data pipelines. Query, join, and aggregate—all with portable semantics.
See more practical applications in the Use Cases section.
One Expression, Three Targets
Elo compiles to idiomatic code in each target language
2 ^ 10 > 1000 and TODAY >= SOY
Math.pow(2, 10) > 1000 && DateTime.now().startOf('day') >= DateTime.now().startOf('year') 2 ** 10 > 1000 && Date.today >= Date.today.beginning_of_year
POWER(2, 10) > 1000 AND CURRENT_DATE >= DATE_TRUNC('year', CURRENT_DATE) Ready to try Elo?
Jump into the playground and start writing temporal expressions that just work.
Open PlaygroundBrought to You by
Claude Code
Co-designer & Implementer
Every line of code, tests, and docs