Skip to content

Releases: xuesoso/plotty

v1.5.0

Choose a tag to compare

@xuesoso xuesoso released this 26 Jun 00:29
f4e85ce

What's Changed

  • feat: render plotly figures in the plot pane (v1.5.0) by @xuesoso in #7

Full Changelog: v1.4.0...v1.5.0

v1.4.0

Choose a tag to compare

@xuesoso xuesoso released this 24 Jun 03:13
2b6d23f

What's Changed

  • Per-window cache, adaptive split direction, close pane on disable (v1.4.0) by @xuesoso in #6

Full Changelog: v1.3.0...v1.4.0

v1.3.0

Choose a tag to compare

@xuesoso xuesoso released this 24 Jun 02:18
1609366

plotty v1.3.0 — Dedicated display pane

plotty now keeps its own dedicated plot pane instead of drawing into "the last pane" of your tmux window — so it never clobbers an editor, logs, or any pane you opened yourself. The pane also self-heals when it goes away.

✨ Highlights

  • Dedicated pane by default. enable() (i.e. target_pane="auto") splits off a plot pane tagged with the @plotty tmux option and reuses it across calls — even from a different process. It will never pipe escape bytes into a pane you're using for something else.
  • Auto-recreate when closed. If you kill the plot pane, plotty silently splits and tags a fresh one on the next figure (and restarts the viewer), instead of erroring with can't find pane: %N on every plot.
  • Clean teardown on interrupt. Pressing Ctrl+C or q in a plotty-owned plot pane now closes that pane (the next figure opens a fresh one) rather than stranding you at a shell prompt with a stale plot and no navigation. A pane you passed via target_pane is left untouched.

🔧 Notes

  • Explicit targets are unchanged: enable(target_pane=2), a negative index (-1 = last), a named target (sess:win.pane), or PLOTTY_PANE all bypass the dedicated-pane logic and behave exactly as before.
  • Inline mode no longer falls back to dumping sixel into your REPL when the target pane's tty is gone.

🧰 Maintenance

  • CI: bump actions/checkout 6.0.3 → 7.0.0 (#4)

Full changelog: v1.2.0...v1.3.0

v1.2.0

Choose a tag to compare

@xuesoso xuesoso released this 12 Jun 06:52
960fd13

Highlights

Image display on ghostty and kitty — robust inside tmux. plotty now ships a second built-in encoder using the kitty graphics protocol with Unicode placeholders: image data is transmitted once, while placement is plain placeholder text that tmux tracks in its grid — so plots survive pane resize, zoom, and pane switches on terminals that don't render sixel. Requires tmux set -g allow-passthrough on (plotty warns if it's off); single tmux layer (local or one remote over SSH) — use a sixel terminal for nested tmux.

Protocol-aware default. plotty.enable() now auto-detects the terminal: sixel-capable → built-in sixel encoder; ghostty/kitty → built-in kitty-graphics encoder. Terminal identity beats advertised features, so a terminal-features ',*:sixel' override can't mislead detection on terminals that can't render sixel.

Changed

  • imgcat="auto" now means protocol detection between the two built-in encoders; it no longer scans PATH for external tools. External sixel encoders remain explicit opt-ins: imgcat="chafa" / "img2sixel" / "magick".
  • imgcat="builtin" forces the sixel encoder; imgcat="kitty" forces the kitty-graphics encoder.

Notes

  • All existing features work through the new encoder: viewer mode (history keys, live settings), inline mode, size, dpi, bg compositing.
  • 104 tests passing.

🤖 Generated with Claude Code

v1.1.0

Choose a tag to compare

@xuesoso xuesoso released this 11 Jun 06:24
c73ae05

Highlights

Zero dependencies by default — the built-in sixel encoder is now the default renderer. External encoders are explicit opt-ins: enable(imgcat="chafa") / "img2sixel" / "magick" (slightly faster, better resampling/dithering), or enable(imgcat="auto") for the previous PATH auto-detection.

Fixed

  • Viewer can no longer crash when its session/pty is torn down (self-pipe event loop, guarded I/O, always exits 0) — eliminates macOS "Python quit unexpectedly" dialogs.
  • Stale/recycled pids are validated before signalling — plotty can never terminate an unrelated process.
  • plotty never injects bytes into the console you type in: single-pane tmux windows get an auto-split plot pane; outside tmux, non-sixel terminals (IDE consoles) get a clear warning instead of escape garbage.

