Weekly report
Frappe and ERPNext changes, 31 Aug to 6 Sep 2026
326 changes merged: 2 breaking, 76 new features, 22 speed-ups, 180 fixes, 46 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
- breaking Prevent update_doctypes from exporting files Utility test called update_doctypes against real schema, saving standard child DocTypes to the app checkout and breaking later migrations.
- breaking Pre-tag surface trims, the toast contract, and the type errors that reach consumers Eight breaking changes for 1.0.0 tag: `ThemeSwitcher` moves to experimental, DatePicker stops re-exporting utils, `Button` drops exposed `rootRef`, `HoverCard` declares side/align/portalTo, Toast compat shims removed, Toast `description` becomes required.
- feat Let an app mount its own UI inside a desk page Enables apps to mount Vue UI with frappe-ui in shadow roots within desk pages, isolating styling and dependencies from the framework.
- feat A history entry carries the sidebar it was read in Fixes back button navigation for items that appear in multiple sidebars by storing which sidebar the page was opened in.
- feat Weigh each boot key and log the ones over budget Implements boot budget checking by logging each key's size and flagging those exceeding the 40 KB budget.
- feat Open a shut section the address is standing in Fixes sidebar section expansion so a section automatically opens when the address points to an item within it, even if keep_closed is set.
- feat Draw a navigation item's authored icon Renders authored navigation item icons that were defined and shipped but not drawn in the UI.
See all 85 changes
- feat Keep the reader in the panel they are already in When a navigation destination exists in multiple panels, keeps the reader in their current panel instead of always switching to one panel.
- feat Save a navigation arrangement as anchors, not positions Desk v2's first user-state write: saves navigation arrangements (which items are pinned/hidden) as anchors rather than screen positions for consistency across devices.
- feat Draw the sidebar a linked rail item opens Renders the sidebar panel that opens when clicking a linked rail item; implements charter point 1 of the rail/sidebar design.
- feat Let an app extend another app's rail, and drop mount_on One app can now extend another app's rail while keeping its own; resolves the mounting and ordering question for multi-app navigation.
- feat Filter desk v2 navigation on the bucket each item type declares Builds the single navigation filter designed for "Filter an authored rail"; applies the bucket each item type declares.
- feat Render every navigation item kind, through the contribution door All eight Navigation Item Type records now render in AppRail.vue instead of silently dropping seven of them; implements the contribution pathway.
- feat Resolve desk v2 navigation into boot New `frappe/shell/navigation.py` resolves rails and sidebars into boot, implementing the design settled by "Where does desk v2 resolve navigation layers?"
- feat Author Rail and Navigation Item on desk-v2 New Rail and Navigation Item doctypes for desk v2's navigation model.
- feat Extend Sidebar for desk v2 with an address, layers and Navigation Item rows Desk v2's sidebar gains link_doctype, layers, and Navigation Item row support.
- feat More improvements for the editor Sidebar editor now supports item deletion and direct app shipping.
- feat Cleaner tree view UI Tree view redesign with improved layout and visual hierarchy.
- feat Address every doctype under every prefix, with a module segment Moves slug table out of boot to serve per-bench routing with module-name mapping, allowing doctypes to be addressed under every prefix via a module segment.
- perf The shell's Python reads as code Applies comment cleanup rule to desk v2 shell Python, removing explanatory and redundant docstrings per AGENTS.md.
- perf Field descriptions that fit under the field Shortens field descriptions on Rail, Navigation Item, Navigation Item Type and Sidebar DocTypes to fit under their input fields.
- perf Shell, router and contribution seam comments under the rule Brings frontend shell, router and contribution seam files under the desk v2 comment rule, cutting 21% → 11% comment density.
- perf Record-page engine comments under the rule Applies comment cleanup to the record-page engine (36 files), removing ticket citations and "rather than" arguments.
- perf The comment and field description rule for desk v2, and the check behind it Documents the comment and field description rule for desk v2 and implements the automated check that gates four area sweeps.
- perf Speeding up permission level maps generation Uses `set` instead of `list` when generating permission level maps to avoid redundant duplicate prevention work.
- perf Replace datetime.now() with now_datetime() Dashboard chart tests fail at month-end with timezone mismatch between machine clock and site time; tests now use `now_datetime()`.
- perf Add the desk layer's glossary Documents the desk layer's vocabulary including terms like Replay, Field overlay, Commit, and Row handle.
- perf Add the desk layer's design philosophy Establishes the desk layer's rulebook addressing where code belongs in @framework/ui versus frontend/.
- perf Add workspace notes for the desk v2 shell Adds CLAUDE.md with operational workspace notes for the desk v2 shell, documenting traps and commands.
- fix Make capture preview remove control readable over photos Updates camera preview close button styling to remain visible over dark backgrounds.
- fix Constrain captured image size in camera preview Constrains preview image dimensions in camera upload dialog to prevent overflow and stacking across grid columns.
- fix Add client_secret in blocklist of traceback_sanitizer Masks client_secret credentials when they appear in error tracebacks to prevent credential leakage.
- fix Translated doctype search repeats rows across pages Fixes pagination for doctypes with translated fields, which previously repeated rows across pages due to filtering translated values in Python after SQL offset.
- fix Escape in get_csv_bytes too Escapes special characters when exporting CSV files to prevent formatting issues with leading characters.
- fix Keep the right column aligned across rows Fixes list view layout where timestamps, comment counts, and avatars had variable widths, misaligning columns.
- fix Duplicate intro messages on first save of new document Deduplicates intro messages that were being shown multiple times on first document save.
- fix CSV conversion of prepared report fails when report has total row Handles list-format total rows in CSV conversion that was expecting only dict rows.
- fix Quote boolean literals so they work as conditions too Quotes boolean literals in SQL conditions to fix postgres type errors when booleans are used in WHERE clauses.
- fix Give parent docs identity to link child table with attach field Fixes file attachment linking in child table fields by ensuring parent documents have proper identity.
- fix Typecast ref_name and docname Updates autoincrement doctypes with correct typecasting for ref_name and docname fields.
- fix Keep json payloads parseable Ensures JSON payloads remain parseable, preventing data corruption during serialization.
- fix Read app data files as UTF-8, not the locale default Fixes `UnicodeDecodeError` that blocked all site migrations when running under C/POSIX locales with ASCII encoding.
- fix Remove request completely fix(safe_exec): remove request completely
- fix Use query builder for contact search PostgreSQL couldn't execute the Contact link query's MySQL IF function; rebuilt with the query builder to work across databases.
- fix Force render_safe_globals context Web pages no longer need to parse `exec_safe_globals` — `render_safe_globals` is sufficient for the use case.
- fix Apply the module veto to a sidebar addressed at that module `block_modules` was gating Module items but missing Sidebar items addressed at blocked modules; now applies the veto consistently.
- fix Open workspace by slug in Workspaces tab Workspace routing was using raw names instead of slugs, causing lookups to miss and show 404s.
- fix Populate footer parent_label options on page load Footer Items' Parent Label select stayed empty on page load and only populated after editing; mirrors the fix already applied to Top Bar Items.
- fix Changing the file private/public should not throw FilealreadyExists error fix(file): Changing the file private/public should not throw FilealreadyExists error
- fix Correct typo. in cache invalidation key User `allowed_in_mentions` changes weren't invalidating the cache because the handler checked the typo'd field name `allow_in_mentions`.
- fix Give the IMAP sync rule test account a unique email id Test was reusing an email already owned by another test account, causing backports to v15 (where email_id is unique on its own) to fail.
- fix Print format onboarding follow-ups Print format builder had several follow-up fixes: unified empty-header check, restored letterhead margin in PDF, and copy-from-New-dialog fix.
- fix Harden public signup against enumeration and abuse Rate limit public signups to 500 per IP per minute and return generic failure messages to prevent email enumeration.
- fix Allowed file extensions setting not enforced for files with an unknown mimetype File upload validation now checks extensions directly instead of relying on mimetype table lookups, preventing unintended accepts when OS/Python versions don't recognize extensions.
- fix Ignore reindexed uids when building IMAP sync rule IMAP sync handles UIDVALIDITY changes without getting stuck on invalid sync requests.
- fix Make `after_response` callbacks reliable One failing callback no longer skips database cleanup; failures are logged with tracebacks.
- fix Filter User fields based on perms instead of ret. unconditionally User fields now respect normal permission checks instead of returning all fields regardless of access.
- fix Render the doc passed by the caller Print rendering now handles unsaved preview documents correctly via `frappe.get_print()`.
- fix Calendar all day fallback fix: calendar all day fallback
- fix Rounding inflates exactly representable values at high precision Float rounding epsilon now scales with precision to prevent inflating exact values.
- fix Allow export when report exceeds max_report_rows Reports over the row limit can now be exported (which the UI recommends).
- fix Cast boolean values to strings for PostgreSQL compatibility fix: cast boolean values to strings for PostgreSQL compatibility
- fix Use Redis heartbeat for process health Containerized deployments now correctly detect scheduler status via Redis heartbeat instead of file locks.
- fix Use postgres-compatible quoting in SQL strings and aliases Postgres no longer rejects double-quoted string literals and aliases; uses SQL-standard single quotes.
- fix Make RQ job id creation idempotent fix: make RQ job id creation idempotent
- fix Better message for migrate Framework errors during migrate now display less scary messages.
- fix Add roles table to SMS Settings System Managers can now configure which roles are allowed to send SMS.
- fix Escape docname used as default link text in get_form_link Removes dependency on docname validation by escaping fallback link text.
- fix Show print format field only for query/script reports Print Settings dialog rendered Print Format field in doctype report view and treeview where it does not apply.
- fix 2FA login says the code was emailed when nothing was sent `send_token_via_email` returned `True` even when `frappe.sendmail` did not queue; login page showed false success on unsubscribed or muted emails.
- fix Disabled reports still appear in desk search Disabled Reports appeared in Desk search, List View dropdowns, and recent routes when linked through Custom Roles or with no roles.
- fix Don't advise deleting the lock file on lock timeout Lock timeout message incorrectly told users to delete the file; deleting while held allows concurrent database operations.
- fix Make "rows selected" toast readable in dark mode Datatable selection toast was hard to read in dark mode.
- fix Add link for partner discovery Billing card now links to partners page.
- fix Log lock path on filelock timeout Diagnostic log in `filelock()` used a plain string, logging literal `Filelock: Failed to aquire {lock_path}` instead of the actual path.
- fix Apply field level permission on attachments in right pane Field-level permissions were not applied to attachments in the right pane.
- fix Add connect timeout for requests to Frappe Cloud Frappe Cloud integration lacked timeouts, allowing network issues to block gunicorn workers indefinitely.
- fix Enforce one primary contact per party Prevents multiple contacts from being marked as primary on the same party, eliminating ambiguity in transaction contact selection.
- fix Don't break job system on invalid workers config Guards queue timeout retrieval to fall back to defaults instead of crashing when workers config is malformed, preventing entire background job system failure.
- refactor The contribution table has five paths, not four Updates documentation to reflect the fifth app contribution path (navigation item renderers).
- refactor Tidy the node hover card Drops redundant doctype name from tree node hover cards and adds title tooltips for truncated values.
- refactor Reduce days until stale and increase limit per run chore: reduce days until stale and increase limit per run
- refactor Merge develop into desk-v2 First merge of develop into desk-v2 since branch point (42 ahead / 322 behind) to unblock Rail/Navigation Item authoring.
- refactor Bump jquery, moment and sortablejs jQuery 3.7.1, moment 2.30.1, sortablejs 1.15.7; old bundled versions removed.
- refactor Update POT file chore: update POT file
- refactor Remove unwanted images Remove unwanted images
- refactor CI crowdin setup CI crowdin setup
- breaking Prevent update_doctypes from exporting files Utility test called update_doctypes against real schema, saving standard child DocTypes to the app checkout and breaking later migrations.
- feat More sidebar improvements Adds general sidebar enhancements.
- feat Disabled marker and cost center parity in tree views Shows disabled status as badges in Account and Cost Center tree views; makes Account Type visible in previews and adds cost center parity.
- feat Ship ERPNext's module-primary rail and its module sidebars Ships one Rail record (20 items) and 18 module Sidebar records (317 rows); ERPNext navigation arrives as JSON with no navigation code.
- feat Contribute the Default Company navigation item kind First navigation item kind from a non-frappe app; demonstrates that extensibility is first-class with a two-file, one-hook contribution.
See all 63 changes
- feat Track supplier quotation order status Supplier Quotation now tracks whether items have been ordered, reusing the status field and adding ordered_qty.
- feat Close individual transaction items Adds a `closed` flag on Purchase Order, Sales Order, Delivery Note and Purchase Receipt item tables to close individual rows instead of the whole document.
- feat Enhance tree view functionality for accounts and cost centers Builds on Frappe tree redesign with accounting-specific actions: account-number badge, freeze indicator, row actions for Add Child, View Ledger, Convert, Move, Delete.
- feat Add multi-currency support to Blanket Orders Blanket Orders now support transaction currency, exchange rates, and selling/buying price lists with price list currency conversion.
- feat Production plan visualizer page and summary report fix Fixes Production Plan Summary report (finished good rows emitted after work order rows, Order Qty showed remainder chain) and adds production plan visualizer page.
- feat Valuation method for BOM secondary items BOM Secondary Item gets a Valuation Type select with three modes: % of FG Cost (existing), Valuation Rate (pre-v16 method: bin-average valuation), and AQ (average qty).
- perf Narrow shared fixture hardening Restores original fixture bootstrap, removes advisory lock and process guard, keeps Item Price reuse and independent fixture creation, keeps settings restoration on exception.
- fix Check write permission in whitelisted document methods Adds `check_permission("write")` to whitelisted document methods that mutate data, preventing unauthorized modifications.
- fix Show actual outgoing rate in ledger preview Displays actual FIFO outgoing rates instead of average valuation rate and formats as currency in stock ledger preview.
- fix Restore hover tooltip on Profit and Loss dashboard chart Restores hover tooltip functionality on P&L dashboard charts.
- fix Check write permission in whitelisted document methods `run_doc_method` was only checking read permission; writes via `db_set`, `db_update`, and direct SQL were accessible to any read-permitted user.
- fix Assign batch_no only when the first batch covers the full qty Auto-pick was assigning a batch that couldn't fulfil the full quantity when qty spanned multiple batches; now leaves batch empty so the auto-created bundle splits it correctly.
- fix Preserve exchange gain loss journals in lcv Submitting a Landed Cost Voucher was cancelling the exchange gain/loss Journal Entry it was meant to work with.
- fix Subtract stock qty of same-document rows from batch availability Batch filtering was subtracting transaction-UOM qty from stock-UOM quantities, allowing assignment of batches that can't cover alternate-UOM rows.
- fix Filter fully ordered items when creating RFQ from Material Request RFQ creation was copying all items including those fully covered by POs; now filters on pending qty like the PO flow does.
- fix Use item warehouses in production plan work orders Work orders from a production plan were using the sub-assembly target warehouse as source for all raw materials instead of respecting each item's defaults.
- fix Validate contact email before saving an email campaign Email campaigns for contacts with no primary email were saving and silently failing to send; now validates email presence first.
- fix Include payment deductions in sales/purchase register ledger bal… Sales Register ledger view incorrectly showed discounted amounts as outstanding customer balance when payment entries posted discounts to Sales Discount accounts.
- fix Filter cancelled BOMs in BOM Stock Analysis The BOM selector was including submitted but now-cancelled BOMs.
- fix Prorate landed cost charge into transaction currency Landed cost charge GL entries were using the entire item net amount instead of the applicable charge when posting in transaction currency.
- fix Use company-currency change amount when netting pos gl entries Multi-currency Sales Invoices were netting POS change amount in invoice currency instead of company currency, producing incorrect GL entries.
- fix Check read permission on lead in add_lead_to_prospect The method wasn't checking whether the user could read the lead before converting it to a prospect.
- fix Rearrange fields in BOM Operation fix: rearrange fields in BOM Operation
- fix Allow creating stock closing balances Non-Administrator users were getting permission failures when generating Stock Closing Balance records.
- fix Skip zero quantity items in production plan material requests Backports v16 behavior to v15: zero-quantity rows stay in Production Plan for bin reservation but are skipped when creating Material Requests.
- fix Add missing perm checks on various whitelisted methods Enforce permission checks on multiple whitelisted methods that were previously bypassed.
- fix Add permission checks on payment entry whitelisted methods fix: add permission checks on payment entry whitelisted methods
- fix Ignore cancelled batch entries in valuation Batch quantity calculations during manufacture exclude cancelled outward entries.
- fix Handle BOM price list currency update New BOMs no longer error when selecting an item triggers price list currency updates.
- fix Round party balances to currency precision in Trial Balance for Party GL balances rounded to currency precision eliminate floating-point residuals that bypassed the Exclude Zero Balance filter.
- fix Validate serial batch bundle company A stock voucher could retain a Serial and Batch Bundle from a different company after the voucher company was changed.
- fix Validate POS Settings invoice and search fields on the server API requests could store invalid fields or excluded items in POS Settings, bypassing browser validation.
- fix Check read permission on source in create_duplicate_project Project duplication did not verify read access to the source project.
- fix Add missing permission validation on get_contract_template CRM contract template endpoint was accessible without permission checks.
- fix Add permission checks on get_available_payment_schedules Payment schedule endpoint lacked permission validation.
- fix Do not map the same row twice in "Get Items From" Selecting the same Delivery Note twice in a Sales Invoice added two sets of lines for the same rows; button now enforces idempotence.
- fix Explain missing fields when loading party details or taxes When Company, party, or date was missing, the form cleared user input and showed a vague "Mandatory" message; now explains what was cleared and what must be set first.
- fix Add permission checks on get_invoices POS invoice endpoint was accessible without permission checks.
- fix Compare updated item quantities in stock UOM Update Items compared quantities stored in different UOMs, rejecting valid updates or accepting invalid reductions when conversion factors differed.
- fix Correct reservation and pick list quantities Only the final batch had its delivered quantity updated; picked quantities spanning multiple locations were deducted repeatedly; allocated serial numbers were not removed from leftover locations.
- fix Handle duplicate root BOM items Adding the same raw material twice under a root BOM Creator raised `StopIteration` instead of a duplicate validation error.
- fix Keep closed rows out of Update Items Closed rows remained editable in Update Items dialog and reachable via the whitelisted method; server now excludes them.
- fix Correct BOM sorting and stock translations BOM item sorting used an invalid comparator for equal item codes; two stock validation messages had formatting issues preventing translation or silently discarding arguments.
- fix Widen item name in stock projected qty Stock Projected Qty report allocated only 100 pixels to Item Name while Description had 200, truncating longer names.
- fix Translate label in party validation Party validation label in error messages was not wrapped for translation.
- fix Restore isolated loyalty and subcontracting tests Loyalty Program test module failed in isolated process; Skip-transfer Manufacture Stock Entries replaced Work Order item warehouses incorrectly.
- fix Skip tax addition for invoice created from opening invoice tool Opening invoices automatically fetched taxes when enabled in Account Settings, but opening entries are inclusive and should not auto-add.
- fix Scoping whitelisted methods output to projects and timesheets that are accessible to users Restricts whitelisted method output to user-accessible projects and timesheets, preventing unauthorized data exposure.
- fix Work Order picks wrong Delivery Date when Sales Order has the same item in multiple rows Backport to version-16-hotfix.
- fix Work Order picks wrong Delivery Date when Sales Order has the same item in multiple rows Backport to version-15-hotfix.
- fix Use packed row delivery date Work Orders for packed items now correctly pick delivery dates from their corresponding Sales Order rows instead of the first matching item, fixing wrong date assignments when the same item appears multiple times.
- refactor Authenticate github clones in install.sh Fixes intermittent CI setup failures by authenticating git clones from GitHub to avoid throttling on unauthenticated HTTPS requests.
- refactor Strict permissions for transaction deletion record Restricts Transaction Deletion Record creation and adds System Manager permission check when using the "Delete Transaction" button.
- refactor Release v15 chore: release v15
- refactor Release v16 chore: release v16
- refactor Release v16 chore: release v16
- refactor Allow shallow fetch when fast-forwarding the cached bench Adds `--update-shallow` to allow extending shallow clones; fixes bench init failures on cached runs after frappe develop moves past the baked base SHA.
- refactor Add SMS settings roles for SMS send access control Patch to pre-fill roles into SMS Settings Role Table after frappe/frappe#42285.
- feat Add icons for Update Progress and Mark as Completed Goal tree row actions now display icons for Update Progress and Mark as Completed.
- feat Copy applicant data when creating an Employee Creating an Employee from a Job Applicant now uses mapped document creation, copying name, email, phone, designation, salary currency, and job opening details instead of opening a blank form.
- fix Clear unused dates when Is Recurring is toggled Clears hidden date fields in Additional Salary when toggling recurring mode to prevent false duplicate/overlap validation errors.
- fix Exclude cancelled Job Offers in JobApplicant.onload Filters out cancelled job offers from job applicant UI to prevent linking to dead records.
- fix Set print_format_for to doctype in standard formats Makes bundled print formats (Salary Slip variants) visible in the print dropdown by setting the print_format_for field.
See all 8 changes
- fix Update system date format for password in salary slip Date fields in password policy template stringified as ISO regardless of System Settings format; employee told password is their date of birth in dd-mm-yyyy tries 08-05-1990 and cannot open PDF.
- fix False Exchange Gain/Loss on Expense Claims in base currency Expense Claims booked false gains/losses when linked advance's exchange rate was missing/zero; now skips calculation when no real rate exists.
- refactor Add audit_trail_doctypes to hooks Allows other apps to customize audit trail tracking of HRMS DocTypes.
- feat Ship CRM's rail and its four doctype sidebars CRM's rail is now authored in source as standard rows instead of derived at runtime; implements the doctype-primary half of the navigation design.
- feat Add chart options API and update AddChartModal component Moves chart definitions from hardcoded frontend to a backend API, providing an extension point for apps to contribute custom dashboard charts.
- feat Add fetch_from support in fields feat: add fetch_from support in fields
- fix Make website column clickable in Leads and Deals list views Website field now opens URLs in a new tab instead of showing as plain text.
- fix Prevent IntegrityError when syncing items without a standard rate Item sync was writing NULL to the NOT NULL currency column when an item had no Item Price; now coerces the rate with `flt()`.
See all 18 changes
- fix Manual backport of visited records dimming (#2693, #2767) #2693 was never backported due to a merge commit; manually applied #2693 and #2767 to main-hotfix and fixed a subsequent migrate failure.
- fix Dim assignee, timestamp and favourite columns for visited rows Visited-row dimming was only applied to text columns; now extends to assignee avatar, timestamp, and favourite heart columns, plus adds data patch for existing records.
- fix Show filter date fields in the system date format Date/date-range filters now display in the configured system date format.
- fix Prevent 'Document not found' error flash on lead delete Delete success is now silent instead of showing a misleading error before navigation.
- fix Bulk edit reports failures and supports lost reason Bulk edit now reports which records failed to save and supports required lost reason on status changes.
- fix Allow custom values for autocomplete fields Combobox fields now allow custom values like Frappe's Autocomplete field.
- fix Email template selection break fix: email template selection break
- fix Cannot read properties of null in quickfilters Quick filters failed on cold list-view loads when list.params was null.
- fix Typos in user-facing messages and parameter names Fixed intergration→integration (Exotel error), charaters→characters, seperate→separate, and extention→extension parameter.
- fix Wrap hardcoded user-facing strings in __() for translation Error banners, modal fallbacks, and validation messages on Deal/Lead pages were not wrapped for translation extraction.
- fix Dim visited deals/leads in list view using frappe's _seen field Dims deal and lead rows in list view once opened, using Frappe's built-in `_seen` tracking instead of client-side store.
- refactor Put Territories back in the Organizations panel Restores CRM Territory in the Organizations sidebar panel alongside Deals, fixing workaround that removed it.
- refactor Minor release v1.83.0 chore: minor release v1.83.0
- fix Stop mail loops from bounces and autoresponders Prevents inbound mail loops by screening machine-generated messages and blocking replies to bounces and out-of-office responses.
- fix Write portal defaults without saving the whole document Fixes migration failures by writing portal settings without validating broken link references in unrelated menu rows.
- fix Move agents off an agent status when it is disabled Disabling an HD Agent Status left agents stuck on it because the picker hid disabled statuses; now auto-moves them to the default status.
- fix Dedupe vue-router and dompurify for the linked @framework/ui Building against frappe/ui source was failing because vue-router wasn't installed next to that source; added deduplication.
- fix Avoid improper reply box closing for Grammarly suggestions Grammarly's suggestion card no longer triggers reply box closure.
See all 8 changes
- fix Blank empty states, always-visible Update Account, false typing indicator Settings screens (Agents, Email Accounts, Saved Replies, Field Dependencies) now render empty states instead of blank.
- fix Download attachments the browser cannot preview Attachments with unrenderable mime types (`.dwg`, `.avi`) got stuck in preview dialog without download links; preview eligibility is now an explicit allowlist.
- refactor Hotfix to main Hotfix to main
- feat Migrate v2 dashboards to v3 workbooks Adds a migrator copying v2 dashboards into new v3 workbooks; v2 queries, expressions, charts and dashboards are translated, with post-migration validation comparing results.
- perf Merge version-3-hotfix into version-3 Merge of insights branches resolving workflow step name conflict.
- fix Accept a numeric workbook name on insert Handles legacy numeric workbook names from old fixtures to prevent `bench migrate` failures when syncing.
- fix Native SQL queries with a CTE fail with "Duplicate query name" Fixes ibis query compilation which was writing CTEs twice, causing sqlglot to reject duplicate names.
- fix Read the condition off the whole expression Drill down on conditions with commas was parsing only up to the first comma; switched to a full-expression parser that respects nesting.
See all 10 changes
- fix Report failures and rerun script queries on input changes Script query failures were not published to the Logs panel; Force Run and variable changes did not rerun due to persistent code cache.
- fix Carry a SQL column expression through an ibis query Migrator writes `sql_column` operation for v2 constructs; ensures the operation contract matches develop so columns are not lost on upgrade.
- fix Finish the sql_column rename to raw_sql Tests still referenced the old `sql_column` field name after rename to `raw_sql`.
- fix Give the SQL column operation the same contract as develop Migrator wrote `sql_column` field but develop reworked it to `raw_sql`, causing data loss on upgrade.
- refactor Sync translations with crowdin/github-action Replaces failing Crowdin GitHub integration with crowdin-actions workflow for weekly translation syncs.
p
Press
2 new features · 10 fixes
- feat Find sites with outdated framework in n days Introduces a daily audit job that snapshots the aggregate count of sites with outdated framework versions.
- feat Warning for outdated framework version Shows a banner in bench and site dashboards if the Frappe Framework is more than 30 days old.
- fix Don't archive a site when the archive step was skipped Prevents accidental deletion of a site's backups and metadata when the archive step fails or is skipped, which was mistakenly treated as success.
- fix Allow a pull update on a site with a large database Enables app pull updates on large databases (108 GB+) without requiring a full physical backup.
- fix Use parsed GitHub url when adding app in new app dialog Parses GitHub URLs correctly when adding apps to prevent format-related errors.
See all 12 changes
- fix Print each site that loses its rate limit The rate-limit removal patch was silent on success; now prints the site name after each successful config update.
- fix Strip unwanted fields from save Dashboard forms no longer reject saves over computed fields returned by the resource read.
- fix Add error states for notif panel & server name in incidents card fix(ui): Add error states for notif panel & server name in incidents card
- fix Fix TypeError in OCI attach_to_firewall Virtual machine OCI attachment had a type error.
- fix Say drop bench, not archive bench Bench action menu was the only place that said "archive" instead of "drop" like other destructive actions.
- fix Clamp MSS MSS clamping for NAT to prevent fragmentation.
- fix Permission error on toggle Adds missing editable field declaration so users can enable/disable firewalls without permission errors.
o
Other
1 breaking · 41 new features · 10 speed-ups · 44 fixes · 24 refactors
- breaking Pre-tag surface trims, the toast contract, and the type errors that reach consumers Eight breaking changes for 1.0.0 tag: `ThemeSwitcher` moves to experimental, DatePicker stops re-exporting utils, `Button` drops exposed `rootRef`, `HoverCard` declares side/align/portalTo, Toast compat shims removed, Toast `description` becomes required.
- feat Add query and index analysis to the DB analyzer Adds read-only performance analysis covering time-consuming queries, full table scans, unused indexes, and redundant indexes via Performance Schema.
- feat Integrate Atlas WG Mesh Integrates WireGuard mesh for private tenant networking, builds metald and wg-mesh binaries locally, and auto-configures machines from warm snapshots.
- feat Add support for traffic bandwith limit and ip attach/detach Adds traffic bandwidth limits for public and private internet, cleans up egress options, and enables public IP attach/detach without VM restart.
- feat Add disk throughput and IOPS limits Adds disk throughput and IOPS limit controls for metal VMs.
See all 120 changes
- feat Drive the pictures sidebar from the Theme doctype Makes theme categories configurable via the Theme doctype with Show in Pictures Sidebar and Sidebar Order fields, eliminating hardcoded sidebar lists.
- feat Ask how far a recurring change reaches Unifies the dialog for recurring calendar event changes (edit, drag, delete, RSVP) with consistent UI asking whether to modify one instance or the entire series.
- feat QOL sidebar shortcut Adds Cmd+B keyboard shortcut to toggle the sidebar across the app.
- feat Storage cluster stage handling Adds state toggles at every storage cluster stage for better recovery from failed deployment states.
- feat Introduce Project Adds a new Project feature to the billing module.
- feat Retain html formatting when pasting text content Preserves rich text formatting (lists, inline styles) when pasting between slides instead of stripping to plain text.
- feat Number card target and delta prefix Adds optional `target` field to show target value and `deltaPrefix` for units in NumberCard; removes per-series emphasis on axis chart hovers.
- feat Scroll table horizontally when columns exceed width Allows horizontal scrolling of tables when added columns exceed viewport width instead of shrinking all columns.
- feat Standardize app page metadata Standardizes document titles and favicons across Suite apps with dynamic, workbook-aware metadata.
- feat Feat/timetable generation Automated timetable generation for schools; administrators describe rules once and the generator builds conflict-free weeks, replicates across terms as Course Schedule records, and reports unplaceable items.
- feat Warm snapshots + image promotion VM snapshots, promotion to images, and cloning from warm snapshots; refreshes VM metadata on clone.
- feat Atlas controller - Phase 1 Bare metal provisioning with Scaleway and Route53; adds server provider and DNS provider abstraction, HTTP proxy build, and automates wireguard + metal daemon setup.
- feat Build golden images feat: Build golden images
- feat Better password set feat: Better password set
- feat Separate recorder health and admission Recorder deployment health separate from atomic admission decisions with typed policy/capacity/recovery contracts.
- feat Left right layout feat: left right layout
- feat Project recorded shared stage Record the ordered shared stage from SFU; gate FFmpeg capture on frame commits and media attachment.
- feat Apply dynamic rate limits to all public endpoints All public meeting endpoints (join, approval, etc.) protected with configurable rate limits seeded on install.
- feat Delete and a legible title in the event modal Event modal gains delete from a ⋯ menu and editable title with visual affordance.
- feat Event reminders that reach the browser Calendar alerts now publish a realtime event to open suite tabs and become toasts with an Open action plus system notifications when permitted.
- feat Finalize recording artifacts durably Adds durable Frappe finalization state and authenticated status protocol for recording artifacts, making artifact validation, Drive publication and owner notifications recoverable and idempotent.
- feat Separate recording budgets and storage reservations Adds explicit Drive storage reservations for recording budgets, growing them from durable cumulative segment progress.
- feat Add shortcuts for undo send, schedule send and the outbox Cmd/Ctrl+Shift+Enter opens Schedule Send; Cmd/Ctrl+Z undoes sent mail while server holds it.
- feat Version recording contracts Versions recording commands, callbacks, browser lifecycle, and Recording Grant proof seams with immutable v1 semantic vectors.
- feat Lay the submission details page out as a ledger Outbox submission details redesigned as one narrow column with subject, merged delivery state, state actions, activity list, and message facts.
- feat Make the undo send period configurable per user User Settings gets a Compose section with `undo_send_period` select (5, 10, 20, 30 seconds, default 5).
- feat Add Frappe app scaffold at repo root Scaffolds atlas Frappe app with monorepo coding and documentation guidance.
- feat Better field mapping for actions and support for all WhatsApp languages WhatsApp integration improvements for field mapping and language support.
- feat Replace LVM with ZFS — snapshots, resize, restart Storage infrastructure refactor from LVM to ZFS.
- feat Refactor HTTP Proxy HTTP proxy implementation refactored with token-authenticated control endpoints for maps, certificates, health, readiness, and targeted PATCH/DELETE operations for site and custom-domain mappings.
- feat Restrict cross-tenant access to privileged VMs Adds controller-managed privileged VM whitelist for tenant 0, permitting cross-tenant traffic only when either endpoint is whitelisted.
- feat Pre-filled default reminders, all-day alert fixes New events open with default reminder pre-filled as an editable row; all-day swaps respect defaults; flipping All Day swaps an untouched row between defaults.
- feat Multi-company India Payroll Adds multi-company mode to Payroll Settings with a child table holding statutory registration details per company, supporting multiple ESIC employer codes and EPF establishment codes.
- feat Recover recording interruptions Recovers transient FFmpeg capture failures within a fixed 60-second recovery window, persisting omission bounds, callbacks, and retry state; shows participants the interrupted state and recovery countdown.
- feat Add unicast discovery relay Adds a discovery relay for environments without multicast support, forwarding WHO_HAS and NOW_HERE messages over UDP unicast to configured peers with automatic reload and logging.
- feat Private multicast network mesh Establishes a private multicast network mesh with a reserved tenant ID for cross-IP connectivity on private networks.
- feat Make recording startup durable Persists recorder startup milestones before recording begins and replays/retries startup callbacks until capture launch is acknowledged.
- perf Speed up loan repayment repost by cutting extra queries and events Achieves ~50% faster loan repayment repost (350s vs 709s for 2394+ accruals) by eliminating duplicate penal interest lookups and redundant event triggers.
- perf Use framework icons in print toolbar and remove "Try the new Print Designer" prompt Updates print toolbar icons to framework (Lucide) names; removes the deprecated "Try the new Print Designer" inner message.
- perf Correct API defects in frappe-ui skill, merge the reference files, add an eval gate Skill now includes correct API signatures for consumer apps, fixing prop/slot/option-shape errors that agents made 6 of 10 times in blind evaluation.
- perf Remove dead code Removes orphaned frontend components, superseded editor/history implementations, unreachable legacy controllers, and unused backend surfaces; extends Knip coverage to JavaScript.
- perf Report coverage in PR descriptions CI now appends collapsed backend and frontend coverage reports to PR descriptions with deltas against latest base-branch artifacts.
- perf Run vouched forks on hosted runners E2E keeps contributor vouching as first gate, runs vouched fork E2E code on disposable GitHub-hosted runners, retains self-hosted ARC for internal/protected branches.
- perf Replace interrupted recorder endpoints Replaces failed Chromium/SFU recorder endpoints within interruption deadline, binds replacement callbacks and fresh grants durably, reconciles lost callbacks while preserving semantics.
- perf Enable track changes on settings and exchange doctypes Enables `track_changes` on Calendar Exchange, Mail Exchange, JMAP Account, Mail Signature, Mailbox Settings and Drive Settings doctypes so edits appear in timeline/Version log.
- perf Simplify unvouched PR message Automatic closure message now states only that author is not in vouched contributors list.
- perf Update pypika dev environment Removes deprecated pipes dependency (tox 4.x), bumps tox-gh-actions to match tox, removes tox-venv, updates coverage.
- fix Ignore a file dropped on a read-only editor Prevents file uploads and image insertion into read-only editors, which were incorrectly mutating document content.
- fix Remove backtick notation from order_by Removes invalid backtick notation that was returning HTTP 417 errors across multiple page routes, blocking site access.
- fix Re-evaluate slot-derived computeds when a slot toggles Fixes TextInput prefix and suffix icons rendering incorrectly when toggling visibility.
- fix Stop task detail blanking on server-scoped tasks Fixes task detail page going blank for server-scoped tasks by removing undefined route reference.
- fix Repayment schedule dates stop advancing when schedule type is blank When schedule type was empty, `get_next_payment_date` was returning the same date every loop iteration instead of advancing.
- fix Restore the mobile gap above a poll in the timeline Polls sat flush against post bodies on mobile; restored the mobile padding that was inadvertently removed.
- fix Actions that stopped at a removed toast call Mail and Calendar actions were calling the removed `toast.removeAll()` from a frappe-ui bump; replaced with guard checks.
- fix Triage that reaches the end of a list keeps going Triaging the last thread in a list closed the reading pane and deselected it; triaging from the bottom now wraps to the top to keep the flow going.
- fix Self-heal push subscriptions and seed missing sync state Mail realtime wasn't working because push subscriptions were never created, only renewed; added auto-creation and sync state seeding.
- fix Delete the site's push subscriptions when a user is disabled Disabling a user now cleans up push subscriptions on the mail server so they can't accumulate orphaned entries.
- fix Let the account switcher keep its rows The account submenu closed when moving the pointer toward the list; fixed by using a proper list component instead of hand-built slots.
- fix Time edits the event modal wouldn't take Three issues: recurring event times were overwritten on save, DST transitions weren't handled, and date validation was missing.
- fix Keep the broken-file-log compensation test off stderr Test captured stderr printing, which made CI runners look like failures even though the test passed; now redirects stderr to a StringIO.
- fix Align writer and sheets navbars Adds the shared app switcher, theme control, and account action to Writer and Sheets; aligns navbar chrome with Slides and adds editable Sheets breadcrumbs.
- fix Verify Digio webhook using X-Digio-Checksum header Digio webhooks now verified with correct HMAC-SHA256 checksum header instead of rejected plaintext secret.
- fix Stop double charge debit on write off recovery payment account Write-off recovery payments no longer double-charge the bank account when covering a charge with its own invoice.
- fix A scroll never pages the thread Swipe-to-page now tracks touch movement along its path instead of just endpoints, preventing accidental thread pagination during scroll.
- fix Crash when amount paid check runs before payable amount is set Loan repayment validation moved after payable amount is set to prevent crashes on "Validate Payments" enabled products.
- fix A mail to yourself reads once in its thread Self-addressed messages no longer appear twice (Sent copy and delivery copy collapsed into one).
- fix Language migration and sync race fix: language migration and sync race
- fix Show meet avatar fallback in join/leave toasts Join/leave notifications now display themed avatar initials instead of a generic user icon.
- fix Empty-canvas nudge stays gone once a tool is armed fix: empty-canvas nudge stays gone once a tool is armed
- fix Drop the 10 MB cap on inserted images Removed client-side image size check; limits now enforced below the app layer.
- fix Smooth freehand stroke capture Freehand strokes retain intended shape by filtering low-amplitude samples.
- fix Smooth laser trail spine points Laser pointer trails eased to follow fluid gestures instead of hand jitter.
- fix Mirror shape rotation and connector geometry in SVG thumbnails/exports fix: mirror shape rotation and connector geometry in SVG thumbnails/exports
- fix Render fill and border on text box shapes fix: render fill and border on text box shapes
- fix Compact Fill and Border popovers fix: compact Fill and Border popovers
- fix Delay tooltips for two seconds Tooltip hover delay now consistent across toolbar and teleported popovers.
- fix Table toolbar, header columns, click-to-select, wrap and auto-fit Table toolbar unified; adds cell fill/border, text color, font selector, header controls.
- fix Label elbow corner style and provide clear tooltips fix: label elbow corner style and provide clear tooltips
- fix Give composer errors and checkbox options room to breathe fix(polls): give composer errors and checkbox options room to breathe
- fix Broken expresisons in custom field fix: Broken expresisons in custom field
- fix Vote in a single-answer poll with radios Single-answer polls now render radio buttons instead of checkboxes.
- fix Stop the delete shortcut eating Backspace Popover isOpen state no longer swallows Backspace/Delete keypresses from the page.
- fix Stop failing a publish over an edit that arrived mid-save User could not publish a draft on first attempt; post body never reached the server and publication refused to proceed.
- fix Keep the drafts list in the doctype store New drafts did not appear in the list and deleted drafts persisted until page reload; moved bare useCall into listStore for sync.
- fix Preserve active media attachments Media element manager replaced unchanged srcObject streams after 60 seconds, interrupting playback with brief black frames on routine Vue updates.
- fix Uploaded image overwrites an earlier one with the same filename Pasted clipboard images all saved as `image.png`, with WebP versions overwriting previous images to the same URL; now generates unique names via `generate_file_name`.
- fix Tolerate the root-redirect race in open_root E2E test `test_logs_into_admin` failed intermittently with navigation interruption race; added tolerance for root → /sites redirect.
- fix Keep a selected image ring under the pinned author row Full-width image selection ring in discussions scrolled above and was visible behind the pinned author row; now masked with z-index.
- fix Give the mail actions menu its options back Mail ⋯ menu showed "No options"; frappe-ui menu groups changed to `{ group, options }` but code still used `items` key.
- fix Fix Restore PF wage aggregation in EPF register Version-16-hotfix merge into develop left `_aggregate_salary_detail` in half-merged state with undefined `company_by_slip` references, causing NameError on every call.
- fix Advertise routable local SFU address Respects WebRTC bind address in development and advertises the detected local IPv4 for local media transport.
- refactor Add SPEC files and concept docs Adds SPEC.md for every internal package and concept docs covering metal module architecture, VMs, storage, networking and snapshots.
- refactor Let native copy work in text fields Allows native copy behavior in text fields and inputs instead of forcing custom slide/element JSON format.
- refactor Checkout Frappe before bench init Checks out public Frappe repository explicitly in CI before bench init to avoid anonymous clone failures.
- refactor Broken expressions in custom field Broken expressions in custom field
- refactor Remove unused merge config file Remove unused merge config file
- refactor Clean frontend codebase & de-vibifi Improved and made responsive every component in the frontend directory; simplified the Sticky Toolbar by removing unnecessary JS hackery and negative margins, removed default props from frappe-ui components.
- refactor Register app routes statically Registers every app route group when the suite router is created; lazy-loads app bootstrap and runtimes, removes redirect-only legacy routes, and enables navigation between suite apps without full-page reloads.
- refactor First release v1.0.0 chore: first release v1.0.0
- refactor Merging develop into main Merging develop into main
- refactor Remove low-value tests Removes seven Meet tests that inspect framework metadata, assert fixture self-consistency, preserve removed-route history, or derive expectations from implementation details.
- refactor Move server deployment to the Suite Infra app Mail Cluster, Mail Server, and Server Deployment infrastructure moved to standalone Suite Infra app.
- refactor Move room actions to document API Room-owned participant and settings actions moved to locked Meet Room document methods; migrated callers to Frappe v2 response contract.
- refactor Centralize local storage access Shared typed helpers for Meet preferences, background effects, emoji history, device identity.
- refactor Rename Suite Infra to Suite Cloud Suite Infra renamed to Suite Cloud; README, test script, patch docstring updated.
- refactor Update contract docs chore: Update contract docs
- refactor Pin correct version chore: Pin correct version
- refactor Weekly release Weekly release
- refactor Add semantic release and commit linting Add semantic release and commit linting
- refactor Weekly release Weekly release
- refactor Extract local capture session Extracts camera and microphone lifecycle into LocalCaptureSession, staging changes before committing and isolating cancellation and handoff logic from Vue.
- refactor Centralize media attachment Centralizes remote, local, screen, and preview media attachment while making playback recovery and track ownership role-aware.
- refactor Use ephemeral guest access Replaces persisted guest participants with proof-bound ephemeral access leases, validates guest operations against current lease state, and reconciles missed or expired guest attempts.
- refactor Extract media health monitor Moves Meet network and media recovery policy into MediaHealthMonitor while keeping useNetworkQuality as a thin Vue adapter, enabling recovery and stall decisions without Vue mounting.
- refactor Close SFU meeting manager facade Makes SFUMeetingManager the public boundary for Meet media operations, centralizing producer reconciliation and closing lifecycle and manager-replacement races.