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
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
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)