Weekly report
Frappe and ERPNext changes, 5 Oct to 11 Oct 2026
617 changes merged: 3 breaking, 107 new features, 18 speed-ups, 432 fixes, 57 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
- breaking Refactor!: remove wkhtmltopdf and render every pdf with chrome Removes wkhtmltopdf and pdfkit, so every PDF renders with Chrome. This is a breaking change: print formats set to wkhtmltopdf switch to Chrome on migrate, and the PDF Generator setting is removed.
- breaking Pre-bundle prosemirror to avoid breaking TextEditor in dev mode Pre-bundle prosemirror and remove frappe-ui from optimizeDeps to fix TextEditor in dev.
- breaking Nest sublists indented by 2-3 spaces CommonMark-style list nesting with 2–3 spaces was breaking numbered lists; showdown now accepts CommonMark indentation.
Highlights
Compact Filter and Sort with Created by, Access and Unpublished changes filters
builder · feat
Soft module icons
frappe · feat
Use frappe-ui/charts on the dashboard
helpdesk · feat
Quiz sharing, proctored attempt and result improvements
lms · feat
Create Bob chat sessions on the first message and stop autosave writing over Bob's edits
builder · feat
Ask before saving a client script shared by other pages
builder · feat
- feat Soft module icons Framework dock icons become single-colour soft icons that follow the tile's ink.
- refactor Quieter tray with raised active tile Tightens dock tiles and makes the active module the strongest mark.
- breaking Refactor!: remove wkhtmltopdf and render every pdf with chrome Removes wkhtmltopdf and pdfkit, so every PDF renders with Chrome. This is a breaking change: print formats set to wkhtmltopdf switch to Chrome on migrate, and the PDF Generator setting is removed.
- breaking Nest sublists indented by 2-3 spaces CommonMark-style list nesting with 2–3 spaces was breaking numbered lists; showdown now accepts CommonMark indentation.
- feat Group by multiple fields and aggregate multiple columns Report View supports several group by fields and several aggregates (Count, Sum, Average, Min, Max).
See all 148 changes
- feat List all fields on focus and keep keyboard focus in filter and group by popovers The field picker lists all fields on focus, and keyboard focus stays inside the filter and group by popovers.
- feat Read use_ssl from site config for outgoing mail Setting use_ssl in site config enables SSL for outgoing mail, so port 465 works.
- feat Data import for child tables Child tables now support CSV import with Insert, Update and Upsert modes, field pickers, column mapping and validation.
- feat Scope a workflow to documents with conditions Workflows can now be applied conditionally to documents based on field values, with priority support.
- feat Add avatar group component New avatar group component with overlapping display, +N indicator and optional add button.
- feat Show custom label first in the builder properties panel Web Form builder now shows Custom Label first, followed by relevant properties per field type.
- feat Add frappe.ui.BottomSheet for phones New phone-friendly bottom sheet component with steps, auto Back button, drag to resize or dismiss, loaded on demand like chart components.
- feat Sort tree view nodes alphabetically Tree view toolbar now has a Sort dropdown for client-side alphabetical sorting of tree nodes.
- feat Add dedicated "Add Roles" and "Remove Roles" bulk actions User list view now has safe "Add Roles" and "Remove Roles" actions that append or strip roles without overwriting existing ones.
- feat Publish prebuilt assets for Pilot Frappe assets built in CI and published across develop, version-16 and hotfix branches for Pilot benches.
- feat Shared pages open in any shell, system pages in none Pages now open in the shell they were launched from (e.g. printing an Item from Stock opens the Stock shell) instead of always using their module's shell; system pages open without a shell.
- feat Default import template fields for Address, Contact and User Default import fields are now defined for Address, Contact and User doctypes.
- perf Check room permission once, not on every form refresh Skips the permission request when the socket is already in the room, for doctype_subscribe, doc_subscribe and doc_open in both servers.
- perf Fix(desk-v2)… → refactor: resolve every vue import to Vue's runtime build Every Vue import resolves to the runtime build, so no template compiles in the browser.
- perf Migrate UI tests from Cypress to Playwright Port all 101 Cypress specs to Playwright with native sharding; remove Cypress config and plugins.
- perf Trim low-value UI tests Drop UI tests that only check CSS, labels or duplicate another test; make tests table-driven.
- perf Drop unused set only once check from BaseDocument Remove unused `_validate_constants` check and `ignore_validate_constants` flag that haven't been called since v10.
- perf Week number test changes the naming rule of ToDo Create test's own doctype instead of modifying ToDo so rollback doesn't leave stale changes.
- fix Export import provider tables with records Exports for DocTypes with an import provider fill the provider's extra tables and offer an ID column so the file can re-import as an update.
- fix No message when a generated pdf cannot be shrunk Large PDFs that cannot be shrunk now fall back silently to the original, and the "Failed to optimize PDF" message shows only on uploads.
- fix Use the print format's @page margin in chrome pdfs Chrome PDFs use the `@page` margin from a print format's Custom CSS, so they match the preview.
- fix Match Chromium for zero values and empty sections in Typst PDFs Typst PDFs now print zero values for "Print if empty" fields and skip empty labelled sections with their page breaks, as Chromium PDFs do.
- fix Preview a chrome format with its own @page margin The print preview uses a Chrome format's own `@page` margin, so it matches the PDF.
- fix Preview a chrome format with its own @page margin The print preview uses a Chrome format's own `@page` margin, so it matches the PDF. Backport of #44244.
- fix Close only the topmost dialog on escape Esc on a message popup over a dialog closes only the popup, and the dialog keeps what was typed.
- fix Encode meta image url in share tags Share previews show the page image when its file name has spaces or non-ASCII characters.
- fix Honour page breaks and Print if empty in Typst PDFs Typst PDFs now break pages at Page Break blocks and print labels for empty "Print if empty" fields.
- fix Require permissions for public workspaces editing Editing a public workspace now checks permissions.
- fix Replace `verify_password` util with Confirm Sensitive Action dialog Replaces the client-only password prompt with a confirm dialog, since the old prompt guarded nothing on the server.
- fix Hardening desk onboarding step fix(security): hardening desk onboarding step
- fix Validate string and Literal annotations Whitelisted methods using string or `from __future__ import annotations` annotations are now type-validated, so crafted dict arguments are rejected.
- fix Check create, not write, to run a method on an unsaved doc Running a whitelisted method on an unsaved document now requires create permission rather than write.
- fix Override comment_email & comment_by Comment author fields are derived on the backend instead of trusting client values.
- fix Refresh user permissions when the tree changes Adding or moving a tree node now clears cached user permissions for other users, so permission changes apply without a full cache clear.
- fix Normalize Unicode passwords before hashing Passwords are hashed in NFC form, so the same password typed on different keyboards or OSes is accepted.
- fix Count fieldname bytes against the Postgres identifier limit Long non-ASCII custom field names no longer get truncated on Postgres, which caused duplicate-column failures on every later schema sync.
- fix Accept form-encoded new_page and save_page args Creating a private workspace and saving a workspace on v16 work again; both requests were failing with a type error.
- fix Disabled about and contact pages still appear in sitemap.xml fix: disabled about and contact pages still appear in sitemap.xml
- fix Global search shows permission errors for hits the user cannot read Same fix as #44214, the original PR.
- fix Form goes blank after a table multiselect row is changed Same fix as #44211, the original PR.
- fix Report links do nothing when split view is off or on ctrl-click Same fix as #44205, the original PR.
- fix Revert "fix: clear include filters and hide column picker when a print format is set (backport #42528)" Reverts #42546 for the same reason.
- fix Revert include filters and column picker change Reverts #42528, which hid the Include filters checkbox and column picker when a print format is set.
- fix Validate series options and default together Naming series options and default are validated together.
- fix Filter amended documents in audit trail The Audit Trail Document field lists only amended transactions (v15 backport).
- fix Show password field even if it's an fc site The setup wizard shows the password field on Frappe Cloud sites too, since no reset email is sent during setup.
- fix Link preview popover rebuilds on control value change fix: link preview popover rebuilds on control value change
- fix Show Field as read-only in form builder The Field dropdown in the Web Form builder shows the value instead of an empty select.
- fix Trim tables on sqlite and clear stale column cache Trim-tables drops orphaned columns one at a time on SQLite and clears the column cache.
- fix List and drop ghost tables on Postgres in trim-database `bench trim-database` no longer crashes on Postgres.
- fix Add write check to get_workflow_state_count Adds a write permission check to the workflow state count API.
- fix Validate requests and normalize domains Validates allowed paths, monitoring windows and configuration payloads, requires POST for actions, and keeps domain rows consistent without duplicates.
- fix Calculate invoice period from the reference document Auto Repeat periods now cover Daily, Weekly and Fortnightly frequencies, the first generated document, and month-end dates that no longer drift.
- fix Unbound import in apply_workflow on cancel Workflow cancellation with Queue in Background enabled no longer fails with UnboundLocalError.
- fix Fix(bank statement) / fix(data_import): skip payload_count write when the import doctype lacks the column Bank Statement Import fails on every run since #39887 with an unknown-column error on payload_count. The write is skipped when the doctype lacks the column.
- fix Track index progress for every doctype A fresh search index build seeds a progress row for every configured doctype, not only the last one.
- fix Use a limit SQLite accepts for offset without limit get_list with an offset but no limit works on SQLite.
- fix Limit DocType names to the Postgres identifier length DocType names are capped at 60 characters on Postgres, so long names no longer create truncated tables that break re-saving.
- fix Round robin repeats a user on concurrent saves The last assigned user is read with a row lock, so two documents created close together no longer go to the same user.
- fix Redis_cache returns None when a parallel worker caches the result If another worker saves the cached result between the read and the exists check, the key is read again instead of returning None.
- fix Show correct status in User list for select-only users Select-only users no longer see every user as Disabled in the User list.
- fix Let select-only users search linked addresses Address link fields using address_query with link_doctype and link_name filters no longer raise PermissionError for select-only users.
- fix Keep the file's modified on a DocType data import Data imports keep the file's modified timestamp, so repeated migrates no longer change fixture DocTypes. Model sync still sets modified to now.
- fix Unread count stays stale when the feed is reloaded Reloading the notification feed also refreshes the unread count badge.
- fix Show participant events in the calendar The calendar now includes events where the user is a participant, such as Maintenance Schedule visits assigned to a Sales Person.
- fix Show Image field in report side panel preview The Image field in Report View's side panel shows the image instead of the missing-image placeholder.
- fix Compare is set filters with the column's empty value (backport #43537) Is Set filters compare against each column's empty value on v16.
- fix Icon picker stays open when clicking elsewhere in a child table The icon picker closes when clicking elsewhere in a child table.
- fix Round the section selection ring to its radius (backport #44153) Backport of #44153.
- fix Round the section selection ring to its radius The selection ring around a print section follows the section's corner radius.
- fix Stop cutting off the bottom of badge text Descenders in badge text (g, y, p) are no longer clipped.
- fix Give the info card an opaque background The field info card uses a defined background token, so page text no longer shows through it on v16.
- fix Widen empty state description Empty state descriptions are widened from 320px to 384px so most fit on one line.
- fix Optimize pdf during upload Uploaded PDFs are optimized as well as images.
- fix Show number stepper as a single input with inline buttons Same change as #44148, against the main branch.
- fix Show number stepper as a single input with inline buttons Number fields in the print editor are one full-width input with inline −/+ buttons, and arrow keys step the value.
- fix Explain why a section is greyed out on hover Backport of #44160.
- fix Restyle the color picker on Espresso tokens The colour picker drops the uppercase headings, uses Espresso's palette with a selected ring, and works in dark mode.
- fix Explain why a section is greyed out on hover Hovering a greyed-out section shows whether it is hidden by its visibility condition or has no values for the preview record.
- fix Restyle the color picker on Espresso tokens Backport of #44139.
- fix Discard client parsed validate_rename in whitelisted api Removed client-side validation override in rename API to prevent privilege escalation.
- fix Keep standard builder formats on their shipped renderer Standard print formats remain on their original renderers during migrations.
- fix Show prepared report errors in the report view Report failures now display error messages in the UI instead of silently failing.
- fix Crash on clicking Add tab in the sidebar Form builder no longer crashes when adding tabs.
- fix Prompt user to update reply-to when email account address changes Email account address changes now prompt to update Reply-To rows.
- fix Name pages in the form builder Web Form pages retain their names after builder saves.
- fix Owner notifications skip documents created by Administrator Notifications to document owner now resolve Administrator's email.
- fix Not found error shows two messages in the same dialog 404 errors no longer show duplicate messages.
- fix Fix(installer)!: prefer flag over config for admin password during `new-site` Command-line `--admin-password` flag now takes precedence over config file values.
- fix Fix user input for lowercase boolean in set-config fix(cli): Fix user input for lowercase boolean in set-config
- fix Save cell value on tab from last column before switching rows Tabbing out of the last editable column skipped blur and reverted the typed value; now commits before switching rows.
- fix Currency field keeps the old precision after the currency changes Rows added under one currency dropped decimals when the document's currency changed; control now reads current currency on every save.
- fix Table in a dialog ignores read only Grid outside a form treated tables as editable even when read_only was set, and toggling it back failed; now respects read_only flag.
- fix Open count link drops the document filter on the list Clicking a dashboard's open count routed to the list twice and the second route dropped filters; now routes once with both filters.
- fix Run automation drains at read committed Repeatable-read snapshot made TimestampMismatchError retry reread stale rows; MariaDB 11.6+ rejects locking read outright. Drains now run at READ COMMITTED.
- fix Use indexed modified column in large table check Meta rebuild queried creation column without an index on v15; now uses indexed modified column to avoid full table scan.
- fix Fix print format editor fixes for missing formats, footer position and layers Opening editor for deleted format showed blank page; footer appeared at content bottom instead of page bottom with repeat off; header/footer zones unnamed in inspector.
- fix List custom modules in the block-module editor Custom modules without an app never got checkboxes and were quietly unblocked on form save; now listed and checkboxes work.
- fix Add icons to top-level sidebar links missing one Top-level sidebar links in Contacts, Geo and other shipped sidebars rendered with empty icon slots; added icons for all.
- fix Restore pre-upgrade workspace edits from version history v16→v17 upgrade re-imported workspaces and lost all custom edits; now offers `/desk/workspace-restore` to rebuild edits as Custom Workspaces.
- fix Keep sites before the setup wizard on Apps Standby sites upgraded ahead of signup were pinned to desktop icon grid and shown the "try new navigation" banner; now left alone until setup wizard completes.
- fix Int field used as the document name becomes a string autoname with Int field turned `3` into `"3"` on save; with set-only-once the second save failed with "Value cannot be changed". Name now converted to field type.
- fix Release fixes for the print format builder Missing format no longer shows blank page, letter head footer positioning fixed, page breaks and table defaults corrected for release.
- fix Field list spacing and search box size in print format builder Print format editor left panel had spacing and sizing inconsistencies; fixed search box height, field row height, group divider spacing.
- fix Download with more relevant filename Print download filename improved when print happens via printview API.
- fix Query recorder leaves sql on connection, breaks later tests Query capture in tests failed after recording or assertRowsRead left sql on connection; both now clear it.
- fix Review bot posts the same review twice when dispatched twice CI dispatch race condition caused duplicate review posts; now protected against concurrent posts.
- fix Worker re-registration when Redis key expires Worker registration expired in Redis if heartbeat missed TTL; now re-registers on heartbeat to stay visible.
- fix Child table links hide direct links on the same field Reverse relationships with same fieldname kept only child link in automation picker; now includes both with deduplicated names.
- fix Size dock icons with icon-size classes only Remove contextual CSS overrides and set dock icon sizes via icon-md and icon-lg classes.
- fix Letter head Based on toggle switches to Image Show the image upload when picking Image for a letter head with existing HTML content.
- fix Drop the duplicate Logout from the apps screen menu Remove stray Logout entry that was duplicated during backport conflict resolution.
- fix Letter head, version history and print page fixes Fix letter head editing, version history sidebar, and print page in the print form builder.
- fix Int field used as the document name becomes a string Convert Int-field document names to the field's type before set-only-once checks.
- fix Enforce Desk User read permissions on attachments Hide the add attachment button from users without write access.
- fix Clear client supplied content hash for remote files Ignore client-supplied content hash for remote files since they have no real hash.
- fix Keep Sidebar Item Group on version-16 Restores Sidebar Item Group doctype deleted during v16 polish to prevent migrate from removing it as an orphan.
- fix Keep spacers and skip item groups in the v16 conversion v16 sidebar migration aborts on Spacer and Sidebar Item Group rows; conversion now skips unsupported types instead.
- fix Restore frappe's desktop icons on version-16 Desktop icon JSON files were deleted during v16 polish, causing migrate to remove them as orphans and lose all desktop folder navigation.
- fix Bring the Desktop Icons grid up to v16 and onto the Apps screen's look Sites using Desktop Icons mode were seeing an old unstyled icon grid; icon grid now extends the Apps page class and shares its styling.
- fix Number card shows NaN for a zero value when currency is set Number cards with zero values and currency formatting displayed NaN instead of 0; report cards with no aggregate data now show N/A.
- fix Run an expanded group's rule under its icon Expanded group's connector line ran near the icon's left edge instead of under its centre; alignment is now correct.
- fix Show Import on an empty list even when filters are set Import button was missing on empty filtered lists; it now appears on filtered and unfiltered lists.
- refactor Neutral close message for inactive backports Inactive backports close with a neutral message asking to reopen if still needed.
- refactor Skip plan jobs and dependency audit on Skip CI PRs With the Skip CI label, only the lint, docs, commit and Semgrep checks run.
- refactor Close inactive backport PRs after 7 days Mergify backport PRs close after seven days with no activity, unless labelled `no-stale`.
- refactor Add a contributor workflow for coding agents Adds an AGENTS.md contributor workflow for coding agents, a one-line CLAUDE.md that loads it, and matching PR template and review guidance.
- refactor Close inactive PRs after 1 day PRs labelled `inactive` close one day after the label, instead of two.
- refactor Correct test assertion test: correct test assertion
- refactor Lower the page JS baselines to what CI measures Lowers the page JS size baselines to the values CI measures.
- refactor Vouch @FawazAlhafiz chore: vouch @FawazAlhafiz
- refactor Run grid import tests as a dedicated desk user Grid import tests run as their own desk user instead of the shared test user.
- refactor Run v16 ui tests with playwright test: run v16 ui tests with playwright
- refactor Stop opening weekly release pull requests for v14 ci: stop opening weekly release pull requests for v14
- refactor Release v15 Automated weekly release.
- refactor Release v16 Automated weekly release.
- refactor Bump shell-quote from 1.10.0 to 1.12.0 Dependencies updated.
- refactor Bump source-map-js from 1.2.1 to 1.2.2 Build dependencies updated.
- refactor Bump RestrictedPython to 8.5 Backport: RestrictedPython updated to 8.5.
- refactor Lower stale PR threshold to 15 days Stale PR detection threshold lowered from 20 to 15 days to match hrms and catch abandoned PRs sooner.
- refactor Update POT file Translation template updated.
- refactor Update POT file Translation template updated.
- refactor Version-16 polished chore: version-16 polished
- feat Soft module icons feat: soft module icons
- feat Allow submit with confirmed stock value difference within 1% A Period Closing Voucher can be submitted when the stock asset difference is within 1%, after the user confirms the amounts.
- feat Add United States chart of accounts template Adds a US GAAP chart of accounts template used for companies with Country set to United States.
- feat Stock Valuation Comparison report of actual vs expected valuation New script report shows every Stock Ledger Entry's actual vs expected balance qty, value and rate with basis for expected (FIFO queue, batch average, serial rate, reconciliation).
- feat Stock Valuation Comparison report Report of actual vs expected stock valuation for auditing ledger accuracy (v16-hotfix backport).
See all 212 changes
- feat Report to find and fix uncancelled SLEs of cancelled vouchers New Stock report finds Stock Ledger Entries with is_cancelled=0 whose voucher is cancelled, so admins can repair entries affected by repost race condition.
- feat Map raw material serial / batch to finished good serial / batch for traceability Serial and Batch Traceability report now maps raw materials used in production to the finished goods they became, enabling accurate supplier recalls and customer traceability.
- feat Default import template fields and descriptions for common DocTypes Common ERPNext doctypes now have default import fields and user-facing descriptions.
- perf Batch work order stock availability Work Order stock checks group items by warehouse into fewer queries, so a 100-row order makes far fewer SQL reads.
- perf Recalculate a transfer with additional costs once per repost Stock Entry reposting with additional costs no longer recalculates N times for N rows.
- perf Keep only summed columns in the Stock Balance snapshot ledger Snapshot run now copies only columns needed for segment sums into DuckDB temp table instead of all columns; few replayed rows fetch other columns from second table.
- perf Use query builder for previous SLE of current voucher Port `get_previous_sle_of_current_voucher` to query builder for consistency with develop.
- fix Bin bug fixes Locks the Bin row when only ordered, reserved, indented or planned qty changes, so a concurrent stock movement is no longer overwritten. Fixes three Bin bugs in total.
- fix Landed Cost Voucher bug fixes Sums vendor invoice claims across vouchers instead of overwriting them, caps claims at the invoice amount, and stops cancellation from zeroing claims. Fixes four bugs in total.
- fix Stock Settings bug fixes Makes the ledger and repost logic use the Default Valuation Method correctly, so backdated entries are reposted under Standard Cost. Fixes five Stock Settings bugs in total.
- fix Consume alternative items in the ratio they were transferred Splits raw material consumption between an item and its alternatives in the ratio they were transferred. Same change as #60091 and #60092.
- fix Consume alternative items in the ratio they were transferred Duplicate of #60090 with the same change.
- fix Consume alternative items in the ratio they were transferred Duplicate of #60090 with the same change.
- fix Item Price bug fixes Customer and batch prices now take priority over a general price with a later valid-from date. Fixes three Item Price bugs in total.
- fix Batch bug fixes Expiry from shelf life counts from the receipt date, not today, for batches created by backdated receipts. Fixes five Batch bugs in total.
- fix Price List bug fixes Changing a price list's currency now converts the prices, not just the label. Fixes three Price List bugs in total.
- fix Serial No bug fixes Fixes three Serial No bugs, including cancelling a Stock Reconciliation wrongly marking its serials as delivered.
- fix Warehouse bug fixes A plain save can no longer flip a warehouse between group and ledger, and the ledger check now runs on update. Fixes eight Warehouse bugs in total.
- fix Item Attribute bug fixes Changing an abbreviation no longer renames variants that have a user-chosen item code. Fixes three Item Attribute bugs in total.
- fix Item Lead Time bug fixes The scheduler no longer applies Daily Yield twice, so planned quantities are correct. Fixes five Item Lead Time bugs in total.
- fix Shipment bug fixes Shipments from a Delivery Note are valued at the DN total including taxes, not the net item amounts. Fixes seven Shipment bugs in total.
- fix Item Manufacturer bug fixes Duplicate manufacturer part numbers are now caught on edit, and the Item default is no longer cleared by a non-default row. Fixes three Item Manufacturer bugs in total.
- fix Item Standard Cost bug fixes Entries before a same-day revaluation and cancelled entries are no longer skipped by the backdating rule. Fixes six Item Standard Cost bugs in total.
- fix Stock Entry Type bug fixes Add to Transit ticked on the standard Material Transfer type no longer traps goods in transit. Fixes two Stock Entry Type bugs in total.
- fix Quality Inspection bug fixes A row's Quality Inspection is now checked against its document and item on Delivery Note, Sales Invoice and other documents, not only Purchase Receipt. Fixes six bugs in total.
- fix Quick Stock Balance bug fixes Past-date qty and value now use the same cut-off, so later entries that day are counted in both. Fixes two Quick Stock Balance bugs in total.
- fix Item Alternative bug fixes Substitutes used in Work Order transfers are now checked against Item Alternative and the Work Order setting, and the transfer is no longer credited to the original item. Fixes two bugs in total.
- fix Packing Slip bug fixes Packing slip rows must belong to the slip's own Delivery Note, so another DN's row can no longer be packed. Fixes three bugs in total.
- fix Quality Inspection Template bug fixes A formula-based row must have a formula before the template saves. Fixes two bugs in total.
- fix Shipment Parcel Template bug fixes Stock Manager can now use Add Template on a Shipment. Fixes two bugs in total.
- fix Item Variant Settings bug fixes Allow Different UOM is no longer undone by saving a template. Fixes two bugs in total.
- fix Match the file country code to the stored lowercase code Import Supplier Invoice now matches uppercase Italian country codes on PostgreSQL, so it no longer fails on every file.
- fix Delivery Settings bug fixes Delay between Delivery Stops can no longer be negative, which made ETAs go backwards. Fixes two bugs in total.
- fix Validate opening stock serial and batch settings Opening stock for serialized or batched items is now validated against the naming settings, so it no longer gets silently skipped. Also stops a background job from being queued when it would create no stock.
- fix Allow stock users to submit linked purchase receipts Stock Users can submit a Purchase Receipt linked to a Production Plan through a subcontracting Purchase Order, because the receipt no longer needs write access to the plan.
- fix Prepare pdf tests and formats for chrome-only rendering Bank statement tests and the Proforma Invoice format use `get_pdf` with Chrome, and CI installs Chromium, so ERPNext works once wkhtmltopdf is removed.
- fix Apply user permissions in get_stock_balance fix(stock): apply user permissions in get_stock_balance
- fix Enforce pick list delivery permissions Delivery mappers check read permission on the Pick List before using it.
- fix Apply user permissions in get_stock_balance (backport #60245, #60260) fix(stock): apply user permissions in get_stock_balance (backport #60245, #60260)
- fix Check putaway rule permission in get_available_putaway_capacity fix(stock): check putaway rule permission in get_available_putaway_capacity
- fix Apply user permissions in get_stock_balance (backport #60245, #60260) fix(stock): apply user permissions in get_stock_balance (backport #60245, #60260)
- fix Apply user permissions in stock reconciliation balance lookups fix(stock): apply user permissions in stock reconciliation balance lookups
- fix Delete Company: remove password verification Drops the client-side password prompt; the existing type-the-company-name confirmation stays.
- fix Validate cost center changes and preserve numeric names (backport #60237) Cost Center saves can no longer change company, use cross-company parents or convert groups in ways that skip the GL and allocation checks.
- fix Validate cost center changes and preserve numeric names Same change as #60276, the original PR. Also stops renames of names that start with digits from corrupting the display name.
- fix Correct disposal GL and sold status, validate asset sale, split and opening depreciation Disposal credits the full asset cost, so the fixed asset and accumulated depreciation accounts no longer drift.
- fix Depreciation schedule double posting, manual schedule validation and booked months Depreciation rows already booked are no longer posted again when the daily job runs by index range after a cancelled entry.
- fix Keep prospects on lead delete, one prospect per lead and convert to customer once Deleting a lead no longer deletes its Prospect with its notes, opportunity rows and linked contacts.
- fix Fix(manufacturing): respect unreserved work order components (backport #60161) A Work Order shows Stock Reserved only when every component is reserved.
- fix Respect unreserved work order components Same fix as #60289, the original PR.
- fix Validate item conversions and work order links Alternate UOMs need a positive conversion factor, and a component of a submitted Work Order can't have Maintain Stock turned off.
- fix Handle multiple batches in pick list bundles Allocating a Pick List item with several batches in another open Pick List no longer raises a KeyError.
- fix Default job card completion to previous operation output (backport #60275) The Complete Job dialog defaults Completed Quantity to what the previous operation allows.
- fix Default job card completion to previous operation output Same fix as #60278, the original PR.
- fix Prevent planning a sales order line more than once (backport #60271) Production Plan fetches only the unplanned qty of each Sales Order line and blocks plans that exceed it.
- fix One header to row copy for accounting dimensions (backport #59753) A header dimension change now updates every row, through one handler.
- fix Prevent planning a sales order line more than once Same fix as #60272, the original PR.
- fix Link lead quotations and opportunities to its customer (v16) fix(selling): link lead quotations and opportunities to its customer (v16)
- fix Keep dimensions on duplicated rows Duplicated rows keep their own dimensions instead of taking the header value.
- fix Link lead quotations and opportunities to its customer (v15) fix(selling): link lead quotations and opportunities to its customer (v15)
- fix Link lead quotations and opportunities to its customer Quotations and Opportunities of a Lead move to the Customer made from it, so they show on its dashboard.
- fix Keep short service ranges after the period end on auto-repeated invoices (version-15) Same fix as #60328, for v15.
- fix Keep short service ranges after the period end on auto-repeated invoices Service dates on auto-repeated invoices are shifted correctly, so a short range doesn't land in the wrong month.
- fix IFRS template double-counts short-term borrowings and drops uncategorised accounts The IFRS cash flow template no longer counts short-term borrowings twice or drops uncategorised accounts.
- fix Keep service dates after the period end in order on auto-repeated invoices Service dates past the period end stay in order, so the invoice saves.
- fix Take back additional costs on Subcontracting Receipt returns Returns of Subcontracting Receipts reverse the additional cost they originally booked.
- fix Correct disposals, finance books and reversals, add adjustment column fix(asset-depreciations-and-balances): correct disposals, finance books and reversals, add adjustment column
- fix Asset permissions, disposed asset values and reversed depreciation Grouped views only include assets the user can read, and disposed values are corrected.
- fix Apply campaign pricing rules, allow deleting campaigns and fix campaign efficiency counts Campaign pricing rules apply to sales transactions, and campaigns can be deleted.
- fix Timestamp update for lead and opportunity, quotation validity on the server and carry forward The "update timestamp on new communication" setting applies only to Lead and Opportunity.
- fix Count partly ordered quotations and activity after conversion, apply permissions fix(campaign-efficiency): count partly ordered quotations and activity after conversion, apply permissions
- fix Render terms ending in a file extension and blank contract fields as empty Terms ending in .html or .txt render, and blank contract fields show as empty.
- fix Offer slots with no agents, require a positive duration and refuse overlapping slots Appointment slots work with no agents, and overlapping or zero-length slots are refused.
- fix Include child territories and show every lost reason when filtering by one fix(lost-opportunity): include child territories and show every lost reason when filtering by one
- fix Include child territories, list each lead once and list leads without a company fix(lead-details): include child territories, list each lead once and list leads without a company
- fix Sales roles, submitted invoices, recipients format and one row per lead fix(lead-conversion-time): sales roles, submitted invoices, recipients format and one row per lead
- fix Opportunity rate, company for amounts and missing sales stage Foreign-currency opportunities convert at their stored rate.
- fix Apply minimum lead age to older leads Minimum Lead Age keeps leads older than the cut-off, not younger.
- fix Vat charged as an actual amount and user permissions fix(vat-audit-report): vat charged as an actual amount and user permissions
- fix Validate company and vat accounts, follow company renames, limit settings roles fix(uae-vat-settings): validate company and vat accounts, follow company renames, limit settings roles
- fix Purchase Order bug review fixes Thirteen Purchase Order bugs are fixed, including drop-ship cancellation leaving the Sales Order delivered.
- fix Add company filter and apply permissions fix(first-response-time-for-opportunity): add company filter and apply permissions
- fix Give sales users read access to sales stages fix(sales-stage): give sales users read access to sales stages
- fix Let sales users read and sales master managers maintain segments fix(market-segment): let sales users read and sales master managers maintain segments
- fix Default quality inspection sample size to one Same change as #60292, the original PR.
- fix Drop the full cache clear on save Employee saves no longer clear the entire site cache, since the nested-set fix now refreshes user permissions.
- fix Refresh the stock entry after recalculating picked bundles After batches are auto-picked at submit, the entry is reloaded so GL additional-cost splits and target legs use the recalculated values, not the save-time ones.
- fix Disable update stock for sales invoice created from DN (backport #60230) Backport of #60230.
- fix Keep each batch's rate through a material transfer Each inward batch keeps its outward rate plus the row's additional cost, and a repost repairs entries already saved with flat batch rates.
- fix Disable update stock for sales invoice created from DN Sales Invoices created from a Delivery Note now force Update Stock off.
- fix Keep job card qty in material request transfer Job Cards could not be submitted after a Material Request transfer because the Work Order branch of the Stock Entry mapper zeroed the finished-goods qty. It now zeroes only for Work Order requests without a Job Card.
- fix Keep job card qty in material request transfer (backport #60246) Backport of #60246.
- fix Combine material request receipt quantities A Purchase Receipt and a Purchase Invoice with Update Stock no longer overwrite each other's received quantity on a Material Request, so a fully received request now shows as fully received.
- fix Derive actual dates from submitted entries Work Orders without operations take actual start and end dates from submitted Stock Entries only, and cancellation clears stale dates.
- fix Keep payment terms, PO no and service dates on auto-repeated invoices Auto Repeat invoices keep the payment terms template, PO No and shifted item service dates from the reference invoice.
- fix Mark fully depreciated assets without schedules (backport #52309) Submitted assets marked Is Fully Depreciated with Calculate Depreciation unchecked now move to the correct status in v16 instead of staying Submitted.
- fix Correct fiscal year selection and creation Fiscal year selection prefers the company-specific year over an overlapping global one, Feb 28 year-end rollover is fixed for leap years, and automatic creation can recover from a missed run.
- fix Stock Closing Entry bug fixes Stock Balance filters apply to the closing opening, and six further closing-entry bugs are fixed, each with a regression test.
- fix Round ledger-view invoice debits, convert outstanding only for foreign receivables, expand customer groups Ledger view debits use the rounded grand total so the running balance matches the GL, and foreign-currency outstanding is converted only for foreign receivables.
- fix Invoice permissions, bundle, drop-ship and sales order buying amounts, and group-by totals Applies the user's Sales Invoice permissions to the report, corrects buying amounts for bundles, drop-ship and sales orders, and fixes group-by totals.
- fix Ledger view signs, party permission, outstanding conversion, internal transfers and tree filters Ledger view uses one sign convention, applies party permissions, fixes outstanding conversion and internal transfers, and corrects tree filters.
- fix Reverse charge debit notes, returns, missing emirate and box 9 amounts Reverse charge debit notes are subtracted in boxes 3 and 10, and returns, missing emirates and box 9 amounts are corrected.
- fix Net payments in company currency and company permission Total Payments excludes cancelled payments and debit notes, nets off refunds, works in company currency, and respects company permission.
- fix Lapsed fulfilment, status, signature and checklist after submit, linked document party The daily job sets Fulfilment to Lapsed when a deadline passes, and status, signature and checklist behaviour after submit is corrected.
- fix Supplier pan, rate and limit checks, and locking used certificates Certificate PAN is kept in line with the supplier, rate and limit checks are added, and used certificates are locked.
- fix Import line quantities, credit notes, surcharges and suppliers as in the file Payment codes are read from the correct field, and line quantities, credit notes, surcharges and suppliers import as they appear in the file.
- fix Validate vat accounts, refuse company change, limit settings roles VAT accounts are validated (company, group, duplicates, empty rows), so the VAT Audit Report picks the right rows. Company changes are refused and settings roles are limited.
- fix Conversion rate, periods across years, filters and permissions Foreign-currency opportunities convert at the rate stored on the opportunity, periods work across years, and filters and permissions are fixed.
- fix Look up party addresses by DocType name On PostgreSQL, selecting a Customer or Supplier on a Tax Rule now fills the billing and shipping addresses.
- fix Exclude the current company's retention warehouse from source pickers Source warehouse pickers on Stock Entry refresh the Sample Retention Warehouse when the company changes.
- fix Pool group sub assembly warehouse stock in production plan Sub-assembly stock across child warehouses of a group is summed into one pool for netting, so Production Plan no longer under-produces.
- fix Exclude the current company's retention warehouse from source pickers (backport #60189) Backport of #60189.
- fix Pool group sub assembly warehouse stock in production plan (backport #60210) Backport of #60210.
- fix Hide Overview tab on unsaved customers The Overview tab is hidden on new Customers until they are saved.
- fix Add permission check for `get_company_defaults` API endpoint now checks user permissions before returning company defaults.
- fix Validate transaction context in item detail endpoints Added context validation to prevent unauthorized access to item pricing and batch detail endpoints.
- fix Check task read permission before listing its child tasks Child task listing now respects user permissions on parent tasks.
- fix Convert cash flow account type rows to the presentation currency Cash Flow sections and Net Change in Cash now show correct totals when Presentation Currency is set.
- fix Use the group company column for consolidated profit totals Consolidated Financial Statement profit rows no longer double-count subsidiary amounts.
- fix Stock Closing Balance bug fixes Fixed valuation rate tracking and FIFO queue handling for stock closing entries.
- fix Do not auto-pick the same batch qty for every Stock Entry row Auto-picked batches now correctly reduce available qty for subsequent rows.
- fix Reserve sub-assembly items taken from stock Production Plan now correctly reserves sub-assembly stock taken from the warehouse.
- fix Split manufacture cost over all finished good rows Manufacturing cost is now correctly divided across multiple finished good receipt rows.
- fix Apply transaction date exchange rate to purchase receipts Purchase Receipts now use the correct posting date exchange rate instead of the order date rate.
- fix Keep each batch's rate through a material transfer Batch-wise valuation no longer shifts value between batches during transfers.
- fix Honour over delivery allowance in Delivery Note mapper Delivery Note can now include over-delivery quantities within the configured allowance.
- fix Make the Party column a dynamic link on Party Type Party names in Payment Ledger are now clickable links to the customer or supplier.
- fix Split same-named parties and vouchers, fix company currency for foreign accounts General Ledger no longer merges customers and suppliers with the same name.
- fix Fix cleared withdrawals and invoice currency Fixed balance calculation for transactions cleared before posting date and multi-currency invoices.
- fix Start income and expense balances at the fiscal year Account balances for income and expense accounts now respect fiscal year boundaries.
- fix Age rows without a bill date and fix bulk payment amounts Accounts Payable now ages invoices without bill dates and calculates bulk payment amounts correctly.
- fix Apply user permissions to opening balances User permissions on accounts now apply to opening balance queries.
- fix Periods across fiscal years and net profit without gross accounts Date ranges crossing fiscal years and net profit calculations now include all relevant entries.
- fix Correct grand total %, tax columns and subtotals Report now respects filters in % calculations and shows correct tax columns and subtotals.
- fix Report roles, child-only account conversion and cash flow working capital Fixed account conversion rates and cash flow calculations for multi-currency consolidation.
- fix Make the Account column a link to Account Account column now respects user permissions.
- fix Yearly profit, creditor turnover sign, company-currency averages and report roles Report now uses yearly profit, correct signs and company currency for ratio calculations.
- fix Opening entries, cross-year profit, opening balance and accumulated totals Cash Flow correctly handles opening entries, profit across fiscal years and accumulated totals.
- fix Status from quotations, RFQ conversion factor, duplicate customers and prospect rows Opportunity status now updates when quotations expire and RFQ mapping uses correct conversion factors.
- fix Stale status, repeat conversion, delete permission and phone sync Lead status no longer stays stuck after opportunity/quotation is deleted.
- fix Unsubscribe handling, start-day and late steps, duplicate sends and template fields Campaigns now include unsubscribe links, handle late steps correctly and avoid duplicate sends.
- fix Slot capacity, portal time zones and holidays, agent assignment and calendar event Fixed slot capacity, timezone handling and holiday/calendar event conflicts.
- fix Reject invalid downtime intervals Downtime entries now reject To Time earlier than From Time.
- fix Set employee salary currency from company Employee salary currency now defaults from the company instead of global defaults.
- fix Allow back-to-back working hours Back-to-back workstation shifts no longer trigger overlap errors.
- fix Pick outward batches before valuing the stock entry Batches are auto-picked before rates are set, preventing incorrect valuations.
- fix Fail loudly when the reposting data file is missing or corrupt Reposting now fails with clear errors instead of silently using empty checkpoints.
- fix Refresh POS item stock qty on new order POS item grid stock quantities now refresh correctly when starting a new order.
- fix Stock Ledger Entry bug fixes Fixed fallback rate calculation for stock issued while negative.
- fix Stock Reposting Settings bug fixes Fixed timeslot format and reposting start messaging.
- fix UOM Category bug fixes Two-step UOM conversions no longer bridge unrelated categories.
- fix Warehouse Type bug fixes Built-in Transit warehouse type can no longer be deleted.
- fix Require a company Electronic Invoice Register now requires a company filter.
- fix Reject manual costs above the consumed cost on save, floor them on repost Manual finished good costs above consumed cost are now rejected instead of silently discarded.
- fix One header to row copy for accounting dimensions Accounting dimension copying from header to rows is now consistent across all doctypes.
- fix Do not reserve existing stock for produced serial no rows SO rows with "Ensure Delivery Based on Produced Serial No" had their existing stock double-reserved when the SO submitted; now skipped for those rows.
- fix Do not allow finished good qty above finished good quantity Manufacture entries with finished good rows raised above the entry qty bypassed validation; now checked against both process loss and entry qty.
- fix Check overproduction only on the job card's operation Lowered overproduction allowance on one operation blocked all others in the Work Order; now checks only the Job Card's own operation.
- fix Convert PO amount to company currency for budget validation Foreign currency POs compared against budget without rate conversion and bypassed Over Budget check; now multiplied by order rate.
- fix Keep a task in its parent task's project Duplicated projects left child tasks pointing at the original parent's project; now updated to point at the copied parent.
- fix Bill the remaining amount after the full qty is billed SO rows with milestone billing (full qty at lower rate) could not bill the remaining amount; mapper, picker and button now count full qty as billed.
- fix Fix two develop tests broken by crossed merges Tests written before a validation merged failed on develop; now follow the correct flow that the validation allows.
- fix Honour Price Not UOM Dependent in transactions Price list flag had no effect because code read a key that never existed; now uses the correct key.
- fix Include child territories and groups in Inactive Sales Items report Territory filter matched the invoice's own territory only, missing child and group territories; now includes all descendants and ignores credit note returns.
- fix Scope accounting dimension defaults to the asset's company Every company's dimension settings applied to asset entries, so another company's mandatory field stamped values that failed validation; now scoped to the asset's company.
- fix Validate material request transfer warehouses Material Request transfer had no warehouse validation, allowing mismatched from/to warehouses; added validation.
- fix Skip reporting-currency conversion when no reporting currency is set v14 migration crashed with ReportingCurrencyExchangeNotFoundError when company had no reporting currency; now skips conversion.
- fix V15 asset depreciation schedule patch on current develop v15 migration crashed when it called removed helper function; now uses current API with same field mapping.
- fix Task bug review fixes Task dependents never rescheduled and other task workflow bugs fixed.
- fix Guard acc_frozen_upto reads in pre-v16 patches Three old patches crashed on develop when they read removed Accounts Settings field; now guarded with existence check.
- fix Reject stale standing part in Supplier Scorecard Supplier Scorecard bugs fixed: status calculation, period windows and other edge cases now correct.
- fix Buying Settings and Supplier bug review fixes Buying Settings and Supplier permission and validation bugs fixed.
- fix Timesheet bug review fixes Timesheet and Sales Invoice row billing edge cases corrected.
- fix Quality Management bug review fixes Corrective action and other Quality module bugs fixed with individual commits per issue.
- fix Project bug review fixes Project status transitions now validate correctly and other project flow bugs fixed.
- fix Maintenance Schedule and report bug review fixes Maintenance Schedule, Visit and report permission and calculation bugs fixed.
- fix Procurement Tracker and subcontracting report bugs Tracker and subcontracting report edge cases and calculations fixed.
- fix Request for Quotation and Supplier Quotation bug review fixes RFQ and Supplier Quotation workflow and comparison report bugs fixed across 16 commits.
- fix Add permission checks from the bug reviews Permission findings from bug reviews added systematically across multiple doctypes.
- fix Make currency parameters optional in get_exchange_rate Prevent `FrappeTypeError` when opening a Quotation without a preset Company.
- fix Split shared invoices over all their sales orders in payment terms status report Divide invoice amounts correctly between all sales orders when one invoice covers several orders.
- fix Subcontracting Inward Order bug review fixes Fix batch-wise and serial-wise return validation for subcontracting inward orders.
- fix Procurement Tracker actual cost in company currency Show Procurement Tracker actual cost for uninvoiced lines in company currency, not order currency.
- fix Serial and batch fixes for subcontracting inward returns and consumption Fix serial and batch allocation and validation in subcontracting inward returns.
- fix Keep Include Closed Orders out of the other trends reports Prevent Include Closed Orders filter from leaking between trend reports via shallow-copied shared filters.
- fix Validate Delivery Note return rows without dn_detail Check unlinked return rows against item's total delivered qty; throw if item not in original.
- fix Clear advances from invoice returns Remove advance allocations from credit notes instead of copying invalid rows.
- fix Apply company restriction in standard cost item query Apply Item company restrictions when picking items for Standard Cost.
- fix Fetch BOM rows in stock UOM when getting items Return BOM rows in stock UOM without extra UOM/conversion-factor fields to prevent double conversion.
- fix Use imported query functions in scorecard variables Fix AttributeError in Supplier Scorecard variables by importing query functions instead of using frappe.qb.fn.
- fix Allocate reserved batches up to the requested qty Distribute reserved batches to the requested qty instead of always transferring the full reserved amount.
- fix Count a split batch once across work order reservations Count each reservation's share of a split batch, not the full moved qty.
- fix Raw material group warehouse fixes in production plan Prevent For Warehouse from being the group itself; count group stock once; fix custom warehouse search.
- fix Enforce UOM restrictions in sales and purchases Apply UOM conversion rule in Item defaults and transactions when "Allow UOM with conversion rate" is on.
- fix Allocate only the untransferred qty of reserved batches Return untransferred qty from get_reserved_materials instead of full qty after partial transfers.
- fix Project UX cleanup Improve Project form: regroup timeline fields, bring tasks into the project, allow task assignment, improve portal users section.
- fix Allow group warehouse for raw material availability in production plan Add optional Raw Material Group Warehouse; sum availability across children while receiving into For Warehouse.
- fix Do not revive cancelled stock ledger entry during reposting Item valuation reposting was saving cancelled stock ledger entries back to the database, marking them as active again; reposting now updates only valuation figures, leaving entry status untouched.
- fix Check read on purchase document in get_values_from_purchase_doc Validates user can read the purchase document before filling asset details from it.
- fix Check tax template access in get_taxes_and_charges Validates read access to tax templates before returning them for forms.
- fix Convert PO amount to company currency Over Budget restriction was not enforced on purchase orders in foreign currency.
- refactor Move warehouse defaults from Stock Settings to Company (backport #57571) Default Warehouse and Sample Retention Warehouse move from Stock Settings to Company, with a patch that migrates the values.
- refactor Reuse the setup job's exact Python in test shards Test shards install the same Python patch version as the setup job, so the bench venv finds its interpreter.
- refactor Replace legacy print formats with the Classic builder formats 15 legacy print formats replaced with builder-made Classic, Modern and image variants.
- refactor Release v16 Automated weekly release.
- refactor Version-16 polished chore: version-16 polished
- refactor Update ERPNext logo chore: update ERPNext logo
- feat Soft module icons HRMS dock gets the soft icons.
- feat Module onboarding, documentation links and icons Each HR module workspace opens with first-transaction onboarding; DocTypes and reports now link to documentation; Lucide icons and sidebar refinements added.
- feat Publish prebuilt assets for Pilot HRMS assets built in CI and published for Pilot; frontend and roster SPAs declared in bench.assets.
- perf Remove old salary slip print formats Delete superseded Standard, Year to Date and Timesheet salary slip formats; migrate links to Classic/Detailed/Compact.
- fix Clear local caches after HRMS test rollback Clears process-local caches after the test rollback so tests stop reusing stale data.
See all 18 changes
- fix Show conditional components related to leave_without_pay Same fix as #5401, against the main branch.
- fix Block a half-day request on a full leave day Half-day attendance requests are now correctly blocked when a full leave covers that day.
- fix Show Start Date and End Date in system date format in Salary Register Start and End Date columns ignored System Settings date format unlike other date fields; changed field type to respect the format setting.
- fix Allocate leaves left in annual quota instead of skipping allocation Earned Leave Schedule rounded up and exceeded quota, skipping later periods and throwing errors; now capped to annual allocation.
- fix Improve validations in interview workflows Interview form validations apply to workflow documents; improved error messages and edge case handling.
- fix Remove old salary slip print formats Old salary slip formats superseded by Classic/Detailed/Compact; patch deletes them and migrates links to replacements.
- fix Resolve conflicts in CheckInPanel Merge conflict markers left in CheckInPanel broke CI check; resolved.
- fix Add hook for module redirection HR module needed code-only hook declaration so custom HR Setup heir can handle navigation and dock entry.
- fix Setup Shift Schedule duplicate assignment on end date Repeating Shift Schedule ending on schedule week's last day created final assignment twice; now resets start date after end-date insert.
- fix Show Start Date and End Date in system date format in Salary Register Apply the system date format to Salary Register Start Date and End Date columns.
- fix Improve validations in interview workflows Improve interview workflow validation logic.
- refactor Bump version to 16.49.0 chore: bump version to 16.49.0
- refactor Version-16 polished chore: version-16 polished
- fix Show priority bars on tasks and in the priority dropdown Priority shows as signal bars on tasks and in the dropdown; the dot never rendered before.
- feat Feat(enrichment settings UI) Enrichment settings now have a UI with toggle, crawl budget, and social profile rules.
- feat Publish prebuilt assets for Pilot CRM assets built for main branch against Frappe version-16; Pilot benches download instead of building on install.
- perf Cut request load from the frontend and notifications Fewer requests from the frontend, a single unread-count query, and an index on CRM Notification.
- fix Save when only 'Create Lead from Incoming Emails' changes Same fix as #3004, the original PR.
See all 19 changes
- fix Keep brand favicon on dashboard, data import and onboarding pages Same fix as #3006, the original PR.
- fix Link Task/Note created from Call Log modal to its Lead/Deal Tasks and Notes created from Call Log modal now link to the referenced Lead/Deal.
- fix Count unique deals per funnel stage Funnel chart no longer counts the same deal multiple times when it moves between stages.
- fix Use NestedSet for CRM Territory so lft/rgt and tree filters work CRM Territory tree filters now work correctly with proper NestedSet implementation.
- fix Readable email colors in dark mode and resizable editor Email text and border colors are now readable in dark mode.
- fix Show save error on the failing step when a wait has arms Save errors on WaitForEvent branches attached to wrong step or were dropped; now correctly marked on the failing step.
- fix Keep the time of day and site time zone in the Meta lead sync window Meta lead sync skipped leads created between site midnight and UTC midnight on sites ahead of UTC; now converts to Unix timestamp and preserves time of day.
- fix Show the call's referenced lead or deal instead of a phone number match Call log contact name came from phone lookup even when the reference document was available; now reads from reference first.
- fix Deal contact organization filter Contact dropdown listed every contact, ignoring the Deal's Organization; now filters by organization and lets users set company_name from the deal form.
- fix Add trailing semicolons to ERPNext doctype_js scripts Missing semicolon at end of doctype script let next script's array literal run as previous statement; added trailing semicolons.
- fix Multi-select picker for in / not in operators Use MultiSelect picker for in / not in filter operators matching the field type.
- refactor Dismiss onboarding help panel before clicking Load More test: dismiss onboarding help panel before clicking Load More
- refactor Minor Release v1.87.0 chore: Minor Release v1.87.0
- refactor Replace email view with EmailItem from @framework/ui refactor: replace email view with EmailItem from @framework/ui
- feat Quiz sharing, proctored attempt and result improvements Adds a Copy link button for quizzes, shows students only the quiz title in the breadcrumb, and improves the proctored attempt and results.
- feat Restrict who can assign a badge Only staff roles can create LMS Badge Assignment; automatic awarding still works so students get earned badges.
- feat Let Course Creators manage the batches they are tagged on Course Creators now edit tagged batches, enrol students and run live classes; cannot create/delete batches. Moderators create and tag them.
- feat Link self-hosted sites to the Payments repo, not the marketplace LMS Settings Payments missing warning now links to GitHub repo for self-hosted, Frappe Cloud marketplace for Frappe Cloud.
- fix Programming exercise saving and other misc issues Students can now save programming exercise submissions with server-side grading.
See all 12 changes
- fix Show configured limit for oversized lesson uploads File upload limit is now shown to users before upload.
- fix Serve private question images like lesson media Quiz images uploaded to private paths blocked student access; now rewritten to a secure endpoint that vouches file access to the question author.
- fix Limit what a course archive can create Course imports ran permission checks only on first insert; now run normal permissions for Course Evaluators and keep only existing users and evaluators.
- fix Show the server's message when a course import fails Course import toast showed exception class but dropped the reason; now reports server's error messages.
- fix Change all batches tab to active and implemented dynamic title name Replace "All" tab with "Active" for admins and make page title reflect selected tab.
- fix Create lesson only once its title is typed Create new lessons on idle, blur or Ctrl/Cmd+S instead of immediately inserting an untitled placeholder.
- fix Make a11y: make learner pages usable by keyboard and screen readers WCAG 2.2 AA audit fixes: video controls visibility on focus, proper buttons for keyboard navigation, screen reader support.
b
Builder
10 new features · 13 fixes · 2 refactors
- feat Compact Filter and Sort with Created by, Access and Unpublished changes filters Status and Sort selects become a Filter popover with a count chip and a Sort menu, with new filters for creator, access and unpublished changes.
- feat Create Bob chat sessions on the first message and stop autosave writing over Bob's edits AI sessions now create on first message instead of on page load, and autosave respects AI edits.
- feat Ask before saving a client script shared by other pages Prompt to update all pages or save as copy for this page when editing a shared client script.
- fix Make client script editing reliable Prevent unsaved text loss when a save is in flight; send modified timestamp to catch stale saves.
- feat Make navbar items link to pages, sections or external URLs Navbar items can link to a page, an on-page section or an external URL.
See all 25 changes
- feat Add the server access model for extensions Extensions can now declare and request capabilities on specific doctypes.
- feat Add frappe-builder agent skill Coding agents (Claude Code, Codex) can now manage Builder sites via frappectl; one tool for sites, pages and components; settings > agents shows one-line prompt.
- feat Publish prebuilt assets for Pilot Builder assets built in CI and published for Pilot on develop and master branches.
- feat Offer the latest models in AI setup, drop the cheap tiers Refresh Builder's AI model list to include Claude Sonnet 5.5, Opus 5.5, Fable 5.1 and the latest OpenAI/Google models.
- feat Preview state styles during canvas drags Canvas drag handles now read and write the active state style instead of falling back to base style.
- feat Split progress bar for the AI setup steps AI settings now uses a frappe-ui Progress component with three segments instead of tab buttons for the Provider / Connect / Models setup flow.
- fix Select the entire canvas on Ctrl/Cmd+A Ctrl/Cmd+A outside a text block selects the whole canvas, not the editor UI.
- fix Stop page client script modal from shifting on scroll Caps the Page Client Script editor height so the modal always fits the window and no longer jumps when scrolled.
- fix Keep components lean, edit instance content in place fix(skill): keep components lean, edit instance content in place
- fix Give every pasted image its own file name Pasting multiple images left them empty as uploads raced on same `.temp-image.png` path; each now gets unique name.
- fix Drop weak-model handholding from Bob's prompts AI generation prompts had weak-model guards; refactored to sentence case without em dashes and added AI-tells rule to catch stock phrases.
- fix Keep canvas history tracking resumable when a batched callback throws Wrap history resume in finally block so undo/redo tracking resumes even if batch callback fails.
- fix Give copied client scripts a fresh hash instead of appending one Swap trailing hash chain for one fresh hash when copying pages to avoid name bloat.
- fix Keep newly drawn text block in edit mode Ignore outside clicks while in text mode so the trailing mouseup click doesn't clear the new block.
- fix Drop the stale Builder Component connection on client scripts Remove the Builder Component connection backed by a table that was already deleted.
- fix Fix page editor Cmd/Ctrl+S to save a version Add a dialog offering to save the current state as a version; repeat presses save directly with a toast.
- fix Show the server's message when AI setup fails Error messages showed only the URL and exception type; now displays the server's detailed error message.
- fix List only indexable Builder Pages, skip redirects, home page at the site root Sitemap was listing all Builder Pages including disabled and login-only ones; now respects Builder's indexing rules.
- refactor Lock built-in registry items Built-in registry items can no longer be replaced or removed by extensions.
- refactor Bump litellm to 1.95.1 Updates to patched version to fix PYSEC-2026-4066 vulnerability in the LiteLLM proxy server.
- feat Use frappe-ui/charts on the dashboard The dashboard uses the new frappe-ui charts, and number cards show change against the previous period.
- feat Publish prebuilt assets for Pilot Helpdesk assets built in CI and published for Pilot download; benches skip slowest asset build step on install/update.
- fix Park a re-fetched mail only once Same fix as #3869, the original PR.
- fix Correct SLA deadline timezone and hold-time deduction (backport #3776) Corrects SLA deadlines for timezone and deducts hold time properly.
- fix Move agents off an agent status when it is disabled (backport #3433) Agents are moved off an agent status when it is disabled.
See all 9 changes
- fix Show translated field labels in the customer portal Apply `__()` to field labels so translations are used in the customer sidebar and template.
- fix Ticket trend sla line shows a count, not a percentage Chart was plotting raw ticket counts on a 0–100 % axis, making the line unreadable; now plots actual percentages.
- refactor Hotfix to main chore(release): hotfix to main
- refactor Select every value pasted into the in filter Parse comma or newline separated values in In filter; add all of them to the selection.
- feat Stack a line chart's areas Line charts can now be stacked to sum overlapping areas.
- feat Read a dashboard's span as the Period of a Number card that states none Number cards now read dashboard `within` span as Period so comparison has previous span to step back from, fixing comparison on adhoc filters.
- feat Publish prebuilt assets for Pilot Insights frontend SPA built in CI and published for Pilot benches.
- fix Resume an incremental import from the store's newest cursor Incremental imports now take the bookmark from the newest cursor actually written to the store, so a failed bookmark save no longer makes the next run reprocess or skip rows.
- fix Keep an incremental table's rows when its sync settings change Changing Cursor Column or Sync From no longer drops stored rows of an Incremental table, so history the source has purged is kept. Switching a Full copy to Incremental still drops the Full copy.
See all 8 changes
- fix Keep a cleared filter cleared after a reload A filter the reader cleared stays cleared after Refresh or an owner save, instead of the default filling it back in.
- fix Open the folder of the open query or chart Opening a query or chart in a collapsed folder expands that folder.
- fix Clear old Insights Query Execution Logs Query execution log grows unbounded and reached 1.1GB on production; now has clear_old_logs method registered in Log Settings for user-configured purge.
p
Press
6 new features · 11 fixes
- feat Add build, New Bench and prune charts Build Server Stats shows its charts in a grid, with eight new charts for builds, New Bench and prune activity.
- feat Revive clamav ClamAV file scanning service restored on servers for virus detection.
- feat Deploy bench groups on a schedule from settings Scheduled Deploy Settings doctype lets operators define bench groups and their deploy times instead of editing server scripts; deploy schedule is now visible and auditable.
- feat Allow Pilot to download backups after team approval Pilot can request access to Frappe Cloud v1 site backups; a team member approves with a passcode and Pilot gets 12 hours to download them.
- feat Track how fast sites adopt new deploys Site Adoption Snapshot doctype tracks each site's current bench, filled hourly and kept for 30 days; identifies which sites are stuck and how fast rollouts spread.
See all 17 changes
- feat Deploy a scheduled group now from its row Scheduled Deploy Settings rows now have a **Deploy Now** button to deploy a group immediately instead of waiting for its scheduled hour.
- fix Retry the agent install while apt is locked Same fix as #7723, the original PR.
- fix Allow users to purchase credits based on outstading amount Users with a small outstanding balance (e.g. ₹66.25) can pay through Razorpay; the minimum and default amounts now agree.
- fix Send Raven alerts to the real channel ID Same fix as #7720, the original PR.
- fix Check press roles in protected endpoints Checks press roles in the protected decorator and write-access check, so a member whose role lacks a release group can no longer deploy through bench.deploy_and_update or other protected endpoints. Teams without roles keep full access.
- fix Repair a crashed global search table on the site's bench Backups failing on a crashed MyISAM `__global_search` table now trigger a repair job that runs on the site's bench. The old job call had no bench or site and never ran.
- fix Fix(site-backup): Repair a crashed global search table on the site's bench Manual backport of #7667 to master.
- fix Better feedback on security tab Improves the feedback shown on the server security tab.
- fix Type pagination arguments that reach the query builder Limit and offset reached the query as SQL text instead of type-coerced integers; now annotated as int on get_notifications.
- fix Reject control characters in environment variables Newlines in environment variables broke Dockerfile rendering and executed arbitrary directives; now validated on save and before rendering.
- fix Queue Deploy Now on the build queue Deploy Now jobs sat queued behind the long queue backlog; now queue on build queue like Release Pipeline does.
- fix Read machine availability from server types Hetzner deprecated the GET /datacenters API on Oct 1; availability now comes from server type locations via hcloud >= 2.26.0.
o
Other
1 breaking · 55 new features · 6 speed-ups · 66 fixes · 21 refactors
- breaking Pre-bundle prosemirror to avoid breaking TextEditor in dev mode Pre-bundle prosemirror and remove frappe-ui from optimizeDeps to fix TextEditor in dev.
- feat Servers map revamped The servers page now has an always-open list, an inset map card, a regions toggle, richer spot cards, and a map refactor. Also fixes truncated labels.
- feat Server page actions, clearer resize and fractional vCPU The server page gets the server list's Actions menu, with Rename added. The resize dialog explains its choices and loads the current size on every open, and fractional vCPU sizes are supported.
- feat Enhance server transition animations and improve layout Smoother transitions between servers, with the list on the right and the map in the centre.
- feat Add smooth slidein animation for server detail page The server detail page slides in smoothly.
See all 149 changes
- feat Build Ubuntu images from the latest release and kernel The image builder uses the latest Ubuntu cloud image and supported kernel for each release, and adds minimal images for all versions.
- feat Join and leave workspaces from the mobile workspaces drawer Users can join and leave workspaces from the mobile workspaces drawer.
- feat Add chart skeletons and plan limits to usage charts Usage charts show loading placeholders, and the CPU and memory y-axes stop at the plan limit.
- feat App Favicon, combined Settings Dialog Studio apps get a favicon setting and can be renamed from the frontend. App and Studio settings merge into one Settings dialog.
- feat Take the SMTP endpoint from the Suite site FrappeMail Services take their SMTP server and port from the Suite site, with a Refresh SMTP Info button.
- feat Give each new server a mailbox from its region's mail service Each new server gets a send-only mailbox from its region's FrappeMail Service.
- feat List a server's hostnames in team identity tokens Team identity tokens list the hostnames of the team's sites on the server.
- feat Sync with statutory system feat: Sync with statutory system
- feat Send site mail under the site name from the bench mailbox New sites send mail under their site name through the bench mailbox.
- feat Collections & Delinquency Management module Adds a collections module that opens cases for delinquent loans, assigns officers, tracks payment promises and sends reminders.
- feat Fill each field of GitHub's new advisory form feat(draft-security-advisory): fill each field of GitHub's new advisory form
- feat Add Raven and Builder signups Adds Raven and Builder to the apps prepared for product signup images.
- feat Product signups for Frappe Cloud apps Each Frappe Cloud app can offer a signup from its own page, with setup handled by the app.
- feat SSH keys in settings and on each server Adds SSH key management in settings and on each server.
- feat Add server detail page Adds a server detail page.
- feat Screen new senders in the Inbox, and make Block send mail to Junk New senders appear in the Inbox with an icon and a No/Yes prompt, and blocking a sender moves its mail to Junk.
- feat Report page actions menu use from the reader Reports Download, Copy page, ChatGPT and Claude use from the reader as one telemetry event.
- feat Feat/unicommerce charges as invoice items Unicommerce COD, gift wrap and shipping charges are added as invoice items, so orders with charges invoice without GST mismatch errors.
- feat Invite accounts that send mail but do not receive it Mail accounts can now be created send-only with receiving disabled.
- feat Split delivery for relaying domains, and S3 blob store bootstrap Mail routing now properly handles relaying domains and S3 blob store initialization.
- feat Create accounts that send mail but do not receive it Suite Cloud accounts can be created with receiving disabled via Stalwart permissions.
- feat IronCalc calculation core, previewed behind ?engine=ironcalc IronCalc calculation engine integrated as an optional backend for Sheets.
- feat Split the canvas into typed modules, with editing fixes Canvas refactored into ~28 typed modules with editing fixes for selections and fills.
- feat Add an embeddable settings UI Cloud Settings now available as typed SDK for use in any app with optional shared dialog.
- feat Switch theme from search by typing dark or light Typing "dark" or "light" in search now shows theme switch actions.
- feat Feat!: remove Desk access from Suite User and Suite Admin Suite User and Suite Admin roles no longer grant Desk access.
- feat Support Generic provider and Ubuntu 26.04 in atlas-vm Generic provider and Ubuntu 26.04 guest image support added.
- feat Sign in trial owners and keep one address for trial sites Trial owners now sign in as themselves with token from Pilot; site can be renamed and Central provides team identity token.
- feat Send a common site config to every new server Central Settings Common Site Config JSON field sent to every server at bootstrap so apps get settings on install or later.
- feat Apply config patches from instance metadata Central can set any key in common_config.toml, bench.toml or common_site_config.json via instance metadata without Pilot code changes.
- feat Send Pilot telemetry as pilot-common-config Central telemetry settings now sent in pilot-common-config metadata format; Pilot merges into common_config.toml for cleaner config management.
- feat Publish prebuilt assets for Pilot Lending assets built in CI and published for Pilot; benches download prebuilt archives and skip asset build.
- feat Classify incoming mail by its headers Mail sorted into Primary, Promotions, Social, Updates and Forums from headers on first fetch; category stored as keyword on server.
- feat Publish prebuilt assets for Pilot Blog assets built in CI and published for Pilot benches on develop and version-16.
- feat Publish prebuilt assets for Pilot (version-16) Blog assets published for version-16 branch and Pilot benches.
- feat Stream remote backup files into the site Remote site restores now stream file archives into tar instead of copying to disk; idle tasks send heartbeats so long restores don't block Admin.
- feat Move frappe apps to their branch heads and add whatsapp Registry updated: 17 frappe apps now point to branch heads; whatsapp app added since crm develop depends on it.
- feat Extensible routing and boot data Add thin abstraction layer for app routing extensions, aliases, guards and router options.
- feat BMC support for generic provider Add Baseboard Management Controller (Redfish) support for generic Atlas provider: power state, boot options.
- feat Add frappe-wiki-skill agent skill with wikictl helper Add skill and stdlib-only CLI for agents to edit wiki pages over frappectl.
- feat Take site links from the www/sitemap page instead of rebuilding frappe's Let app sitemap overrides take effect by reading site links from the page instead of rebuilding.
- feat Remove add-on service Replace Add-on Service DocType with a Select field on Team Service.
- feat Add @frappe/cloud-sdk package Add cloud SDK package to Pilot.
- feat Stabilize Pilot and add restore, branch switch and site actions Admin dashboard now supports restore, reinstall, build assets and branch switch operations; fixes stability issues and closes 20 open issues.
- feat Show server IDs, group the menu and open servers from Pilot Server list and overview now show Atlas VM IDs; server menu is grouped by action frequency; servers can be opened from Pilot console links.
- feat Link Central entries to this server in Central Admin dashboard now links to this server's overview and resize dialog in Central.
- feat Show display names instead of internal IDs Notifications, billing rows and customer copy now use display names instead of internal record IDs and service names.
- feat Restore a site from a Frappe Cloud v1 Restore dialog now includes Frappe Cloud v1 as a source for site restoration.
- feat Bucket VM metrics by max samples VM metrics requests now return at most 300 samples by default; buckets are sized per range so every request returns a consistent chart-sized response.
- feat VM Metrics Collect VM CPU, memory, disk and network metrics on Metal every 10 seconds; retain seven days of daily JSONL history locally and serve on demand through Metal and Atlas APIs.
- feat Theme-aware images with caption, align and resize Wiki editor images now support captions, left/centre/right alignment, separate light/dark mode images and resizing via corner grip.
- perf Keep built app bundles out of the editor's tailwind scan Excludes built output from the editor's Tailwind content scan, cutting a cold build from 14.9s to 2.3s.
- perf Lazy load panels and fit the dialog to phones The Cloud Settings dialog loads each panel only when shown, which cuts the 2 MB bundle. It also brings its own Inter font and fits phone screens.
- perf Open the editor before the sidebar loads The editor opens after the change request loads, with the sidebar tree loading alongside it.
- perf Paint the edit rail from the last tree while it loads The edit rail shows the tree from the last visit right away, then swaps in the fresh one.
- perf Load revision items once in get_cr_tree Each revision loads once in get_cr_tree, which roughly halves the time.
- perf Slim get_page_data and debounce hover prefetch get_page_data returns only the fields the reader swaps in, and hover prefetch is debounced.
- fix Set allmulticast only in multicast mode Stops WG Mesh from enabling allmulticast in unicast NDP mode, which made Broadcom `bnxt_en` hosts stop receiving all traffic. Also reverts the metald change from #350.
- fix Select unicast NDP before VMs start metald picks unicast NDP mode before any VM sends NDP, so hosts on networks without IPv6 multicast stop losing their uplink on each metald start.
- fix Keep NDP lookups intact under checksum offload Guest checksum offload could write into the NDP target address, so VM-to-VM lookups across hosts failed. The solicitation now carries a valid target and checksum.
- fix Delete admin members using controller when user is deleted Admin members are removed through the controller when a user is deleted.
- fix Look up a channel missing from the list before showing a DM as not found Looks up a channel that is missing from the list before reporting a DM as not found.
- fix Show custom emoji in last message in DMs Shows custom emoji in the last-message preview in DMs.
- fix Multiple UI fixes Keeps mention read state when a message is edited, stops soft 404 pages from previewing, makes polls inert on the threads page, and fixes mobile Later and print dialog layouts. Also fixes CI tests and adds keyboard workspace switching.
- fix Report guest memory use from the balloon device New VMs boot with a balloon device that reports guest memory and returns freed pages to the host, so the memory chart matches the guest.
- fix Install modules for the pinned kernel in every image Every image gets modules for the kernel it boots, so Docker and BPF tools work on Ubuntu 22.04 and 26.04 VMs.
- fix Bug reports from the #gameplan channel Fixes eight reported bugs, including wrong discussion after navigating, rail badges drifting off their icons, slow reactions, and a broken digest email.
- fix Settle a restart when the server reads running A restart now succeeds once the server reads as Running, instead of sitting at "Restarting" for ten minutes and then failing.
- fix Use the chrome header template when no pdf generator is set Letter head headers and footers stop disappearing from reports, auto email reports and email attachments when no PDF generator is set.
- fix Remove a mailbox only through the background removal Deleting a User Mail Account is blocked; removal runs in the background and deletes the Suite member first, so the mailbox password stops working.
- fix Point chromium_path at the real Chromium binary Chrome PDF renders no longer leave Chromium processes running, since the path now points at the real binary instead of a wrapper.
- fix Report the requested disk size as the desired size Resizing a VM without changing its disk size no longer fails with "Disk size can only increase".
- fix Keep text color on bold text in every prose variant Bold text keeps its named color in every prose variant, not only prose-v3.
- fix Refill the mailbox pool only to its minimum A mailbox refill creates only the mailboxes the pool is missing, not a fixed 50.
- fix Resume the selected product Returning customers resume onboarding for the product they picked and reopen their existing site.
- fix Collections & Delinquency Management (#1489) Manual backport of #1489 to version-16-hotfix.
- fix Add dhparam Adds the DH parameters file to the nginx setup.
- fix Add the site name to streamed backup file names Streamed backup file names now include the site slug, both locally and in S3, so the file says which site it belongs to.
- fix Add the site name to streamed backup file names (backport #613) Backport of #613.
- fix Stale workspace responses and picture captions Responses for a space or change request that changed mid-flight are dropped, and captioned pictures render their caption correctly.
- fix Moves AST parsing into subprocess scripts run by bench Python App validation parses code with the bench's own Python, so apps using newer syntax no longer fail on the host interpreter.
- fix Inset a line's ends from the value axis Line charts get the same inset from the value axis that bar charts already had, so data labels no longer collide with ticks.
- fix Make room for data labels only when one would clip Charts reserve space for data labels only when one would clip, instead of always leaving an empty band.
- fix Compile published app templates in production mode Published apps compile templates in production mode, so HTML comments no longer make a fragment root that drops block styles.
- fix Close sheets on back instead of leaving the page The back action closes an open sheet rather than leaving the page.
- fix EmbedFrame border radius Corrects the border radius of the embed frame.
- fix The overview asks Grove on every open, uncached The AI overview fetches month usage fresh on every open, so it matches the usage page.
- fix Page the team lists at 10 rows without the size picker Team lists page at 10 rows with no page-size picker.
- fix Misc fix: Misc
- fix Sync invoices on ERPNext v15+ Fixed failing Unicommerce invoice sync by using item-wise tax flow.
- fix Make the zone file export importable into Route 53 Zone file exports now split long TXT values and properly format target records.
- fix Claim public addresses on the public interface Metal now claims public addresses on the correct interface.
- fix Give Suite Cloud 30 seconds to accept a connection Suite Cloud connection timeout increased from 5 to 30 seconds.
- fix Answer NDP for attached public IPv6 addresses VM public IPv6 addresses now respond to neighbor discovery.
- fix Answer ARP for attached public IPv4 addresses VM public IPv4 addresses now respond to ARP requests.
- fix Offer empty partitions as the Generic storage pool device Host setup now accepts empty partitions and RAID arrays as storage devices.
- fix Complete Generic setup without a provider catalog Generic provider setup no longer requires provider catalog records.
- fix Keep page meta when extendRoute replaces route.meta fix: keep page meta when extendRoute replaces route.meta
- fix Drop entry and frappe_cloud fix(telemetry): drop entry and frappe_cloud
- fix Strip embedded JavaScript from invoice PDFs before attaching Unicommerce PDFs with auto-print scripts blocked sync; now sanitized before saving to strip JS while keeping page destinations and forms intact.
- fix Clear loan closure_date when a closing repayment is cancelled Cancelled payment left closure_date on loan so it looked closed despite amount due; now clears the date.
- fix Skip lowercase component names in build, treat them as native elements Build tool incorrectly treated lowercase component names as Vue components; now skips them as native elements.
- fix Pre-bundle every prosemirror package so TextEditor and frappe-ui/editor share one copy ActivityTimeline failed to load in dev with duplicate selection JSON ID error; now bundles prosemirror to avoid duplication.
- fix Wiki v3 on Frappe v15 support Wiki v3 only ran on v16+, failing install and migration on v15; now one codebase with API detection for both versions.
- fix PDF loading state for public PDF embeds PDF embeds showed empty strip until PDF.js rendered; now show page-shaped skeleton during load.
- fix Install the static stalwart-cli so Ubuntu 20.04 nodes can bootstrap Ubuntu 20.04 glibc too old for gnu stalwart-cli; now downloads musl build which is statically linked.
- fix Hold Ansible at the 12 line so Ubuntu 20.04 nodes work Ansible-core 2.20+ requires Python 3.9 but Ubuntu 20.04 has 3.8; pinned to ansible 12 line with ansible-core 2.16.
- fix Run the Ansible pinned with the app, not the host's Verify SSH failed with host Ansible too old; now runs Ansible pinned with the app.
- fix Keep search and notifications in history when opening a result Prevent back button from skipping Search/Notifications page after opening a result; use redirect guards correctly.
- fix Focus the invite email and dialog-hosted forms Apply autofocus to the invite email input and first text input in dialog-hosted forms.
- fix Theme-aware canvas and color-scheme for rendered apps Set color-scheme and page background to match browser dark mode; fix iframe backdrop color.
- fix Focus the first text input of forms and dialogs Set autofocus on first text input in auth pages and form dialogs.
- fix Use the site's own db_type for drop, restore and reinstall Drop, restore and reinstall were using the bench's db_type instead of the site's own, causing database password mismatches.
- fix Preserve disk cleanup after cancellation Failed disk create rollback was skipped if the request context was cancelled; rollback now continues independently.
- fix Prevent resize deadlock Resize and network update could deadlock; resize no longer holds the allocation lock since capacity comes from the host.
- fix Validate restored node numbers Peer restore now rejects node numbers above 65535 that would overflow the client address field.
- fix Make terminal text selection visible Setup wizard terminal text selection was invisible due to black selection highlight on the dark terminal background.
- fix Going back to all spaces resets the filter to published Chosen filter was not remembered when navigating back to All Spaces; filter now persists for the browser tab.
- fix Accept resource limit alerts from pilot Adds missing Notification Event Type for `resource_limit_breached` alerts so Pilot resource warnings reach teams.
- fix Preserve preferred affinity fallback during resize Resize with affinity matching was skipping the Preferred fallback; nonmatching servers with capacity are now available as fallback.
- fix Send event_type and reference_name in pilot events Pilot was sending wrong field names for events (sending `event` instead of `event_type`); Central now receives and deduplicates alerts correctly.
- fix Keep the table still and fit snapshot columns Selection bar now replaces search row instead of pushing the table; snapshot columns now auto-fit to content width.
- fix Fix admin port, proxy scheme and Socket.IO origin Admin site returned 502 errors in Supervisor mode using the wrong port; Socket.IO now works behind HTTPS reverse proxy.
- refactor Tighten access and restructure New teams hold only their creator, custom roles carry only capabilities their creator holds, and signing in as Administrator needs `server:console`. Also restructures the code.
- refactor Add the host NIC receive stall incident report Adds the incident report for the Mumbai host network loss, covering impact, timeline, root cause and host setup for new hosts.
- refactor Mark the repository as archived The README says Print Designer is archived and points to the built-in Print Format Editor in Frappe 16.
- refactor Split oversized test files and fix slow date-dependent tests (backport #1502) test: split oversized test files and fix slow date-dependent tests (backport #1502)
- refactor Split oversized test files and fix slow date-dependent tests Splits the oversized lending test files so CI balances them across five containers.
- refactor Give each app page its own data scope Each app page has its own data store, so a page being left no longer sends requests with the new route's params, and old blocks no longer show without data.
- refactor Grove integration Refactors the Grove integration.
- refactor Migrate container concepts Moves container immutability, storage and asset pages into Explanation and consolidates duplicated material.
- refactor Migrate deployment how tos Moves the remaining Production docs into How-to Guides and Explanation under the Diátaxis structure.
- refactor Publish prebuilt assets for Pilot Builds Raven assets in CI and publishes them on release assets for Pilot benches.
- refactor Update crm dev version chore: update crm dev version
- refactor Merge develop into version-3 Merge develop into version-3
- refactor Rearrange some cards in AI overview page chore: Rearrange some cards in AI overview page
- refactor Making things work for central chore: Making things work for central
- refactor Allow frappe v17 dev in frappe-dependencies Allows Frappe v17 dev in the dependency bounds so Nightly benches deploy.
- refactor Specs for the calculation core, saving, collaboration and the grid docs(sheets): specs for the calculation core, saving, collaboration and the grid
- refactor Bump mermaid from 12.0.0 to 12.1.0 in docs Documentation dependencies updated.
- refactor Bump isort from 9.0.1 to 9.0.2 Pre-commit hook dependencies updated.
- refactor Point the app-building skill and AI prompt at the Icon component for icons Documentation updated to recommend Icon component instead of lucide icon classes for AI-generated content.
- refactor Exclude standalone services from pilot validation List Suite's standalone services in `[tool.bench] validation-ignore` to skip import checking.
- refactor Name the repository for gh in the publish step Set `GH_REPO` in asset publish step so `gh release` finds the repository.