Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Aura

Aura

Aura is a gradually-typed programming language that transpiles to Python. One spelling per construct, no synonyms. The whole Python ecosystem — any PyPI package — is one import away.

CI Release PyPI Python License: MIT


Status

Aura is alpha (0.2.0a2). The compiler, type checker, rule checker, REPL, language server, formatter, linter, project tooling, and standard library are implemented and covered by a test suite of 11,000+ tests.

Syntax freeze. As of 0.2.0a1, Aura's syntax is officially frozen. No syntax changes will be made before the stable 1.0 release. The canonical grammar is docs/GRAMMAR.md and every change is recorded in CHANGELOG.md.

What exists today:

Area State
Language, parser, type/rule/mutability checkers Implemented
Transpiler to Python (Python 3.10+) Implemented
CLI (17 subcommands) Implemented
Project tooling (init, venv, add, remove, install, deps, doctor) Implemented
Language server (diagnostics, completion, hover, go-to-definition) Implemented
Standard library (18 modules) Implemented
Compile-time macros Implemented
Security hardening (SSRF guards, input limits, no traceback leaks) Implemented
Compilation to native machine code Not planned for 1.0

Requirements

  • Python 3.10+ (the generated code targets 3.10+).
  • No mandatory third-party runtime dependencies. On Python 3.10, tomli is installed automatically to read aura.toml.
  • Optional: cryptography>=44 (the [pqc] extra) enables the production post-quantum backend for stdlib.crypto.

Installation

From PyPI:

pip install aura-language

From a checkout:

git clone https://github.com/JoaoValentimTheo/aura-lang.git
cd aura-lang
pip install -e .
aura run examples/hello.aura

Optional post-quantum backend:

pip install "aura-language[pqc]"

Quick start

aura init myapp          # scaffolds aura.toml and src/main.aura
cd myapp
aura run src/main.aura

The smallest Aura program:

def main() {
  print("Hello, Aura!")
}

From a source checkout without installing, the main.py shim works too:

python3 main.py run examples/hello.aura

The language

Aura has exactly one spelling per construct — no synonyms. The full grammar is in docs/GRAMMAR.md.

// Bindings: `let` is immutable, `let mut` opts into reassignment.
let name = "Aura"
let mut count = 0

// Functions; types are optional and checked before execution.
def max(a: int, b: int) -> int {
  return a > b ? a : b
}

// Pattern matching with guards.
match command {
  case "quit" { return }
  case n if n > 100 { print("big") }
  case _ { print("other") }
}

Key rules:

  • let/const are immutable; let mut is required to reassign.
  • none is the null literal; not, and, or are the logical operators.
  • Only def declares functions; only new declares constructors; only extends declares inheritance (class X(Y) and implements are rejected).
  • Every class/trait member declares its visibility (public/private/ protected).
  • *args and **kwargs work in every context the grammar permits: function declarations, calls, decorators, and lambdas.

Classes

Fields may be declared in the class header, which builds the constructor and generates accessors:

class User(private name: str, mut age: int = 0, public id: int = 0) {
  public def greet() -> str {
    return "hi " + self.get_name()
  }
}

let u = User("ana", 30)
print(u.get_name())    // ana  -- getter is always generated
u.set_age(31)          // setter exists because `age` is `mut`
print(u.id)            // 0    -- public field, direct access

A class has one constructor style: header fields or body fields with a manual def new — never both. Mixing them is a syntax error.

Inheritance uses extends; a subclass header declares only its own fields:

class Admin extends User(email: str) { }

let a = Admin(email: "a@x.com", name: "bob")
print(a.get_email())

Overriding is implicit: declare a method with the same name in the subclass. There is no override keyword.

Traits and abstract classes

A trait is a pure contract: methods without a body are abstract, and a concrete class must implement every one it inherits.

trait Drawable {
  public def draw() -> void
}

class Circle extends Drawable {
  public let radius: float = 1.0
  public def draw() -> void { print("circle") }
}

An abstract class is a real base — fields, concrete methods and a constructor — that cannot be instantiated and may defer methods with abstract def:

abstract class Shape {
  public abstract def area() -> float
}

class Square extends Shape {
  public let side: float = 2.0
  public def area() -> float { return self.side * self.side }
}

