2.21.0 (2026-05-12)
Bug Fixes
- Add warning to Computer Use install modal (#30094) (ecf96ad)
- ai-builder: Allow restoring archived workflows from Instance AI (#29813) (a33a89a)
- ai-builder: Preserve collected planning context (#29916) (5e3aa1a)
- ai-builder: Resolve HitlTool variants to base node in get_node_types (#29731) (ed9471a)
- Airtable Node: Fix typecast option dropping attachment field updates (#29556) (0cafc71)
- Align undici override across major versions (#30028) (6b893b4)
- Calendly Trigger Node: Use API v2 for webhook subscriptions (#29771) (0edcdcf)
- core: Activate agent chat integrations on every main (#30029) (6f4f0a0)
- core: Add configurable retries and error details to S3 (#28309) (e2576ca)
- core: Add ESLint rule to prevent error instances in toThrow assertions (#29889) (75ed71c)
- core: Add liveness timeouts for Instance AI (#30145) (52a4bcb)
- core: Add support for context establishment hooks in webhook mode (#29893) (04e9b25)
- core: Add workflow structure validation (#29699) (bec74ae)
- core: Advance Postgres IDENTITY sequences after entity import (#29762) (ca33060)
- core: Agent sessions correctly quoting columns in queries for Postgres (#29999) (9f92005)
- core: Agents called from workflows use the workflows owner/user ID for calling further workflows through the agent (#30242) (9072ee3)
- core: Allow GIT_SSH_COMMAND in simple-git after 3.36.0 upgrade (#29894) (f42be90)
- core: Allow profile edits when SSO is no longer active (#29765) (2714f00)
- core: Allow same-domain redirects in instance-ai web research (TRUST-73) (#30107) (3123f25)
- core: Always create instance-ai sandbox workspace dirs (TRUST-79) (#30106) (5e88748)
- core: Avoid MCP get_execution hang on circular references (#30051) (60e23e1)
- core: Check npm provenance in community package scanner (#29667) (804f51c)
- core: Clarify 0-based indexing in workflow SDK prompts and JSDoc (#29734) (fba873c)
- core: Clarify agent builder prompt guidance (#30127) (75646c4)
- core: Defer credential setup during workflow builds (#30181) (bb73952)
- core: Emit missing auth audit events for OIDC and SSO-restricted login (#29856) (dd812c5)
- core: Export boolean CSV values as true/false for Data Tables (#30007) (94d91e1)
- core: Filter WaitTracker to only poll waiting executions (#29898) (5c7921f)
- core: Fix duplicate task request on runner defer (#28315) (80c8a6c)
- core: Harden axios error handling against non-string error stack (#29100) (2dbf02e)
- core: Improve AI chat file upload handling and error states (#29701) (afe119b)
- core: Improve documentation usage in mcp tools (#30210) (e8827cd)
- core: Initialise encryption key proxy on worker and webhook instances (#29912) (ae57e60)
- core: Inline AI_NODE_SDK_VERSION to save memory by not loading @n8n/ai-utilities on boot (#30113) (f709e53)
- core: Persist agent chat draft across modes and hide unfinished tool-approval toggle (#30123) (7094b48)
- core: Preserve node positions on AI workflow updates (#29850) (f2764f0)
- core: Prevent proxy layer accumulation in ObservableObject (#30129) (0a76135)
- core: Propagate waitTill from worker to main in scaling mode (#30099) (3702ff8)
- core: Scope credential resolution (#30156) (174f0f8)
- core: Simple-git update broke https connection (#29998) (01300e9)
- core: Simplify Slack redirect URL verification process for agents (#30033) (8201281)
- core: Skip disabled tool nodes when mapping AI Agent tool sources (#29460) (bd7eeb7)
- core: Skip unknown fixedCollection keys instead of throwing (#29689) (a30772c)
- core: Stop applying node-defined sensitive output fields to runtime data (#30198) (f4e8088)
- core: Stop logging password reset token values (#29405) (bc8d196)
- core: Support type filters on global credential lookups (#30002) (8e0f37d)
- core: Throw on bare OutputSelector passed to .add()/.to() (#29736) (60a5122)
- core: Validate AI builder credential IDs before save (#30070) (ceaebc6)
- Correct connect.html path in browser extension (#29714) (9b3b29b)
- EditImage Node: Fix composite operation failing with stream empty buffer (#30088) (0cc163b)
- editor: Add expand/collapse to chat panel in Agents (#30069) (f87094c)
- editor: Disable chat during interactive agent choices (#30111) (8171cf0)
- editor: Fix Agents styling issues from merge regression (#30032) (478d499)
- editor: Fix collapse/expand for Chat sidebar (#29378) (ee847d1)
- editor: Improve sidebar new resource menu UX (#29597) (d5af542)
- editor: Make sure trimmed placeholder never reaches backend (#29842) (f7c7acc)
- editor: Match input height with mode selector in resource locator (#30075) (277431b)
- editor: Polish encryption keys settings page (#30008) (5cbd2dd)
- editor: Preserve decimal suffix when duplicating a node (#29541) (08a36d7)
- editor: Refresh node icon when diff sidebar selection changes (#29816) (ff41613)
- editor: Rename canvas header dropdown action to Description (#29719) (49e7b05)
- editor: Rename encryption keys "Type" column to "Status" (#29966) (e71afed)
- editor: Render tooltips above popovers (#29997) (ba5b3d1)
- editor: Resolve expressions in 'Go to Sub-workflow' navigation (#29843) (d6bae35)
- Fix 15 security issues in fast-xml-builder, basic-ftp, fast-uri and 5 more (#30169) (267fe49)
- Git Node: Restore Clone and other operations on simple-git 3.36+ (#30223) (a8aa955)
- Google Chat Node: Clarify message resource name field (#29964) (55df7cb)
- Google Sheets Node: Reduce duplicate API calls in append operation to avoid quota limits (#29444) (d63e1ae)
- Handle IMAP fetch errors to prevent instance crash and stuck workflows (#29469) (46d52ff)
- HTTP Request Node: Validate URL type in older node versions (#29886) (29a864c)
- MongoDB Node: Resolve collection parameter per item in write operations (#29956) (582b6ae)
- Notion Node: Paginate Get Many operations beyond 100-item API cap (#29690) (d318bc1)
- Notion Node: Serialize staticData as ISO string in NotionTrigger (#29688) (d2e1eb3)
- Notion Node: Update UI URLs from notion.so to notion.com ahead of domain migration (#29861) (3593131)
- Oracle DB Node: Handle the test failures (#28341) (0697562)
- Restore broken stdlib calls in Python Code node (#29776) (a786476)
- RSS Feed Read Node: Respect proxy settings (#30059) (2e046d5)
- Salesforce Node: Fix trigger not firing on repeated record updates (#29107) (f871d44)
- Schedule Node: Fix hourly intervals that don't divide evenly into 24h (#29778) (1a22c76)
- Snowflake Node: Fix issue with Insert and Update operations not working (#29339) (4c369e8)
- Supabase Node: Don't display RPCs in an RLC for the table (#28146) (78aa0e7)
- Wait Node: Resolve expressions inside Custom HTML form fields (#30060) (7c1a771)
- YouTube Node: Fix misspelled "unlisted" privacy status value in Video Update operation (#30203) (96b018d)
Features
- Acuity Scheduling Trigger Node: Add webhook request verification (#29261) (da41470)
- Add fully dynamic disclaimer to Quick Connect offer (#29852) (b6127d8)
- ai-builder: Add per-PR eval regression detection vs LangSmith baseline (#29456) (bbe3e2d)
- ai-builder: Guarantee user-visible output on terminal states (#29636) (4d9e624)
- Asana Trigger Node: Add webhook request verification (#29258) (94e4033)
- Cal Trigger Node: Add webhook request verification (#29484) (3276edc)
- Calendly Trigger Node: Add webhook request verification (#29482) (e929f9f)
- core: Accept merge.input(n) inside ifElse/switch branch targets in workflow-sdk (#29716) (34f2107)
- core: Add flag to import workflow cli to activate workflow on import (#29770) (283071e)
- core: Add IP rate limiting to dynamic credential authentication endpoints (#30199) (515ae7c)
- core: Add MCP tool to list credentials (#29438) (d6cc3be)
- core: Add multi-config evaluations backend (#29784) (8116e0a)
- core: Add n8n-object-validation ESLint rule for community nodes (#29698) (701f9a4)
- core: Add no-template-placeholders ESLint rule for community nodes (#29796) (c4056b2)
- core: Add observational memory storage foundation (#29814) (be4ef22)
- core: Define community packages with environment variables (#29961) (730c3e1)
- core: Generate service-specific OAuth2 credentials for dedicated MCP tools (#29884) (8617067)
- core: Server-side pagination, sorting, and filtering for encryption keys (#29708) (9afbe13)
- core: Transform MCP server configs into dedicated MCP tools (#29493) (4dce41f)
- core: Use McpManagerClient and enforce whether MCP server connections are allowed (#29694) (8235474)
- Customer.io Trigger Node: Add webhook request verification (#29480) (a772016)
- editor: Add envFeatureFlag and copyButton property options (#29733) (75053fe)
- editor: Cap eval concurrency slider at admin-set limit (#29807) (6232de4)
- editor: Eval run detail loading + error states (TRUST-70 follow-up) (#29817) (6f9b99a)
- editor: Redesign evaluation run detail page (#29592) (9014bae)
- editor: Show locked state and permission notice on data redaction workflow settings (#30022) (7635131)
- Figma Trigger Node: Add OAuth2 authentication support (#30079) (e3e70d6)
- Figma Trigger Node: Add webhook request verification (#29262) (910822f)
- Formstack Trigger Node: Add webhook request verification (#29495) (4e28652)
- GitLab Trigger Node: Add webhook request verification (#29260) (fbf89bd)
- Jira Node: Add OAuth2 (3LO) support (#29414) (4d5bafc)
- MailerLite Trigger Node: Add webhook request verification (#29491) (12b7cc6)
- Mautic Trigger Node: Add webhook request verification (#29658) (eaadf19)
- Microsoft Outlook Node: Add location and attendees fields to calendar events (#29844) (2e21c5f)
- Microsoft Outlook Node: Add support for recurring event instances (#29802) (dab3653)
- Onfleet Trigger Node: Add webhook request verification (#29485) (133a5aa)
- Strava Node: Allow custom OAuth2 scopes (#29972) (5abcae6)
- Taiga Trigger Node: Add webhook request verification (#29487) (3c97c49)
- Trello Trigger Node: Add webhook request verification (#29252) (8f1f42d)
- Twilio Trigger Node: Add webhook request verification (#29259) (acc9643)