All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.1.1 - 2026-04-30
Added
- README demo GIF (
assets/demo.gif) showing aKino.ExRatatuiwidget driving anExRatatui.Appinside a Livebook notebook.
0.1.0 - 2026-04-29
Added
- First release.
kino_ex_ratatuiruns anExRatatui.Appinside a Livebook notebook via xterm.js, implemented as a ~150-lineKino.JS.Livewidget on top ofExRatatui.Transport.ByteStream. Two entry points:Kino.ExRatatui.new/2for live App-driven kinos,Kino.ExRatatui.frame/2for one-shot static frames suitable for docs andKino.Layout.grid/1side-by-side comparisons. - JS bundle under
assets/—@xterm/xterm5.5 +@xterm/addon-fit0.10 bundled with esbuild 0.28 tolib/assets/kino_ex_ratatui/{main.js,main.css}. The bundle is committed so installing the hex package needs no Node toolchain.mix assets.installandmix assets.buildaliases are provided for contributors. - Lazy lifecycle. The runtime server and
ExRatatui.Sessionare created on the first"resize"event from the iframe, so dimensions always come from xterm.js'sFitAddonrather than a hardcoded default. Subsequent resize events flow throughByteStream.forward_resize/4. When the App returns{:stop, _}(ormount/1fails), the widget broadcasts the canonical alt-screen leave sequence so xterm.js restores its cursor and main buffer. - Test suite — 22 tests via
Kino.Test'sconfigure_livebook_bridge+push_event/3+assert_broadcast_event/3, covering: lazy boot, mount-opts pass-through, handleconnect payload, first/subsequent resize, input round-trip, input arriving before first resize, server:DOWN, terminate cleanup, mount failure, unrelatedhandle_infomessages, and `_assets_info/0. Runs async in 0.2s, 100% line coverage (test fixtures excluded viatest_coverage: [ignore_modules: [...]]`). - Three bundled example notebooks under
examples/—system_monitor.livemd(callback-runtime dashboard portingex_ratatui/examples/system_monitor.exswithGauge,Table,/procpolling),chat_interface.livemd(callback-runtime AI-chat mock exercisingMarkdown,Textarea,Throbber,Scrollbar, and/-prefixedSlashCommandsautocomplete viaPopup— ported from the original imperativeExRatatui.run/1loop inex_ratatui/examples/chat_interface.exs), andreducer_counter.livemd(reducer-runtime counter with aSubscription.intervalplus aKino.ExRatatui.frame/2static-frame demo). Each notebook cross-references the other two and links to the relevant runtime guide so any one of them is a complete jumping-off point.