Xranklin.jl compatibility with Julia 1.12

I’ve been using Xranklin.jl, the intended successor to Franklin.jl for building static sites. I know @tlienart has been busy / unable to devote much time to his open source development, but it’s been mostly working fine.

On upgrading to Julia 1.12 though, I’m getting world age issues when I try to to build

julia> Xranklin.serve()
  Activating project at `~/Repos/LabWebsite`
[2025-10-22 11:49:51] Info: ⌛ processing config file	
[2025-10-22 11:49:51] Info: 🗑️ cleaning up all objects...
[2025-10-22 11:49:51] Info: 🏁 ... done (δt = 0ms)	

ERROR: UndefVarError: `website_title` not defined in `Main.__FRANKLIN_1585204`
The binding may be too new: running in world age 39053, while current world is 39057.
Stacktrace:
Rest of stacktrace
  [1] getproperty
    @ ./Base_compiler.jl:47 [inlined]
  [2] #_eval_vars_cell##0
    @ ./none:-1 [inlined]
  [3] iterate
    @ ./generator.jl:48 [inlined]
  [4] grow_to!(dest::Vector{@NamedTuple{…}}, itr::Base.Generator{Base.Iterators.Filter{…}, Xranklin.var"#_eval_vars_cell##0#_eval_vars_cell##1"{…}})
    @ Base ./array.jl:863
  [5] collect
    @ ./array.jl:787 [inlined]
  [6] _eval_vars_cell(mdl::Module, code::String)
    @ Xranklin ~/.julia/packages/Xranklin/6wt1L/src/context/code/notebook_vars.jl:148
  [7] eval_vars_cell!(ctx::Xranklin.GlobalContext{Xranklin.LocalContext}, cell_code::SubString{String})
    @ Xranklin ~/.julia/packages/Xranklin/6wt1L/src/context/code/notebook_vars.jl:81
  [8] html_md_def(b::FranklinParser.Block, c::Xranklin.GlobalContext{Xranklin.LocalContext})
    @ Xranklin ~/.julia/packages/Xranklin/6wt1L/src/convert/markdown/rules/text.jl:71
  [9] top-level scope
    @ none:1
 [10] eval(m::Module, e::Any)
    @ Core ./boot.jl:489
 [11] EvalInto
    @ ./boot.jl:494 [inlined]
 [12] convert_block(b::FranklinParser.Block, c::Xranklin.GlobalContext{Xranklin.LocalContext}; tohtml::Bool)
    @ Xranklin ~/.julia/packages/Xranklin/6wt1L/src/convert/markdown/md_core.jl:201
 [13] convert_block
    @ ~/.julia/packages/Xranklin/6wt1L/src/convert/markdown/md_core.jl:189 [inlined]
 [14] html
    @ ~/.julia/packages/Xranklin/6wt1L/src/convert/markdown/md_core.jl:203 [inlined]
 [15] convert_md(md::SubString{String}, c::Xranklin.GlobalContext{Xranklin.LocalContext}; tohtml::Bool, nop::Bool, error_backtracking_iteration::Int64, kw::@Kwargs{})
    @ Xranklin ~/.julia/packages/Xranklin/6wt1L/src/convert/markdown/md_core.jl:145
 [16] convert_md
    @ ~/.julia/packages/Xranklin/6wt1L/src/convert/markdown/md_core.jl:20 [inlined]
 [17] #html#120
    @ ~/.julia/packages/Xranklin/6wt1L/src/convert/markdown/md_core.jl:167 [inlined]
 [18] html
    @ ~/.julia/packages/Xranklin/6wt1L/src/convert/markdown/md_core.jl:166 [inlined]
 [19] html(md::String, c::Xranklin.GlobalContext{Xranklin.LocalContext}; kw::@Kwargs{})
    @ Xranklin ~/.julia/packages/Xranklin/6wt1L/src/convert/markdown/md_core.jl:172
 [20] html
    @ ~/.julia/packages/Xranklin/6wt1L/src/convert/markdown/md_core.jl:172 [inlined]
 [21] process_config(gc::Xranklin.GlobalContext{Xranklin.LocalContext}, config::String)
    @ Xranklin ~/.julia/packages/Xranklin/6wt1L/src/process/config_utils.jl:68
 [22] process_config(gc::Xranklin.GlobalContext{Xranklin.LocalContext})
    @ Xranklin ~/.julia/packages/Xranklin/6wt1L/src/process/config_utils.jl:19
 [23] serve(d::String; dir::String, folder::String, clear::Bool, final::Bool, single::Bool, eval::Bool, nocode::Bool, threads::Bool, use_threads::Bool, prepath::String, prefix::String, base_url_prefix::String, allow_no_index::Bool, debug::Bool, cleanup::Bool, skip::Vector{…}, port::Int64, host::String, launch::Bool)
    @ Xranklin ~/.julia/packages/Xranklin/6wt1L/src/build/serve.jl:196
 [24] serve
    @ ~/.julia/packages/Xranklin/6wt1L/src/build/serve.jl:58 [inlined]
 [25] serve()
    @ Xranklin ~/.julia/packages/Xranklin/6wt1L/src/build/serve.jl:58
 [26] top-level scope

