Skip to content

Open Issues and RFCs

A programming language is never only its syntax.

A programming language is never only its syntax.

It is also a project. It has maintainers, users, design debates, bug reports, accepted changes, rejected ideas, unfinished work, and long-term goals.

Zig is still before 1.0, so this matters even more. The language and standard library can still change in significant ways before the stable 1.0 release.

To understand Zig well, you should learn how to read its open issues and design discussions.

What Is an Issue

An issue is a public discussion item in the Zig repository.

Issues can be used for several purposes:

bug reports
language design proposals
standard library changes
compiler crashes
documentation problems
tracking long-term work
platform support problems

A bug report might say:

This valid Zig program fails to compile.

A design proposal might say:

This part of the language should work differently.

A tracking issue might say:

Here is a large feature, with many smaller tasks inside it.

Do not assume every issue describes something Zig will do. Many issues are exploratory. Some are rejected. Some are old. Some describe behavior that has already changed.

What Is an RFC

RFC usually means Request for Comments.

In many language projects, an RFC is a formal proposal for a change.

Zig does not need to copy another language’s RFC process exactly. The important idea is the same: a serious language change should be discussed, tested, criticized, and refined before it becomes part of the language.

A good proposal usually explains:

the problem
the proposed change
examples
tradeoffs
compatibility concerns
implementation cost
alternatives

A weak proposal usually only says:

I like this feature from another language. Zig should add it.

That is rarely enough.

Why Open Issues Matter

Open issues show you the unfinished edge of the language.

Official documentation teaches you what Zig is today. Issues show you what people are debating, fixing, or redesigning.

This helps you understand:

which parts of Zig are stable
which parts are changing
which bugs affect real users
which design questions are still open
which compiler areas need help

For example, if many issues discuss a standard library API, that API may still be in flux. If many issues discuss a backend, that backend may still have limitations. If many issues discuss compiler diagnostics, error messages may be improving but not complete.

Do Not Treat Issues as Documentation

An issue is not the same as official documentation.

Issues may be outdated. They may contain incorrect assumptions. They may include unfinished ideas. They may describe older compiler behavior.

When reading an issue, always ask:

When was this opened?
Is it still open?
Has a maintainer commented?
Does it refer to an older Zig version?
Was it closed by a pull request?
Did the language change since then?

A closed issue can still be useful, but you need to know why it was closed.

It may have been fixed. It may have been rejected. It may have become obsolete.

Labels

Large projects use labels to organize issues.

Labels may indicate:

bug
proposal
accepted
rejected
documentation
compiler
standard library
linker
stage2
platform-specific area
good first issue

Labels help you filter the repository.

For a beginner, the most useful labels are usually:

documentation
good first issue
bug
proposal
accepted

Avoid starting with deep compiler backend issues unless you already understand the relevant subsystem.

Reading a Design Issue

When reading a design issue, do not begin by agreeing or disagreeing.

First reconstruct the problem.

Ask:

What pain is this issue trying to solve?
Is the pain common or rare?
Does the proposal make code clearer?
Does it make the compiler more complex?
Does it break existing code?
Does it fit Zig’s design?

Zig tends to prefer explicit behavior, simple control flow, no hidden allocation, no hidden exceptions, and strong compile-time checks. A proposal that conflicts with these values has a high burden of proof.

For example, a feature that adds convenience but hides memory allocation would likely face serious criticism.

Reading a Bug Report

A good bug report usually contains a minimal reproduction.

That means a small program that shows the problem.

Example shape:

pub fn main() void {
    // small example that triggers the bug
}

When studying a bug report, look for:

the Zig version
the target
the build command
the expected behavior
the actual behavior
the minimal code sample
the error message or crash

If the issue does not contain a minimal reproduction, it may be harder to evaluate.

As a learner, bug reports are valuable because they show the boundary between language rules and compiler behavior.

Tracking Issues

Some issues are not about one bug. They track a large area of work.

A tracking issue might collect:

subtasks
related pull requests
current limitations
design notes
known bugs
future milestones

These issues are useful when you want a map of a subsystem.

Examples of areas that often need tracking in a systems language include:

async
incremental compilation
compiler backends
standard library redesign
package management
debug info
linking
cross-compilation

A tracking issue is often better than reading random issues one by one.

Pull Requests

A pull request is a proposed code change.

Issues discuss problems. Pull requests change the repository.

When an issue is fixed, a pull request often links to it.

A pull request usually contains:

code changes
tests
review comments
design discussion
maintainer feedback

Reading pull requests teaches you how the project actually changes.

