# Ajt: An alternative package manager for Julia

**URL:** <https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542>\
**Category:** Package Management\
**Tags:** package-manager\
**Created:** [July 30, 2026, 7:44pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542 "2026-07-30T19:44:48Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [July 30, 2026, 7:44pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/1 "2026-07-30T19:44:49Z")

</div>

Hi there!  
I’ve been working on an alternative package manager for Julia for a while, called Ajt. I built it because I’ve hit some limitations with Pkg.jl in a game engine i am working on which is made in Julia (currently working on it privately). Ajt is implemented in the zig programming language.  
Its not meant to replace or overthrow Pkg, i made it to see how far i can go and what will be the tradeoffs.  
Some of the things it focuses on:

- very fast startup (static binary)
- a different dependency resolver (based on PubGrub) with more explicit error messages
- parallel installation / compilation scheduling instead of phase barriers
- a content-addressed precompile cache (so builds can be reused across machines)  
Not sure how useful this will be in practice, but I figured it might be interesting to share and get feedback.  
github: [GitHub - sinisterMage/Ajt.jl: An alternative package manager for the Julia programming language · GitHub](https://github.com/sinisterMage/Ajt.jl)

---

<div class="post-metadata">

**Author:** ![greatpet](https://avatars.discourse-cdn.com/v4/letter/g/e495f1/32.png) [@greatpet](https://discourse.julialang.org/u/greatpet)\
**Post date:** [July 30, 2026, 8:12pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/2 "2026-07-30T20:12:22Z")

</div>

> [@sinisterMage](#):
>
> - a content-addressed precompile cache (so builds can be reused across machines)

Do you set a generic CPU\_TARGET to prevent architecture-dependent cache?

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [July 30, 2026, 8:25pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/3 "2026-07-30T20:25:32Z")

</div>

not in the code of Ajt itself, there is no hardcoded JULIA\_CPU\_TARGET, but AJt does read a CPU\_TARGET from a Dockerfile for example (in my use case)

---

<div class="post-metadata">

**Author:** ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)\
**Post date:** [July 30, 2026, 8:36pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/4 "2026-07-30T20:36:15Z")

</div>

Curious about whether it supports functionality like `Pkg`’s `Pkg.Apps`? I use that for some of my projects but have had a few issues along the way and am wondering if this provides another option?

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [July 30, 2026, 8:50pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/5 "2026-07-30T20:50:20Z")

</div>

currently not, if you will try to use Pkg.apps via Ajt it will forward the call to Pkg due to it not being implemented yet, however, i am planning to implement it soon.

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [August 5, 2026, 10:29am UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/6 "2026-08-05T10:29:07Z")

</div>

update: Pkg.apps is now partly supported (dev, rm, status).  
the full Pkg.apps will be supported soon along with binary releases in github releases  
note: for all of you who want Ajt in the general registry, that is not possible currently.  
Ajt is written in zig and is a standalone package manager for Julia, not a Julia package, sorry for the inconvenience

---

<div class="post-metadata">

**Author:** ![asinghvi17](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/asinghvi17/32/8272_2.png) [@asinghvi17](https://discourse.julialang.org/u/asinghvi17)\
**Post date:** [August 5, 2026, 11:41am UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/7 "2026-08-05T11:41:06Z")

</div>

You could always have a build recipe in [Yggdrasil](https://github.com/JuliaPackaging/Yggdrasil) to distribute a JLL package, though I’m not sure if that has a Zig compiler yet

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [August 5, 2026, 12:49pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/8 "2026-08-05T12:49:27Z")

</div>

ill check it out and see if it can work.  
thank you very much for suggesting it 🙂

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [August 5, 2026, 1:57pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/9 "2026-08-05T13:57:42Z")

</div>

i checked, there is no zig recipe in [GitHub - JuliaPackaging/Yggdrasil: Collection of builder repositories for BinaryBuilder.jl · GitHub](https://github.com/JuliaPackaging/Yggdrasil), also if i am not mistaken JLLs are to be retired, but maybe i am wrong.

---

<div class="post-metadata">

**Author:** ![asinghvi17](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/asinghvi17/32/8272_2.png) [@asinghvi17](https://discourse.julialang.org/u/asinghvi17)\
**Post date:** [August 5, 2026, 2:56pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/10 "2026-08-05T14:56:37Z")

</div>

Hmm I did find a [zig recipe here](https://github.com/JuliaPackaging/Yggdrasil/blob/master/Z/zig/build_tarballs.jl), as well as a [recipe that uses zig](https://github.com/JuliaPackaging/Yggdrasil/blob/master/L/libsie_z/build_tarballs.jl), so it seems quite possible to do something there. Not sure if those are the versions you need though, but that can always be updated by a PR 😉

JLLs are not being retired, they are going strong and underpin quite a bit of the ecosystem these days. BinaryBuilder.jl, the thing which builds JLLs, _is_ at some point going to be swapped out for the new BinaryBuilder2.jl, but that is at some point in the future.

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [August 5, 2026, 3:00pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/11 "2026-08-05T15:00:13Z")

</div>

oh, i didnt find that, thank you for pointing it out to me! and my bad for thinking JLLs are retiring 😅 anyhow, ill start to work on shipping Ajt as a JLL, thank you!

---

<div class="post-metadata">

**Author:** ![rayegun](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rayegun/32/26729_2.png) [@rayegun](https://discourse.julialang.org/u/rayegun)\
**Post date:** [August 5, 2026, 4:47pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/12 "2026-08-05T16:47:29Z")

</div>

Where did you get the impression JLLs would be retired? If there’s some documentation or post that needs to be edited we should do that

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [August 5, 2026, 4:49pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/13 "2026-08-05T16:49:11Z")

</div>

i saw it in some post here, i dont remember which tho, lemme find it

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [August 5, 2026, 4:51pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/14 "2026-08-05T16:51:09Z")

</div>

> [@Moving away from "manual JLL packages" in the General registry](https://discourse.julialang.org/t/moving-away-from-manual-jll-packages-in-the-general-registry/135754):
>
> By “manual JLL”, I mean a JLL package that does not come from [Yggdrasil, the Julia community build tree](https://github.com/JuliaPackaging/Yggdrasil). In the past, we’ve allowed some manual JLLs to be registered in the General registry. However, after some internal discussion, the registry maintainers have decided that we won’t accept manual JLLs in the future. Going forward, all JLLs should come from Yggdrasil, so that we can centralize JLL reviews in a single place. Existing manual JLLs will not be affected. This only applies going forw…

i meant this, but i think i read it incorrectly, my bad!

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [August 5, 2026, 5:29pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/15 "2026-08-05T17:29:21Z")

</div>

> [@sinisterMage](#):
>
> parallel installation / compilation scheduling instead of phase barriers

Could you elaborate on what this means. What’s a phase barrier in this context?

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [August 5, 2026, 5:51pm UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/16 "2026-08-05T17:51:06Z")

</div>

a phase barrier in this context is waiting for one stage to happen before moving to the next, Ajt does something different, it moves to the next phase per item instead of waiting globally, for example: if package A is downloaded before package B, it wont wait for package B unless its a dependency

---

<div class="post-metadata">

**Author:** ![Benny](https://avatars.discourse-cdn.com/v4/letter/b/49beb7/32.png) [@Benny](https://discourse.julialang.org/u/Benny)\
**Post date:** [August 10, 2026, 8:52am UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/17 "2026-08-10T08:52:30Z")

</div>

I thought that’s what Pkg already does? I don’t know how to actually check for parallel downloads, but that’s how I interpreted [`JULIA_PKG_CONCURRENT_DOWNLOADS`](https://pkgdocs.julialang.org/v1/managing-packages/#Pkg-client/server).

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [August 10, 2026, 9:07am UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/18 "2026-08-10T09:07:38Z")

</div>

yes, Pkg.jl does concurrent downloads, but it dosent immediately go to compile the downloaded package, it waits for the other packages to finish, only then moving on to the next phase, Ajt models packages as a dependency graph and starts the next phase per package as soon as its ready to move on to that phase.  
if you need more clarification please let me know 🙂

---

<div class="post-metadata">

**Author:** ![yvikhlya](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yvikhlya/32/3753_2.png) [@yvikhlya](https://discourse.julialang.org/u/yvikhlya)\
**Post date:** [August 10, 2026, 11:21am UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/19 "2026-08-10T11:21:42Z")

</div>

Imo, a good package manager should really be language agnostic. Language toolchain should provide language specific parts of build system, and package manager handle multi-language dependencies and reproducible dev environments. One example of this approach is nix+devenv.sh. Nix implementation may be not optimal, but the idea is right imo.

---

<div class="post-metadata">

**Author:** ![sinisterMage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sinistermage/32/222897_2.png) [@sinisterMage](https://discourse.julialang.org/u/sinisterMage)\
**Post date:** [August 15, 2026, 8:40am UTC](https://discourse.julialang.org/t/ajt-an-alternative-package-manager-for-julia/138542/20 "2026-08-15T08:40:55Z")

</div>

update: Ajt v0.1.0 is now out along with binaries for it, no need to build from source with zig!  
github: [Release ajt v0.1.0 · sinisterMage/Ajt.jl · GitHub](https://github.com/sinisterMage/Ajt.jl/releases/tag/v0.1.0)
