Repository navigation
Releases: xuesoso/plotty
Release list
v1.5.0
v1.4.0
v1.3.0
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
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,bgcompositing. - 104 tests passing.
🤖 Generated with Claude Code
v1.1.0
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 newtarget_panemoves it. - Figure history: viewer keys
p/k(older),n/j(newer),q(quit); ring size viahist/PLOTTY_HIST. bg/PLOTTY_BGbackground 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
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 atmux+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-detectschafa/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) anddpi(source resolution),
via args orPLOTTY_*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+numpyrequired.
Quick start
import plotty
plotty.enable()
import matplotlib.pyplot as plt
plt.plot([1, 4, 9, 16]) # appears in the plot paneRequirements: Python ≥ 3.7 · tmux ≥ 3.4 (built with sixel) · a sixel-capable
terminal (WezTerm, iTerm2, xterm, xfce-term, …).
v1.0.0
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 atmux+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-detectschafa/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) anddpi(source resolution),
via args orPLOTTY_*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+numpyrequired.
Quick start
import plotty
plotty.enable()
import matplotlib.pyplot as plt
plt.plot([1, 4, 9, 16]) # appears in the plot paneRequirements: Python ≥ 3.7 · tmux ≥ 3.4 (built with sixel) · a sixel-capable
terminal (WezTerm, iTerm2, xterm, xfce-term, …).