// let s = Shape()   // E316: abstract, cannot be instantiated

Aura honours Python's object protocols: dunder methods, descriptors, context managers (with / async with), generators, and the MRO are all supported when extending Python classes.

Concurrency

import stdlib.threading as threading

def main() {
  let results = threading.map_concurrent((n) => n * n, [1, 2, 3, 4])
  print(results)
}

Async is native, including file and HTTP helpers that do not block the loop:

import stdlib.io as io
import stdlib.http as http

async def main() {
  await io.write_async("out.txt", "hello\n")
  let text = await io.read_async("out.txt")
  let response = await http.aget("https://example.com")
  print(text.trim())
  print(response.status)
}

Cryptography

stdlib.crypto provides hashing, HMAC, HKDF, and post-quantum primitives (ML-KEM / ML-DSA).

import stdlib.crypto as crypto

def main() {
  let key = crypto.random_bytes(32)
  let tag = crypto.hmac_sha3_256(key, "authenticated")

  let kp = crypto.kem_keypair()
  let envelope = crypto.kem_encapsulate(kp.public_key)
  let shared = crypto.kem_decapsulate(kp.secret_key, envelope.ciphertext)
  print(shared == envelope.shared_secret)
}

The bundled pure-Python reference backend reports production = false and is not cryptographically secure. Install the [pqc] extra for real secrets.

Python interop

Any PyPI package is one import away; the python bridge reaches anything else.

import os
import math
import json
import python

def main() {
  print(math.sqrt(144.0))
  let payload = json.dumps({"name": "aura", "ok": true})
  print(payload)
  print(python.is_instance(payload, str))
}

Aura apps can drive real frameworks directly — for example a Flask app with dotted @app.route(...) decorators:

import flask

let app = flask.Flask(__name__)

@app.route("/hello/<name>")
def hello(name) {
  return f"Hello, {name}!"
}

Compile-time macros

Beyond runtime decorators such as @debug, @memoize, and @cache, Aura has compile-time macros expanded by the transpiler before any Python is emitted. A macro receives its operands as quoted AST, returns replacement AST, and leaves no trace at runtime unless it chooses to emit one.

import macros

def main() {
  assert_eq(2 + 2, 4)       // evaluate both once, assert equality
  static_assert(true)       // checked at compile time
  print(stringify(42))      // folds the literal to "42" during compilation
  let mut a = 1
  let mut b = 2
  swap(a, b)                // a binding plus two assignments
}

Built-ins: assert_eq, assert_ne, static_assert, identity, discard, stringify, swap, debug_value, todo, unreachable. Macro expansion is hygienic — introduced bindings can never capture a call-site name — and a program's own declaration always shadows a built-in macro of the same name.

Aura Patterns (AUP)

AUP is a catalog of idiomatic solutions, each with a runnable example under examples/aup/:

Pattern Example
Optional results (T | none) option.aura
Typed error handling error_handling.aura
Builder builder.aura
Strategy strategy.aura
Pipeline (|>) pipeline.aura
Memoize / cache memoize.aura
Observer observer.aura
Resource management (with) resource.aura
Worker pool worker_pool.aura
Hybrid post-quantum crypto hybrid_crypto.aura

CLI

Command Purpose
aura run <file> Transpile and execute an Aura file (-v prints the generated Python)
aura check <file> Type-check and rule-check without running
aura transpile <file> Print the generated Python (-o <file> writes it)
aura format <file> Reformat source (-i in place, -o <file> to a file)
aura lint <file> Style warnings (--allow-warnings to exit 0)
aura test [dir] Run .aura test files (-v verbose)
aura repl Interactive REPL
aura init [name] Scaffold a project (--venv to also create an environment)
aura venv [action] Manage .venv: init, info, shell, remove
aura add <pkg> Add a dependency (-D dev, --no-install, -V <spec>)
aura remove <pkg> Remove a declared dependency
aura install Install everything declared in aura.toml
aura deps List dependencies (--lock writes aura.lock)
aura doctor Check Python, venv, and installed dependencies
aura debug <file> Run under the trace debugger
aura lsp Language server over stdio
aura version Print or bump the version

