Skip to content

verso-v1.2.1

Choose a tag to compare

@github-actions github-actions released this 08 Aug 15:25
· 9 commits to main since this release

Release making Python widgets live rather than pictures of themselves, so a slider drawn in a cell keeps talking to the interpreter that made it and can drive a computation written in another language, translating the interface into four more languages, opening the space beside the notebook to panels contributed by extensions, giving language kernels a formatter extension point so a package can teach Verso to render its own types, and preferring the native libraries a NuGet package ships over whatever the system offers first.

Upgrade Notes

  • Code written after #!import in the same cell now runs. Everything below the directive used to be discarded without a word. A cell that carries boilerplate under an import, on the assumption it was inert, will execute that code for the first time on this release
  • An extension built against Verso.Abstractions 1.2.0 needs a 1.2.0 or newer host. The host accepts an extension whose referenced minor version is at or below its own, so a 1.1 host declines a 1.2.0 extension and asks for a newer host. Patch versions are never compared, which is why extensions kept loading across the whole 1.1 series
  • Formatter extensions should check context.MimeType in CanFormat. Both new interface members have default implementations, so nothing fails to compile, but a formatter that claims a value it cannot render in the MIME type actually requested is now stepped over rather than allowed to answer

New: Live Python Widgets

  • A rendered ipywidgets or anywidget control now stays connected to the Python interpreter that made it for as long as the session runs. Dragging a slider fires the author's Python callback, and Python changing the value moves the control back, both within a cell and across cells
  • ipywidgets Output areas capture prints, displays and clear_output the way a Jupyter kernel does, so interact and interactive_output behave as documented instead of showing nothing
  • A widget with no interpreter behind it, because the file was just opened, was run from the command line, or its kernel restarted, draws visibly inert with a note to run the cell rather than looking like a control that is simply broken
  • Saving a notebook asks each live widget for its current on-screen state, so the file records what you were looking at rather than whatever the cell first drew
  • A new verso.widgets.assetSource setting chooses where a widget's front end JavaScript loads from. Only cdn works today; bundled is reserved for a copy shipped alongside the notebook
  • A new Interactive Widgets guide covers what separates a live widget from a static one, what a saved file holds, how widgets behave with no network, anywidget support, and the size limits that apply

New: Cross-Language Widget Binding

  • #!bind projects a widget's trait into the notebook's shared variables under a name you choose, in both directions, so a slider built in a Python cell can drive a computation written in C# or F#, and writing that variable moves the slider back
  • #!bind --list shows every trait currently projected as a variable, and #!bind --remove <name> stops one from following its widget without deleting the variable
  • A new DAG Notebook showcase layout makes the notebook dependency-aware: running a cell re-runs the cells that read the variables it defines, in dependency order, so a bound control at the top of the graph cascades a run with nothing else clicked

New: Interface Language

  • Verso's interface ships in German, Spanish, Japanese and Simplified Chinese alongside English, covering the notebook UI, the toolbar and panels, kernel messages that land in cell output, and the command line tool
  • Choose a language with --language or the verso.language setting. With neither, Verso follows VERSO_LANGUAGE, then the operating system's own language, then falls back to English
  • verso serve negotiates a language per browser from its Accept-Language header, or pins one for every visitor with verso serve --language
  • Regional tags resolve sensibly, so de-AT reaches German and zh-CN reaches Simplified Chinese, and a tag Verso does not recognize falls through to the next source instead of failing
  • Numbers, dates and currency keep the machine's own formatting whichever interface language is chosen, so a language never changes what a cell computes or what gets written into a notebook
  • Database connection diagnostics, including provider not found and multiple providers registered, are translated along with everything else
  • Translations are checked on every build for missing keys, orphaned keys, mismatched placeholders and empty strings, and a pseudo-locale flags any string still hardcoded in English

New: Notebook Panels

  • An extension can contribute a panel that sits beside the notebook body and toggles from the toolbar, alongside Verso's own Metadata, Extensions, Variables, Settings and Cell Properties panels, by implementing INotebookPanel
  • A panel describes its content as one or more representations ordered richest first, rather than drawing it directly, so the same panel works on every host including one that never touches a browser. Offering a text/plain alternative beside text/html is what keeps a panel useful everywhere
  • A panel can implement IPanelInteractionHandler to respond to clicks and other actions raised inside it, and call RequestRefresh to have the host ask for its content again after something changes

New: Compare Panel

  • A Compare panel picks a baseline and steps through a notebook's changes one at a time while the notebook itself stays visible. Changed cells carry a colored stripe and a badge reading Added, Removed, Modified or Moved, and selecting an entry scrolls to the cell it describes

