Inception · founding charter · 2026

Written by LLMs. Compiled to any metal.

Cyr is the native dialect of Cyra — AOT-compiled via LLVM, from servers down to a bare MCU. No VM, no GC. The language machines write, now on the metal.

Native code, from your app down to PID 1.

Pre-v0

This page shares the first ideas, the inception philosophy, and the expectations for Cyr. The name, the trunk/branch relationship, the runtime and CLI names, and a set of keystone decisions are locked — but Cyr is not yet shipping. What you read here is a charter, not a release.

Where the BEAM is a wall.

Cyra is excellent at what the BEAM is excellent at: concurrent, fault-tolerant, hot-reloadable systems. But whole classes of work live below that line. Today a developer who hits the wall must drop to C, Rust, or Zig and leave the language entirely. Cyr is the escape hatch that keeps you in the family.

LLVM, AOT

Cyr compiles ahead-of-time to native object code via LLVM — no VM, no JIT. A self-contained binary that runs on a Tier-1 platform with nothing installed.

Tiny runtime: cyrt

A small runtime linked into every binary — allocator, panic handler, intrinsics. Targeted at low hundreds of kilobytes, not megabytes. Embedded and WASM-plausible.

.C

C23 FFI

@external(c, "...") is the single native interop surface. Call C and be called by C with full signatures, explicit widths, and explicit nullability — no hand-written glue.

Same syntax, same soul

switch-only flow, Option/Result, explicit types — ~85% identical grammar to Cyra. The skill and the source cross the managed/native boundary.

The arborescence

One grammar, one semantics core, two backends — the way C has a hosted and a freestanding implementation. The trunk is the shared grammar; the two branches diverge only where the runtime model forces them to.

// the BEAM dialect

Cyra

Warm and managed. Runs on a machine.

  • Erlang VM target — dynamic, hot reload
  • Actorspid / ref / port
  • Arbitrary-precision integers
  • :erlang.* FFI · Cyra.* stdlib

// the native dialect

Cyr

Bare metal. Is the machine code.

  • LLVM target — AOT, static binary
  • C23 FFIptr<T>, @external(c, "...")
  • i64 default + bigint opt-in
  • cyrt runtime · Cyr.* stdlib

From your app to PID 1.

Cyr explicitly targets low-level systems and OS development — up to and including an init/PID 1, daemons, drivers, and freestanding bare-metal code. The harder the profile, the more the language gets out of the way. Cyr's reach is organized into three execution profiles.

1

hosted

app · daemon · CLI

A normal native program on a full OS. The whole stack is available, and cyrt uses the OS heap and OS threads.

full cyrt + full Cyr.* stdlib + libc
2

freestanding-hosted

init / PID 1 · minimal static binary

A kernel is present but userland is minimal. PID 1 should not drag a full libc — a thin direct-syscall layer talks to the kernel.

cyrt + Cyr.Core + thin libc / syscalls
3

bare-metal

kernel · bootloader · firmware · ISR

No OS at all. You bring the allocator; there are no threads, no libc, no unwinding. Inline asm, volatile/MMIO, atomics, custom entry points.

cyrt-core only · no libc, no OS allocator

Native, explicit, unambiguous

A driver fragment with C23 FFI, packed layout, Option instead of null, and tail recursion that runs in constant stack — all in familiar Cyra syntax.

driver.cyr
module Sensor.Driver {
    use Cyr.Result;

    // C23 FFI — the single native interop surface
    @external(c, "read_register")
    fn read_register(addr: ptr<u32>) -> u32;

    @repr(packed)
    struct Reading { id: u16; value: i32; }

    // switch-only flow; Option<T> for absence, never null
    pub fn decode(raw: u32) -> Option<Reading> {
        switch raw {
            0 => None;
            _ => Some(Reading { id: 1, value: raw as i32 });
        }
    }

    // guaranteed constant stack — TCO holds at the CIR layer
    fn sum(xs: list<i64>, acc: i64) -> i64 {
        switch xs {
            []        => acc;
            h :: rest => sum(rest, acc + h);   // i64 traps on overflow
        }
    }

    @entry
    pub fn main() -> i32 { 0; }
}

Keystone decisions

Cyr begins from the premises Cyra already settled, plus a set of one-way doors ratified by the philosophy council at inception. These are the expectations Cyr commits to.

i64

No silent overflow

i64 default; arithmetic traps by default. wrapping, saturating, and bigint are explicit opt-ins.

?:

Option-only absence

nil is retired from non-Option types. Null lives only behind ptr/any at the C wall.

Guaranteed TCO

Tail-position recursion — including mutual recursion — runs in constant stack. A semantic guarantee at the CIR layer, not LLVM faith.

&

ARC, no borrow checker

Memory is ARC + opt-in arena + weak. Safety is relocated to compiler defaults, not author-written lifetime annotations — the right call for an LLM-authored corpus.

!!

Loud, minimal unsafe

Raw ptr<T> deref and any down-casts live only inside unsafe — greppable and auditable.

::

A separate Cyr.* stdlib

Cyr rewrites its standard library natively. Portability lives in the grammar, not the library names — a use line is always honest about its dialect.

What Cyr is not

Not a rewrite or a fork

Cyr is not "Cyra 2.0" and does not diverge in syntax. It is one language with two backends — not two languages competing.

Not a separate brand

Cyr ships as part of the same project — same tooling, same community — not a rival product with its own identity.

Not the actor model

pid, ref, port, spawn, receive, send are removed. Anything actor-like is a library, not a language primitive.

Not a general systems pitch

Cyr is for the people who already love Cyra and now want to write the layer underneath their applications — not a pitch to the general systems-programming public.

Decided deliberately, once

"Source and skill continuity"

Peirce's pragmatic maxim is Cyr's test: what concrete difference does Cyr make that "Cyra plus just use C" does not? The answer — continuity of source and skill across the managed/native boundary — governs every design choice.

"Grammar shared, library honest"

The dialects share ~85% of their syntax — the real transferable asset. They deliberately do not share library names: coherence belongs to syntax and CLI; honesty belongs to the namespace.

"Twenty-one philosophers, one charter"

Aristotle's Four Causes frame the effort; Popper names what would falsify success; Kant's antinomies keep the council honest. Eighteen open design domains were read by all twenty-one, and the keystone decisions ratified — the council runs as organon, open on GitLab.