A scripting language
with simpler syntax than Python.

azro means “stone” in Tamazight — small, solid, and built to last. No let. No return. No colons. No print() boilerplate. Just the logic.

git clone … && cd azro-lang && ./install.sh
hello.az
typing…
runs with azroc run hello.az
Star on GitHubv0.1.0Built in safe RustSandbox by defaultDecentralized packages9-crate workspace
0
stdlib modules
0
tutorials & docs
0
example programs
0
Rust crates
Why azro

Small surface, solid foundation

azro is designed around a single principle — simplicity. The features below reflect that goal.

Minimal syntax

No let, no return, no trailing colons, no print() boilerplate. Just the idea you wanted to express.

? "hi"

Built in safe Rust

Wrapping arithmetic, never panics, embeddable in untrusted contexts. A 64 MB worker stack and sandbox defaults.

wrapping_add(a, b)

Multilingual

Write azro in English, Arabic, Hindi, or Python-style via syntax profiles — a pure source-level transformation.

azro syntax init --template hindi

Decentralized packages

Install from GitHub shorthand (User/Lib), a raw Git URL, or the official registry. No central gatekeeper.

azro install User/Lib

Embeddable

SecurityLimits, instruction budget, sandbox defaults. Add azro-interpreter to any Cargo project.

SecurityLimits { ..sandbox() }

Well-tested

32 unit + integration tests, clippy-clean, rustfmt-clean. 22 standard-library modules out of the box.

cargo test --workspace
Side by side

Azro compared to Python

The same idea, side by side. Azro reduces the ceremony without reducing the power.

azro
4 lines
fn greet name
    $"Hello, $name!"

? greet("world")

Same output. Less ceremony. The pipeline and implicit return do the work thatreturn,for, and.append()used to.

Cheat sheet
Feature azroPythonLua
Print to stdout? "hi"print("hi")print("hi")
Define a functionfn f(n) n * ndef f(n): return n * nfunction f(n) return n * n end
Implicit returnyesnono
Trailing colonsnonerequirednone
Variable declarationx = 1x = 1local x = 1
Pipeline operatorx |> ff(x)f(x)
Null-coalescea ?? ba or ba or b
Implementation languageRust (safe)CC
Embeddable sandboxbuilt-invia ASTlimited

Comparisons are about ceremony, not capability. Python and Lua are far more mature ecosystems — azro is the small, embeddable option.

For Python developers

The migration cheat sheet

Coming from Python? Here's how common tasks translate. Same intent, less ceremony — every time.

Task Python Azro
Print a valueprint("hello")? "hello"
String interpolationf"Hello, {name}!"$"Hello, $name!"
Define a functiondef add(a, b): return a + bfn add(a, b) a + b
Arrow / lambdadouble = lambda x: x * 2double = x => x * 2
List comprehension[x*2 for x in nums if x > 0]nums |> filter(x => x > 0) |> map(x => x * 2)
Read a filewith open("f.txt") as f: data = f.read()data = fs.read("f.txt")
Parse JSONimport json obj = json.loads(text)obj = json.parse(text)
HTTP GETimport requests r = requests.get(url)r = api.get(url)
Null-coalescename = user.name or 'guest'name = user.name ?? "guest"
Match / switchmatch status: case 200: ... case _: ...match status 200 ? "OK" else ? "?"
Next step
Read the full Python-dev learning path
Skim the beginner track, focus on |> and ??.
The honest question

Why not just use Python, Lua, or Rust?

Skeptical? Good. Here's azro against the languages you're already considering — including where azro loses.

Criterion azroPythonLuaRust
Target use caseembedded scriptinggeneral-purposeembedded scriptingsystems programming
ImplementationRust (safe)CCself-hosted
Runtime footprint~3 MB~12 MB~0.3 MBvaries
Sandbox built-inyes — SecurityLimitsvia AST/hookslimitedno (unsafe)
Syntax ceremonyminimalmediumminimalexplicit
Package managerdecentralizedpip/PyPILuaRockscargo
Multilingual sourceyes — profilesnonono
Speed (hot loops)slow (no JIT)slow (CPython)fast (LuaJIT)very fast
Maturityv0.1.0 — youngmaturematuremature

azro doesn't “win” this table — it occupies a specific niche: a tiny, sandboxed, multilingual scripting layer for Rust hosts. If you don't need that, the others are better choices.

A 60-second tour

See the language, end to end

Switch between the tabs to walk through the core syntax. Every snippet is real azro.

print.az
# ? is the print shorthand — one character
? "Hello, world!"
? $"2 + 2 = ${2 + 2}"

# print(...) still works if you prefer it
print("Both styles work together")
output
Hello, world!
2 + 2 = 4
Both styles work together
Run it yourself: azroc run print.az
Next step
Try editing real azro code
Browse real .az programs — filter by category and difficulty.
Standard library

22 modules, batteries included

From math and strings to crypto, HTTP, and terminal UI — the stdlib covers the common ground without external dependencies. Hover any module to see what it does.

Data structures

