Julia1.12 world age problem related to PlotlyJS.jl (WebIO)

Hi,

A warning (about world age) is fetched when I load my project since I switched to Julia 1.12.

My project uses PlotlyJS.jl which is the only package in Project.toml being related to WebIO.jl.

WARNING: Detected access to binding `WebIO.webio_serve` in a world prior to its definition world.
  Julia 1.12 has introduced more strict world age semantics for global bindings.
  !!! This code may malfunction under Revise.
  !!! This code will error in future versions of Julia.
Hint: Add an appropriate `invokelatest` around the access to this binding.
To make this warning an error, and hence obtain a stack trace, use `julia --depwarn=error`.
versioninfo ans Pkg status
julia> versioninfo()
Julia Version 1.12.4
Commit 01a2eadb047 (2026-01-06 16:56 UTC)
Build Info:
  Official https://julialang.org release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 16 Ă— 13th Gen Intel(R) Core(TM) i5-13600H
  WORD_SIZE: 64
  LLVM: libLLVM-18.1.7 (ORCJIT, alderlake)
  GC: Built with stock GC
Threads: 16 default, 1 interactive, 16 GC (on 16 virtual cores)
Environment:
  DYLD_LIBRARY_PATH = /home/G36749/opt/xpressmp/lib:
  LD_LIBRARY_PATH = /home/G36749/opt/xpressmp/lib:
  JULIA_EDITOR = code
  JULIA_VSCODE_REPL = 1
  JULIA_NUM_THREADS = 16

(Viviane) pkg> status
Project Viviane v0.1.0
Status `~/Projects/Julia/viviane.jl/Project.toml`
  [ae650224] ChunkSplitters v3.1.2
⌅ [864edb3b] DataStructures v0.18.22
  [5789e2e9] FileIO v1.17.1
  [87dc4568] HiGHS v1.20.1
  [5903a43b] Infiltrator v1.9.7
  [c3a54625] JET v0.11.3
⌅ [033835bb] JLD2 v0.5.15
  [0f8b85d8] JSON3 v1.14.3
  [4076af6c] JuMP v1.29.3
  [b8f27783] MathOptInterface v1.48.0
  [c020b1a1] NaturalSort v1.0.0
  [67456a42] OhMyThreads v0.8.4
  [f0f68f2c] PlotlyJS v0.18.17
  [f27b6e38] Polynomials v4.1.0
⌅ [08abe8d2] PrettyTables v2.4.0
  [92933f4c] ProgressMeter v1.11.0
  [295af30f] Revise v3.13.1
  [10745b16] Statistics v1.11.1
  [856f2bd8] StructTypes v1.11.0
  [f8b46487] TestItemRunner v1.1.4
  [1c621080] TestItems v1.0.0
  [ac1d9e8a] ThreadsX v0.1.12
  [37e2e46d] LinearAlgebra v1.12.0
  [de0858da] Printf v1.11.0
  [9e88b42a] Serialization v1.11.0
Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated

As stated, Revise stop working (randomly).

Any ideas ?

Best,

Laurent

2 Likes

I think you should migrate to an actively maintained package, such as PlotlyJS.jl, PlotlyLight.jl.

Thank you for your piece of advice.
Actually I do use PlotlyJS.jl (sorry) as one can see in the Pkg status list.
I have corrected the initial post.

Well, then there’s nothing I can do about it. :cry:

1 Like

You would first need to identify where the problematic access is. For this you might be able to see it based on your precompile output (normally, there is context which we can’t see in your posted output). If that does not contain anything useful, you might want to precompile the dependencies of your project separately.

After you know the package which causes the access, you need to find the line where webio_serve is actually accessed with incorrect world age. Ideally, you would than change the logic to be consistent with word age. If this is not possible, you would add the indicated invokelatest call.

1 Like

I’m having the same “problem” but my project is still running, so I’m waiting and seeing.
I’m hoping to see that it has to do with the implementation of JSON.jl from JSON3.jl in PlotlyJS.jl.

The last version update and commit on PlotlyJS.jl was made in Aug 2025, and I cannot see any coding activity on the PlotlyJS.jl repo. but issues are still beeing posted.
I hope and think its work in progress since I think quite a lot of people use PlotlyJS.jl.

Wait and see and, and hope that some people get to fixing it, sadly I do not have the knowledge to help to assist such huge and complex repos.

1 Like

Thank you for your message: i feel less alone in facing this problem :slight_smile:

I wonder if the :heart:s given to the initial post also indicate that other users have encountered this error with PlotlyJS.js/Julia 1.12…

I wonder if I should switch back to Makie.jl (the interactivity of the graphs is really useful).

I had previously switched from Makie.jl to PlotlyJS.jl because it was difficult to keep up with the API changes.

1 Like

I haven’t been looking into Makie.jl. but my plot is quite comprehensive, so I would love not to redo it all again.

This is one of my “simpler” plots, I removed some stuff for confidentiality reasons. And PlotlyJS.jl has good time handling, that I’m very dependent on.

Let’s see. I think PlotlyJS.jl will be updated.

1 Like

Indeed.

Although Makie.jl is super powerful and allows for complex, reactive and beautiful plots, a translation from PlotlyJS.jl would take a significative amount of time

Can you share a (M)WE that shows the issue?

Also, do you have Revise loaded here or not? If yes, can you try without?

1 Like

Thank you for your suggestions !

Il will try to build a MWE.

Meanwhile,

I usually work using Revise but it does not seems to make a difference here.

 $ julia --project -t auto
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.12.4 (2026-01-06)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org release
|__/                   |