For beginners, this is useful because you can see the connection between an idea and the implementation.

A small documentation pull request may show the easiest contribution path. A compiler pull request may show how internal systems fit together.

Accepted Does Not Always Mean Finished

In a fast-moving project, an accepted proposal may still need implementation.

There are several possible states:

proposed
discussed
accepted
partially implemented
implemented
tested
documented
released

Do not confuse acceptance with availability.

A feature may be accepted in principle but not usable in your installed Zig version.

Always check the actual compiler version.

Rejected Proposals Are Useful

Rejected proposals are worth reading.

They show what the project chooses not to do.

A rejected feature can teach you Zig’s design boundaries.

For example, a rejected proposal may reveal that the project avoids:

hidden control flow
implicit allocation
complex runtime machinery
ambiguous type behavior
syntax that saves typing but hides meaning

Understanding rejections helps you predict future design decisions.

Version Context

Zig changes across versions.

An issue from an older version may mention behavior that no longer exists.

When reading an issue, always note the version.

For example:

Zig 0.10 behavior
Zig 0.11 behavior
Zig 0.12 behavior
Zig 0.13 behavior
Zig 0.14 behavior
Zig 0.15 behavior
Zig 0.16 behavior

If you are learning Zig 0.16, older issues may still be useful historically, but they may not describe current behavior.

This is especially important for:

build system APIs
standard library APIs
async
compiler internals
package management
error messages
backend behavior

How to Search Issues

Search with specific terms.

Weak search:

error
compiler
bug

Better search:

error union coercion
comptime pointer
ArrayList allocator
x86_64 linker
build.zig dependency

Use language terms you already know:

comptime
Sema
AIR
ZIR
allocator
slice
sentinel
error set
packed struct
extern struct
linker

The more precise your search, the better the results.

How to Judge a Discussion

Not every long discussion is important. Some discussions are long because the topic is central. Others are long because the problem was unclear.

Look for maintainer comments.

Look for links to implementation work.

Look for examples.

Look for whether the issue is still active.

Useful signs:

clear examples
small reproductions
maintainer response
linked pull requests
updated comments
tests added
documentation updated

Less useful signs:

large vague complaint
no reproduction
no version
no target
no concrete proposal
old discussion with no follow-up

Contributing to Discussions

If you join a discussion, be precise.

Good contribution:

I tested this on Zig 0.16.0 with this command. Here is a minimal reproduction. Expected result: X. Actual result: Y.

Weak contribution:

This is broken. Please fix.

Good design feedback:

This proposal makes allocation implicit in this case. That seems to conflict with Zig’s usual allocator style. Could this be expressed with an explicit allocator parameter instead?

Weak design feedback:

Rust has this, so Zig should too.

Zig design discussions usually reward concrete examples and clear tradeoff analysis.

Good First Issues

A good first issue is intended to be approachable.

These often involve:

documentation fixes
small standard library changes
test additions
minor diagnostics improvements
simple cleanup

Good first issue does not mean no effort. It means the issue is smaller and more isolated than deep compiler work.

Before working on one, read:

the issue
related files
contribution guide
existing tests
recent similar pull requests

Then make a small, focused change.

Avoiding Common Mistakes

Beginners often make these mistakes when reading issues:

treating proposals as accepted facts
reading old issues without version context
assuming closed means fixed
assuming open means confirmed
joining design debates without examples
starting with the hardest compiler issues

The safer approach is slower:

check the date
check the labels
check maintainer comments
check linked pull requests
check current compiler behavior

This saves time and prevents confusion.

What Issues Teach You About Zig

Open issues and RFC-style discussions teach you the living shape of Zig.

They show that language design is a tradeoff.

Every feature has costs:

syntax cost
compiler complexity
runtime cost
teaching cost
debugging cost
compatibility cost
maintenance cost

A feature may be useful and still not belong in Zig.

A proposal may solve one problem but make many other parts of the language harder to understand.

This is why serious language design moves carefully.

A Practical Reading Path

Start with documentation and small issues.

Then read accepted proposals.

Then read closed design discussions.

Then read tracking issues.

Then read implementation pull requests.

A good path is:

documentation issue
small bug report
accepted proposal
tracking issue
pull request
compiler source

This gives you context before diving into hard internals.

The Beginner Mental Model

Use this model:

Documentation tells you what Zig is.
Issues show you what Zig is becoming.
Pull requests show you how it changes.

Reading issues and RFC-style discussions is part of learning Zig seriously.

You do not need to follow every debate. You do need to understand that Zig is still evolving, and that the public repository is where much of that evolution becomes visible.