Added

  • Live settings: re-running enable(size=…, bg=…, imgcat=…) updates a running viewer without restart; a new target_pane moves it.
  • Figure history: viewer keys p/k (older), n/j (newer), q (quit); ring size via hist/PLOTTY_HIST.
  • bg/PLOTTY_BG background compositing for dark terminals.
  • status() diagnostics, save(path), show(fig) for non-pyplot figures, disable(close_pane=True), __version__.

Performance

  • Built-in quantizer ~15× faster (distinct-color weighted median-cut; lossless ≤256 colors); figures written once instead of twice.

Breaking

  • Setups that relied on silent chafa/img2sixel auto-detection now use the built-in encoder. Pass imgcat="auto" to restore the old behavior.

🤖 Generated with Claude Code

v1.0.0-publish

Choose a tag to compare

@xuesoso xuesoso released this 07 Jun 06:52

plotty v1.0.0

Inline matplotlib plots in your terminal — rendered as sixel in a dedicated
tmux pane, including over SSH. No browser, no X11, no Jupyter server.

Highlights

  • Terminal-native matplotlib backend. import plotty; plotty.enable() and
    your figures show up in a tmux pane next to your REPL — the notebook experience
    for a tmux + ipython (+ nvim) workflow.
  • Works over SSH, identically to local. Only rendered sixel bytes cross the
    wire; the control plane (signals, pidfile, image hand-off) stays host-local.
  • Nested tmux support (local tmux → ssh → remote tmux) with a one-line,
    one-time tmux config.
  • Built-in, dependency-free sixel encoder (pure stdlib + numpy) — works out
    of the box with zero external tools. Auto-detects chafa / img2sixel /
    ImageMagick for higher-quality output when available. Sixel-only, by design,
    for SSH robustness.
  • Two display modes: a viewer process that auto-redraws on pane
    resize/zoom (default in tmux), and a lightweight inline mode that pipes sixel
    straight to the pane's tty or your stdout (works without tmux too).
  • Auto-display in IPython after every cell — no plt.show() needed.
  • Tunable display — size (width in cells) and dpi (source resolution),
    via args or PLOTTY_* env vars.
  • Startup health check that flags missing tmux sixel support and tells you
    exactly what to fix.
  • Tiny footprint: Python ≥ 3.7, only matplotlib + numpy required.

Quick start

import plotty
plotty.enable()

import matplotlib.pyplot as plt
plt.plot([1, 4, 9, 16])     # appears in the plot pane

Requirements: Python ≥ 3.7 · tmux ≥ 3.4 (built with sixel) · a sixel-capable
terminal (WezTerm, iTerm2, xterm, xfce-term, …).

v1.0.0

Choose a tag to compare

@xuesoso xuesoso released this 07 Jun 06:26

plotty v1.0.0

Inline matplotlib plots in your terminal — rendered as sixel in a dedicated
tmux pane, including over SSH. No browser, no X11, no Jupyter server.

Highlights

  • Terminal-native matplotlib backend. import plotty; plotty.enable() and
    your figures show up in a tmux pane next to your REPL — the notebook experience
    for a tmux + ipython (+ nvim) workflow.
  • Works over SSH, identically to local. Only rendered sixel bytes cross the
    wire; the control plane (signals, pidfile, image hand-off) stays host-local.
  • Nested tmux support (local tmux → ssh → remote tmux) with a one-line,
    one-time tmux config.
  • Built-in, dependency-free sixel encoder (pure stdlib + numpy) — works out
    of the box with zero external tools. Auto-detects chafa / img2sixel /
    ImageMagick for higher-quality output when available. Sixel-only, by design,
    for SSH robustness.
  • Two display modes: a viewer process that auto-redraws on pane
    resize/zoom (default in tmux), and a lightweight inline mode that pipes sixel
    straight to the pane's tty or your stdout (works without tmux too).
  • Auto-display in IPython after every cell — no plt.show() needed.
  • Tunable display — size (width in cells) and dpi (source resolution),
    via args or PLOTTY_* env vars.
  • Startup health check that flags missing tmux sixel support and tells you
    exactly what to fix.
  • Tiny footprint: Python ≥ 3.7, only matplotlib + numpy required.

Quick start

import plotty
plotty.enable()

import matplotlib.pyplot as plt
plt.plot([1, 4, 9, 16])     # appears in the plot pane

Requirements: Python ≥ 3.7 · tmux ≥ 3.4 (built with sixel) · a sixel-capable
terminal (WezTerm, iTerm2, xterm, xfce-term, …).