Skip to main content

Changelog

All notable changes to Noodles.gl are documented here.

August 2026

Added

  • Comprehensive GIS tools and ease-of-use features (#519)
  • deck.gl scale widget operator (#526)
  • Resizable panel system replacing fixed layout modes (#465)
  • Freeform input support for StringLiteralField (#442)
  • Editable defaults in table schemas (#545)

Changed

  • Upgraded deck.gl to 9.3.8, then 9.3.10 (#533, #546)

Fixed

  • Unchanged for-loops rerunning unnecessarily (#523)
  • ForLoop visual membership synced with graph connections and execution scope, with unique group IDs and legacy group migration (#541, #542, #539, #544)
  • Layer loading errors now surfaced instead of hanging render (#521)
  • Connected geocoder queries not executing (#522)
  • TableEditor string literals now use a dropdown; active cell commits before row mutations (#524, #535)
  • JSON inputs now supported for icon mappings (#527)

July 2026

Added

  • Blender-style multi-input handles with order-correct data flow (#120)
  • WebMCP support for external control from Claude Code, with origin trial token (#508, #510)
  • Spreadsheet pane for tabular data inspection (#466)
  • Copy/paste support for timeline keyframes (#388)
  • Free API fallbacks and key nudges for AI features (#396)
  • Improved properties panel context menu and visual alignment (#504)
  • Homepage redesigned with visual-first layout and example screenshots (#517)

Fixed

  • Container scope-boundary bugs: copy-paste, delete cascade, undo/redo (#503)
  • MapLibre flickering via deep equality checks and icon caching (#447)
  • Node disappearing when title input blurred without changes (#518)
  • Crash when renaming nodes with upstream connections (#136)

June 2026

Added

  • Timeline MCP tools and improved AI integration guidance (#487)
  • Undo/redo support for TableEditorOp edits (#499)
  • Point2D/3DField accepts GeoJSON Point Features, with geometry-column detection for NetworkOp compatibility (#482, #486, #498)
  • Greyscale categorical color ramp with configurable steps (#478)
  • Improved op() error messages in CodeOp/ExpressionOp/AccessorOp (#484)

Changed

  • Operator properties panel shows all fields by default, removed pencil icon toggle (#485)

Fixed

  • Point field schema not transforming tuples to objects (#500)
  • False "unsaved changes" warnings from improved dirty-state detection (#493)
  • op() references with double-quoted paths (#483)

May 2026

Added

  • Timeline in/out points with draggable markers and loop playback, applied to rendering frame range (#445, #454, #457)
  • Real-time keyframe value updates while editing timeline (#446)
  • Timeline zoom around playhead with shift-scroll (#443)
  • Timeline variables in CodeOp/ExpressionField with reactive tracking (#441)
  • Timezone support and Temporal.ZonedDateTime output for TableEditorOp, plus a DateTime field (#440, #436)
  • File upload support for IconLayerOp icon atlas (#437)
  • SmoothOp for Gaussian/boxcar smoothing (#460)
  • Keyframe shape variations based on interpolation type (#459)
  • Edge bars from sequence boundaries to first/last keyframes (#458)
  • One-click ViewerOp to TableEditorOp conversion (#480)
  • Executing indicator for ops taking longer than 200ms (#476)

Changed

  • Optimized ReactFlow usage, reducing unnecessary re-renders (#434)

Fixed

  • Custom resolution selection not taking effect (#473)

April 2026

Added

  • TableEditorOp v2 with typed schema system (#423)
  • MapStyleConfigurator operator for visual map style editing, replacing MapStyleOp with typeahead on MaplibreBasemapOp (#378, #393)
  • RampOp operator with interactive curve editor (#398)
  • LegendWidget operator, with scale input (#408, #412)
  • Custom parameter editor for dynamic field creation (#231)
  • CrossOp for generating unique pairs, SimplifyOp for GeoJSON simplification (#426, #424)
  • CustomMapLibreLayer operator for custom WebGL layers (#430)
  • BitmapOverlayWidget for screen-space image overlays (#428)
  • Virtual in-memory filesystem for projects (#432)
  • Per-channel keyframing for Vec2, Vec3, Point2D, and Point3D fields (#375)
  • Debug breakpoint toggle on operator nodes (#421)
  • Download SVG from ViewerOp when input is a chart element (#411)

Changed

  • Lazy-loaded heavy dependencies to reduce initial bundle size (#403)

Fixed

  • ForLoop execution correctness in the pull-based system (#429)
  • BitmapLayerOp edit button crash, improved error boundaries (#425)
  • Recovery from stale edges and unknown operator types (#417)

March 2026

Added

  • Native timeline system replacing Theatre.js: Theatre.js-style keyframe controls, editable speed graph (After Effects style), Cavalry-style time markers, keyframed-field highlighting (#349, #354, #359, #356)
  • Undo/redo history for operator property changes (#362)
  • PNG sequence export capability (#360)
  • Reroute operator for graph organization (#371)
  • Swap connection on edge drop, and highlight target edge during connection drag (#372, #383)
  • Resizable timeline panel (#384)
  • Background rendering via worker timers (#368)
  • FileUrlField combining FileField and JSONUrlField with upload support (#374)
  • Transparent basemap support by preserving geo viewState in deckProps (#363)

Changed

  • Removed Theatre.js dependency entirely — render settings, project loading, and keyframing rebuilt on the native timeline (#269)
  • Migrated from Yarn to npm, adopted npm workspaces for faster Cloudflare builds (#381, #390)
  • Upgraded TypeScript to 6.0.2 (#391)

Fixed

  • Slow node dragging via O(1) edge connection lookup and fewer graph transforms (#347, #232)
  • Timeline scrub slowness (#346)
  • Stale frame encoded at render start (#314)

February 2026

Added

  • /projects page with modal routes and File menu links (#313)
  • TSV format support in FileOp (#304)
  • Fully qualified handle names shown in property list connections (#309)
  • depthTest parameter added to all layer operators (#311)

Fixed

  • Layer reordering by fixing edge handle format matching (#310)
  • Memory leak during video export (#316)

January 2026

Added

  • Editable field visibility with show/hide controls in Properties panel (#283)
  • Dim unconnectable nodes during connection drag (#250)

Changed

  • ForLoop now returns array of all iteration results (#240)
  • ForLoop field renamed from 'd' to 'item' for clarity (#240)

Fixed

  • Theatre.js cold prism warning (#258)
  • "Project not found" dialog after File > Import then Save (#188)
  • Parent group node included when copying ForLoop nodes (#222)
  • Syntax error messaging for ExpressionOp and CodeOp (#244)
  • Connection constraint violation error messages (#255)

December 2025

Added

  • Tools shelf with PointOp wizard and CSV importer (#192)
  • Collapsible sidebar with node renaming (#193)
  • OrthographicView operator (#179)
  • TopMenuBar with hamburger menu (#163)
  • "I" key navigation for drilling into containers (#159)
  • Keyboard shortcuts centralized in KeyboardManager (#169)
  • SDF font settings for TextLayer (#202)
  • Text rendering properties on GeoJsonLayer (#200)
  • API Keys UI in Settings menu (#190)
  • ChromePicker for color fields (#177)
  • External AI control for automated pipeline creation (#211)
  • AI skills for generating projects and refactoring (#150)
  • GraphExecutor architecture for scope-based control flow (#214)
  • softMin/softMax properties on NumberField (#215)
  • Text and binary format options in FileOp (#210)
  • Allow incompatible operator connections with error surfacing (#224)
  • Node insertion on edge drop (#223)
  • Error popover on execution state change (#256)
  • PostHog error tracking with React 19 hooks (#245)
  • Projection switching in MaplibreBasemapOp (#187)

Changed

  • ReactFlow upgraded from v11 to v12 (#221)
  • Migrated from Volta to Corepack (#174)

Fixed

  • Prevent "Locate Project" dialog after successful creation (#180)
  • DateField Theatre.js sync with integer milliseconds (#185)
  • Preserve operator names in production builds (#181)
  • DuckDB-WASM worker loading on Cloudflare Pages (#220)
  • Viewer operator placement and selection logic (#242)
  • False unsaved changes warnings on node dimension updates (#246)

November 2025

Added

  • Undo/Redo functionality (#4)
  • PostHog analytics with opt-in consent (#127)
  • TimeSeriesOp for time-based data interpolation (#62)
  • KmlToGeoJsonOp for KML conversion (#118)
  • DateTimeOp with second/millisecond precision (#142)
  • GeoJsonField type with lime handle color (#119)
  • Temporal blending support in SwitchOp (#141)

Changed

  • Migrated state management to Zustand (#132)
  • Examples directory restructured to /public/examples (#68)
  • Lazy-loading for examples to reduce bundle size (#154)

Fixed

  • Theatre.js naming collision with containers (#134)
  • Breadcrumb bar and container state changes (#117)

October 2025 - Initial Release

Added

  • Core node-based editor with reactive data flow
  • Claude AI chat sidebar integration (#26)
  • Block Library with search by name and descriptions (#64, #69, #99)
  • Export project as ZIP (#96)
  • MapLibreBaseMapOp auto-added to new projects (#98)
  • SwitchOp value blending (#90)
  • Temporal types for DateFields (#63)
  • Multi-statement SQL support in DuckDB (#40)
  • AGENTS.md for LLM context (#60)

Changed

  • Upgraded to React 19 and Vite 7 (#81)
  • Renamed MergeOp to ConcatOp, ObjectMergeOp to MergeOp (#75)