Writing Zig without autocomplete is fucking miserable, so that's why ZLS exists. I spent three months debugging phantom errors before I realized half were typos that any decent language server would've caught.
ZLS 0.15.0 dropped August 24, 2025, and only works with Zig 0.15.1 - not 0.15.0 because that was retracted for being broken. Version compatibility is stricter than a bank loan officer. The smart thing about ZLS is it uses LSP, so they only have to build one thing that works with every editor instead of writing VS Code extensions, Vim plugins, and Emacs modes separately.
How This Thing Actually Works
Your editor talks to ZLS through JSON-RPC messages - you type code, editor sends it to ZLS, ZLS analyzes it and sends back completions and errors. When ZLS gets better, every editor wins. Basic stuff.
The hard part is ZLS has to understand Zig's batshit crazy features like comptime where code runs at compile time. Spoiler alert: comptime analysis barely works. Try anything beyond const foo = @import(\"std\")
and ZLS gives up. Don't expect rust-analyzer levels of intelligence here.
Setup ranges from "click install" (VS Code) to "sacrifice a goat and read three blog posts" (everything else).
Version Hell Will Ruin Your Day
This bears repeating: version mismatches will fuck your entire week. ZLS 0.15.0 works with Zig 0.15.1. Period. Mix versions and you get Segmentation fault (core dumped)
with zero context about what went wrong.
I've been burned three times by this shit. Used ZLS 0.14 with Zig 0.15 and got segfaults that took two days to debug. The error message? "Unexpected token '}'" on a perfectly valid file. Thanks for nothing.
ZLS auto-detects your `build.zig` which works fine for hello world bullshit. Once you have actual dependencies or custom build steps, get ready for "unable to resolve symbol" errors on code that compiles just fine. At least ZLS 0.15.0 shows build errors inline now instead of making you tab over to the terminal every five minutes like a caveman.
What You Actually Get
ZLS has 4.1k stars which is decent for a language server that half the time makes you restart it. The zigtools org actually maintains this thing and ships updates regularly.
The basics work: autocomplete, go-to-definition, error squiggles. That's it. Comptime analysis is a joke - try any real metaprogramming and it gives up. Refactoring support makes rust-analyzer look like magic by comparison. But honestly? For normal Zig code it's the difference between "tolerable" and "wanting to switch back to C++."
Even TigerBeetle and Bun use it, so it can't be completely worthless.