Skip to content

SB0LTD/sig

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

90,384 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sig

Sig

The Zig compiler that knows how much memory it has.

Release Upstream Sync Status Release Status

sig is a drop-in replacement for zig. All your code works. Then you rename a file to .sig and the compiler starts caring about where your bytes come from.


0.2.0 — No More Excuses

Three platforms. Self-sustained pipeline. Sig builds sig.

$ sig version
sig 0.2.0 (zig 0.17.0-dev, LLVM 22)
Platform Backend Download
x86_64-linux Full (LLVM 22 + self-hosted) tar.xz
aarch64-macos Self-hosted tar.xz
x86_64-windows Self-hosted zip

The Linux binary has the full LLVM backend — it can emit machine code for every target LLVM supports. macOS and Windows ship with the self-hosted backends (x86_64, aarch64, wasm, arm, riscv64). All three produce working binaries today.

The entire release is produced by sig itself. No cmake. No external zig. One sig build-exe invocation compiles the compiler, links LLVM, and outputs a static binary. That binary can then cross-compile itself for other targets. Bootstrap complete.


What makes it strict

The .sig extension activates strict mode. Same syntax. Same parser. Same compiler. But allocator usage becomes a compile error.

// foo.zig — business as usual
var list = std.ArrayList(u8).init(allocator);
try list.appendSlice(data);

// foo.sig — you bring the buffer, you know the cost
var buf: [4096]u8 = undefined;
const result = try sig.fmt.formatInto(&buf, "{s}: {d}", .{ name, count });

Four errors replace silent reallocation:

Error When
BufferTooSmall Output exceeds the caller-provided buffer
CapacityExceeded Bounded container is full
DepthExceeded Recursion hit its limit
QuotaExceeded Resource cap reached

Standard Zig error unions. try, catch, orelse. Nothing new to learn.


The Spoon

Sig is not a fork. It stays synchronized with upstream Zig within minutes of every commit.

When a new commit lands in ziglang/zig, it fires a GitHub dispatch. The sig-sync workflow cherry-picks the commit, resolves conflicts (keeping sig-owned files), validates the bootstrap, and pushes. If the standard library changed in a way that breaks the bootstrap, it triggers a rebuild chain automatically.

The result: sig never drifts. You get upstream bug fixes, optimizations, and new features without waiting.

Latest upstream commit 3deb86ba
Last sync 2026-06-13
Upstream codeberg.org/ziglang/zig
Base version zig 0.17.0-dev · LLVM 22.1.3
Sync frequency Every commit (< 1 min latency)

Getting started

# Download the latest release
curl -sL https://github.com/SB0LTD/sig/releases/latest/download/sig-x86_64-linux.tar.xz | tar -xJ
export PATH="$PWD/sig/bin:$PATH"

# Or build from source (requires a sig or zig binary)
git clone https://github.com/SB0LTD/sig.git && cd sig
sig build -OReleaseFast

It's a drop-in replacement. Every .zig file compiles unchanged. Rename to .sig when you're ready to go strict.

How it's built

build-llvm (one-time)  →  build-bootstrap (one-time)  →  release (every version)
     LLVM 22 .a files        v28 bootstrap binary            sig builds sig

The bootstrap is a previous sig release. It compiles the current source with LLVM 22 linked in. The output is a static musl binary that cross-compiles for all targets. No external dependencies at runtime.

License

Same as upstream Zig — MIT. See LICENSE.

Contributors

Languages

  • Zig 96.3%
  • Standard ML 2.0%
  • C 1.1%
  • C++ 0.2%
  • Python 0.1%
  • Shell 0.1%
  • Other 0.2%