New: Formatter Extensions

  • Language kernels can hand a runtime value to registered formatter extensions before applying their own rendering, through a new IExecutionContext.TryFormatAsync. PowerShell is the first kernel wired to it, contributed by @eosfor (#93)
  • A formatter extension can declare itself a fallback, so it runs only for an explicit Display call and steps aside when a specialized formatter is present. PowerShell output that no extension claims renders exactly as it did before, through the same table and list formatting, contributed by @eosfor (#93)

Improved: Native Library Resolution

  • A package's own native libraries are now preferred over a same-named library found elsewhere on the system, fixing a class of failure where a plotting library such as ScottPlot died on a native version mismatch it had nothing to do with. Reported and diagnosed by @oxygen-dioxide (#91)
  • Natives resolve against the running process's own architecture and C library rather than the machine's, so a session under architecture emulation, or on a musl based distribution such as Alpine, no longer reaches for a binary it cannot run
  • A native that ships in a separately versioned companion package, as the SQL Server client's networking library does, is now found reliably, and switching a package to another version mid-session no longer risks handing it the wrong version's native
  • An extension that depends on a native library keeps working after a restart, instead of only in the session that installed it

Improved: Python Package Handling

  • A #!pip line naming only packages already present neither runs the installer nor prints anything, so leaving one at the top of a cell you rerun costs nothing after the first time
  • An import that fails on a typo or a missing submodule of a package you already have, such as pandas.frame, is no longer offered as something Verso can install. Only a genuinely absent distribution is

Improved: Extensions Panel

  • Rebuilt as a single list with each package's install state on its own row, in place of three stacked lists, and now showing a package's own icon, publisher, description, download count and capability chips
  • Search results say which package source they came from, rather than the panel assuming everything is from nuget.org
  • Verso's own packages now carry an icon on nuget.org

Improved: Appearance

  • Themes gain an elevation scale for shadows and a shape scale for corner radii, plus AccentForeground, BgSunken and FgSubtle, each exposed as a --verso-elevation-*, --verso-shape-* or --verso-* custom property a theme or layout extension can read. A theme written before this release keeps working and picks up sensible defaults
  • Cells and buttons carry slightly rounder corners, the toolbar is a little taller, and cards, panels and dialogs cast a subtle shadow that lifts them off the page
  • Tooltips across the toolbar and panels replace the browser's own with a faster styled one, and every icon-only button now has an accessible name

Improved: Documentation and Samples

  • A new Sharing a Notebook guide covers turning a GitHub, GitLab or gist URL into a read-only page by swapping the host, pinning a link to a commit so it never moves, and pasting a ready-made Open in Verso badge into a README. It also spells out how a shared page renders: a Markdown file splits into the cells the editor would show, relative images and links are fetched from the repository, a relative link to another notebook opens as a page here rather than on the forge, and every page carries a View source button back to the original file
  • Two PowerShell sample notebooks: micrograd builds an automatic differentiation engine from scratch, renders its computation graph, and trains a small multi-layer perceptron, and mnist reuses that engine on real handwritten digits. Contributed by @eosfor (#92)
  • The README gains screenshots of the dashboard, presentation and compare views, expanded prose on kernels, layouts, panels, parameters and the Python interpreter, and links to the gallery, docs and API reference
  • The embedding guide's execution-event example is corrected: OnCellExecuted, OnCellExecuting and OnCellOutputUpdated each take an Action<Guid>, so the example now reads ExecutionCount, LastElapsed and LastStatus off the cell

Fixed

  • A #!import written inside a file that is itself imported now runs, instead of being dropped as inert text, and its own directives run in priority order
  • A relative path in a nested #!import resolves against the directory of the file that wrote it, falling back to the notebook's directory, so a folder of helper files that import one another works wherever the notebook lives
  • Two files that import each other stop cleanly instead of recursing until the process gives out
  • Display with an explicit MIME type is honored by the built-in DataTable, SQL result set and F# formatters, so asking for application/json or plain text no longer returns an HTML table regardless, contributed by @eosfor (#93)
  • A live widget no longer loses its connection and rebuilds from a stale snapshot when autosave writes the notebook out from under it
  • Comparing a notebook against a baseline no longer marks a cell changed because an output rendered on open, such as a Markdown preview, differs from what the file stored
  • Opening a notebook that uses a custom layout or an extension panel through verso serve no longer throws during the server's prerender pass
  • Scrolling to a selected cell waits until its editor has both a position and a size, so a cell whose editor grows after layout no longer settles below the fold