A small, closed language for application intent, written by people and by agents, verified by the toolchain.
Explore Topaz
Start with what Topaz is for. Then follow the guided path, scan the syntax map when you need a quick answer, or choose a toolchain destination.
See what Topaz is designed for, what its code looks like, and where it fits before writing your first program.
Meet Topaz →02Start with one small program and continue step by step to a checked, tested, two-module application.
Start learning →03Scan everyday syntax and jump straight to the focused manual page for each language feature.
Open the syntax map →04CLI, direct execution, Rust, Python, web targets, WASM, packages, and current support.
Explore the tools →Run this program today and get the output shown here.
function clean(words: Array<string>) -> Array<string> {
return filter(words, (w: string) => w != "")
}
function shout(words: Array<string>) -> Array<string> {
return map(words, (w: string) => w + "!")
}
let line = ["one", "", "way", "", "to", "say", "it"]
|> clean
|> shout
print("{line}")[one!, way!, to!, say!, it!]
One way to say it. The language decides policy, so you don’t have to.
Domain words stay in your language: 한글, Кириллица, emoji are first-class.
A small spec, machine-checkable profiles, docs verified against the parser.
sql, sh, and path templates preserve literal and interpolation structure.
Readable enough to review and precise enough to run.
Topaz is a compact, Unicode-first language for application intent. People and code generators use the same syntax, and the toolchain can run it directly or produce Rust, Python, and web artifacts.
Read the philosophy →function discount(customer: { tier: string, years: int }) -> float {
return match customer {
case { tier: "vip", years } if years > 5 => 0.3
case { tier: "vip" } => 0.2
case { years } if years > 1 => 0.1
case _ => 0.0
}
}
print("{discount({ tier: "vip", years: 7 })}")
print("{discount({ tier: "new", years: 0 })}")0.3 0.0
let result = concurrent {
answer: 6 * 7
status: "ready"
}
defer print("cleaned up")
print("{result.answer} {result.status}")42 ready cleaned up
function fibonacci(n: int) -> int {
return match n {
case 0 => 0
case 1 => 1
case _ => fibonacci(n - 1) + fibonacci(n - 2)
}
}
let series = map(0..<10, fibonacci)
print("{series}")[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
function clean(words: Array<string>) -> Array<string> {
return filter(words, (w: string) => w != "")
}
function shout(words: Array<string>) -> Array<string> {
return map(words, (w: string) => w + "!")
}
let line = ["one", "", "way", "", "to", "say", "it"]
|> clean
|> shout
print("{line}")[one!, way!, to!, say!, it!]
function 인사하기(이름: string) -> string {
return "안녕하세요, {이름}님!"
}
print(인사하기("토파즈"))안녕하세요, 토파즈님!
function greet(name: string) -> string {
return "Hello, {name}!"
}
print(greet("Topaz"))Hello, Topaz!
function привет(имя: string) -> string {
return "Привет, {имя}!"
}
print(привет("Топаз"))Привет, Топаз!
You write the intent. The compiler emits Rust and Python.
Available — 798 examples checked
Available — multi-file units
Available — every program on this page runs
Available — emits Rust and builds native programs
Available — emits Python with runtime support
Available — nominal closed sums with exhaustive match