← HOME - a blog about
xit RSS
██╗ ██╗██╗████████╗██╗ ██████╗ ██████╗
╚██╗██╔╝██║╚══██╔══╝██║ ██╔═══██╗██╔════╝
╚███╔╝ ██║ ██║ ██║ ██║ ██║██║ ███╗
██╔██╗ ██║ ██║ ██║ ██║ ██║██║ ██║
██╔╝ ██╗██║ ██║ ███████╗╚██████╔╝╚██████╔╝
╚═╝ ╚═╝╚═╝ ╚═╝ ╚══════╝ ╚═════╝ ╚═════╝
DEVLOG - ZIG 0.16'S BREAKING CHANGES - November 27, 2025
I'm back from a lot of traveling and despite the jetlag
and mild cold, I'm trying to get back into the project. The
main progress I've made recently is making changes for Zig
0.16. I already wrote about the breakages from 0.15, but
there are more on the way.
Zig 0.15 (and soon, 0.16) massively broke the xit project,
because I made heavy use of the standard library. Accounting
for these changes has taken months, because xit is not a
small codebase anymore; it's over 25k lines. I "signed up"
for this by using an unstable language. While it's not
always fun to deal with, the changes are good for the
language and even improved xit's performance.
One breaking change was zlib. In 0.15, Zig's zlib
compressor was completely removed, and its decompressor was
redesigned to comply with
writergate. Since xit relies on
zlib for git compatibility, this was a problem. My temporary
solution was to copy the zlib code from the 0.14 std lib
into the xit project, but that code uses the old-style
readers/writers, so it's not a long-term solution.
The great news is that someone
contributed a
writergate-compliant zlib compressor recently, so it'll be
landing in 0.16. On a separate branch, I've already removed
the vendored std lib code and replaced it with the new zlib
compressor and decompressor. This was a lot of work, because
they now have a very different API, but everything is
looking good now.
Zig 0.16 is also
introducing the Io interface, which
will need to be passed to anything that does i/o, including
filesystem operations. I haven't done this change yet, and
it's going to be pretty big in terms of line count, but I'm
guessing it'll be mostly mindless work so I'm not worried
about it. I'm pretty excited about this design because it
should make it easy to multi-thread parts of xit.
Besides that, I did some work on master to improve http in
xit. The new HTTP client in Zig 0.15 is very difficult to
use correctly, and after the initial work to support 0.15 I
temporarily recommended people stick to ssh-based
networking. I finally found and
fixed the problem, so
http-based cloning now works again.
In the process of doing that, I realized my networking
tests were not hitting certain code paths because they were
making very small repos. I
added some tests that fetch and
push repos containing much more data, so hopefully that will
catch more problems in the future.
A year ago, I spent all three months of winter
implementing git's client-side networking protocol in xit.
This winter, I plan on implementing a server. My goal is to
have a fully compliant git-compatible server written in Zig
by the end of winter. I like doing this kind of boring,
incremental work during the winter months when I'm stuck
inside all day avoiding the bitter cold.
That means the project will probably be quiet in the
meantime. Come spring, xit will come out of hibernation and
new feature work will continue.