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.