Run aura --help or aura <command> --help for details.

Projects and dependencies

Aura projects are self-contained: aura init writes an aura.toml, aura venv creates the environment, and aura add records and installs dependencies.

aura init myapp --venv          # aura.toml + src/main.aura + .venv
cd myapp
aura add "requests>=2.28"       # runtime dependency
aura add -D pytest              # development dependency
aura deps --lock                # write aura.lock with exact versions
aura doctor                     # verify the environment

aura.toml:

[project]
name = "myapp"
version = "0.1.0"

[dependencies]
requests = ">=2.28"

[dependencies.dev]
pytest = ">=8"

Dependencies install into the project's .venv when one exists, and into the current interpreter otherwise. aura venv shell prints the activation command.

REPL

aura repl shares the real parser and every checker (types, structural rules, and mutability), so each line is validated the way aura check validates it. State persists across lines:

$ aura repl
aura> let mut x = 1
aura> x = x + 1
aura> x
2
aura> let y: int = "text"
[E101] Variable 'y': expected Int, got String
aura> :type x
int

Commands: :help, :vars, :type <expr>, :ast <expr>, :load <file>, :run <file>, :py <code>, :history, :reset, :q.

Standard library

Module Purpose
stdlib.threading Thread pool, map_concurrent
stdlib.asyncio Async event-loop helpers
stdlib.io File I/O (sync + async)
stdlib.http HTTP client (sync + async)
stdlib.crypto Hashing, HMAC, HKDF, post-quantum (ML-KEM/ML-DSA)
stdlib.json JSON encode/decode
stdlib.regex Regular expressions
stdlib.string String manipulation
stdlib.math Mathematical functions
stdlib.collections Collection utilities
stdlib.itertools Iterator combinators
stdlib.os OS-level utilities
stdlib.python Python bridge (python.is_instance, ...)
stdlib.time Time functions
stdlib.testing Test framework support
stdlib.macros Compile-time macro surface

Documentation

Document Covers
docs/README.md Documentation index and reading order
docs/GRAMMAR.md Canonical EBNF grammar (source of truth)
docs/LANGUAGE.md Complete language reference (English)
docs/LANGUAGE_PT.md Referencia completa da linguagem (Portugues)
docs/TYPES.md Type system (English)
docs/TYPES_PT.md Sistema de tipos (Portugues)
docs/ERRORS.md Every diagnostic code (E## / W##)
docs/AUP.md Aura Patterns catalog
docs/DESIGN.md Transpiler architecture
docs/COMPLETENESS.md Language coverage and remaining gaps
CHANGELOG.md Release history
examples/ Runnable example programs

Development

git clone https://github.com/JoaoValentimTheo/aura-lang.git
cd aura-lang
pip install -e ".[dev]"

pytest                    # full test suite (3,000+ tests)
ruff check aura/          # lint
mypy aura/                # type-check the compiler

See CONTRIBUTING.md for the workflow and SECURITY.md to report a vulnerability.

License

MIT — see LICENSE.

Release files for aura-language 0.2.0a2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aura-language 0.2.0a2
File Size Uploaded
aura_language-0.2.0a2.tar.gz 314.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aura-language 0.2.0a2
File Interpreter ABI Platform
aura_language-0.2.0a2-py3-none-any.whl Python 3 none any Details

Total release size: 541.3 kB

Release files / aura_language-0.2.0a2.tar.gz

Download URL aura_language-0.2.0a2.tar.gz
Size 314.5 kB
Tags Source
SHA-256 checksum
How to use checksums
d8c2efd9ff931ad4a2f88606c11ff2ce523b48a87c674f571e4f43d514fc49fc
BLAKE2b-256 checksum
How to use checksums
c8d01a59b339d260c69e259694e5f8377486f1c08d1c186fd0b4c41e25e7f5ac
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / aura_language-0.2.0a2-py3-none-any.whl

Download URL aura_language-0.2.0a2-py3-none-any.whl
Size 226.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4ce468c94685c6ac168e9d9b60b73a69e7cacb829860ca56278e00ed43756d27
BLAKE2b-256 checksum
How to use checksums
99a00bae395888b392b939f8c789512de3df520e27590e7c49d9cc1a0631b982
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page