Back to Releases

Release notes *2.9.1*

December 12, 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

Improved Export to PDF

We have reworked our exporter once more to make it possible to print large notebooks or render expressions within a bulky notebook. Now, our renderer won't try to rasterize hidden elements and waste resources on them.

New Cell Group Feature

You can now split the notebook into two using this feature starting from the focused cell:

%3Cimg%20src%3D%22attachments%2FScreenshot%25202025-12-05%2520at%252018.38.50-d00.png%22%20width%3D%22300%22%2F%3E

Also, large imported Mathematica notebooks will be automatically split to avoid performance issues with a large number of cells.

Improved GUI of Manipulate

We have improved the layout, as well as added Copy Expression and Copy Parameters options to assist

Minor formatting improvements

AlgebraicNumber

ToNumberField[(*SqB[*)Sqrt[2](*]SqB*), (*SpB[*)Power[2(*|*),(*|*)1/4](*]SpB*)]
(*VB[*)(AlgebraicNumber[Root[-2 + #1^4 & , 2, 0], {0, 0, 1, 0}])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4vkAjLTC13SU3OL0osyS8KBskH5eeXFJ2xrk+bt+CbPQCNIhCc"*)(*]VB*)

New command palette tools!

including Code Beautifier and String Escaper

(* try to apply on this one *)
(* place your cursor here and run Beautify from the command palette *)

f[ω_, eps_, list_List] := eps + Total @ Table[((Power[i[[2]],2])/(Power[i[[1]],2] - Power[ω,2] + I i[[3]] ω)), {i, list}]

n[ω_, params__] := Sqrt[f[ω, params]] 

r[ω_, L_, params__] :=With[{np = n[ω, params]},Power[Abs[((np - 1)/(np + 1))],2]]

Try Bull Running btw 😉

Tabular support

  • is one of new features in Wolfram in a long time, that significantly improves dataset workflow.

We added the corresponding representation to WLJS Notebook with lazy loading and progressive rendering:

Tabular[{{1, 2, 3}, {4, 5, 6}}]
(*VB[*)(tabular158)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJycbGaQapKboJianpOiaGBuk6lomp1rqGiYlJZqYW6QZWxqaAQCbIRZd"*)(*]VB*)

Here is another example

Tabular[{{1, x, Today}, {4, y, Tomorrow}}, {"col1", "col2", "col3"}]
(*VB[*)(tabular164)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKp5qYJRknmyXrGiVamumapKUk61qYWRroJhomGSYnWpqYpxgZAgCLaxXR"*)(*]VB*)
EntityValue[
 EntityClass["Book", "DuneBooks"], {"FirstPublished", "Author", 
  "Image"}, "Tabular"]
(*VB[*)(tabular33)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJ5kbmqUmJhnomhslJumaGBlY6CYZmyXpmpkZWBibm1taWqSZAACBthUb"*)(*]VB*)

InputTerminal

We added a new I/O element to our GUI building blocks

t = InputTerminal[]
(*VB[*)(EventObject[<|"StandardInput" -> OutputStream["/private/var/folders/fs/ch7ddlhn7jz5vyg5k8bbrxyh0000gn/T/m000050493621", 7], "StandardError" -> OutputStream["/private/var/folders/fs/ch7ddlhn7jz5vyg5k8bbrxyh0000gn/T/m000051493621", 8], "Id" -> "08892486-275c-4c18-9dbf-3af499c66145", "View" -> "35618a69-6e0e-48b2-9e96-39a440007831"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKG5uaGVokmlnqmqUapOqaWCQZ6VqmWprpGlsmmpgYGBiYWxgbAgB0mhSP"*)(*]VB*)

It uses the same EventObject interface as most GUI element, but allows to interact with default streams

WriteString[t["StandardOutput"], "Hi There!"];
WriteString[t["StandardError"], Sqrt[1/2]];

Here is a basic echo handler you can make using events interface:

EventHandler[t, {"Command" -> Function[c, c]}];

Evaluate All Cells Button

As many (3) people requested, we added a new button to the top menu

Improved Information

We switched back to our own implementation of the output of Information, have a look:

?Plot
(*VB[*)(FrontEndRef["af697218-bd9d-44c2-9e9c-a6c9c47457aa"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJ6aZWZobGVroJqVYpuiamCQb6VqmWibrJpolWyabmJuYmicmAgCIbRXo"*)(*]VB*)

Or multiple symbols

?Log*
(*VB[*)(FrontEndRef["dac104f9-0b73-4eed-adf6-e3826bb8258d"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKpyQmGxqYpFnqGiSZG+uapKam6CampJnpphpbGJklJVkYmVqkAACR4hY1"*)(*]VB*)

OpenerView

We implemented OpenerView aka spoiler element

OpenerView[{"Show me a plot", Plot[x, {x,0,1}]}, False]
(*VB[*)(Null)(*,*)(*"1:eJwljsEKwjAQRKvoUQ9+QQSvgZYkkN5t8SYY6X3b7qIQu5Km1M831csbZmCYObZ8o1WWZeMm4cK+p+3idgnNE+czdhwgcnDrlFwbt0/iHjyLFwoQb8/xXz8k1IGHWA199cFuitB6dKcUW9CkcqNkXiiQGkwpLZKRJZGyVvctqWJcVmvwI/6O3MOEX1ESJm4="*)(*]VB*)