# Joovy - Faster compilation

**URL:** <https://discourse.julialang.org/t/joovy-faster-compilation/137945>\
**Category:** Tooling\
**Created:** [July 5, 2026, 7:13am UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945 "2026-07-05T07:13:01Z")\
**Posts on this page:** 13\
**Page:** 2

<div class="post-metadata">

**Author:** ![arnold-c](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arnold-c/32/222741_2.png) [@arnold-c](https://discourse.julialang.org/u/arnold-c)\
**Post date:** [July 21, 2026, 6:55pm UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/21 "2026-07-21T18:55:47Z")

</div>

This is really great to see - I have been bitten a number of times by seemingly random recompilations of projects when I start a new REPL, which is particularly painful when the project includes Makie, so being able to mitigate this during development is exciting to say the least. I primarily use neovim for my coding environment, so I appreciate that (certainly in the initial implementation) this package is not optimized for my setup. However, I wonder if it would be simple enough to provide some sort of interface via Preferences.jl, where the user could define in the `LocalPreferences.toml` file which compilation tier to use by default, and then be able to assign different external packages/internal modules to use a different compilation tier? In a similar vein, I suppose you could specify the internal functions to different tiers using something like

```julia

[Joovy]
default = tier_0
ModuleA = tier_1
ModuleA.some_function = tier_2

```

I appreciate that this might not be possible and that I may be misunderstanding something fundamental about Joovy from my quick skim of the repo, but thought I’d type this up in case it’s in any way useful as a suggestion.

---

<div class="post-metadata">

**Author:** ![madppiper](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/madppiper/32/220029_2.png) [@madppiper](https://discourse.julialang.org/u/madppiper)\
**Post date:** [July 21, 2026, 7:26pm UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/22 "2026-07-21T19:26:26Z")

</div>

Hey, thats actually a great idea. Let me think about it a bit, but I don’t see why not. I mean, right now everything is flagged by annotations, but we could also keep the code lean by a config like that.

---

<div class="post-metadata">

**Author:** ![madppiper](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/madppiper/32/220029_2.png) [@madppiper](https://discourse.julialang.org/u/madppiper)\
**Post date:** [July 22, 2026, 6:26pm UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/23 "2026-07-22T18:26:24Z")

</div>

I added a first version of this and pushed it to github last night. It ran fine on my tests today, but it would be great if you could try it yourself and give me some feedback 🙂

Thanks for the suggestion, btw.

---

<div class="post-metadata">

**Author:** ![arnold-c](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arnold-c/32/222741_2.png) [@arnold-c](https://discourse.julialang.org/u/arnold-c)\
**Post date:** [July 23, 2026, 8:21pm UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/24 "2026-07-23T20:21:00Z")

</div>

That’s very efficient - thank you! I’m about to leave for a vacation so probably won’t be able to test it out for a week, but I have a work project that I suspect this would be a good test case for so I’ll be sure to try it out ASAP and get back to you!

---

<div class="post-metadata">

**Author:** ![BananaMaster3](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bananamaster3/32/218457_2.png) [@BananaMaster3](https://discourse.julialang.org/u/BananaMaster3)\
**Post date:** [July 24, 2026, 9:45am UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/25 "2026-07-24T09:45:42Z")

</div>

Incredible! Now what should I do with all the hours this saves…

---

<div class="post-metadata">

**Author:** ![okartal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/okartal/32/44818_2.png) [@okartal](https://discourse.julialang.org/u/okartal)\
**Post date:** [July 24, 2026, 5:08pm UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/26 "2026-07-24T17:08:24Z")

</div>

@madppiper very interesting, congratulations! I am not an expert but is your design similar to [JavaScriptCore - WebKit Documentation](https://docs.webkit.org/Deep%20Dive/JSC/JavaScriptCore.html)? Maybe it can be further inspiration, I think this was discussed somewhere in this forum as a way to improve the UX in Julia.

---

<div class="post-metadata">

**Author:** ![madppiper](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/madppiper/32/220029_2.png) [@madppiper](https://discourse.julialang.org/u/madppiper)\
**Post date:** [July 24, 2026, 5:25pm UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/27 "2026-07-24T17:25:52Z")

</div>

Thanks!

And thanks for the reference, I really need to read up on what they do. But in short: right now Joovy runs everything cheap first, then optimizes the hot functions in the background based on call counts. Julia already has a solid optimizer, so it’s really just about when you pay for it.

Right now I’m mostly experimenting, hoping it slowly turns into a much better experience in our tooling. It’s not trying to make Julia something it isn’t though.

Always happy for input! This is great.

---

<div class="post-metadata">

**Author:** ![madppiper](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/madppiper/32/220029_2.png) [@madppiper](https://discourse.julialang.org/u/madppiper)\
**Post date:** [July 31, 2026, 4:09pm UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/28 "2026-07-31T16:09:56Z")

</div>

I hope everyone is enjoying their summer-break? Anyway, I had some time to play around a bit more, so I just pushed an update.

Anyway, i had a second look at how reloads are handled. And turns out, I had left some room for improvement: if you reload a file, every definition in it got re-evaluated, even the ones you never touched. Julia then treats all of those as freshly redefined and invalidates their callers, so one small edit could cause recompiles all over the place. So I am now adding a cache layer. Joovy now hashes each definition and only re-evaluates what actually changed.

The second thing is a new idea. Joovy already knows the call graph of a lazily-loaded file, so instead of waiting for you to call a function and stall while it compiles, there’s now a small background queue that compiles the likely-next functions during idle time - one at a time, yielding in between, so the REPL never blocks on it. To be clear about the limits: Julia still generates native code the moment a concrete call happens, so this doesn’t make compilation free, it just moves it into time you weren’t using anyway. It’s off by default while I collect experience with it, but you can turn it on by setting “speculate = true” in the [Joovy] section of your LocalPreferences.toml if you want to try it.

---

<div class="post-metadata">

**Author:** ![cstjean](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cstjean/32/1444_2.png) [@cstjean](https://discourse.julialang.org/u/cstjean)\
**Post date:** [August 7, 2026, 5:41am UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/29 "2026-08-07T05:41:05Z")

</div>

> [@madppiper](#):
>
> that compiles the likely-next functions

How do you predict that?

---

<div class="post-metadata">

**Author:** ![madppiper](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/madppiper/32/220029_2.png) [@madppiper](https://discourse.julialang.org/u/madppiper)\
**Post date:** [August 7, 2026, 5:54am UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/30 "2026-08-07T05:54:06Z")

</div>

Oh, there is a call-graph that I rely on. There is no “prediction” in that sense, but the call-graph connects changes in one function to the next. When you touch or promote a function, I queue what it calls plus the rest of that file, ranked by how many callers each has.

---

<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 7, 2026, 6:27am UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/31 "2026-08-07T06:27:13Z")

</div>

i myself encountered a similar problem when working on a big private Julia project, the development cycle was just too slow, but my solution was to replace Pkg.jl with my own Package manager, i think i should have read this post before i wrote tons of zig code to replace Pkg 😅

---

<div class="post-metadata">

**Author:** ![madppiper](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/madppiper/32/220029_2.png) [@madppiper](https://discourse.julialang.org/u/madppiper)\
**Post date:** [August 7, 2026, 6:35am UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/32 "2026-08-07T06:35:47Z")

</div>

You could try adding Joovy to JulIDE and experiment with it. Joovy is open source and I bet you can do similar things as I did with Flexible Julia and Joovy and test if it makes a difference in your work

---

<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 7, 2026, 6:37am UTC](https://discourse.julialang.org/t/joovy-faster-compilation/137945/33 "2026-08-07T06:37:50Z")

</div>

thats actually a good idea! ill test it out 🙂

[Previous page](https://discourse.julialang.org/t/joovy-faster-compilation/137945.md?page=1)
