[ANN] Sessions.jl, A terminal-native Julia notebook built on Pluto.jl's reactive engine and Tachikoma.jl

Sessions.jl

A terminal-native Julia notebook built on Pluto.jl’s reactive engine and Tachikoma.jl.

Docs
License: MIT


Warning: This is an experimental, alpha-quality project. It was largely built by AI agents (Claude Code), is untested outside of its own test suite, has rough edges everywhere, and may never reach the goals described below. If you need a reliable reactive notebook today, use Pluto.jl – it’s excellent. This exists because building it is fun and the ideas are worth exploring.



Why This Exists

Over the past couple of months I’ve been shifting more and more toward agent-driven development – LLMs writing code, running tests, iterating in the terminal. The terminal has become the center of my workflow, and I wanted Pluto’s reactive model there too. Pluto is great, but having an agent edit a notebook externally gets clunky – restarts, lost changes, package state getting out of sync. Sessions.jl splits the notebook into two files – pure code in .jl, cached outputs in .session.toml – so agents, scripts, and editors can freely modify cells without breaking anything.

The other motivation is having a playground for ideas that are too experimental for Pluto itself. Pluto is a widely-used, carefully-maintained package – it’s not the place to test half-baked integrations with bleeding-edge tools. Sessions.jl is small enough and unimportant enough to be a testing ground. If something turns out well, maybe it can inform upstream work in the Pluto ecosystem.

Sessions.jl is pure Julia through and through – the TUI, the reactivity engine. No JavaScript, no Electron, no browser. Just Julia in a terminal.

Note: This could also be useful in cluster/HPC environments and headless servers – anywhere you SSH in and there’s no browser. Agents in a terminal, notebooks in a terminal, everything in a terminal. Whether it actually gets there is another question.

Built On

Sessions.jl uses Pluto.jl’s file format, ExpressionExplorer.jl for reactive analysis, PlutoDependencyExplorer.jl for cell ordering, and AbstractPlutoDingetjes.jl for the @bind protocol. The TUI is built on Tachikoma.jl. Notebooks are compatible with Pluto – you can open the same .jl file in either.

Installation

Requires Julia 1.12+.

using Pkg
Pkg.Apps.add(url="https://github.com/GroupTherapyOrg/Sessions.jl")

This installs the sessions command to ~/.julia/bin/. On first launch, JETLS (real-time diagnostics) is auto-installed.

Quick Start

# Open a notebook
sessions my_notebook.jl

# Create a new notebook
sessions

# Run headlessly (CI, scripts)
sessions run my_notebook.jl

Or from the Julia REPL:

using Sessions
Sessions.main("my_notebook.jl")

Code/State Separation: .jl + .session.toml

Sessions.jl splits your notebook into two files:

File Contains Role
notebook.jl Cell code, cell order, fold/disabled metadata Source of truth – safe for agents and tools to modify
notebook.session.toml Cached outputs, stdout, runtime, error messages Execution cache – optional, can be deleted and regenerated

The .jl file is pure code. An LLM agent, an IDE, or a shell script can modify cell code freely – the cached outputs live separately in .session.toml and are never corrupted by code edits. A file watcher detects external changes within a second, marks modified cells as stale, and lets you re-run when ready.

@bind Widgets

Sessions.jl implements the AbstractPlutoDingetjes @bind protocol:

@bind x Slider(1:100)
@bind name TextField()
@bind flag CheckBox()
@bind choice Select(["A", "B", "C"])
@bind n NumberField(1:10)

Other Experiments

Things baked in or being explored – none production-ready, all subject to being ripped out:

  • JETLS integration – Real-time JET.jl diagnostics via LSP, catching type errors as you write
  • Runic.jl formatting – Auto-format cells on save
  • WebAssembly export – Compiling notebook interactivity to WASM via WasmTarget.jl so exported notebooks don’t need a running Julia server. Right now it barely works for sliders. Compiling real Julia to WASM is really hard and this will probably not go anywhere, but it’s fun to try.
  • etc.

License

MIT

12 Likes

Installing needs

ERROR: expected package `Therapy [b2c3d4e5]` to be registered

and GitHub - GroupTherapyOrg/WasmTarget.jl · GitHub which I all failed to install.