julia> using Viviane
WARNING: Detected access to binding `WebIO.webio_serve` in a world prior to its definition world.
  Julia 1.12 has introduced more strict world age semantics for global bindings.
  !!! This code may malfunction under Revise.
  !!! This code will error in future versions of Julia.
Hint: Add an appropriate `invokelatest` around the access to this binding.
To make this warning an error, and hence obtain a stack trace, use `julia --depwarn=error`.

(Viviane) pkg> st
Project Viviane v0.1.0
Status `~/Projects/Julia/viviane.jl/Project.toml`
  [ae650224] ChunkSplitters v3.1.2
⌅ [864edb3b] DataStructures v0.18.22
  [5789e2e9] FileIO v1.17.1
  [87dc4568] HiGHS v1.20.1
  [5903a43b] Infiltrator v1.9.7
  [c3a54625] JET v0.11.3
⌅ [033835bb] JLD2 v0.5.15
  [0f8b85d8] JSON3 v1.14.3
  [4076af6c] JuMP v1.29.4
  [b8f27783] MathOptInterface v1.48.0
  [62286e6e] MinCostFlows v0.1.2
  [c020b1a1] NaturalSort v1.0.0
  [67456a42] OhMyThreads v0.8.5
  [f0f68f2c] PlotlyJS v0.18.17
  [f27b6e38] Polynomials v4.1.0
⌅ [08abe8d2] PrettyTables v2.4.0
  [92933f4c] ProgressMeter v1.11.0
  [10745b16] Statistics v1.11.1
  [856f2bd8] StructTypes v1.11.0
  [f8b46487] TestItemRunner v1.1.4
  [1c621080] TestItems v1.0.0
  [ac1d9e8a] ThreadsX v0.1.12
  [37e2e46d] LinearAlgebra v1.12.0
  [de0858da] Printf v1.11.0
  [9e88b42a] Serialization v1.11.0
Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated`
``

Good news : The problem is not related to my code and an empty project with the following dependencies:

module WorldAgeBug

using JET
using JuMP
using HiGHS
using PlotlyJS
using ChunkSplitters
using ProgressMeter
using OhMyThreads
using PrettyTables
using DataStructures
using LinearAlgebra
using JLD2
using StructTypes
using JSON3
using Infiltrator
using Serialization
using MathOptInterface
using Statistics
using Polynomials

end # module

allows to reproduce the bug:

$ julia --project
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.12.4 (2026-01-06)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org release
|__/                   |

julia> using WorldAgeBug
WARNING: Detected access to binding `WebIO.webio_serve` in a world prior to its definition world.
  Julia 1.12 has introduced more strict world age semantics for global bindings.
  !!! This code may malfunction under Revise.
  !!! This code will error in future versions of Julia.
Hint: Add an appropriate `invokelatest` around the access to this binding.
To make this warning an error, and hence obtain a stack trace, use `julia --depwarn=error`.

julia> 

Now I have to remove the depencies to a minimal set…

Two packages are enough for the bug to arise:

$ julia --project
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.12.4 (2026-01-06)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org release
|__/                   |

julia> using WorldAgeBug
WARNING: Detected access to binding `WebIO.webio_serve` in a world prior to its definition world.
  Julia 1.12 has introduced more strict world age semantics for global bindings.
  !!! This code may malfunction under Revise.
  !!! This code will error in future versions of Julia.
Hint: Add an appropriate `invokelatest` around the access to this binding.
To make this warning an error, and hence obtain a stack trace, use `julia --depwarn=error`.

(WorldAgeBug) pkg> st
Project WorldAgeBug v0.1.0
Status `~/Projects/Julia/WorldAgeBug.jl/Project.toml`
  [c3a54625] JET v0.11.3
  [f0f68f2c] PlotlyJS v0.18.17

(WorldAgeBug) pkg> 

And the main file of the MWE project : src/WorldAgeBug.jl:

module WorldAgeBug

using JET
using PlotlyJS


end # module

@pfitzseb : Is this MWE OK ?

Yeah, I was just about to suggest removing JET.

Does this repro with Revise.jl instead of JET?

Anyways, @aviatesk may have an idea as to why this happens

Sorry for the delay.

Yes !

$ julia --project
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.12.4 (2026-01-06)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org release
|__/                   |

julia> using WorldAgeBug
Precompiling WorldAgeBug finished.
  1 dependency successfully precompiled in 2 seconds. 89 already precompiled.
WARNING: Detected access to binding `WebIO.webio_serve` in a world prior to its definition world.
  Julia 1.12 has introduced more strict world age semantics for global bindings.
  !!! This code may malfunction under Revise.
  !!! This code will error in future versions of Julia.
Hint: Add an appropriate `invokelatest` around the access to this binding.
To make this warning an error, and hence obtain a stack trace, use `julia --depwarn=error`.

(WorldAgeBug) pkg> st
Project WorldAgeBug v0.1.0
Status `~/Projects/Julia/WorldAgeBug.jl/Project.toml`
  [f0f68f2c] PlotlyJS v0.18.17
  [295af30f] Revise v3.13.2

(WorldAgeBug) pkg> 

Revise and JET are not designed to be usinged from packages.

1 Like

OK thanks.

When I remove both JET.jl and Revise.jl from the dependencies of the empty package WorldAgeBug.jl, the problem disappear…

BUT, when I load the WorldAgeBug.jl package from vsode (alt-J alt-O), then the pb is still there… I know that vscode automatically use Revise (but I need it).

Surprisingly, when I add

   "julia.additionalArgs": [
        "--depwarn=error"
    ]

to the settings.json of vscode Julia’s extension it seems to mitigate the pb…

Sounds similar to

1 Like