One wayto say it.

A small, closed language for application intent, written by people and agents, verified by the toolchain.

Run this program today and get the output shown here.

TOPAZ
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}")
output
[one!, way!, to!, say!, it!]

Four products, one source

Run the file you just wrote. The same file builds a native binary, a Python bundle or a web package, and the choice is a flag on one command.

One settled form

Every ordinary idea has one canonical form, and the language holds that line. A file a person wrote and a file a generator wrote come out the same shape.

Failure has a shape

Recoverable failure travels as a Result and expected absence travels as an Option. Cleanup runs on every exit path, and the checker names the case your match left out.

Your words are names

Identifiers are Unicode from the lexer up and nothing rewrites them behind your back. 사용자 is an ordinary variable, and the module resolver rejects names that invite confusion.

Small on purpose

The surface stays small because the small surface is the product. The same compact grammar is what a person reads and what a generator writes.

Executable Specification

A specification for humans and executable code for computers.

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 →

The code is the hero.

TOPAZ
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 })}")
output
0.3
0.0
TOPAZ
let result = concurrent {
    answer: 6 * 7
    status: "ready"
}

defer print("cleaned up")
print("{result.answer} {result.status}")
output
42 ready
cleaned up
TOPAZ
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}")
output
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
TOPAZ
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}")
output
[one!, way!, to!, say!, it!]

Any tongue. Same code.

한국어

TOPAZ
function 인사하기(이름: string) -> string {
    return "안녕하세요, {이름}님!"
}

print(인사하기("토파즈"))
output
안녕하세요, 토파즈님!

English

TOPAZ
function greet(name: string) -> string {
    return "Hello, {name}!"
}

print(greet("Topaz"))
output
Hello, Topaz!

Русский

TOPAZ
function привет(имя: string) -> string {
    return "Привет, {имя}!"
}

print(привет("Топаз"))
output
Привет, Топаз!

You write the intent. The compiler emits Rust and Python.

See what the toolchain does today