The exact same thing on Julia 1.11 builds ok, though possibly relevant, there are some different packages installed when resolving the project. When I switched to 1.11 and did ] up, the main difference appears to be removing the JuliaSyntaxHighlighting.jl indirect dependency, the other changes seem to be minor or patch version changes.

Pkg outputs

When running Julia 1.11

(LabWebsite) pkg> up
    Updating registry at `~/.julia/registries/General.toml`
   Installed OpenSSL_jll ─ v3.5.4+0
  Downloaded artifact: OpenSSL
  No Changes to `~/Repos/LabWebsite/Project.toml`
    Updating `~/Repos/LabWebsite/Manifest.toml`
  [ac6e5ff7] - JuliaSyntaxHighlighting v1.12.0
⌅ [aea7be01] ↓ PrecompileTools v1.3.3 ⇒ v1.2.1
  [458c3c95] ↑ OpenSSL_jll v3.5.1+0 ⇒ v3.5.4+0
  [ca575930] ↓ NetworkOptions v1.3.0 ⇒ v1.2.0
  [44cfe95a] ↓ Pkg v1.12.0 ⇒ v1.11.0
  [deac9b47] ↓ LibCURL_jll v8.11.1+1 ⇒ v8.6.0+0
  [e37daf67] ↓ LibGit2_jll v1.9.0+0 ⇒ v1.7.2+0
  [29816b5a] ↓ LibSSH2_jll v1.11.3+1 ⇒ v1.11.0+1
  [c8ffd9c3] ↓ MbedTLS_jll v2.28.10+0 ⇒ v2.28.6+0
  [14a3606d] ↓ MozillaCACerts_jll v2025.5.20 ⇒ v2023.12.12
  [efcefdf7] ↓ PCRE2_jll v10.44.0+1 ⇒ v10.42.0+1
  [83775a58] ↓ Zlib_jll v1.3.1+2 ⇒ v1.2.13+1
  [8e850ede] ↓ nghttp2_jll v1.64.0+1 ⇒ v1.59.0+0
  [3f19e933] ↓ p7zip_jll v17.5.0+2 ⇒ v17.4.0+2

And when going back to 1.12:

(LabWebsite) pkg> up
    Updating registry at `~/.julia/registries/General.toml`
     Project No packages added to or removed from `~/Repos/LabWebsite/Project.toml`
    Updating `~/Repos/LabWebsite/Manifest.toml`
  [aea7be01] ↑ PrecompileTools v1.2.1 ⇒ v1.3.3
  [c8ffd9c3] ↑ MbedTLS_jll v2.28.6+0 ⇒ v2.28.10+0
  [ac6e5ff7] + JuliaSyntaxHighlighting v1.12.0
  [ca575930] ↑ NetworkOptions v1.2.0 ⇒ v1.3.0
  [44cfe95a] ↑ Pkg v1.11.0 ⇒ v1.12.0
  [deac9b47] ↑ LibCURL_jll v8.6.0+0 ⇒ v8.11.1+1
  [e37daf67] ↑ LibGit2_jll v1.7.2+0 ⇒ v1.9.0+0
  [29816b5a] ↑ LibSSH2_jll v1.11.0+1 ⇒ v1.11.3+1
  [14a3606d] ↑ MozillaCACerts_jll v2023.12.12 ⇒ v2025.5.20
  [458c3c95] ↓ OpenSSL_jll v3.5.4+0 ⇒ v3.5.1+0
  [efcefdf7] ↑ PCRE2_jll v10.42.0+1 ⇒ v10.44.0+1
  [83775a58] ↑ Zlib_jll v1.2.13+1 ⇒ v1.3.1+2
  [8e850ede] ↑ nghttp2_jll v1.59.0+0 ⇒ v1.64.0+1
  [3f19e933] ↑ p7zip_jll v17.4.0+2 ⇒ v17.5.0+2

I tried loading Xranklin in 1.12 without updating, but get a bunch of precompile errors. The Project.toml is

[deps]
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
Git = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2"
Hyperscript = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91"
Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306"
NodeJS = "2bd173c7-0d6d-553b-b6af-13a54713934c"
TimeZones = "f269a46b-ccf7-5d73-abea-4c690281aa53"
Xranklin = "558449b0-171e-4e1f-900f-d076a5ddf486"

If anyone has any ideas on how to resolve this, or can point me in a good direction, I’d be happy to try to debug / make a PR to fix it.

You may find some inspiration from

2 Likes

Ah, indeed that looks relevant! Will give that a shot.

1 Like

Seems to work Use invoke latest by kescobo · Pull Request #284 · tlienart/Xranklin.jl · GitHub

2 Likes