# Anyzls installs required zig/zls versions

**URL:** <https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900>\
**Category:** Showcase\
**Tags:** zls\
**Created:** [January 11, 2026, 11:07am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900 "2026-01-11T11:07:29Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![knightpp](https://ziggit.dev/user_avatar/ziggit.dev/knightpp/32/2423_2.png) [@knightpp](https://ziggit.dev/u/knightpp)\
**Post date:** [January 11, 2026, 11:07am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/1 "2026-01-11T11:07:29Z")

</div>

[anyzig](https://github.com/marler8997/anyzig) is really nice. It reads `build.zig.zon` and installs required zig version. Handy for trying out latest `std.Io` stuff!

Though, stable zls sort of works with master zig, I was already inspired to write anyzls.

Shout out to [https://github.com/jedisct1/zig-minisign](https://github.com/jedisct1/zig-minisign). A reimplementation of minisign in Zig, that also can be used as a Zig module.

[Zls website](https://zigtools.org/zls/install/) provides HTTP API, which given zig version returns compatible zls version. So, what was left is too glue everything together.

Here’s anyzls source code [https://codeberg.org/knightpp/anyzls](https://codeberg.org/knightpp/anyzls).

---

<div class="post-metadata">

**Author:** ![neurocyte](https://ziggit.dev/user_avatar/ziggit.dev/neurocyte/32/3804_2.png) [@neurocyte](https://ziggit.dev/u/neurocyte)\
**Post date:** [January 13, 2026, 9:27am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/2 "2026-01-13T09:27:56Z")

</div>

Note that anyzig already supports zls. You can build it with `zig build zls` in the anyzig repo. It’s a pitty perhaps that this is not mentioned in the readme.

---

<div class="post-metadata">

**Author:** ![knightpp](https://ziggit.dev/user_avatar/ziggit.dev/knightpp/32/2423_2.png) [@knightpp](https://ziggit.dev/u/knightpp)\
**Post date:** [January 13, 2026, 10:54am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/3 "2026-01-13T10:54:54Z")

</div>

Ooh, I didn’t know that.

---

<div class="post-metadata">

**Author:** ![neurocyte](https://ziggit.dev/user_avatar/ziggit.dev/neurocyte/32/3804_2.png) [@neurocyte](https://ziggit.dev/u/neurocyte)\
**Post date:** [January 13, 2026, 11:40am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/4 "2026-01-13T11:40:53Z")

</div>

@marler8997 maybe you should mention zls in the readme so people aren’t tempted to reinvent?

---

<div class="post-metadata">

**Author:** ![elpablete](https://ziggit.dev/user_avatar/ziggit.dev/elpablete/32/7701_2.png) [@elpablete](https://ziggit.dev/u/elpablete)\
**Post date:** [April 29, 2026, 4:19pm UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/5 "2026-04-29T16:19:59Z")

</div>

Why is zls not included in the released binary of anyzig?

---

<div class="post-metadata">

**Author:** ![Sze](https://ziggit.dev/user_avatar/ziggit.dev/sze/32/496_2.png) [@Sze](https://ziggit.dev/u/Sze)\
**Post date:** [April 29, 2026, 5:14pm UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/6 "2026-04-29T17:14:08Z")

</div>

anyzig is an indirection that handles version management of the zig executable and according to @neurocyte you can also build such an indirection for zls, so it doesn’t make sense to include any specific zls version in its binary, instead you can create an anyzls so to say (which then will automatically download a zls version, at least that seems like it works from taking a short look at the code, but would be good to add a description to the readme).

---

<div class="post-metadata">

**Author:** ![dimdin](https://ziggit.dev/user_avatar/ziggit.dev/dimdin/32/1457_2.png) [@dimdin](https://ziggit.dev/u/dimdin)\
**Post date:** [April 29, 2026, 9:20pm UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/7 "2026-04-29T21:20:04Z")

</div>

When anyzig zls works it is perfect, but it does not always work. For example it can fetch zls for 0.14.0 but not for 0.15.2. ([Bugfix: ZLS download using incorrect target by mirror-shades · Pull Request #68 · marler8997/anyzig · GitHub](https://github.com/marler8997/anyzig/pull/68))

---

<div class="post-metadata">

**Author:** ![marler8997](https://ziggit.dev/user_avatar/ziggit.dev/marler8997/32/77_2.png) [@marler8997](https://ziggit.dev/u/marler8997)\
**Post date:** [April 30, 2026, 3:00am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/8 "2026-04-30T03:00:03Z")

</div>

I’m not a user of zls so it’s been a bit of an afterthought. I actually don’t know whether people are using it or not? If people are I can try to find time to accommodate. I was thinking of just making anyzig itself support zls…the anyzig and anyzls binaries are almost identical. You’d just pass the"zls" parameter to the anyzig executable.

P.S. oh…there’s also an extra step that’s needed for zls…mapping a Zig version to a zls version. Will need to implement that.

---

<div class="post-metadata">

**Author:** ![lukeflo](https://ziggit.dev/user_avatar/ziggit.dev/lukeflo/32/7514_2.png) [@lukeflo](https://ziggit.dev/u/lukeflo)\
**Post date:** [April 30, 2026, 5:28am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/9 "2026-04-30T05:28:24Z")

</div>

Just out of curiosity: what LSP do you use, or simply none? I dont know any beside zls.

---

<div class="post-metadata">

**Author:** ![dimdin](https://ziggit.dev/user_avatar/ziggit.dev/dimdin/32/1457_2.png) [@dimdin](https://ziggit.dev/u/dimdin)\
**Post date:** [April 30, 2026, 7:59am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/10 "2026-04-30T07:59:27Z")

</div>

Editors must be able to launch `zls`; `zig zls` is not going to work, using a symbolic link from `zls` to `zigany` looks better. Not working `zls` is what preventing people from using `zigany`!

There was a `pfg/fix-zls` branch with a working patch for `zls`—I am using it right now, with an additional `b.getInstallStep().dependOn(&install.step);` in `build.zig` for zls executable—and it rocks 🙂

---

<div class="post-metadata">

**Author:** ![dimdin](https://ziggit.dev/user_avatar/ziggit.dev/dimdin/32/1457_2.png) [@dimdin](https://ziggit.dev/u/dimdin)\
**Post date:** [April 30, 2026, 8:07am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/11 "2026-04-30T08:07:16Z")

</div>

There are some valid reasons that a programmer does not want tools for auto-completion, even syntax coloring. For example not using auto-completion leads to better—easy to remember—names in APIs.  
I am still using `zls` mostly for its code navigation capabilities.

---

<div class="post-metadata">

**Author:** ![marler8997](https://ziggit.dev/user_avatar/ziggit.dev/marler8997/32/77_2.png) [@marler8997](https://ziggit.dev/u/marler8997)\
**Post date:** [April 30, 2026, 10:51am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/12 "2026-04-30T10:51:32Z")

</div>

From what I can see, virtually all editors support passing cli arguments to any LSP program that gets launched. Is this not correct?

---

<div class="post-metadata">

**Author:** ![lukeflo](https://ziggit.dev/user_avatar/ziggit.dev/lukeflo/32/7514_2.png) [@lukeflo](https://ziggit.dev/u/lukeflo)\
**Post date:** [April 30, 2026, 10:54am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/13 "2026-04-30T10:54:48Z")

</div>

Thats a very understandable reason. But as you mention, the navigation stuff is really helpful, as is function documentation. I also don’t use too much autocompletion, but the offered completions show me that everything is set up correctly (although, you can’t rely on this, since the LSP might have some internal quirks.)

---

<div class="post-metadata">

**Author:** ![marler8997](https://ziggit.dev/user_avatar/ziggit.dev/marler8997/32/77_2.png) [@marler8997](https://ziggit.dev/u/marler8997)\
**Post date:** [April 30, 2026, 11:06am UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/14 "2026-04-30T11:06:48Z")

</div>

I don’t use an LSP. I use emacs and the times I’ve tried using an LSP resulted in emacs crashing and becoming unresponsive. I blame emacs but it’s been hard to find an alternative editor that does everything I rely on.

---

<div class="post-metadata">

**Author:** ![dimdin](https://ziggit.dev/user_avatar/ziggit.dev/dimdin/32/1457_2.png) [@dimdin](https://ziggit.dev/u/dimdin)\
**Post date:** [April 30, 2026, 1:49pm UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/15 "2026-04-30T13:49:49Z")

</div>

It is not correct for the vscode zig plugin, it is always calling either a zls executable that is in the `PATH`, or a configured zls executable without the ability to provide arguments (the first call is using as argument: `--version`).

It is correct for helix, but a user must change the default configuration—it is inconvenient for an editor that just works.

It is fine to use a `zls` script that just calls `zig zls`; but I really don’t know how a windows user can handle it.

---

<div class="post-metadata">

**Author:** ![knightpp](https://ziggit.dev/user_avatar/ziggit.dev/knightpp/32/2423_2.png) [@knightpp](https://ziggit.dev/u/knightpp)\
**Post date:** [July 17, 2026, 8:37pm UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/16 "2026-07-17T20:37:18Z")

</div>

Pushed a commit fixing corrupt memory ☹

[https://codeberg.org/knightpp/anyzls/commit/65389bea0cf55e1a8cc8260529d7b5166367fcc0](https://codeberg.org/knightpp/anyzls/commit/65389bea0cf55e1a8cc8260529d7b5166367fcc0)

---

<div class="post-metadata">

**Author:** ![knightpp](https://ziggit.dev/user_avatar/ziggit.dev/knightpp/32/2423_2.png) [@knightpp](https://ziggit.dev/u/knightpp)\
**Post date:** [October 5, 2026, 3:11pm UTC](https://ziggit.dev/t/anyzls-installs-required-zig-zls-versions/13900/17 "2026-10-05T15:11:39Z")

</div>

I’ve released version 0.0.1. The most interesting feature is using [std.Io](http://std.Io) to cancel slow HTTP requests and try next mirror, the slow connection detection logic is really simple at the moment.

- Add support to download zig compiler versions.
- Add standalone CLI mode, now you need to create symlinks (or scripts) to run in `zls` or `zig`
  - standalone mode supports several useful command
    - anyzls mirrors [–no-shuffle]
      - fetches [https://ziglang.org/download/community-mirrors.txt](https://ziglang.org/download/community-mirrors.txt) and shuffles

    - anyzls guess-zig
      - returns detected zig version

    - anyzls symlink
      - creates symlinks for you

- Zig downloads support mirrors and have basic slow connection detection, in which case it cancels in-flight request and moves on to next mirror

Cache layout was changed, you should remove old cache like this `rm --recursive --interactive ~/.cache/anyzls`
