The Zig compiler that knows how much memory it has.
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.
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.
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.
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) |
# 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 -OReleaseFastIt's a drop-in replacement. Every .zig file compiles unchanged. Rename to .sig when you're ready to go strict.
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.
Same as upstream Zig — MIT. See LICENSE.