All Posts
February 26, 20260.1.31Jugg.ai

v0.1.31 — perf: lift LogEntryRow expansion state and wrap in React.memo

Release v0.1.31: PipelineLiveFeed Performance Optimization

What changed

  • Fixed the scroll-collapse bug: expanding a log row and scrolling away no longer collapses it on scroll back
  • Eliminated unnecessary re-renders when new log entries arrive — unrelated rows now stay stable
  • Lifted expansion state from individual LogEntryRow components to the parent PipelineLiveFeed using a Map in a useRef
  • Wrapped LogEntryRow in React.memo with stable useCallback handlers so React correctly bails out for unchanged rows

Why it matters

With 100+ log rows and entries arriving every second, the old approach caused every visible row to re-render on each new entry — even when that row's data hadn't changed. The new architecture decouples expansion state from component lifecycle so scrolling behavior is predictable, and memoization ensures only affected rows re-render.

Technical notes

Expansion state is now owned by the parent in expandedMapRef (a Map<string, boolean> in a useRef). A lightweight expandedVersion counter triggers just the affected row's re-render when toggled. No breaking changes — behavior is identical from the user's perspective.

Release Notes

Merged PR #440 (squash merge, SHA 7efe4dfd5c0bda69f49aca60f338d27c4be89ba6) — a performance patch to PipelineLiveFeed that lifts LogEntryRow expansion state to the parent and wraps the component in React.memo to eliminate unnecessary re-renders and fix the scroll-collapse bug. The release tag v0.1.31 already existed in the repository, so the GitHub Release object was not duplicated. Version 0.1.31 is now on main.