Weekly report
Frappe and ERPNext changes, 6 Jul to 12 Jul 2026
293 changes merged: 2 breaking, 58 new features, 26 speed-ups, 175 fixes, 32 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
- breaking Re-evaluate link_filters per search without breaking doc-based get_query Fix crashes when Link fields have both Customize Form filters and programmatic set_query reading the document.
- breaking Scope index subquery to current schema in get_table_co… MariaDB index metadata lookup was reading from all databases with matching table names instead of just the current schema, breaking multi-site migrations.
- feat Editor's pick Add transaction-scoped advisory lock `frappe.db.transaction_advisory_lock(key)` for postgres: released on transaction commit/rollback, participates in deadlock detection, re-entrant, and shared polling timeout with session-scoped locks.
- feat Editor's pick Add v2 discovery API Internal (WIP, no-docs) API v2 endpoints for programmatic endpoint discovery; OpenAPI compatibility left for external apps.
- breaking Re-evaluate link_filters per search without breaking doc-based get_query Fix crashes when Link fields have both Customize Form filters and programmatic set_query reading the document.
- breaking Scope index subquery to current schema in get_table_co… MariaDB index metadata lookup was reading from all databases with matching table names instead of just the current schema, breaking multi-site migrations.
- feat Min_value and max_value properties for numeric fields Allow Int, Float, Currency, and Percent fields to declare validation bounds in DocType and Customize Form, with validation running on save.
See all 83 changes
- feat Print format builder colour styling + copy/paste Add colour styling for table headers/borders and field text, plus copy/paste support for fields and sections in the print format builder.
- feat Expose source code over discovery API Framework now exposes source code over the discovery API.
- feat Add hook to allow drive to overwrite file perms Added hook to allow Drive to override File permissions independent of Framework defaults.
- feat Add generic utilities for styling and layout Added generic utility classes for styling and layout based on the Espresso design system.
- feat Basic error analysis Error analysis UI added for better error visibility and debugging.
- feat Surface data import failures in log files Data import row errors now logged via frappe.logger() for visibility in frappe.log and external log aggregation, complementing Data Import Log.
- feat Add validation for link filters to ensure valid JSON format and structure Added backend validation for link_filters on fields to ensure valid JSON structure.
- feat Move microbenchmarks to Frappe project feat: Move microbenchmarks to Frappe project
- feat Image and barcode blocks with width option Print Format Builder now supports Image and Barcode blocks; linear barcodes via JsBarcode (browser print), QR codes via pyqrcode server-side as data-URI PNG.
- perf Replace get_attr usage in has_child_permission Fix subtle attribute resolution bug in permission checking.
- perf Single shared stylesheet for print format builder canvas and print output Extract static print format CSS into a shared stylesheet to keep canvas preview and PDF output in sync.
- perf Strip rich text instead of rendering html in static cells Child table grid cells now display rich text as plain text instead of full HTML, improving rendering performance while keeping editor available on row open.
- perf Normalize whitelisted HTTP methods Store whitelisted HTTP methods as tuples; treats a bare string as a single-method tuple for consistency.
- perf Use client_cache setter in `get_db_table_columns` On cache miss, was incorrectly writing via `frappe.cache.set_value()` instead of `frappe.client_cache.set_value()`, forcing the next call to make an unnecessary Redis round-trip instead of a near-instant local hit.
- fix Hash bearer tokens at rest Store OAuth access and refresh tokens as SHA-256 digests instead of plaintext, decoupling document names from tokens and adding index coverage for lookup.
- fix Harden DCR and cleanup OAuth authorization UI Improve OAuth Device Code Request security and align UI with design standards.
- fix Add egress URL validation for server-side fetches Validate egress URLs for server-side fetches to prevent SSRF attacks.
- fix Translations not applied in background jobs Set frappe.local.lang after initializing the job user so translations use the job user's language instead of the site default.
- fix Clear if_owner on permission rows above level 0 Validate and clear if_owner flags on higher permission levels where they are ignored, aligning stored permissions with framework behavior.
- fix Guard against None table field in load_doc_before_save Default to an empty list when child table fields are None to prevent TypeError during pre-save processing.
- fix Duration picker opens away from the field in scrolled grids Position the duration picker using viewport coordinates and keep it anchored while scrolling or resizing.
- fix "Show all activity" toggle showing white when enabled Fix toggle appearance when the "Show all activity" filter is enabled.
- fix Return consistent request ID Return a consistent request ID to allow tools to query recordings easily.
- fix Assign to filter fails with type validation error on strict stacks Accept current_filters as either string or list to fix type validation when toggling the Group By dropdown in the Assign To filter.
- fix Auto-assignment fails to follow document when triggered by web user Apply ignore_permissions when creating follow entries during auto-assignment from web user submissions.
- fix Print format builder table + preview fixes Center serial-number columns, round section backgrounds in print output, and keep preview document selection in sync.
- fix Allow loopback redirect URIs Enables HTTP on loopback URIs (127.0.0.1/localhost) for OAuth redirects in native apps, per RFC 8252.
- fix Use static ?url imports for Leaflet images so the rolldown build can resolve them Studio build was failing because rolldown couldn't resolve Leaflet image imports; switched to static ?url imports.
- fix Revert "fix: make postgres transactions read committed by default" Reverted postgres transaction isolation level change.
- fix Only allow text in description Description field now restricts input to plain text only.
- fix Escape computed url in EmbeddedList link column Escape computed URLs in EmbeddedList link columns to prevent XSS.
- fix Preserve guest-submitted name/email Guest comments were being overwritten with "Guest" because an anti-spoofing override ran above the guest check; now scoped to logged-in users only.
- fix Don't mutate caller's get_query().filters in MultiSelectDialog MultiSelectDialog was mutating the caller's shared filters object when reused across searches; now works with immutable filters.
- fix Dashboard quick list check filter drops "= No" Dashboard quick list check filters with "= No" were being dropped because standard checkboxes couldn't distinguish unchecked from no-filter; now kept as regular filters.
- fix Bind inline edit to row at edit start, not submit Report View inline edits were saving to the wrong record if a quick filter changed while editing; now binds to the row captured at edit start.
- fix Child table header background/radius scoped to row, not cells Child table header styling now applies to the row instead of individual cells, enabling proper border radius on a rounded container.
- fix Collapsible section collapses while typing in a child table row form Editing a field in a collapsible section of a grid row was causing the section to collapse; now preserves expansion state during refresh.
- fix Contrast on custom HTML sidebar field in print format builder Print format builder custom HTML sidebar field now has proper contrast in dark mode.
- fix Hardening oauth endpoints Approve endpoint restricted to POST-only with CSRF token hardening in OAuth confirmation flow.
- fix Restrict print format builder preview to sys. man. Print format builder API restricted to System Manager role, preventing unauthorized access via preview endpoint.
- fix Kanban board leaks memory and hangs on repeated re-render Kanban watchers now properly unsubscribe on re-initialization, preventing memory leak and performance degradation on repeated refreshes.
- fix Notification subject shows "None" when the title field is empty Notification subjects now use document name fallback instead of literal "None" when configured title field is empty.
- fix Xls file import fails with "startswith first arg must be str or a tuple of str, not bytes" Legacy .xls OLE2 files now preserved as binary, fixing xlrd parsing that failed on text-decoded data.
- fix Print view is unusable on mobile Print preview iframe now pinned to actual page width and toolbar repositioned for mobile, preventing content overflow and improving usability.
- fix Code fields show stale value after navigating between documents Code field editors now repaint when expanded from collapsed sections, fixing display of stale content from previous documents.
- fix Form does not render when form sidebar is disabled Web Page form rendering fixed when form_sidebar user setting is disabled, preventing TypeError in add_web_link.
- fix Allow missing link_filters in validate_fields function Patch compatibility restored for ≤v14 databases where link_filters column doesn't exist during pre_model_sync.
- fix Child table numeric filters generate invalid postgres query Nullability checks now performed against resolved child DocType, preventing invalid COALESCE wrapping on PostgreSQL numeric fields.
- fix Queued telemetry events must survive clear_cache() Telemetry events persisted across cache clear operations.
- fix Handle orphan module Setup now handles orphan modules without failing.
- fix Dont explode plucked scalars on masked doctypes Query builder now handles masked doctypes correctly without exploding scalar results.
- fix Misc error log fixes Error logging improvements for DX.
- fix Remove border from filled search bar Search bar border removed from filled state, eliminating double edge against navbar background.
- fix Icon label styles Icon label styling fixed.
- fix Apply cint to Int fieldtype in format_value Int columns now consistently formatted with cint on server side, matching client-side formatter and fixing PDF/email report decimal display.
- fix Normalize Check formatter value with cint to prevent 0 rendering as checked Check field grid cells now normalize string "0" to integer 0 before rendering, preventing false "checked" state in web form grids.
- fix Don't auto-set default on every save, only on create Letterhead default no longer resets on every save, only on initial creation.
- fix Timeline make cards respect full-width toggle Timeline comment cards now respect full-width toggle setting.
- fix Show table field label instead of doctype name in filter dropdown Child table filters now show parent table label instead of internal doctype name, improving UX discoverability.
- fix Hide Download Report button without read permission Download Report button now hidden when user lacks read permission.
- fix Postgres Time columns read back with their precision PostgreSQL Time columns now read back with full precision specification, preventing false type-change detection on every migrate.
- fix Prevent broken pipe from aborting dashboard sync during setup Dashboard sync now continues if progress stdout fails, making output best-effort instead of aborting setup wizard.
- fix Show deferred error insert Developer experience improvements for error handling.
- fix Remove duplicate ellipsis menu button on repeated edit-save Fixed duplicate menu button creation on repeated workspace edit-save cycles.
- fix Show link filters if fieldtype is Link Link filters field now appears in Custom Field configuration when fieldtype is Link.
- fix Apply default ordering in v1 & v2 list endpoints REST list endpoints now apply stable default sort order instead of returning records in undefined order.
- fix Remove attribution link from about dialog fix: remove attribution link from about dialog
- fix Map query timeout and deadlock errors to 508 Aligns error responses with Frappe's concurrent-transaction retry convention for consistent client handling.
- fix Don't probe external links with a nonexistent fieldname in get_open_count On postgres sites, opening the Connections tab on a form would 500 with "current transaction is aborted" due to probing links with a nonexistent fieldname.
- fix Skip error log for expected exceptions Adds `skip_error_log` flag to exception classes so expected/benign errors don't clutter the Error Log.
- fix Limit to system manager Permission restriction to system manager role.
- fix Avoid field masking when permissions are ignored Field masking now respects when permissions are explicitly ignored in queries, returning unmasked data where intended.
- fix Wrap write_only inner fn Internal function wrapping fix for write_only decorator.
- fix Print view crash on direct load Opening `/app/print//` directly threw TypeError because a method reference no longer exists, aborting `print_view.show()` and leaving the page half-rendered.
- refactor Move Props and Slots interfaces in .ts files Moved component Props and Slots interfaces to .ts files for better props/slots discovery, matching frappe-ui conventions.
- refactor Pulse capture() site keyword-only + drop is_enabled cache Telemetry capture() site parameter now keyword-only to fix footgun where positional site arg looked correct but never worked, plus is_enabled() caching removed.
- refactor Redirect pv output to /dev/tty refactor(restore): Redirect pv output to /dev/tty
- refactor Build: update quill image resize module Revert: build: update quill image resize module
- feat Explain FIFO allocation of fixed Discount Amount on Sales Order Add an informational description to the Additional Discount Amount field explaining how fixed discounts behave across multiple deliveries and invoices.
- feat Support partial transfer from pick list Pick list now supports partial transfers with Work Order status updates on each partial completion.
- feat Confirmation dialog when enabling negative stock on Item Item-level negative stock toggle now shows same compliance warning as global setting, alerting users to FIFO/valuation implications.
- feat Allow group warehouse for raw material availability in production plan Production Plan now accepts optional group warehouse for raw material availability checks, allowing stock assessment across sibling warehouses while receiving into leaf warehouse.
- feat Create material request for raw materials from work order Work Order form now includes button to create Material Request for raw materials, adding requisition step before transfer.
See all 68 changes
- feat Filter service level agreement link by document type Service Level Agreement field now filters to show only SLAs configured for that document type.
- feat Add grouping by dimension functionality in financial reports Financial reports now support grouping rows by custom dimensions.
- perf Extract deferred-accounting and document-schedule from AccountsController Move deferred revenue/expense and payment schedule validations into dedicated service classes, continuing AccountsController decomposition.
- perf Batch default account/cost-center/warehouse lookups in bom… Hoisted per-item database queries into single batch lookups for BOM explosion, reducing N+1 queries.
- perf Avoid n+1 queries for work order item source warehouse Stock Entry's get_bom_raw_materials now batch-fetches Work Order Item warehouses in one query instead of per-row lookups.
- perf Avoid per-row Warehouse doc fetches in auto reorder job Auto reorder job warehouse lookups consolidated into batch fetches.
- perf Avoid per-row Warehouse doc fetches in auto reorder job Auto reorder job now batch-fetches Warehouse documents instead of fetching per row.
- perf Avoid per-row Warehouse doc fetches in auto reorder job Reorder item job now caches Warehouse docs instead of fetching once per Bin row, eliminating redundant lookups in warehouse parent chains.
- perf Batch bin lookups in delivery note stock update Delivery note stock updates now batch Bin lookups into single query instead of per-row calls, reducing 400 queries to 1 for 200-item notes.
- perf Add coverage for Email Campaign Unit tests for Email Campaign: start date not in past, end date derived from largest send_after_days, non-empty schedule required, Lead recipients must have email.
- perf Add coverage for Import Supplier Invoice Unit tests for Import Supplier Invoice: validates Stock Settings has a default UOM and resolves country codes.
- perf Fix flaky test_coa_based_on_country_template (abbreviation collision) Test was generating random 3-character abbreviations that collided with existing companies; now regenerates until unique.
- perf Add coverage for Italy e-invoice utility helpers Unit tests for Italian e-invoice helpers: condition building, summary aggregation per tax rate, charge computation, and amendment tracking.
- perf Add coverage for Lower Deduction Certificate Unit tests for date overlap detection and fiscal-year validation in Lower Deduction Certificate.
- perf Add coverage for Appointment Booking Settings Unit tests for slot validation: from-time before to-time, slot length must be a whole multiple of appointment duration.
- perf Purchase-side Payment Entry allocation coverage Adds unit tests for Payment Entry allocation on the purchase side: paying multiple invoices clears outstanding, overpaying leaves advances, and excessive allocations are rejected.
- fix Map stock_qty in apply_price_list_on_item Convert transaction quantity to stock quantity before evaluating Pricing Rules when items use alternative UOMs, preventing quantity-band rules from being inconsistently applied.
- fix Read user permissions from current session user in payment reconciliation Refresh user permission filters at reconciliation time instead of capturing them at document creation, fixing filters when the session user changes.
- fix Remove incorrect Payable account_type from Customer Deposits in Philippines CoA Fix non-deterministic default payable account selection caused by duplicate account_type in the Philippines Chart of Accounts template.
- fix Retain invoice table on opening invoice creation error Preserve invoice data instead of clearing the table when opening invoice validation fails, avoiding forced re-entry.
- fix Render columnar financial statements Display data in the Horizontal Balance Sheet columnar report template instead of showing empty results.
- fix Update events order by date ascending Sort Lead activities by due date instead of arbitrary order.
- fix Allow negative balance in bank statement import Accept negative opening balances during bank statement imports.
- fix Use correct mapper path for make_work_orders call Work Order creation from Sales Order was broken because the JS call still resolved to the old sales_order.py path instead of the new mapper.py location.
- fix Fetch payment entry reference amounts from invoice Payment Entry created from a Payment Request now correctly shows the full invoice amount in the Payment References table instead of only the paid amount from the request.
- fix Link job card in stock entry created from pick list Stock Entries created from Pick Lists against Job Card Material Requests now properly set job_card and related fields, so the Job Card recognizes the material transfer.
- fix Make trend report based-on and group-by column labels translatable Trend report column labels for based-on and group-by are now translatable.
- fix Validate planned end date is not before planned start date in wo… Work Order now validates that planned end date is not before planned start date.
- fix Correct stock ageing value for moving average and lifo items Stock Ageing report values are now correct for Moving Average and LIFO valuation methods; each remaining slot is revalued to qty × current rate.
- fix Pick list serial batch posting date Pick list serial/batch handling during posting now correctly applies posting dates.
- fix Pick list serial batch posting date Pick list serial/batch posting dates are now handled correctly.
- fix Partial delivery note against pick list Partial deliveries against pick lists now handled correctly.
- fix Display outstanding amount using company default currency Opening Invoice Creation Tool now displays outstanding amount in company's default currency instead of global default, fixing currency symbol in multi-company setups.
- fix Stock entry handler and transaction controller fixes Type-hint and module refactors fixed to restore client-side whitelisted method calls for apply_price_list and stock_entry_handler.
- fix Rename variant item_code/item_name when attribute abbreviation changes Item variant codes and names now update when parent attribute abbreviation changes, keeping variants in sync with attribute configuration.
- fix Validate planned end date is not before planned start date in work order Work Order validation now prevents end date before start date.
- fix Update BOM operations when routing is changed BOM operations table now updates when routing is changed on a new version, no longer showing stale operations from original BOM.
- fix Pick list serial batch posting date Pick list posting date handling fixed to prevent TypeError and date validation errors in serial/batch operations.
- fix Make trend report column labels translatable Trend report headers (Item, Item Name, Customer, Currency, etc.) now translatable instead of hardcoded English.
- fix Use company currency instead of global default in report Trend reports now display company currency symbol instead of global default, fixing symbol mismatches in multi-company environments.
- fix Revert "refactor(sales_person_wise_transaction_summary)" Sales Person-wise Transaction Summary reverted to SQL from query builder to fix v15 compatibility (ignore_permissions not supported).
- fix Skip allowed users check when frappe crm is installed locally CRM sync now handles local CRM installation alongside remote, skipping user allowlist validation and auto-cleaning settings on app install/uninstall.
- fix Match depreciation schedule rows at currency precision to avoid duplicate JEs Depreciation schedule now matches rows at currency precision instead of exact float equality, preventing duplicate journal entries for assets with many decimal places.
- fix Patch moved create_company_custom_fields from pre_model_sync to post_model_sync Company custom field creation patch moved to post_model_sync for correct execution order.
- fix Get_terms_and_conditions render_template with safe_exec Hardens terms and conditions rendering against code injection by using safe_exec instead of bare render_template.
- fix Added permission checks on various whitelisted functions Adds read permission validation to payment entry detail lookups, bank account, and party account whitelisted functions.
- fix Validate template and its variant in the same Pricing Rule Prevents false "Multiple Price Rules exist" error when both a template and its variant are added to the same rule, with a save-time validation block.
- fix Precision issue causing reconciliation error Fixes floating-point precision errors that blocked account reconciliation. Backported to #56937, #56938.
- fix Workspace for stock and manufacturing fix: workspace for stock and manufacturing
- fix Guard empty group-by detail row in trends After adding an explicit GROUP BY, a zero-match detail query returns no rows instead of one all-NULL row, which would raise IndexError when accessed; now skipped safely.
- fix Scope Production Planning arrival qty to open POs The report's Arrival Quantity was summing every submitted PO line ever created including fully received ones, overstating incoming stock; now sums only open POs.
- fix Close postgres locking races; gate batch valuation with a txn advisory lock Fixes two phantom-insert races where concurrent operations could create duplicate stock entries on postgres; gates batch valuation with transaction-scoped advisory locks.
- fix Stock Closing Entry duplicate check misses contained date ranges The duplicate-date validation had a logically inert third condition that never fired, allowing a new date range fully contained within an existing entry to slip through.
- fix Use transaction-currency outstanding on Dunning for foreign-currency invoices When a Sales Invoice is posted in a foreign currency against a receivable account in the company currency, creating a Dunning now shows the correct outstanding amount in the transaction currency instead of the party account currency.
- fix Campaign with a naming series breaks the UTM Campaign link When a Campaign uses a naming series, linking to the mirrored UTM Campaign would fail because the link pointed to `campaign_name` instead of the actual document `name`.
- fix Show earliest schedule date as required date When a Material Request lists the same item on multiple rows with different schedule dates, the consolidated Requested Items report now shows the earliest date instead of the latest, correctly reflecting urgency.
- fix Make Procurement Tracker rows coherent PO lines Multi-line POs with blank material request items were fabricating rows by pairing one line's item with another line's qty and amount; now uses a subquery to pick the representative line per group.
- fix Dark theme shop floor Dark theme styling fix for shop floor.
- fix Compute budget requested amount per row Budget checking was computing Sum(qty) × Max(rate) over all matched Material Request items, fabricating totals when items had different rates; now sums per-row (qty × rate).
- fix Keep bom_no/is_phantom_item pair coherent in get_bom_items_as_dict When a BOM lists the same item via both phantom and non-phantom sub-BOMs, independent Max() aggregations could pair one line's phantom flag with another line's bom_no, exploding the wrong sub-BOM.
- refactor Reversing exchange rate revaluation journals Exchange Rate Revaluation can now reverse the journals it created, with AR/AP report integration.
- refactor Fix row transformation for growth calculations Growth view formatting in financial reports now renders correctly with custom templates.
- refactor Catalog second-order GROUP BY traps (wrap-is-the-bug classes) Documentation: catalogs recurring GROUP BY aggregation mistakes (incoherent Max/Min pairs, NULL-skipping, fabricated arithmetic, wrong-bound picks) in `.github/POSTGRES_COMPATIBILITY.md` and Greptile review instructions.
- fix Add permission check for half-day attendance updates Half-day attendance mutations now require write permission on Attendance doctype, closing permission bypass in mark_employee_attendance.
- fix Include expense claim line projects in project total expense claim Project total expense claim calculation now includes expense claim lines linked at the detail level, not just document-level project links.
- fix Implement close warning for job openings and related validation. Job Opening close now shows confirmation warning if linked Staffing Plan still has unfilled positions, while still allowing close if needed.
- fix Resolve blank employee number and reports_to in Profile PWA Profile now displays employee_number (when using name-based IDs) and reports_to by bypassing desk-side hiding and permission restrictions.
- fix Link field clears when selected value is outside default options page Link field values now persist when selected value falls outside default page by injecting value into options and reloading on clear.
See all 7 changes
- fix Include carry forwarded leaves in allocation calculations Leave allocations now correctly include carry-forwarded leaves from prior periods in the balance calculation.
- fix Include carry forwarded leaves in allocation calculations fix(employee_leave_balance): include carry forwarded leaves in allocation calculations
- feat Render state options on address form when India Compliance is installed CRM Address form now renders state field as an autocomplete when India Compliance is installed, matching Desk behavior.
- fix Date 'Between' filter throws 'split is not a function' Handle DateRangePicker's array value format instead of expecting a string for date range filters.
- fix ERPNext Item sync fails in ERPNext v15 Handles v15's tuple-based and v16+'s dict-based price query results for seamless ERPNext integration across versions. Backported to #2420.
- fix Remove deprecated pulse api fix: remove deprecated pulse api
- fix Pass frappe._dict to get_item_price in Item sync (fixes AttributeError on Item insert) Fixes crash when syncing items by passing frappe._dict (attribute-accessible) instead of plain dict to ERPNext's get_item_price().
See all 9 changes
- fix Prefill value from lead while converting to deal Prefills conversion modal with lead data to reduce data mismatch risk and improve UX.
- fix Remove orphaned crm.api.event scheduler hooks Removes scheduler hooks that were accidentally pushed in main-hotfix, fixing "No module named 'crm.api.event'" errors on every `bench migrate`.
- refactor Patch Release v1.77.3 chore: Patch Release v1.77.3
- refactor Patch release v1.77.2 chore: Patch release v1.77.2
- fix Resolve race condition hiding course outline for non admins Course outline loading skeleton added to prevent race condition rendering for non-admin users.
- fix Emit images inside pasted list items as image blocks Images pasted into list items are no longer silently dropped; they're emitted as standalone blocks after the list. Backported to #2551.
- fix Add json guard on course lesson content Prevents 500 errors when non-EditorJS content (e.g. raw YouTube URLs) is pasted into course lessons; adds get_editorjs_blocks() helper reused across course outline, quiz, and export flows.
- refactor Merge main-hotfix into main chore: merge main-hotfix into main
- refactor Merge `develop` into `main-hotfix` chore: merge `develop` into `main-hotfix`
b
Builder
3 fixes
- fix Remove clientScript from page's block JSON Stop duplicating clientScript in page block JSON when extending from a component.
- fix Prevent arrow keys clobbering text InlineInput fields Arrow key stepping logic now gated to numeric-only inputs, preventing text field values from being replaced with NaN.
- fix Update frappe-ui to v1.0.0-beta.21 Upgrades frappe-ui submodule with 20 typography token migrations across 16 files and Popover component adaptations. Backported to #662.
- fix Prevent AssignTo crash when current user is the only agent AssignTo dropdown was crashing when the session user was the only agent; fixed variable rename that left `seen` undefined.
- fix Display proper labels for time elapsed Activity timeline now displays correct relative date labels (e.g. "2 days ago" instead of "yesterday" for 40+ hour intervals).
- fix Redirect responses to correct merged ticket Responses to merged/closed tickets now append to the target ticket they were merged into instead of reopening the original.
- refactor Add aerodeval as authorised user Added aerodeval as an authorized helpdesk user.
- refactor Hotfix to main Helpdesk hotfix release to main branch.
- feat ERPNext workbook templates + prebuilt dashboard gallery Ships four prebuilt ERPNext dashboards (Sales, Purchasing, Receivables/Payables, Inventory) importable from a Library as cross-app contract via insights_workbooks hook.
- fix Get_list dashboards and queries Fixed get_list endpoints for dashboards and queries.
- fix Fix German translation for 'Host' Fix German translation for 'Host'
- fix Keep POT updates in a single self-updating PR Weekly POT regeneration now reuses a single stable branch, eliminating accumulating stale PRs with conflicts.
- fix Enforce per-role export permission on query download Fixes RBAC enforcement on query downloads by checking the DocPerm export bit; previously only checked global settings and team membership, rendering Role Permissions Manager's role-level toggle ineffective.
p
Press
5 new features · 10 fixes
- feat Sync app source versions from repo on branch change Automatically syncs app source versions when branches are switched. Backported to #6920.
- feat Add a Subscriptions tab to view the team's subscriptions Adds consolidated Subscriptions view under Billing, grouped by type (sites, servers, marketplace apps), showing plan and installed-site tracking. Backported to #6915.
- feat Add Plan History tab to site detail page Shows chronological log of all plan changes with plan details, who changed it, and colour-coded change type (Initial/Upgrade/Downgrade).
- feat Extend NAT into OCI Extends NAT (private IP) support from AWS/Hetzner/DO/Frappe Compute into OCI; upgrades OCI SDK from 2.116.0 to 2.180.0 to support VNIC route table attachment.
- feat For OCI, revert the VNIC route table in static IP allocation OCI cleanup: reverts VNIC route table after static IP allocation.
See all 15 changes
- fix Scope plan fallback to server's own cluster Database servers on legacy plans were shown all enabled plans across all regions instead of just their own; now only platform filter is relaxed during fallback, never cluster.
- fix Remove duplicate primary btn in CommunicationInfoDialog Removed visually duplicate primary button from communication info dialog.
- fix Exclude archived sites' updates from archive block Bench archival was incorrectly blocked if a site that had been involved in a fatal update was later archived; the guard now excludes archived sites.
- fix Use host name if present when trying to notify users of incoming site archival Site archival notifications now use the host name when present for better user clarity.
- fix Properly match githuburl in add apps dialog GitHub URL regex matcher now handles github.com URLs without requiring https:// prepend.
- fix Show remaining wait time instead of elapsed time for disk resize Disk resize wait messages now show remaining time (decreasing) instead of elapsed time (increasing), matching user expectations for cooldown UX.
- fix Only hand out standby sites on the latest bench Trial sites now receive the latest app builds instead of potentially weeks-old deployments waiting on async migrations. Backported to #6914.
- fix Add missing dependent apps to release group Automatically appends required dependent apps to release groups if missing, preventing manual configuration gaps. Backported to #6916.
- fix Remove unnecessary validation in Release Group doctype Removes an overly restrictive validation check in Release Group. Backported to #6918.
- fix Change team owner icon color to gray Dashboard styling fix.
o
Other
32 new features · 7 speed-ups · 35 fixes · 18 refactors
- feat Feat(meet-sfu)!: use `webRtcServer` for minimising port usage SFU now uses webRtcServer with one port per worker instead of one per transport, dramatically reducing open ports on the server.
- feat Fetch source if available CLI now fetches source code when available for enhanced introspection.
- feat Add OAuth 2.0 browser login Added OAuth 2.0 authorization-code + PKCE flow for interactive browser login; access token refreshes automatically and no secret is stored locally.
- feat Add manual refresh button for new emails Mail UI now has a manual refresh button for on-demand email fetching instead of waiting for polling.
- feat Route accepted senders to Inbox and let spam fall through screening Mail screening gate now routes accepted senders straight to Inbox while letting unrecognized mail fall through to server-side spam filtering.
See all 92 changes
- feat Notify when a newer version is available CLI now passively notifies users when a newer version is available via a one-line stderr nudge, leveraging the existing update command.
- feat Add self-upgrade command CLI can now self-upgrade using the original installation backend (uv tool, pipx, pip) with automatic detection of the installer.
- feat Introduce themes for avatar Avatar component now supports themes with deterministic color assignment by label, defaulting to gray with overrideable options.
- feat Disable mail account Users can now disable their mail account; when disabled, an optional Stalwart role from Mail Settings is applied to restrict mail server access.
- feat Launch CLI coding agents wired up for Frappe Added frappe-cli assistant command to launch CLI coding agents (pi, claude, codex) with Frappe-specific system prompts and site context.
- feat Add read-only profiles CLI profiles now support --read-only flag to restrict operations to GET requests only, preventing accidental writes.
- feat Add daily job to renew expiring JMAP push subscriptions Daily scheduled job now renews JMAP push subscriptions within 3-day expiry threshold, preventing subscription lapse.
- feat Add push encryption toggle and fix encrypted push decoding JMAP push encryption now toggleable (unencrypted by default), and encrypted push decoding fixed to handle base64 body with JSON content-type.
- feat Show SMTP/IMAP/POP details for third-party clients Mail Settings now displays SMTP/IMAP/POP configuration for third-party mail clients (Thunderbird, Gmail app), configurable via admin Mail Client Configuration table.
- feat Add Push Subscription tab to Settings Mail UI Settings now includes Push Subscriptions tab where users can create, view, renew, and delete JMAP subscriptions in bulk.
- feat Add Verify SSL option for JMAP connection Added Verify SSL checkbox to Mail Settings for JMAP, enabling local development with self-signed certificates.
- feat Markdown format for useEditor and Markdown-backed apps (wikis, docs) can now use `format: 'markdown'` with content carried as markdown string.
- feat Add date-range old-order sync with paginated fetch and duplicate-safe creation New on-demand backfill job fetches and syncs Unicommerce orders within a date range with pagination and duplicate safety.
- feat Add --debug to trace requests and server SQL Global `--debug` flag now traces HTTP traffic and server SQL to stderr (with API keys redacted).
- feat Agentic ops, Code & Data wiring feat(AI Integration): Agentic ops, Code & Data wiring
- feat Recipes gallery homepage + frappe-ui design skill Adds homepage gallery with eight full-page app screens in desktop and mobile variants, live preview/code switcher, and frappe-ui design guidance.
- feat Operate the Desk frontend from the Flow panel Adds client tools (read_screen, navigate, fill, submit, etc.) so the panel agent can drive the Desk frontend directly — reads the current route and form state, then manipulates fields and submits.
- feat Reconfigure sites with a shorthand name and description New `frappe-cli auth configure ` to rename and/or describe existing authenticated sites without re-entering credentials.
- feat Resize_capacity — per-host headroom for an in-place resize In-place VM resize now gates on per-host free room (ceiling = host.free + vm.own_footprint), not fleet best-host headroom; includes `placement.resize_headroom()` and whitelisted `provision.resize_capacity()`.
- feat Host dashboard shipped under socket activation Per-host read-only dashboard: Vite/Vue SPA with a stdlib-only backend serving live `/api/state`, organized around Overview/Machines/Images/Storage/Network/Firewall/System sections.
- feat Resolve VM image from frappe_version VM provisioning now resolves the OS image based on frappe_version.
- feat Don't make newly authenticated sites the default `frappe-cli auth login` now defaults to `--no-default`, so new sites don't automatically become the default; pass `--default` to opt in.
- feat Replayable fixture for demo data Replaces imperative demo generator with deterministic fixture: same forum every seed, timestamps re-anchored to "now", requires no LLM or network.
- feat Enhance event logging and delivery mechanism Adds "queued" and "rolled_back" event statuses, implements retry logic for committed events, and enhances logging with timestamps.
- feat Require explicit site for non-interactive multi-profile runs When multiple profiles are authenticated and the CLI runs non-interactively (piped output), it now requires explicit `-s/--site` or env vars instead of silently falling back to the configured default.
- feat Meet mail integration Meet app now integrates with mail functionality.
- feat Add API method discovery commands `frappe-cli method search|list|show` backed by Frappe's API v2 discovery endpoints; supports `--json` for raw payload or human-readable output.
- perf Keep DTLN worklet out of the Vite graph Serve the noise-suppression AudioWorklet as a static asset instead of bundling it, reducing production build size by ~57MB.
- perf Use plain textarea and gemoji instead of pulling editor Simplify message composition by using standard textarea with emoji support instead of a full editor dependency.
- perf Optimistic joining flow Improve perceived performance when joining video calls.
- perf Use colorful avatars Display colorful user avatars in suite apps.
- perf Use frappe-ui BottomSheet Replace Gameplan's local BottomSheet component with the shared frappe-ui primitive; updates mobile reaction picker, revisions dialog, discussions, and space pages.
- perf Apply biome formatting across frontend Frontend was out-of-format per committed biome.json; landed the mechanical `biome check --write` output as one standalone commit (35 files, no behavior change).
- perf Misc cleanup General code cleanup.
- fix Harden API paths, config updates, and downloads Harden API paths and configuration handling in frappe-cli.
- fix Bump reka-ui to 2.9.9 so dialog inputs focus on mouse click Upgrade reka-ui to fix a regression where dialog overlays suppressed focus on mouse clicks to inputs and contenteditable regions.
- fix Don't reload on switching apps Stop reloading the page when switching between suite apps.
- fix Remove root redirect from website redirects Stop redirecting the root path to allow users to set their default home URL.
- fix Don't override favicon for mail and calendar Preserve app-specific favicons instead of overriding them globally.
- fix Block disabled admins from admin endpoints Disabled Mail Admins or System Managers with valid sessions or API keys could restore their own access by calling enable_members without involving another admin; the fix scopes the override to logged-in users only.
- fix Dark-mode event colors Calendar event colors now render correctly in dark mode.
- fix Trim guide for agents CLI guide now focuses exclusively on agent use cases; removed human-centric auth and profile management instructions.
- fix Validate user login CLI now validates actual user login instead of accepting Guest or HTML responses.
- fix Resolve avatar/presence user from shared session store Sheets app avatar now displays correct user initials instead of literal "U" by resolving session from shared store instead of window.frappe.
- fix Relocate email templates to suite app root Email template loading fixed by relocating templates to app root, restoring frappe.sendmail(template=...) functionality.
- fix Resolve lock-wait timeouts and cut repost overhead in loan write off and repayment repost Bulk loan write off and repayment repost operations now execute with batching and async reposting instead of single long transaction, eliminating lock timeouts and reducing runtime from hours.
- fix Unnecesary styling Unnecessary styling removed.
- fix Remove non-standard "Payroll Manager" role from reports Non-standard "Payroll Manager" role removed from lwf_register, esic_register, bank_mandate_report, and employee_provident_fund_register permissions.
- fix Use indiacator pill for styling status fields Status field styling now consistent using indicator pill component.
- fix Enforce Flow Model permission at runtime Model selection now enforces User Permissions at runtime, allowing admins to restrict which Flow Models users can run.
- fix Map PY state to Puducherry to match ERPNext state list Unicommerce orders shipping to Puducherry now map to the correct ERPNext state name.
- fix Bump `dnspython` to ~=2.6.1 (PYSEC-2026-1307) fix: bump `dnspython` to ~=2.6.1 (PYSEC-2026-1307)
- fix Default list sort to 'creation desc' `frappe doc list` now defaults to newest documents first unless otherwise specified.
- fix Refresh access token on 401 and retry once so long-running syncs survive token expiry Long-running Unicommerce sync jobs now refresh expired tokens on HTTP 401 and retry instead of aborting.
- fix Update erpnext helper imports to their new mapper and service modules Updates imports to ERPNext develop's relocated modules and resolves test suite failures for v17 compatibility.
- fix Mail and calendar export Restores export functionality for mail and calendar items.
- fix Generate preview from HTML body Enables preview generation from HTML body content in email and calendar exports.
- fix Hide unpublished content from search results Adds is_published check for spaces and handles unpublished page re-indexes immediately instead of through a 5-minute scheduler queue that could back up indefinitely.
- fix Don't flag valid third-party links as broken (#575) Adds User-Agent header to requests and treats 401/403/429 auth wall responses as valid links rather than dead links.
- fix Fix(SendCloud)!: update deprecated endpoint and parcel validations Updates deprecated SendCloud endpoint and removes strict parcel dimension validation that blocked rate fetch and label creation for carriers with flexible requirements.
- fix Report dynamically-mandatory fields in read_screen Reports fields made mandatory at runtime (via toggle_reqd or mandatory_depends_on) by reading live docfield state instead of static metadata.
- fix "Open in ChatGPT/Claude" uses wrong page URL after sidebar navigation Makes AI share link URLs reactive to SPA navigation instead of binding once at render.
- fix Recover from malformed tool-call arguments Treats invalid JSON in tool-call arguments as an error result instead of crashing the Flow Run, allowing weaker models to retry.
- fix Set max sub category or category max amount while declaring exemptions fix: set max sub category or category max amount while declaring exemptions
- fix Misc hardening fixes for security Hardening against redirects and http protocol weaknesses.
- fix Remove limit for doctypes Removes artificial doctype limit in the CLI.
- fix Follow redirects instead of hard-failing FrappeClient now follows 3xx redirects (like trailing-slash normalization) safely, since httpx strips Authorization headers on cross-origin redirects.
- fix Respect theme in meet home and shortcut dialog changes Meet home and shortcut dialogs now respect the user's theme setting.
- fix Remove em-dashes and other AI-speak from demo content Removed 46 em-dashes and related AI-generated phrasing from demo fixture and seeding docs, replacing with natural alternatives (46 in fixture, 27 in docs, 8 in code).
- refactor Typo in CLAUDE.md Fix a typo in documentation.
- refactor Run parallel e2e tests Parallelize end-to-end test execution for faster CI.
- refactor Type-check the package under mypy --strict Package is now 100% type-checked under mypy --strict with checks wired into pre-commit and CI to prevent regression.
- refactor Remove garbage tests Removed low-value test cases.
- refactor Rewrite README README rewritten in an engineering-focused voice with documentation organized around common workflows.
- refactor Create weekly release and generate semantic release and release notes actions India Payroll CI now generates weekly releases with semantic versioning.
- refactor Remove frontend tooling Reverted frontend tooling features as Flow is moving in a different direction; preserved malformed tool-call recovery fix.
- refactor Remove merge queue ci: remove merge queue
- refactor Derive payments branch from CI branch instead of hardcoding develop Fixed version-15 CI failure by deriving payments branch from CI branch (version-15 bench requires Python 3.10, not 3.14).
- refactor Cover markdown paste rendering (#609) test(editor): cover markdown paste rendering (#609)
- refactor Migrate to Frappe v16 Updates CI/tooling (ESLint 10, Prettier 3.1, commitlint, ruff), bumps to Python 3.14/Node 24/MariaDB 11.8, and version 16.0.0.
- refactor Clean up public API surface v1 API cleanup: adds BottomSheet, DesktopShell scroll prop, refines list primitives (ListGroup, ListHeaderCell, etc.), refreshes generated API references, and groups legacy compatibility paths.
- refactor Keep uv.lock in sync on release Release process now runs `uv lock` and includes `uv.lock` in the release commit, keeping it in sync with `pyproject.toml`.
- refactor Fix broken CI badge in README README CI badge URL referenced non-existent `test.yml` instead of `ci.yml`.
- refactor Enable merge queue support Adds `merge_group` trigger to CI workflow so required checks run when GitHub merge queue builds the merge branch.
- refactor Split release into its own workflow, triggered on every push to develop Decouples release from CI gate since the merge queue already gates all merges to develop; release now runs on every push to develop with no CI dependency.
- refactor Stop release job being skipped after the ci gate Release job was being skipped on `merge_group` events due to incorrect conditional logic; fixed to run correctly.
- refactor Merge CI into single long pipeline Consolidates CI workflow into a single linear pipeline.