> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trainy.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Release history for Pluto SDK and Pluto Server.

## Changelog

### v0.0.41 (Server) — 2026-04-24

Side-by-side comparison performance fixes, runs-table bugfixes, and backend memory hardening.

**Changes:**

* Fix side-by-side view lag: hidden dashboard tree was still mounted, so chart queries, dynamic-section regex queries, and timers kept running in the background
* Fix Config section in side-by-side rendering every row up front (thousands of `JSON.stringify` and inline-diff passes per click) — now lazy
* Fix runs table where deselecting a URL-linked run could leave selection in a broken state
* Backend: trim `runs.list` responses to only return field values for visible columns (avoids \~17 MB responses on Hydra-style configs); kill duplicate `runs.list` queries from a localStorage/saved-view pageSize mismatch and from `refetchType: "all"` over stale cache entries; pause auto-refresh when the browser tab is hidden
* Runs table pageSize is now stored per saved view (DB) instead of in browser localStorage — every saved view (Default and custom presets) carries its own `config.pageSize`, and pageSize changes in the dropdown only persist when you save the active view

***

### v0.0.20 — 2026-04-23

wandb dual-logging, run-lifecycle improvements, and broader display-ID acceptance in the query API.

**SDK Changes:**

* **wandb dual-logging via a `.pth` import hook** — set `PLUTO_API_KEY` (and either `PLUTO_PROJECT` or your existing `WANDB_PROJECT`) and every `wandb.log()` also logs to Pluto, with no code changes. Set `DISABLE_WANDB_LOGGING=true` for Pluto-only mode. See [Weights & Biases Migration](/pluto/wandb-migration).
* **New `run.close()`** — local teardown without marking the run complete on the server. Unregisters the `atexit` hook so a side process that attaches to an active run can exit without ending it. See [Run Lifecycle](/pluto/run-lifecycle#ending-a-run).
* **Display IDs accepted in every query helper** — `get_metrics`, `get_statistics`, `get_files`, `download_file`, `get_logs`, and `compare_runs` now take a display ID like `"MMP-42"` in addition to numeric IDs. Previously only `get_run()` did.
* **Deep merge for config inheritance** — `pluto.init(fork_run_id=..., inherit_config=True, config=...)` now deep-merges your override into the parent's config (was shallow). `run.update_config()` is also deep-merge now.
* Run forking via `pluto.init(fork_run_id=..., fork_step=...)` (preview) — info-log emitted at init time.
* Internal: scope Sentry exception reporting to pluto-touching code only.

***

### v0.0.40 (Server) — 2026-04-16

Ops-only release hardening backend memory under load.

**Changes:**

* Cap L1 cache memory to prevent backend pod OOM under bursty load
* Add `runs.list` memory-pressure regression test that fails on dead bursts (not isolated 503s)
* Add hybrid-auth test infra for L1 cache regression testing

***

### v0.0.39 (Server) — 2026-04-15

Run status-transition timeline, per-widget best-step pinning, multi-sample media nav, and chart-perf improvements.

**Changes:**

* Add durable run-status transition timeline on the run summary page; new `GET /api/runs/status/history` endpoint and `runs.statusHistory` tRPC procedure
* Apply terminal-status precedence (`FAILED > CANCELLED > TERMINATED > COMPLETED`) for `api`-source writes so DDP fan-out collapses to a single timeline entry and a late `COMPLETED` can't clobber a `FAILED`
* Per-widget best-step pinning so each image widget gets its own argmin/argmax step per run (no more "No image at step N" placeholders when one widget happens to lack the metric's argmax step)
* Scoped unpin for cross-panel and best-step pins: dropdown with **Unpin this image** vs **Unpin across all panels**
* **Multi-sample media nav (`◀ i / N ▶`)** for wandb-style list-of-media logging across images, audio, and video — in both the Charts tab and the Dashboards tab. Previously the multi-group renderer dropped all but one sample per `(run, step)`
* Inline ↔ fullscreen sample-index sync; pin remembers the active sample index across Charts ↔ Dashboards tab switches
* Image fullscreen: zoom floor lowered to 10% (20% step), `Ctrl + scroll` for fine zoom; centered images instead of stuck at the top of the container; phantom-scrollbar fix
* Chart performance: zoom + bounds CTE, metric-discovery cache, TTL memoization
* Replace `smartDateFormatter` with `formatAbsoluteTimeTooltip` for tooltips
* Patch 23 high-severity dependency security alerts; bump ClickHouse query log line length

***

### v0.0.38 (Server) — 2026-04-10

Per-run image pinning and metric-driven best-step pinning land.

**Changes:**

* **Per-run image pinning**: pin individual runs at specific steps in multi-run image comparison. Pinned runs stay frozen while the global stepper drives others. Two scopes — pin in a single panel (◇) or across all panels (◈)
* **Best-step pinning**: in the runs table, click a metric column header → "Pin steppers at min/max value" → each run gets pinned at its own argmin/argmax step (★). Backed by ClickHouse `argMin` / `argMax` aggregates
* **"With image" variants** of the best-step actions, restricting argmin/argmax to steps where an image actually exists for that run
* **Find best step** submenu rename with a Target icon and clearer wording
* **Clear All Pins** button in the Image Settings popover
* UI polish: smaller run-name labels (truncate + title tooltip), max 2 images per row, default stepper to max step, distinct pin-type colors and symbols, fullscreen pinned indicator

***

### v0.0.19 — 2026-04-09

Internal robustness fixes.

**SDK Changes:**

* Handle headless sessions during run init
* Suppress Sentry breadcrumbs from internal Pluto trigger endpoint requests so user telemetry isn't polluted

***

### v0.0.37 (Server) — 2026-04-08

Chart bugfixes, performance improvements, and a new step deduplication feature for line charts.

**Changes:**

* Add query-time step deduplication toggle for line charts to eliminate duplicate values from distributed training
* Add maintenance window banner with localStorage-based dismissal
* Fix Y-axis not rescaling when hiding/unhiding runs via the eye icon
* Fix X-axis not shrinking when hiding runs with wider data ranges
* Fix cursor sync not working across charts until first click
* Fix tooltip search breaking the table layout
* Fix pinned tooltip not updating highlight when moving mouse vertically or across charts
* Fix hidden runs with no data still appearing in the tooltip
* Fix tooltip pinning failing in sparse chart regions
* Performance: reduce tooltip DOM elements from N (one per chart) to a single shared instance
* Performance: fix fullscreen open/close lag on dashboard widgets by replacing React state with DOM class toggle
* Fix fullscreen legend sidebar not highlighting the hovered run
* Fix dynamic section widget bugs (stale widgets on last-run deselect, widget count mismatch when hiding runs)
* Fix dashboard search false positives on collapsed dynamic sections

***

### v0.0.18 — 2026-04-06

Added Sentry telemetry for error tracking and pinned httpx to fix a compatibility issue.

**SDK Changes:**

* Add Sentry telemetry for error tracking (disabled in CI)
* Pin httpx \< 1.0 to fix TypeError on `verify` keyword argument

***

### v0.0.36 (Server) — 2026-04-03

Run forking, saveable table views, MCP OAuth support, and dashboard bugfixes.

**Changes:**

* Add Neptune-style run forking with inherited metrics
* Add saveable default run table views with view presets
* Add OAuth 2.1 authorization server for MCP client authentication
* Add downsampling algorithm parameter to lineage metrics query
* Fix dashboard charts incorrectly showing in dynamic sections
* Resolve various search issues and apply UI polish
* Fix fullscreen image scrolling and add dynamic tab titles
* Fall back to PUBLIC\_URL for Pluto API URL in MCP server

***

### v0.0.15 — 2026-03-27

Removed the SDK signal handler to fix cleanup issues in multi-process training setups. Server v0.0.33 brings major performance improvements across the board.

**SDK Changes:**

* Remove signal handler to prevent interference with user process signal handling in distributed training

**Server Changes (v0.0.33):**

* Performance: Add multi-metric batch endpoint for faster chart data loading
* Performance: Add columnar JSON serialization, Redis caching, and zoom query optimizations for reduced latency
* Add incremental DOM updates for tooltips to eliminate re-render jank
* Fix NaN marker colors to match their parent series colors
* Fix step sync and fullscreen behavior for non-chart media widgets (images, audio, video)
* Fix ClickHouse regex compilation errors from dashboard metric patterns

***

### v0.0.14 — 2026-03-24

Added `pluto sync` CLI command to recover data from crashed runs, and fixed sys metrics stepping independently from training metrics. Server v0.0.31 is a major UI release with Y-axis drag zoom, NaN/Inf markers, chart resolution controls, and significant performance improvements.

**SDK Changes:**

* Add `pluto sync` CLI command to retry uploading queued logs from crashed or interrupted runs
* Fix system metrics to use an independent stepper (no longer tied to training step cadence)
* Upgrade git detection log messages from debug to warning level

**Server Changes (v0.0.31):**

* Add Y-axis drag-to-zoom support for line charts
* Add visual markers for non-finite values (NaN, Inf, -Inf) on chart series
* Add chart resolution control to reduce implicit smoothing from downsampling
* Add hovered series highlighting across tooltip and runs table row
* Add step navigation to fullscreen image viewer with sticky steppers
* Add page jumping support for runs table pagination
* Add Python repr parsing and JSON pretty-print by default in side-by-side comparison
* Add pagination support to the `query_logs` MCP tool
* Add AbortSignal support for cancelling in-flight queries
* Persist legend-toggled series visibility across chart zoom interactions
* Make tags cell responsive with dynamic tag visibility based on column width
* Fix notes popover vanishing before user can type
* Fix zoom reset for hidden runs and `?runs=` deep links for off-page runs
* Fix display ID resolution in batch graph procedures during zoom refetch
* Fix legend value cell layout to prevent flicker on hover
* Fix focus and interaction issues in fullscreen chart dialogs
* Performance: group-level chart virtualization and query deduplication
* Performance: fast deep pagination via cursor lookup
* Performance: prefetch chart data when run IDs are present in URL
* Performance: suppress background chart painting during fullscreen mode

***

### v0.0.30 (Server) — 2026-03-19

Run comparison and charting improvements with cross-panel step sync, fullscreen legend sidebar, and inline config diffs.

**Changes:**

* Add cross-panel step sync with stepper UI for navigating training steps across charts
* Add fullscreen legend sidebar for chart comparisons
* Add configurable max series limit for line charts
* Add inline text diff and JSON pretty-print to side-by-side run comparison view
* Make table pagination input editable for direct page navigation
* Hide files and media for hidden runs
* Make matplotlib an optional dependency in the MCP server
* Fix hidden run state not persisting across component remounts
* Fix config data missing from table views and side-by-side comparison

***

### v0.0.13 — 2026-03-16

Added Claude AI skills integration for experiment tracking and fixed a bug with config updates.

**SDK Changes:**

* Add Claude AI skills for experiment tracking
* Fix JSON serialization bug in `update_config` that yielded 400 error on ingest

**Server Changes (v0.0.28):**

* Add chart visualization tools to MCP server for metrics and run comparisons
* Add drag-and-drop section reordering in dashboard edit mode
* Separate selected vs visible runs for independent chart visibility control
* Use distinct colors for metrics in single-run multi-metric charts
* Fix phantom runs appearing in pagination after deselecting all runs
* Fix fullscreen chart dialog closing when interacting with tooltip
* Fix metric column sorting breaking pagination
* Fix race condition in run selection between URL params and cache
* Fix relative time zoom sync and add step range translation
* Fix relative time offset by parsing ClickHouse timestamps as UTC
* Fix zoom group isolation and cross-axis sync issues
* Add error logging for column key extraction failures

***

### v0.0.12 — 2026-03-12

Fixed a bug where runs that ended with an unhandled exception were incorrectly marked as COMPLETED instead of FAILED.

**SDK Changes:**

* Fix runs with unhandled exceptions incorrectly marked as COMPLETED

***

### v0.0.11 — 2026-03-10

Fixed a collision bug where user-seeded random state could cause duplicate run external IDs. Server adds server-side downsampling, dashboard copy/paste, and major charting improvements.

**SDK Changes:**

* Fix run external ID collisions when users seed global random state

**Server Changes (v0.0.26):**

* Add server-side bucketed downsampling for charts
* Add widget copy/paste functionality to dashboard builder
* Add log-scale scientific notation formatting for chart axes
* Add customizable tooltip columns with search filtering
* Add optimistic concurrency control for dashboard edits
* Improve chart emphasis visibility and color palette
* Improve log scale axis label formatting for wide value ranges
* Show tooltip for long tags that get truncated in the runs table
* Fix `?runs=` URL deep-link for runs not on the first page
* Fix side-by-side config diffs not loading on initial page load
* Fix relative time scale consistency across multiple runs
* Fix dashboard widget height regression
* Fix selected runs pagination, cross-page hover, and search/dashboard persistence
* Fix dashboard concurrency warning not triggering
* Remove cross-axis zoom translation in run comparison view
* Resolve high and critical security alerts

***

### v0.0.10 — 2026-03-05

Fixed a bug where heartbeat retries could cause `finish()` to hang when the server returned errors. Added support for resuming runs by display ID or numeric ID.

**SDK Changes:**

* Fix heartbeat retries causing `finish()` to hang on server errors
* Support resuming runs by display ID or numeric ID

**Server Changes (v0.0.25):**

* Add resume run endpoint to allow re-opening completed runs
* Add write tools (`update_tags`, `update_notes`) to MCP server
* Add toggle buttons and keyboard shortcuts to hide/show the run list and graphs panels
* Pin selected runs to top of the runs table
* Add Run ID column to Linear issue sync table
* Add display ID search support to run search queries
* Add skip-missing-values option to line charts
* Improve fuzzy search matching precision and reduce false positives
* Replace print statements with logging and fix session management in Python client

***

### v0.0.24 (Server) — 2026-03-04

Charting improvements including custom x-axis metric selection and persistent zoom across data refreshes.

**Changes:**

* Auto-hide empty pattern-matched chart widgets
* Fix run-scoped metric queries hitting the wrong table
* Add tooltips and improve text overflow handling across UI components
* Add custom x-axis metrics support for dashboard widgets with searchable combobox
* Fix zoom not persisting on virtualized charts after data refresh

***

### v0.0.23 (Server) — 2026-03-02

Added widget search to dashboards and a metrics display in the file tree view, plus several bugfixes.

**Changes:**

* Add widget search functionality to dashboard builder (with fix for hidden widget deletion)
* Fix Y-axis range calculation when chart passes null data bounds
* Add metrics display to file tree view
* Run page toolbar parity improvements, histogram canvas unification, and bugfixes

***

### v0.0.9 — 2026-02-26

**Breaking change:** The environment variable `PLUTO_API_TOKEN` has been renamed to `PLUTO_API_KEY`. Update your configuration accordingly.

**SDK Changes:**

* Rename `PLUTO_API_TOKEN` to `PLUTO_API_KEY` for consistency

**Server Changes (v0.0.22):**

* Overhaul custom dashboards with dynamic sections, widget improvements, and UX polish
* Fix duplicate tooltip appearing when another tooltip is pinned
* Fix widget config properties being stripped by schema validation
* Add per-chart log scale overrides to chart settings popover

***

### v0.0.8 — 2026-02-24

Added Neptune query compatibility and automatic git commit/version logging. Major charting performance improvements on the server side.

**SDK Changes:**

* Add Neptune query compatibility shim for easier migration
* Automatically log git commit hash and SDK version with each run

**Server Changes (v0.0.20, v0.0.21):**

* Use virtualized charts in custom dashboards to unmount off-screen charts for better performance
* Fix tooltip flickering on scroll events
* Fix log scale Y-axis with manual bounds and zoom behavior
* Fix cross-chart highlight dimming all series in single-metric charts
* Fix chart zoom synchronization across X-axes
* Add tooltip to display all tags on overflow
* Fix CORS headers on error responses
* Pin select, status, and name columns in runs table

***

### v0.0.19 (Server) — 2026-02-23

Performance fix for slow tooltip rendering on the dashboard view.

**Changes:**

* Fix slow tooltips on dashboard view

***

### v0.0.7 — 2026-02-20

SDK now automatically captures system information including OS, CUDA, NCCL, and InfiniBand details. Server adds multi-metric chart support with glob and regex search.

**SDK Changes:**

* Automatically capture OS, CUDA, NCCL, and InfiniBand system info
* Fix `run_id` not being passed in Neptune compatibility wrapper

**Server Changes (v0.0.17):**

* Add multi-metric charts with glob search, regex search, and dynamic metric selection
* Support NaN, Infinity, and -Infinity in metric values

***

### v0.0.16 (Server) — 2026-02-19

Major improvements to search, charting, and editing workflows.

**Changes:**

* Add two-stage fuzzy search with backend similarity matching and client-side Fuse.js filtering
* Add min/max envelope downsampling and zoom-aware chart rendering
* Add optimistic updates for tag and notes mutations
* Add display ID support for run labels in charts
* Add localStorage draft save and navigation guard for dashboard editing

***

### v0.0.15 (Server) — 2026-02-18

Chart export, dashboard view on the run detail page, and a revamped runs table layout.

**Changes:**

* Add chart export to clipboard and PNG download (with title and legend)
* Refactor recent runs display from cards to a table layout
* Add diff-only filter and git-style highlighting to side-by-side run comparison
* Add dashboard view support to run detail page
* Enable automatic data refetching on window focus and reconnect

***

### v0.0.14 (Server) — 2026-02-16

Runs table polish: fixes for trailing zeros, column header UX, and number filter input.

**Changes:**

* Fix runs table bugs: trailing zeros, column header UX, number filter input

***

### v0.0.13 (Server) — 2026-02-14

Migrated the Linear integration to OAuth and added URL auto-resolution for org-less paths.

**Changes:**

* Add display ID support for run identification in MCP tools
* Migrate Linear integration to OAuth app
* Add readiness probes with PostgreSQL and ClickHouse health checks
* Add URL auto-resolution to redirect org-less paths to the active org
* Fix `?runs=` URL param not selecting runs on page load and being overwritten by stale cache

***

### v0.0.12 (Server) — 2026-02-13

Linear integration reliability improvements and Stripe promo code support.

**Changes:**

* Fix duplicate Linear comments via idempotent sync with concurrency control
* Allow free checkouts with promo codes by making payment optional

***

### v0.0.11 (Server) — 2026-02-13

Major feature release: Linear integration, display IDs, MCP leaderboard, and free PRO for .edu users.

**Changes:**

* Add Linear integration with write-back and issue picker
* Add Neptune-style sequential run numbering with display IDs
* Add metric names and leaderboard endpoints for MCP run ranking
* Grant free PRO plan to users with `.edu` email addresses
* Fix data table layout minimum width

***

### v0.0.10 (Server) — 2026-02-11

Dashboard and runs table overhaul with grid/free mode toggle, Y-axis bounds, and full run table customization.

**Changes:**

* Add Grid/Free mode toggle for dashboard layout
* Add chart Y-axis bounds, fullscreen mode, and clipping indicators
* Add run table customization with sorting and filtering
* Fix pagination state management in data tables

***

### v0.0.6 — 2026-02-10

Server-side improvements to chart configuration and Konduktor job integration.

**Server Changes (v0.0.8, v0.0.9):**

* Add configurable line width setting for charts
* Fix zoom sync corruption in virtualized line charts
* Add Konduktor job info card to run summary page
* Add notes column to runs table for experiment annotations
* Increase run list limits for table and plots

***

### v0.0.5 — 2026-02-09

Improved sync reliability with batched flushing and backoff to reduce SQLite lock contention.

**SDK Changes:**

* Add batching and regular flushing of the sync queue with backoffs to reduce WAL/SQLite lock contention
* Add `sys/` metrics for Pluto SQLite queue monitoring

***

### v0.0.4 — 2026-01-26

Initial server infrastructure release.

***

### v0.0.3 — 2026-01-14

Fixed a distributed training bug where DDP processes could hang indefinitely.

**SDK Changes:**

* Fix DDP bug by enforcing thread join timeouts