4 modules
  • listcreate, filter, map, reduce, sort
  • dictkeys, values, merge, iteration
  • stringsplit, join, replace, format
  • jsonparse & stringify

Math & randomness

2 modules
  • mathtrig, log, floor, ceil, constants
  • randomint, float, choice, shuffle

System & I/O

5 modules
  • osenvironment, processes, exit codes
  • fsread, write, list, walk files
  • iostdin, stdout, print, input
  • envget & set environment variables
  • processspawn, pipes, signals

Network & web

1 module
  • apiHTTP GET/POST/PUT/DELETE client

Encoding & crypto

4 modules
  • cryptohash, hmac, sha256, md5
  • base64encode & decode
  • uuidv4, v7 generation
  • regexmatch, find, replace, capture

Time & terminal UI

4 modules
  • timenow, sleep, format, parse
  • terminalcolors, cursor, clear, size
  • keyboardread key, modifier state
  • mouseposition, click events

Decentralized packages

Install from GitHub shorthand, a raw Git URL, or the official registry.

Syntax profiles

Write azro in Arabic, Hindi, or Python-style — a pure source-level translation.

Sandbox by default

SecurityLimits, instruction budgets, and file I/O gating for untrusted scripts.

Next step
See it in real programs
Browse 11 example .az files from the repository.
Performance

How fast is it, honestly?

azro is a tree-walking interpreter — comparable to CPython for typical scripts, not a JIT. Here's where it sits, and why.

Task azroPython (CPython)Lua
Hello world startup~8 ms~30 ms~5 ms
Fibonacci(35) recursive~6.5 s~4.8 s~7.2 s
List map + filter (10k items)~1.2 ms~0.9 ms~1.4 ms
JSON parse (100 KB)~0.4 ms~0.6 ms~0.8 ms
Binary size (runtime)~3 MB~12 MB~0.3 MB

Not a JIT

azro is a tree-walking interpreter. Hot numeric loops are slower than PyPy or LuaJIT. Use native (Rust) packages for hot paths.

Sandboxed by default

Every script runs under SecurityLimits. The overhead is tiny, but the safety is real — no arbitrary memory access, ever.

Native FFI escape hatch

When a loop is too slow, drop to Rust via kind = native. Keep the glue in azro, keep the heat in Rust.

Numbers are illustrative reference points, not formal benchmarks — see the performance tutorial for methodology and how to run them yourself.

Honesty

Where azro isn't ready yet

Every young language hides its rough edges. azro doesn't. Here's what's missing, broken, or planned — so you can decide if it fits your use case.

Tradeoff

No JIT, no bytecode

azro is a pure tree-walking interpreter. Hot numeric loops (millions of iterations) will be slower than PyPy or LuaJIT. Use native (Rust) packages for those.

Known bug

Rc cycles leak memory

The interpreter uses Rc<RefCell> for shared values. Reference cycles (a → b → a) are not collected and will leak. Documented in SECURITY.md. A future GC is planned.

Planned fix

Single-threaded execution

azro scripts run on one thread. The host can run multiple interpreters in parallel, but a single script has no shared-memory concurrency. Async/await is planned.

Honest note

Young ecosystem

v0.1.0 — the API may change before v1.0. Few third-party packages exist yet. Don't bet critical infrastructure on it without evaluating the risk.

Planned fix

No stable ABI yet

Native (Rust/C) extensions use a C ABI, but the azro-side Value ABI is not frozen. Rebuilding native packages against new azro versions may be required until v1.0.

Planned fix

Editor support is basic

VS Code, Vim, and Emacs get syntax highlighting + snippets. No language server (LSP) yet — no autocomplete, go-to-definition, or hover docs. Planned for v0.2.

The full list lives in SECURITY.md and CHANGELOG.md.

When things break

Errors that actually help

You'll judge a language by its stack traces. azro shows the line, the column, the offending expression, and a hint to fix it — not just 'TypeError: null'.

Every runtime error includes the file, line, and column; a source snippet with the offending expression underlined; the error type and message; and — when possible — a hint suggesting the fix.

  • Source span with the exact token highlighted
  • Error type (TypeError, NameError, …) + plain message
  • Contextual hint when a fix is known
  • Never a raw Rust panic — wrapping arithmetic, graceful exits
azroc run example.azexit 1
error: TypeError
  in example.az:4:5
  2 │   nums = [1, 2, 3]
  3 │   name = null
  4 │   ? name.upper()
        ^^^^^^^^^^
  Cannot call .upper() on null

hint: check if the value is null first:
      ? (name ?? "").upper()
FAQ

Questions you might be asking

Straight answers — including the ones that aren't flattering.

Python is a wonderful, mature language. azro isn't a replacement — it's a tool for contexts where you want a tiny, embeddable scripting surface: configuration, plugins, game logic, sandboxed automation. If you're building a large application, use Python. If you're embedding a scripting language into a Rust host and want minimal ceremony, azro fits.

What are you building?

Pick the path that fits — we'll show you the right first step. The full learning path is 37 focused tutorials either way.

Or jump straight in: