Back to Releases

Release notes *2.8.9*

November 20, 2025
docker run -it \
  -v ~/wljs:"/home/wljs/WLJS Notebooks" \
  -v ~/wljs/Licensing:/home/wljs/.WolframEngine/Licensing \
  -e PUID=$(id -u) \
  -e PGID=$(id -g) \
  -p 8000:3000 \
  --name wljs \
  ghcr.io/wljsteam/wljs-notebook:main
brew install --cask wljs-notebook

Support of Molecule framework

We added the missing representation of Molecule symbol

Molecule["NC(=O)C[C@H](C(=O)O)N"]
Molecule[(*VB[*) {"N", "C", "O", "C", Atom["C", "HydrogenCount" -> 1], "C", "O", "O", "N"}, {Bond[{1, 2}, "Single"], Bond[{2, 3}, "Double"], Bond[{2, 4}, "Single"], Bond[{4, 5}, "Single"], Bond[{5, 6}, "Single"], Bond[{6, 7}, "Double"], Bond[{6, 8}, "Single"], Bond[{5, 9}, "Single"]}, {StereochemistryElements -> {<|"StereoType" -> "Tetrahedral", "ChiralCenter" -> 5, "Direction" -> "Counterclockwise"|>}} (*,*)(*"1:eJy1U11LwzAU3fzAjxfBF8GnDcxjYctW0/m2rvsQhoNW92zapFJoG0kTtv17k7a6KcKCMkhves89957zcNMOmR8fNxqN4lYFl60njGevQ85x/kZJILMM842C46bmXKkw4SwX45wsEy4kTqvC9U5hvKaRFDhMaXCnYBQSAiPqWDYKO1a/g2IrdCCyiNPrdtGgh2EHx0d6yIkK86QQ1civrKzd7LirXT0Kmi0TugoutLgqyBQ/tCr6pQpjkgjGNWM7cMZSUmW66cWfezRihAZN1QWgA+Bw6gLbVTeAA4BcfUo4CLd4IMMi4sm7KBE4Ul9FAmhUd2rwG9IHtldDtqeH1bw9bXvFZybizoHEn0zE4YHEFybivd/FkafPJz6t4e0W+lIt77n+oZgs8nRTos9c0h+7WWb6+fhsVT0j87U9U7WhYFnx16XVTV1k4rqktlpmnlyWk/95ujfxVJzqZ4vTgn4AqU8Hpg=="*)(*]VB*)]

Example: check for patterns and highlight them

sulfurOxygenBond = MoleculePattern[{"S", "O"}, {Bond[{1, 2}, "Single"]}];
m = Molecule["4-methylbenzenesulfonic acid"]
Molecule[(*VB[*) {"C", "C", "C", "C", "C", "S", "O", "O", "O", "C", "C", "H", "H", "H", "H", "H", "H", "H", "H"}, {Bond[{1, 2}, "Single"], Bond[{2, 3}, "Aromatic"], Bond[{3, 4}, "Aromatic"], Bond[{4, 5}, "Aromatic"], Bond[{5, 6}, "Single"], Bond[{6, 7}, "Double"], Bond[{6, 8}, "Double"], Bond[{6, 9}, "Single"], Bond[{5, 10}, "Aromatic"], Bond[{10, 11}, "Aromatic"], Bond[{11, 2}, "Aromatic"], Bond[{1, 12}, "Single"], Bond[{1, 13}, "Single"], Bond[{1, 14}, "Single"], Bond[{3, 15}, "Single"], Bond[{4, 16}, "Single"], Bond[{9, 17}, "Single"], Bond[{10, 18}, "Single"], Bond[{11, 19}, "Single"]}, {} (*,*)(*"1:eJy9U11LwzAUnV/48SL4Ivg0wTwWXGpo69u6dpswGDS6Z9MmlULbSJqw7T/5I03a6qYvKwOF9LY595x77sPpbcyj9KjX61U3uvh8NeaieB0KQco3RrEqCiLWGk4PDOdSl7HgpQxLusiEVCRvGldbjXDFEiVJnDN8p2F679pxSpHlIduxHhBEFkkGzHKg59qpPYip56WHZsixLrOsks3I71vdu97art3qSbJikbElPjfmuqFy8thv6Be6hDSTXBjGZuCU57S5GdFLNAtYwinDHxoD0AVwOPEB8vUbQA84vjk1jOMNjlVcJSJ7lzUCR/ppSMAZtUoD/kAcgIIWQoEZ1vJ2yHaaT7uYu39kPu9ibu9rDrEZ7wTmfOknrXwTmEjpnJ2ZD0bovMzXNfosFPsVo/pmkh7xZZP47gk71b2h5EW1b76MaNBp65ra73fbyecl/YedqhPzh5G8Yp8Q1/TL"*)(*]VB*)]
MoleculePlot[m, sulfurOxygenBond]
(*VB[*)(FrontEndRef["07561b8a-d909-45e8-b6a1-540829f8f480"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKG5ibmhkmWSTqplgaWOqamKZa6CaZJRrqmpoYWBhZplmkmVgYAAB39RTz"*)(*]VB*)

3D molecule plot

MoleculePlot3D[m, sulfurOxygenBond]
(*VB[*)(FrontEndRef["71530581-9ce1-4559-9f8a-cdfbf6697ddd"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmxuaGhuYWhjqWianGuqamJpa6lqmWSTqJqekJaWZmVmap6SkAAB2UhW/"*)(*]VB*)

Access to properties of the notebook

You can read and write to the notebook fields using this pattern:

n = EvaluationNotebook[];
n["Properties"]
{"Icon","Init","PublicFields","EvaluationContext","Cells","Self","Properties","Hash","AutorunScript","Controller","ExcalidrawImages","FocusedCell","MessangerChannel","ModalsChannel","Objects","Path","Symbols","TOC","WebSocketQ","Opened","Socket","CellsInitialized","Evaluator"}

Both public and private fields are exposed

Read cells and get their content

n["Cells"][[4]]
%["Data"]
RemoteCellObj["54680020-89cf-4be5-aaa7-057ed347804a"]
%22%23%23%20Support%20of%20Molecule%20framework%5CnWe%20added%20the%20missing%20representation%20of%20%60Molecule%60%20symbol%22

Create, open, save and evaluate external notebooks

We completed the implementation of Notebook API to the point, where you can safely:

Import and evaluate

Import a WLN notebook from a file and then evaluate it (only initialization cells) and collect the last output cell:

pianoNotebook = NotebookOpen[FileNameJoin[{"attachments", "Piano.wln"}], Visible->False];
widget = NotebookEvaluateAsModule[pianoNotebook]
rm4339092060234296039G%60PianoView
widget[] 
(*VB[*)(FrontEndRef["d8295bd8-29e4-4177-903d-4efab547e2d1"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKp1gYWZompVjoGlmmmuiaGJqb61oaGKfomqSmJSaZmpinGqUYAgB+9RWC"*)(*]VB*)

We can open that notebook by

NotebookOpen[pianoNotebook]

Create a notebook

Let's make an empty notebook and then open it

doc = CreateDocument[{
  TextCell["Hello World", "Section"], 
  Plot[x, {x,0,1}]
}, Visible->False];
doc // NotebookOpen;

NextJS & MDX Export

We improved our integration with Next.js & React system. Now all assets are served statically within the library: no CDNs, everyhting is local. And Tailwind framework is no longer required!

Check it out:

Minor Bug Fixes

  • The Triangle and StadiumShape symbol is missing its graphical representation.
  • Tooltip was not rendered inside Graphics.
  • The copying button was missing in the cell properties.
  • There was a bug with printing slide cells.
  • Automatic cache flushing occurs after an update.

Thank You All ❤️

Monumental effort people, you're democratizing Mathematica! Anonymous

This is a fantastic project! keep it up! Anonymous

✨ Monthly financial contribution to WLJS Notebook (€3.00) Jason Cunliffe

✨ Monthly financial contribution to WLJS Notebook (€2.00) Guest