Weekly report
Frappe and ERPNext changes, 2 Nov to 8 Nov 2026
638 changes merged: 1 breaking, 137 new features, 28 speed-ups, 391 fixes, 81 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
Highlights
Show published Studio Apps on the desktop
frappe · feat
Category description and more category icons
helpdesk · feat
Let users remove a region from a bench group
press · feat
Let a site turn off its offsite backups
press · feat
Quick app switcher (Alt+`)
frappe · feat
List.js cells describe a column's icon, badge and date format
frappe · feat
- feat Show published Studio Apps on the desktop Adds a desktop tile and app switcher row for each published Studio App, using the app's favicon as its icon.
- feat Quick app switcher (Alt+`) Adds an Alt+` switcher that lists recently used apps for quick changes.
- feat List.js cells describe a column's icon, badge and date format Lets a list's `list.js` set a column's icon, badge or date format without a Vue component.
- feat The Cards view type Adds a Cards view for any doctype, showing a title and body on each card.
- feat Right-align the last list column, as in CRM Right-aligns the last shown column of a desk v2 list, as CRM v1 does.
See all 168 changes
- feat The ⋯ menu moves to the header, a body can set title, buttons, menu and Save Moves the record dialog's menu to the header and lets a custom body set the title, buttons, menu rows and Save.
- feat A custom body for the record dialog Lets an app replace the record dialog's form with its own view, such as a read-only summary.
- feat Let a script's activity row name a gutter icon Lets an app's activity row name its gutter icon with a lucide icon key.
- feat Submit and Cancel refuse a stale record Submit and Cancel send the record's last-seen modified time, so a newer saved version is refused instead of being submitted silently.
- feat Confirm Cancel through linked records and cancel them all Cancel lists submitted linked records and can cancel them all in dependency order.
- feat Reads without approval, a reply after Deny, personal memory and a password box for secrets Read-only Flow tools run without approval, the assistant replies after a Deny, and secrets are entered in a password box.
- feat Status badge in the record header from docstatus Submittable records show a Draft, Submitted or Cancelled badge in the header, or the workflow state when a workflow is active.
- feat A layout shows only the fields it places, and a save asks for missing mandatory fields Details and New Record layouts show only the fields their rows place, and saving warns about mandatory fields the layout leaves out.
- feat Change your password from the Profile pane Every desk user can change their password from the Profile pane of the settings dialog, which also signs out other sessions.
- feat A script's Select and Autocomplete options can carry labels Select and Autocomplete options in scripts can take value and label pairs, so the picker shows the label while saving the value.
- feat Email Account's record page does what its desk v1 form script does Picking a service fills the server settings, the Authorize and Frappe Mail buttons work, and an unauthorised OAuth account is reported.
- feat A script changes a child table's column Client Scripts can show, hide, update and read a child table's columns through the page.fields API.
- feat Amend on a cancelled record, the draft amendment and Open amendment A cancelled record with an amended_from field gets an Amend button that opens a copy, and later an Open amendment button for the amending record.
- perf Keep a list with join aliases in the shared cache Lets lists with Link marks, titles or currencies use the shared cache on revisit, with no skeleton.
- fix Keep the sort popover on its trigger The sort popover stays under its button when a second sort is added, instead of jumping to the top left.
- fix Keep the record tab underline under the active tab after a reorder Remeasures the record tab underline when a script reorders tabs, so it sits under the active tab.
- fix View memory saves a record tab only when the reader chose it Saves a record's tab only when the reader picked it, so a default tab no longer reopens as if chosen.
- fix Read stored stamps on the site's clock for every relative time Reads stored timestamps in the site's timezone for every relative time in desk v2, so a browser in another zone no longer shows wrong times.
- fix Relative dates clamp small clock skew and use the user's language Shows a stamp less than a minute ahead as "a few seconds ago" in every relative date, and uses the user's language.
- fix Replace stale frappe-ui tokens, keep the Cards menu button while open, right-align Save in the Create dialog Replaces renamed frappe-ui classes that drew nothing, keeps the Cards row menu visible while open, and right-aligns Save in the Create dialog.
- fix Rework the chat UI from #46199 and #46298, with Models settings and provider setup Reworks Flow's chat UI, adds Models settings and provider setup, and fixes layout breakage from #46199 and #46298.
- fix Keep the standing window row clear of the docked Flow panel A standing window docked on the right no longer sits under the Flow panel, so its actions stay clickable.
- fix Keep the standing window row clear of the Flow launcher The standing window row stops short of the Flow launcher button, so every pill action stays clickable.
- fix Make a saved record's autoname field read-only on the record page A saved record's autoname field is read-only, so edits no longer disappear silently on Save. Renames go through the Rename action.
- refactor Mount Flow's chat as an island in Desk's panel, not an iframe Flow's chat in the Desk panel is mounted as an island instead of an iframe, so it shares one document and boot with Desk.
- breaking Feat(postgres)!: switch the driver to psycopg 3 Breaking change: moves the Postgres driver to psycopg 3, with server-side parameter binding and prepared statements after repeated runs.
- feat Edit the sidebar and dock inline Users can edit the sidebar and dock from the Desk, including adding links, renaming, and dragging tiles.
- feat Name the installed apps that need each app Cloud Settings turns off Uninstall for an app that another installed app requires, and gives the reason.
- feat List, download and pay a site's invoices Cloud Settings can list a site's invoices, download their PDFs and pay them through Central's server-scoped invoice methods.
- feat Print barcodes with PlutoPrint and Typst CODE128 and CODE39 barcodes in print formats now print with PlutoPrint and Typst, and render the same in the editor and preview.
- feat Convert print designer formats to the print format editor Adds a Convert to Editor Format button for Print Designer formats. It creates a new editor format and leaves the original unchanged.
- feat Switch print formats still on wkhtmltopdf from print settings After saving Print Settings, a toast shows how many print formats still use wkhtmltopdf, with a link to filter them.
- feat Add shell.open, page.open and shell.href Adds shell and page helpers that open a record, list or view, and build its address.
- feat Close five shell API gaps for app scripts Adds a shell dialog API and gives `shell.js` the full Shell object, so app scripts can open their own dialogs.
- feat The standing window handle as shared state, and shell.realtime Makes each app's window handle shared state and adds `shell.realtime`, which unsubscribes with the component that asked.
- feat Submit and Cancel through the Submission Queue Submit and Cancel can run through the Submission Queue when the DocType is set to queue in background.
- feat Report a failed queued Submit or Cancel and fire after\* when it finishes A failed queued Submit or Cancel shows an error with a link to its queue row, and the after-submit or after-cancel hooks fire when it finishes.
- feat Submit goes through the required-fields dialog Submit opens the required-fields dialog when a mandatory field is hidden and empty, then saves and submits.
- feat Add on_social_login hook that receives the provider's claims Adds an on_social_login hook that receives the user, provider and claims at each social sign-in, so apps can set roles and data.
- feat Resolve fieldname parts in naming series counter helpers Original of the naming series counter helper change.
- feat Create documents from uploaded files Users can upload bills, invoices or receipts first and create documents from them later, with the file open beside the form.
- feat Let the agent read the page beside the chat A new read_screen tool lets the chat answer questions about the open page, including unsaved changes and empty required fields on forms.
- feat The standing window, shell.window on the shell hook Apps can open, minimise and close one standing window each from the desk shell, drawn in a row at the bottom right.
- feat Get_new_doc runs an optional set_new_doc_defaults controller method Controllers can fill computed defaults for new records, shared by Quick Entry, the full-page new record and insert.
- feat Let a report format its server pdf cells in python A report can define a formatter in Python, so its PDF is built on the server even when cells are styled, which avoids 413 errors on large reports.
- feat The list page, the List renderer and routing by type Splits the list page into a shared page plus a renderer per view type, with no visible change on screen.
- perf Faster new_doc, link validation and get_list select star Speeds up new_doc, link validation and get_list by avoiding repeated work per call.
- perf Faster frappe.init and frappe.connect outside requests Avoids a Redis round trip and logger cache clears on each init and connect outside requests.
- perf Faster query builder copies and get_query filters perf: faster query builder copies and get_query filters
- perf Faster flt rounding, get_datetime, _() and cache decorators perf: faster flt rounding, get_datetime, _() and cache decorators
- perf Faster DATETIME conversion and cached get_value perf(db): faster DATETIME conversion and cached get_value
- perf Bulk export counts the records three times on open Opening bulk export sends one record count request instead of three.
- perf Skip unused database connection and cache compiled website routes Requests that do not use the database no longer open a connection, and website route rules compile once.
- perf Email lookups scan the whole contact email table Original of the contact email index.
- perf Lazy-load the Geolocation field and lower the record baseline The Geolocation field is loaded only when a form uses it, cutting 15 KB from the record page's JavaScript.
- perf Load a doctype's record.js only when its page opens A doctype's record.js is fetched only when its record or new-record page loads, instead of with the shell.
- fix Require write access for document actions that change data Module onboarding reset, knowledge source resync, studio app export and deletion-request hold now check write access on the saved document. Holding a deletion request now needs System Manager.
- fix Require write access before optimizing a file Optimize checks write access on the stored file before writing anything, so a refused save no longer leaves an optimized copy on disk.
- fix Mails are lost when the mail server drops the connection A dropped connection restarted the whole fetch, which left mail ids out of step with the fetched mails. The retry now reopens the folder and fetches only the failed mail.
- fix Match a site's background jobs by its exact name Background job lists, worker status, stopping a prepared report and pending job checks now match a site's jobs by its exact name.
- fix Show code and json field values as plain text Code and JSON field values print as plain text instead of markup, in standard print and the print format builder.
- fix Skip pdf optimization when a nested image is too large The size check before PDF optimization now also covers images nested inside other page objects.
- fix Opening a prepared report run does not restore its filters Opening a prepared report run from its view link now sets every filter from that run, including multi select filters.
- fix Multi select filters stay editable on a prepared report run On a locked prepared report run, the multi select filter dropdown still opened and reloaded the report. The lock now disables the dropdown properly.
- fix Optimize button errors on files renamed without an extension The optimize button now checks the file name, as the server does, and the server returns a clear message instead of crashing.
- fix Upload error messages lose their line breaks Upload errors keep their line breaks under a file and under the link field.
- fix Set_default ignores the parenttype passed to it Defaults saved through set_default always got parenttype `__default`. It now passes the caller's parenttype through.
- fix Renaming a user loses their time zone and format settings Renaming a user now moves their time zone and date, time and number format defaults to the new name.
- fix Disabling or deleting a user clears the admin's session defaults Logout hooks now run only when someone logs themselves out. Logging out another user clears only that user's sessions.
- fix Optimized file still serves the original when a duplicate exists An optimize now always writes its result, in place or to a new path for a shared file. The record and the file on disk now match.
- fix Optimized file still serves the original when a duplicate exists (backport #46697) fix: optimized file still serves the original when a duplicate exists (backport #46697)
- fix Deleting a user leaves their saved defaults behind Deleting a user now clears their saved defaults, so a new user with the same email does not inherit them.
- fix Optimized file still serves the original when a duplicate exists (backport #46697) fix: optimized file still serves the original when a duplicate exists (backport #46697)
- fix Upload error messages show raw html tags Upload error messages such as the attachment limit now show as plain text, with the tags removed.
- fix Attaching a link to a file the user can't read shows no error Permission errors on link attachments now show under the link box or in a popup, as other upload errors do.
- fix An attached html file replaces the message and is lost An attached html file now goes to the attachments instead of replacing the mail's message.
- fix Some replies with a colon in the subject open a new document Only the Re:, Fwd: and similar prefixes at the start of a subject are stripped, so replies like `Re: Score: 10` match their document.
- fix A mail forwarded as an attachment shows garbled headers Forwarded sender and subject headers are decoded the same way as the mail's own headers.
- fix Sender names from contacts show without a space Sender names from contacts now use the full name, so `RohanKapoor` shows as `Rohan Kapoor`.
- fix Imap replies never match their document by subject On imap accounts, subject matching now reads the folder's append to instead of the account's, so replies match their document.
- fix Xlsx time format Excel exports now format time and timedelta values in Data columns as times, instead of raw day fractions like 0.3333.
- fix Bash tool hangs and borrowed image support The bash tool returns when the shell exits, so background jobs no longer hang it. Image support no longer borrows another provider's entry of the same model id.
- fix File uploader leaks a global variable on every upload `promise` is now declared inside `upload_files`, so it no longer sets `window.promise`.
- fix Keep one parameter for a term in SELECT and GROUP BY Postgres raised a GroupingError when a query term rendered twice as separate parameters. The same term now reuses one parameter.
- fix Build and install apps with pnpm-lock.yaml using pnpm `bench build` failed for pnpm apps because Yarn 1 ran first. Apps with a `pnpm-lock.yaml` now install and build with pnpm.
- fix Preserve resized report column widths Resized report columns keep their widths when a query or script report is saved.
- fix Hide gateway URL from SMS request errors A failed SMS gateway request now returns a generic error, so the gateway URL and credentials no longer appear in the response.
- fix Hide provider URL from address autocomplete errors A failed address autocomplete request returns a generic error instead of the raw provider error, which contained the URL and API key.
- fix Apply field-level read permissions to form responses fix(web_form): apply field-level read permissions to form responses
- fix One broken incoming mail drops every mail fetched with it Each mail is now read on its own, so one unreadable mail no longer loses the others fetched in the same pull.
- fix Mails with raw utf-8 in an address header are never received Address headers with raw utf-8 text no longer raise AttributeError, so these mails are received.
- fix Mails with an unknown address charset are never received Address headers with unknown charsets fall back to utf-8 instead of raising LookupError.
- fix Mails are dropped when reply-to is the account with a name The own-address check compares only the address, so mails are no longer discarded when reply-to is the account with a display name.
- fix Notify if unreplied fails when a folder has no append to A folder with no append-to doctype no longer crashes the unreplied check, so later accounts still get their alerts.
- fix Mails already read in the mailbox arrive as unread IMAP sync passes 1 or 0 for the read state, so mails already read in the mailbox are stored as read.
- fix An unsigned tracking link still adds a view The newsletter read tracker skips counting a view when its link has no valid signature.
- fix Newsletter emails go out without the open tracking image Saves the tracking URL on the email queue, so newsletters sent since the queue change show their open counts.
- fix Refused report actions also return an access denied message Report actions refused for permission return one message instead of two.
- fix Failed file upload shows no reason when the server sends no message Failed uploads with no server message show a reason instead of a bare cross.
- fix Settings dialog shows field descriptions as raw HTML Field descriptions in the settings dialog render as HTML instead of showing raw tags.
- fix A successful file upload never shows server messages Server messages on a successful upload are shown, as the error path already does.
- fix Optimizing a transparent png named .jpg gives it a black background Transparent areas are filled with white before saving as JPEG, so they no longer turn black.
- fix Optimizing a png image saved with a .jpg name fails Converts the image to RGB before saving, so optimizing a PNG named .jpg no longer fails.
- fix A file that fails to attach still shows in the attachments A failed attach rolls back to a savepoint, so no half-attached file is left behind.
- fix Emailing a document twice in one batch alters the second pdf Each PDF in an email batch loads a fresh copy of the document, so print changes no longer carry over.
- fix Custom report charts open their filters with the defaults Chart report settings are stored under the custom report's name, so saved filters load.
- fix Check file type before decoding content Prepared report files are checked by type before decoding, so gzip results no longer fail to open.
- fix Attach field save shows a permission popup for another document A permission check no longer shows a popup when saving a document with an attach field pointing at a file on an unreadable document.
- fix Show readable Method Not Allowed and Notification error dialogs fix: show readable Method Not Allowed and Notification error dialogs
- fix Label provider mailbox passwords App password and show a saved one as dots Provider mailboxes say App password, and a saved password shows as dots when editing.
- fix Explain where css rules go when pasted into custom style Pasting CSS rules into a Custom CSS box now shows a hint, and the editor applies the box the way print does.
- fix Explain where css rules go when pasted into custom style fix(print): explain where css rules go when pasted into custom style
- fix Keep quoted semicolons intact in custom style Custom Style values with a semicolon inside quotes keep their full value in the editor.
- fix Render html editor fields in editor formats HTML Editor fields in print format editor layouts print their content instead of an error.
- fix Keep html block content inside its block Stray table tags and oversized images in HTML blocks stay inside the block, so the print layout no longer breaks.
- fix Keep html block content inside its block fix(print): keep html block content inside its block
- fix Table link options and opt-in user permissions Link fields inside Web Form child tables offer more than the user's own records, and Web Form link options can be limited by User Permissions.
- fix RQ Job list fails when a job expires during load The RQ Job list no longer fails when a job expires between being loaded and being serialized.
- fix A nested timeout_context disables the outer test timeout fix: a nested timeout_context disables the outer test timeout
- fix Stop notification, scheduler and file tests from wiping site data Test helpers that deleted real records, emptied the email queue, removed every file or truncated scheduled job types now delete only what they create.
- fix Saving an attach field shows an error though the doc saved Drops the attach error messages from a failed attach, so the desk shows Saved after the document saves.
- fix A turn's files card opens that turn's own diff Opens only that turn's changes when a file is clicked in a turn's "files changed" card.
- fix Translated template headers stop matching their fields Matches translated data import template headers back to their fields. Backport of #43400.
- fix Scope custom components to their own app and fail the build on a missing one Limits Studio's custom component list to the app's own folder, and fails the build when a component cannot be resolved.
- fix Timeout_context and trace_fields leave their changes behind Makes two test helpers restore exactly what was there before.
- fix Label state column in addresses and contacts report as State/Province The report column uses the Address field's translation, so it no longer shows the workflow meaning of "State".
- fix Rename automation action branch label to Parent Step Branch The Automation Action's Branch field gets its own label, so the plain "Branch" translation keeps its company branch meaning.
- fix Label OAuth client links as OAuth Client The OAuth Client link fields are labelled by their DocType name, so the Lead Type "Client" option gets its customer translation.
- fix Add translation context to sidebar item label The sidebar "Item" label has a translation context, so German no longer shows "Element" for every Item.
- fix Run a subclass override of submit/cancel on the v2 document method route Subclass overrides of submit and cancel run on the v2 method route, so a Journal Entry can be submitted and cancelled from the record page.
- fix A failing act toasts once, however many callers joined it A failing Submit, Cancel or Save shows its error once after a double click, not twice.
- fix Bench watch crashes when redis restarts Restarting redis no longer kills bench watch. It logs a warning and reconnects, and the reconnect limit now applies.
- fix Single doctype table rows keep a dead link on privacy change Attachments in single doctype table rows update their link when the file turns public or private.
- fix Deleting queued reports does nothing without prepared report access Users without prepared report access get a permission error instead of a silent no-op when they delete and regenerate a queued report.
- fix Maintenance jobs start at the same minute on every site Original of the maintenance job offset fix.
- fix Show one scrollbar in the import file picker The library file picker in child table import shows a single scrollbar.
- fix Look up the library file by name, not by URL Grid import finds a library file by name, so it no longer picks another file with the same URL that the user can't read.
- fix Build Flow when NODE_ENV is production, and test the launcher's island Flow builds on production benches, where its install step failed because a patch dependency was skipped.
- fix The assistant replies after Deny, and a client tool may say a call needs no approval After a Deny, the assistant says what it did not do and the run goes on. Tools can mark a call as needing no approval.
- fix Package name for mariadb-client Installs the current mariadb-client package and disables TLS for the MariaDB 10.6 CI service container.
- fix Bump pypdf to 6.21.4 Moves pypdf from 6.21.2 to 6.21.4, which fixes four CVEs that failed the vulnerable-dependency check on every PR.
- fix Count a wrong current password toward the login lockout A wrong current password in update_password now counts toward the same lockout as failed logins, which closes a path to unlimited guessing from a stolen session.
- fix Refuse a malformed layout entry and fix TestOmittedFields (red Desk-v2 status) A malformed layout column entry now raises a ValidationError instead of an AttributeError, and the failing TestOmittedFields tests are fixed.
- fix Restore the statement timeout after counting dashboard links (backport #43399) The one-second statement timeout used when counting dashboard links is removed afterward, so later queries in the same request, job or test run no longer fail with max_statement_time exceeded.
- fix Replace the view key race's last two raw errors Deadlocks and duplicate app-view overrides now return readable messages instead of raw database errors.
- fix Land a new invitee on the invitation's redirect After setting a password from an invitation link, the invitee lands on the path the invitation names, not always /desk.
- refactor Assign every new issue round robin New issues are assigned in turn to the people listed in the workflow.
- refactor Keep a separate uv cache per ubuntu release The uv cache key includes the Ubuntu release, so mysqlclient wheels built on one release are not restored on another.
- refactor Remove a record count that never runs on open refactor(data-import): remove a record count that never runs on open
- refactor Vouch HusnaMa chore: vouch HusnaMa
- refactor Skip the label restart when a newer commit was pushed ci: skip the label restart when a newer commit was pushed
- refactor Assign new bug issues round robin ci: assign new bug issues round robin
- refactor Bump version to v15.126.0 chore: bump version to v15.126.0
- refactor Bump version to v16.55.2 chore: bump version to v16.55.2
- refactor Expect the server drawn barcode image in the print view escaping test test: expect the server drawn barcode image in the print view escaping test
- refactor Stop tests from leaving records on the site test(notification): stop tests from leaving records on the site
- refactor Find the Flow button by its new Flow (Beta) label test: find the Flow button by its new Flow (Beta) label
- refactor Fix the view-list and Cards tests to fit two view types test: fix the view-list and Cards tests to fit two view types
- refactor Review translation PRs except release PRs ci: review translation PRs except release PRs
- refactor Remove unused translation review workflow ci: remove unused translation review workflow
- refactor Remove unused translation review workflow ci: remove unused translation review workflow
- refactor Polish the chat UI Bundles the Inter font, realigns the sidebar and header, moves agents, skills and triggers into settings, and fixes several small styling issues.
- refactor Fix the flaky account unlock and phone list scroll tests Ports the flaky-test fixes from develop, so the account unlock test waits one extra second and the phone list test waits for the seeded todos.
- feat Consolidated accounts receivable and payable reports Adds the consolidated Accounts Receivable and Payable reports. Manual backport of #59481, #59482, #59936 and #64154.
- feat Feat(erpnext) redesign company letterhead and merge the grey one into it Redesigns the Company Letterhead and removes the Grey one, with a patch that moves its uses to the new letter head.
- feat Company-scoped multiselect warehouse and cost center filters in reports Report filters for warehouse and cost center accept multiple values, scoped to the company.
- perf Add voucher_no and voucher_type index on serial and batch bundle (version-15-hotfix) Restores the voucher_no index that an earlier backport dropped, so queries that look up a voucher's bundles stop scanning the whole table.
- perf Fix payment entry deadlocks and per-row queries found by load testing Removes a gap-lock deadlock on Payment Entry insert and several per-row queries found under load.
See all 200 changes
- perf Use serial and batch entry for item and warehouse lookups and index voucher on bundle (version-16-hotfix) perf: use serial and batch entry for item and warehouse lookups and index voucher on bundle (version-16-hotfix)
- perf Use serial and batch entry for item and warehouse lookups and index voucher on bundle perf: use serial and batch entry for item and warehouse lookups and index voucher on bundle
- perf Repost queued item reposts of a company in one pass Queued item and warehouse reposts for a company run in one pass, so shared downstream entries are not recalculated.
- perf Stop re-sorting and re-fetching the repost queue for each dependant Original of the repost queue performance fix.
- perf Refresh only the reposted row of a stock reconciliation Original of the stock reconciliation performance fix.
- fix Show only public Sales Partner fields in the website list The website list returned internal Sales Partner fields such as commission rate and referral code. It now returns only public fields for published partners.
- fix Stock Ledger report bug fixes The Opening row ignored warehouse User Permissions. Warehouses are now narrowed to those the user may read.
- fix Item Price Stock report requires Item Price read access Users who cannot read Item Price were seeing every buying and selling price in the report. The report now requires read access to Item Price.
- fix Restore batch quantity when POS Closing Entry is cancelled Cancelling a POS Closing Entry did not restore Batch Quantity, because the bundles were unlinked before the cancel ran.
- fix Total Stock Summary report bug fix Group By Company totals included warehouses the user may not read. Only permitted warehouses are now summed.
- fix Stock Ageing report bug fixes Item rows included warehouses the user may not read. The report now reads only the permitted warehouses.
- fix Production Analytics report bug fix Work Order counts ignored User Permissions. Work Orders are now read with the user's permissions.
- fix Warehouse wise Item Balance Age and Value report bug fixes Every warehouse became a column, including ones the user may not read. Warehouse User Permissions now limit the columns.
- fix Restore batch quantity when POS Closing Entry is cancelled (version-16-hotfix) fix(pos): restore batch quantity when POS Closing Entry is cancelled (version-16-hotfix)
- fix Serial No bug fixes Cancelling a Stock Reconciliation marked its serials Delivered. A cancelled reconciliation is now treated like a cancelled receipt, so the serials become Inactive.
- fix Stock Ledger Variance report bug fix Emptied FIFO queues were reported one row late. Reposting from that row revalued later issues.
- fix Cost Center Allocation bug review fixes Split rows now add up to the original amount. Each row is the rounded running total minus the rows before it.
- fix Item bug fixes After a merge, the target item's Bins kept reserved quantities for production, subcontracting and stock reservation, and open orders were lost. The merge now moves them to the target.
- fix Period Closing Voucher bug review fixes Bug review fixes for Period Closing Voucher reverse GL entries.
- fix Stock Reposting Settings bug fixes Overnight timeslots now run past midnight, and time comparisons use time values instead of text.
- fix Incorrect Stock Value Report bug fixes Account is now mandatory, so the stock value is no longer compared with the whole General Ledger.
- fix Item Attribute bug fixes An abbreviation change renames only variants whose item code was generated from the old abbreviations, not codes the user chose.
- fix Item Variant Settings bug fixes `attributes`, `has_variants` and `variant_of` can no longer be copied fields, and a patch removes them from existing settings.
- fix Work Order Consumed Materials report bug fixes Returned Qty is read from the Work Order's raw material rows, in the stock unit of measure.
- fix Workstation bug fixes Planned starts before a shift or inside a break move to the start of the next shift on the same day.
- fix Warehouse bug fixes Group and ledger conversion checks run on every save that changes Is Group.
- fix Warehouse Wise Stock Balance report bug fix Stock in disabled warehouses is rolled up over the whole warehouse tree instead of dropping out of the totals.
- fix BOM Update Log bug fixes Update Cost with no leaf BOM now sets its BOM Update Log to Completed, so later updates are not blocked.
- fix Shipment Parcel Template bug fixes Stock Manager gets full permission on Shipment Parcel Template, so Add Template on a Shipment works for them.
- fix Incorrect Balance Qty After Transaction report bug fixes Balance differences are reported at the stock ledger's float precision, so differences up to 0.5 are no longer ignored.
- fix Batch Item Expiry Status report bug fixes From Date and To Date filter on batch expiry date, not the date the batch was created, and rows are sorted by expiry.
- fix FIFO Queue vs Qty After Transaction Comparison bug fixes Entries that keep no FIFO queue, such as Moving Average items, are skipped.
- fix Stock Qty vs Serial No Count report bug fixes Sync Serial No Status on a group warehouse now covers the warehouses under it.
- fix Work Order Summary report bug fixes Work Orders planned to start later are listed instead of being left out.
- fix Routing bug fixes A row whose workstation changes takes the new workstation's hour rate on save, unless the user typed a rate.
- fix Serial No Warranty Expiry report bug fixes The report shows Warranty Expiry Date, not AMC Expiry Date, sorted earliest first.
- fix Work Orders in Progress report bug fix Work Orders completed with process loss no longer stay listed as in progress.
- fix Issued Items Against Work Order report bug fixes Returned materials show a negative Qty, so the column adds up to the quantity actually kept.
- fix Reserved Stock report bug fixes Available Qty to Reserve is read live from the Bin instead of the snapshot taken at reservation time.
- fix Serial and Batch Summary report bug fixes A group warehouse now returns rows for all warehouses under it, and the Warehouse column shows for groups.
- fix Exponential Smoothing Forecasting report bug fixes The forecast is carried forward after the last actual, so it no longer falls toward zero.
- fix Backport CRM bug fixes from develop Cherry-picks High and Medium CRM bug fixes from develop to version-15-hotfix.
- fix Product Bundle Balance report bug fixes The Date filter is applied, so the report shows the balance on the chosen date.
- fix Material Requests without Supplier Quotations report bug fixes Only submitted Supplier Quotations hide a Material Request item, so cancelled or draft ones no longer hide it.
- fix BOM Variance Report bug fixes Every submitted Work Order with a produced quantity is listed, so real variances show.
- fix Requested Items To Be Transferred report bug fix Qty and the open-row check use the stock unit of measure, and a Stock UOM column is added.
- fix Quality Inspection Template bug fixes A formula-based row needs an Acceptance Criteria Formula, and a blank formula is refused.
- fix BOM Operations Time report bug fix Sub-assembly BOM Count is the number of distinct active parent BOMs, shown on every operation row.
- fix Quick Stock Balance bug fixes For a past date, quantity and value use the same cut-off.
- fix Stock Balance report bug fix Warehouse Type is applied together with the Warehouse filter.
- fix Quality Inspection Summary report bug fixes Draft inspections are no longer listed or charted as Accepted.
- fix BOM bug fixes Update Cost without save no longer writes unsaved form changes.
- fix Stock Ledger Invariant Check report bug fix An entry is flagged when its valuation rate times quantity differs from its balance stock value.
- fix Production Planning Report bug fixes Required Qty is in the stock unit of measure, using the BOM row per unit of the BOM.
- fix Item Prices report bug fixes Last Purchase Rate is per stock unit of measure, and the latest purchase on the same date is used.
- fix Production Plan Summary report bug fix Process loss is taken out of Pending Qty on the Work Order, so completed orders no longer show it as pending.
- fix Item Variant Details report bug fixes Open Sales Orders leaves out closed and completed orders, and counts only rows not fully delivered.
- fix Stock Analytics report bug fixes With weeks starting on Sunday, Sunday postings are filed in the correct week.
- fix Itemwise Recommended Reorder Level report bug fixes Delivered now counts components delivered through Product Bundles.
- fix Serial and Batch Bundle bug fixes The inward duplicate check no longer refuses the same new serial on two rows of one receipt.
- fix Items To Be Requested report bug fix Disabled items are no longer listed as items to request.
- fix Incorrect Serial and Batch Bundle report bug fixes Bundles of submitted POS Invoices are no longer listed as bundles without a stock ledger entry.
- fix Report fails for users without System Manager The Invoice Type column is plain text, so users who cannot read DocType can open the POS Register.
- fix Promotional Scheme bug review fixes A slab removed from a Promotional Scheme no longer keeps its Pricing Rule.
- fix Keep loyalty points without expiry when Expiry Duration is 0 When Expiry Duration is 0 or empty, earned points get the expiry date 31-12-9999 instead of expiring the next day.
- fix Return the batches and serial nos of the returned receipt A Subcontracting Receipt return takes the batches and serial nos of the receipt it returns, not the oldest stock by FIFO.
- fix Let Item Price Stock run without Currency access The hidden Currency Link column is now a Data column, so users with Item Price access but no Currency access can run the report.
- fix Return the rejected serial nos and batches of the returned receipt A return from the rejected warehouse takes serial nos and batches from that warehouse, not the first receipt's stock.
- fix Cap a return by the accepted and rejected qty A Subcontracting Receipt return can no longer exceed the accepted or rejected quantity it returns.
- fix Return the finished good at the returned receipt's rate A Subcontracting Receipt return takes the finished good out at the rate of the receipt it returns, under FIFO, LIFO and rejected qty.
- fix Revalue raw materials of a receipt return on repost A repost now revalues the raw materials that a Subcontracting Receipt return puts back in the supplier warehouse.
- fix Revalue raw materials of a receipt return on repost (backport #64204) fix(subcontracting): revalue raw materials of a receipt return on repost (backport #64204)
- fix Reject a BOM that does not produce the Work Order item A BOM that does not produce the Work Order item is refused.
- fix Reject a BOM that does not produce the Work Order item (backport #64463) fix(manufacturing): reject a BOM that does not produce the Work Order item (backport #64463)
- fix Purchase return issue (backport #51514) Earlier returns are counted per warehouse, so a return from the rejected warehouse no longer lowers the accepted qty of the next return.
- fix Landed Cost Voucher bug fixes A Stock or group account can no longer be used as the account of a landed cost charge.
- fix Asset Value Adjustment fixes An asset value adjustment without a finance book is refused for assets with named finance books, and a related fix is included.
- fix Start non-monthly date range periods on the selected date Only Monthly periods start on the first of the month, so a Yearly range starting 17 Jul no longer splits into an extra period.
- fix Backport financial statement report bug fixes from develop Backports financial statement report fixes, including Financial Ratios profit ratios that use the selected year's income and expense.
- fix Respect company and user permissions in invoice discounting, bank clearance, delivery schedule and production plan respect company and user permissions in invoice discounting, bank clearance, delivery schedule and production plan
- fix Respect company and user permissions in invoice discounting, bank clearance and production plan respect company and user permissions in invoice discounting, bank clearance and production plan
- fix Check access when linking crm contacts and running bank transaction rules check access when linking crm contacts and running bank transaction rules
- fix Check access before linking contacts and addresses from crm check access before linking contacts and addresses from crm
- fix Retain payment request on advance allocation Allocating an advance keeps the Payment Request link, so cancelling the Payment Entry no longer leaves the request marked Paid.
- fix Shift stock value with quantity in later entries until the repost runs A new entry posted while a repost is queued now starts from the correct stock value instead of a stale one.
- fix COGS By Item Group report bug fix Counts a stock ledger entry as COGS only when its item row's expense account is the COGS account.
- fix Available Serial No report bug fixes The balance of each item and warehouse starts with serial numbers already in stock before the From Date.
- fix Putaway Rule bug fixes Rebuilt rows keep the rejected quantity, and received quantity equals accepted plus rejected.
- fix Plant Floor bug fixes Stock summary by parent item group includes child groups, and a Plant Floor with a group or other-company warehouse is refused on save.
- fix Warehouse Type bug fixes Warehouse Type Transit can no longer be deleted, so company setup and Add to Transit keep working.
- fix UOM Category bug fixes Unit conversions through an intermediate UOM use only rows from the same UOM Category.
- fix Stock Ledger Entry bug fixes fix(stock): Stock Ledger Entry bug fixes
- fix Workstation Type bug fixes Workstation cost changes propagate to workstations of that type whose costs still match the old type costs.
- fix Close stock reservation gaps for product bundles Closes reservation gaps for Product Bundle components, including components picked from another warehouse.
- fix Keep job card qty over partial sub operation cycles Job Card qty stays correct when partial cycles run on sub operations at different times.
- fix Account for upstream process loss fix(manufacturing): account for upstream process loss
- fix Return a row with rejected qty at the accepted warehouse rate A Subcontracting Receipt return with rejected qty is priced at the accepted warehouse rate instead of zero.
- fix Return a row with rejected qty at the accepted warehouse rate fix(subcontracting): return a row with rejected qty at the accepted warehouse rate
- fix Round MRP qty before rounding up lead time and chart Rounds quantity before the lead-time ceiling, so an inexact BOM ratio no longer adds an extra day or unit.
- fix Limit MRP non-planned Sales Orders to the MPS items The MRP report lists only Sales Orders for items in the Master Production Schedule.
- fix Round MRP qty before rounding up lead time and chart fix(manufacturing): round MRP qty before rounding up lead time and chart
- fix Reject a BOM that does not produce the Work Order item Work Orders and Production Plans accept only a BOM for the item or its template, not a BOM where the item is only a raw material.
- fix Map recalculated balances for Dunning Dunning rows take the recalculated outstanding balance instead of the stale Payment Schedule amount.
- fix Hide an empty description on the Sales Partner page The Sales Partner page no longer shows "None" when the partner has no description.
- fix Backport accounts ledger and register report bug fixes from develop Corrects accounts receivable and payable report bugs that were fixed on develop and rewritten for v15.
- fix Restore auto reconciliation scheduler registration fix(accounts): restore auto reconciliation scheduler registration
- fix Backport regional, EDI and other bug fixes from develop Corrects UAE VAT 201 and VAT Audit report bugs, rewritten for v15's JSON tax data.
- fix Backport accounts ledger and register report bug fixes from develop Corrects bank reconciliation and ledger report bugs from develop, cherry-picked for v15.
- fix Backport assets bug fixes from develop Fixed Asset Register respects asset permissions and shows value for disposed assets.
- fix Backport support, telephony and utilities bug fixes from develop fix: backport support, telephony and utilities bug fixes from develop
- fix Add status filters to Open and Won Opportunity number cards The Open and Won Opportunity number cards filter by status, so their counts are correct.
- fix Large stock ledger fails to print as pdf Printing a large Stock Ledger as PDF builds it on the server, so the request no longer fails with a 413 error.
- fix Index project on stock ledger entry and stock entry detail Indexes project on Stock Ledger Entry and Stock Entry Detail, so Stock Entry submit no longer scans the whole ledger.
- fix Index project cost queries Splits the project additional cost query into two sums so the database can use indexes.
- fix Index project on stock ledger entry and stock entry detail fix(stock): index project on stock ledger entry and stock entry detail
- fix Create portal purchase invoices only through POST Allows only POST for the supplier portal's purchase invoice creation and moves the action into a POST form with a CSRF token.
- fix Semgrep findings (POST-only side effects, dead webhook helpers, quotation lost reasons) Makes fourteen whitelisted methods that send emails, enqueue jobs or commit POST-only, and removes dead webhook helpers.
- fix Do not book pending sub operation qty as process loss Stops deriving process loss while a sub operation is pending, so Complete Job no longer disappears on a Job Card with sub operations.
- fix Ledger invariant check fails on a null rate in the FIFO queue Treats a null rate in a FIFO queue entry as 0 so Stock Ledger Invariant Check no longer raises a TypeError.
- fix Value returned raw materials at the receipt rate Values returned batched raw materials on a Subcontracting Receipt return at the rate they were consumed at, instead of 0.
- fix Ignore Reserve Stock when stock reservation is disabled Clears the Reserve Stock flag when stock reservation is off, so Sales Orders no longer fail on submit.
- fix Do not value rejected qty of a batched finished good Gives rejected batched finished goods on a Subcontracting Receipt no value when "Set Valuation Rate for Rejected Materials" is off.
- fix Stale rate and amount in work order required items Recomputes amount from rate and required qty on save, and refetches the rate when item editing is allowed.
- fix Revalue finished goods after all supplied items on repost Updates the finished good's stock ledger entry and bundle after all supplied raw material entries when a repost revalues them.
- fix Stop reposting loop after job timeout Stops the repost loop when the RQ job times out, so the next entry is not started with no time left and lost.
- fix Scale BOM secondary item cost by work order qty Scales a BOM secondary item's cost by work order qty over BOM qty, instead of multiplying the row total by the projected qty.
- fix Keep process loss of earlier cycles when completing a job card Keeps the process loss booked in earlier cycles when a multi-cycle Job Card is completed again.
- fix End transit entry fails serial no inventory dimension check Lets an End Transit entry for serialized items pass the inventory dimension check when the source and target shelves differ.
- fix Value manual secondary items in company currency on manufacture entries Reads the company-currency cost for manual-valued BOM secondary items, so foreign-currency BOMs no longer post the wrong amount.
- fix Keep group separator when consolidated subtotal is skipped Always adds the group separator in Consolidated Accounts Receivable/Payable, so a skipped subtotal no longer runs groups together.
- fix Partial disassembly of a batched finished good fails Excludes the entry being submitted from the earlier-disassembly count, so a partial disassembly no longer fails with Insufficient Stock.
- fix Show dimension name in serial no inventory dimension error Shows the inventory dimension name, not None, in the serial no inventory dimension error on v15.
- fix Return packed serial / batch items against a sales invoice Matches original packed bundles through the sales invoice item link, so a credit note for a product bundle reuses its batches and serial nos.
- fix Disallow negative valuation rate in item Blocks saving an Item with a negative valuation rate, so a Material Receipt cannot inherit it.
- fix Prevent duplicate charges across dunning notices A later Dunning no longer leaves the earlier one unresolved, so its fee and interest can't be collected again.
- fix Keep credit limit enforced under sales order bypass With the sales order bypass on, delivered but unbilled value now counts toward the customer's outstanding. A Customer Group limit always applies.
- fix Enforce POS settings permissions and validation Only permitted roles can change POS Settings. Submitted POS Invoices must be consolidated before the invoice type can change, and mandatory POS fields are checked on every submit path.
- fix Secure terms rendering and validate applicability Terms and Conditions text renders as literal content, so Jinja in a terms template can no longer read linked document fields. Applicability of terms is also validated.
- fix Correct recipients, totals and links Digests go only to users who can access the data in them, and company financial totals are protected.
- fix Correct buying/selling, naming and inverse rate handling Currency Exchange lookups respect the buying or selling side, keep side-specific rates on the same date, refresh stale names, and use inverse stored rates.
- fix Validate UOM conversion factors Rejects missing and invalid global UOM conversions before they can produce wrong stock quantities.
- fix Backport asset repost and debit note TDS fixes from develop Sale and return entries of an asset stay the same on Repost Accounting Ledger, and a debit note TDS fix is included.
- fix Cache undelivered valuation rates per posting time… The cached valuation rate of undelivered invoice rows is now keyed by posting time and serial and batch bundle, not only item and warehouse. Later invoices no longer reuse the oldest rate.
- fix Replace raw SQL CURRENT_DATE/CURDATE() with frappe.utils.nowdate() Date comparisons use the site's configured timezone instead of the database session timezone.
- fix Match FIFO rates at database precision A FIFO internal transfer no longer consumes the wrong transit layers or posts an unexpected COGS adjustment over floating-point differences.
- fix Deliver reserved serial and batch stock without a bundle (backport #55806) Delivering reserved stock no longer crashes when the serial or batch is on the row rather than in a Serial and Batch Bundle.
- fix Restore updates to legacy cheque print formats Cheque Print Templates created before the upgrade can update their Print Formats again after layout changes.
- fix Keep payment schedule in sync with invoice outstanding on reconciliation Reconciling a payment also updates the invoice's Payment Schedule, so a stale schedule no longer blocks full payment.
- fix Cap payment term allocations at outstanding amount Independently rounded payment terms can no longer exceed the invoice outstanding by 0.01 when a foreign-currency Payment Entry is created.
- fix Fieldname parts in serial and batch naming series Original of the naming series fix, merged to develop.
- fix Fieldname parts in serial and batch naming series (backport #63498) Fieldname parts such as {reference_name} resolve in Stock Settings prefixes and Serial No series, instead of being uppercased or left as literal text.
- fix Backport support, telephony and utilities bug fixes from develop (rewritten for v15) Ports the High and Medium severity fixes for Call Log, telephony and utilities to v15, one commit per bug.
- fix Set paid from/to based on selected company bank account Changing the Company Bank Account updates Paid From and Paid To, even when a Mode of Payment has a default account.
- fix Preserve POS batch quantities and serial selections Repeated clicks on a batch item increase the existing row's quantity instead of adding duplicate rows, and mixed serial rows keep their quantities.
- fix Correct general ledger checkbox filter setting Expanding the General Ledger filters on v16 no longer throws a TypeError, because the setting name is spelled correctly.
- fix Skip over-billing check for returns on save and submit A credit note against an over-billed Sales Order line can be saved and submitted without the over-billing permission.
- fix Correct pages, commissions, targets and routes Published Sales Partner pages load, and commissions, targets and routes are corrected.
- fix Validate Department hierarchy, naming and assignments Rejects Department parents that can't be reached from the company's tree, and validates naming and assignments.
- fix Label state field in print address dialog as State/Province Original of the print address state label fix.
- fix Move payment references beside accounts Cheque or reference number and date move beside the account fields, instead of a separate section near the bottom.
- fix POS Opening Entry bug review fixes (backport #62496) A cashier who is not listed in the POS Profile's Applicable for Users can no longer open a session, along with other fixes from the review.
- fix Block Update Items on ordered, stopped and expired supplier quotations The server now rejects Update Items on Ordered, Stopped and Expired Supplier Quotations, matching the form, which already hides the button there.
- fix Bill the remaining amount after the full qty is billed A Purchase Order row billed at full qty for a lower amount is mapped to a Purchase Invoice again, so its remaining amount can be billed.
- fix Deliver reserved serial nos from a stock updating sales invoice A Sales Invoice with Update Stock made from a Sales Order now picks that order's reserved serial nos instead of a different serial.
- fix Sales Order over-delivery, returns and status hardening (v16) Enforces the over-delivery limit on product bundle items, records returned_qty for returns submitted without a reload, builds the delivery schedule from the sales order row, and validates status and docstatus in update_status.
- fix Skip serial nos reserved for other vouchers in pick list (backport #63183) Same fix as #63335, adapted for v15.
- fix Job card material request regressions from the request cap The Job Card material request cap from #63248 now respects Allow Excess Material Transfer and pre-fills only the rows still pending.
- fix Hide additional cost exchange rate on its own table Adding an Additional Costs row on a Stock Entry, Subcontracting Order or Subcontracting Receipt no longer throws a console TypeError.
- fix Skip serial nos reserved for other vouchers in pick list Pick lists no longer pick serial nos reserved for another Sales Order or Work Order, which made submit fail. A pick list still picks its own reservations.
- fix Load proforma settings through Sales Order onload Sales Order's onload now sends the proforma settings, so users with only the Sales User role no longer get "No permission for Selling Settings" on submitted orders.
- fix Drop zero qty rows from supplier portal Purchase Invoice The supplier portal's Make Purchase Invoice drops zero-qty rows before saving, so the regression from #63296 no longer blocks billing from the portal.
- fix Reset party search when Quotation To is not Customer or Lead Switching Quotation To to CRM Deal or Prospect no longer breaks the party search with "Invalid party type" and gets its own label.
- fix POS Closing Entry bug review fixes (backport #62494) Invoices left off a POS Closing Entry are now consolidated on submit and on Retry, along with other fixes from the review.
- fix Promotional Scheme bug review fixes (backport #62492) A slab removed from a Promotional Scheme no longer keeps its Pricing Rule, along with other fixes from the review.
- fix POS Invoice Merge Log bug review fixes (backport #62493) The consolidated Sales Invoice keeps a write-off on a Paid POS Invoice, along with other fixes from the review. Merge after #63407.
- fix POS Invoice bug review fixes (backport #62561) Fixes from the POS Invoice review, including the write-off handling that #63406 depends on.
- fix POS Settings bug review fixes (backport #62495) Fixes from the POS Settings review, including Invoice Type switching to Sales Invoice when it should not.
- fix Cost Center Allocation bug review fixes (backport #62462) Fixes from the Cost Center Allocation review, including the cost center split in the general ledger.
- fix Pricing Rule bug review fixes (backport #62491) Saving a document no longer re-applies saved pricing rules without checking them, along with other fixes from the review.
- fix Do not allow Deduct for taxes with category Valuation (backport #62478) The server now rejects Deduct on Purchase Taxes and Charges rows whose category is Valuation, not only the form.
- fix Account bug review fixes (backport #62471) Merging a group into one of its grandchildren no longer breaks the account tree, along with other fixes from the review.
- fix Item Tax Template bug review fixes (backport #62470) Fixes from the Item Tax Template review, including the error when dated rows and rate band rows are mixed.
- fix Period Closing Voucher bug review fixes (backport #62468) Fixes from the Period Closing Voucher review, including the reverse GL entries built by make_reverse_gl_entries.
- fix Ledger Health bug review fixes (backport #62476) The General and Payment Ledger comparison and the daily ledger check now compare account currency amounts.
- fix Payment Request bug review fixes (backport #62474) Fixes from the Payment Request review, including schedule-based requests that ignored their schedule.
- fix Payment Order bug review fixes (backport #62475) Fixes from the Payment Order review, including a cause of the Payment Request bug fixed in #63290.
- fix Keep loyalty points without expiry when Expiry Duration is 0 (backport #62483) When Expiry Duration is 0 or empty, earned loyalty points no longer expire the next day.
- fix Widen payment reconciliation tables The Payment Reconciliation tables are wider, so document references and large amounts are no longer truncated.
- fix Use company currency for gross profit Gross profit on foreign-currency Sales Orders and Quotations now subtracts company-currency valuation from the converted sale value, so profitable sales no longer show a loss.
- fix Show activity and note dates in system date format CRM activity and note dates now follow the System Settings date format, and multi-day event end dates no longer show "Invalid date" for formats like dd-mm-yyyy.
- fix Keep price list rate on rows added through Update Items Rows added through Update Items keep their price list rate, and the gap to the entered rate is recorded as discount or margin.
- fix Keep price list rate on rows added through Update Items (backport #63176) Same fix as #63176, backported.
- refactor Wait for the bench to stop before restarting it in patch test The patch test waits up to 60 seconds for honcho and Redis to exit before restarting, which stops the port-in-use failure.
- refactor Post budget cancellation entries at fiscal year start Posts the budget cancellation test entries at fiscal year start, so the tests keep passing from 1 November.
- refactor Post budget cancellation entries at fiscal year start (backport #63340) Same fix as #63340, backported to version-16-hotfix.
- feat Create a default holiday list during setup The HRMS setup wizard creates a holiday list for the company, filled with public holidays, so leave and payroll work from day one.
- feat Rebuild the organizational chart as a Frappe UI page island Replaces the single vertical tree with an org chart that supports pan, zoom and search, plus a company directory.
- fix Label PWA notification read flag as Seen The PWA Notification read checkbox is labelled "Seen", so it no longer uses the read-permission translation.
- fix Check employee access when listing approvers The approver lookup used by Leave Application, Expense Claim and Shift Request now requires access to the employee passed in.
- refactor Move working hours to the details tab and filter print formats by doctype Moves working hours into the Details tab, so the Terms tab holds only the template and letter body.
- feat Task, Note and Call Log rows in the deal and lead Activity tab Shows Tasks, Notes and Call Logs in the Activity tab of deals and leads, each opening its record.
- feat Open Tasks, Notes and Call Logs in the record dialog Opens CRM Task, FCRM Note and CRM Call Log in desk v2's record dialog, with a read-only call summary.
- feat CRM Task list cells as in CRM v1 Gives the CRM Task list CRM v1's status icon, priority badge and due date format.
- feat Schedule send for emails Emails can be scheduled from the composer, and a scheduled email can be sent now, edited or deleted from the timeline.
- feat Client Scripts in the Setup sidebar, Form Scripts report through an act The Setup sidebar opens Client Scripts for writing desk v2 rewrites, and System Managers reach the Form Script report through an action.
See all 52 changes
- feat CRM's ports follow their v1 row's enabled flag The ported form scripts stop running when their v1 CRM Form Script row is disabled, matching /crm.
- feat Run CRM's standard scripts as record.js on desk v2 CRM's four standard form scripts now run on CRM Deal and Lead desk v2 pages, covering product totals, forecast probability and Create Quotation.
- feat Lead syncing on desk v2's standard pages Lead Sync Source, Facebook Lead Form and Failed Lead Sync Log work on desk v2, with Sync Now and Failed Syncs actions.
- feat Verify the ERPNext connection from the ERPNext pane Adds a Verify connection button to the ERPNext pane of CRM settings, which checks the saved URL, key and company.
- feat Default status and owner on insert and in Convert A new CRM Lead or Deal saved without a status or owner gets the first status and the creating user, and Convert to Deal prefills the Deal Status.
- feat Lost Reason shows only while Lost; convert skips it The Lost Reason field shows only when the status is a Lost type, and converting a lead no longer copies its lost reason to the deal.
- feat Open FCRM Note as Cards by default Opens FCRM Note as a Cards view by default in desk v2.
- feat CRM defaults on Email Account and Email Template's desk v2 pages New Email Accounts default to syncing all mail and to Append To CRM Lead, and copied Email Templates get CRM's defaults.
- feat Prefill status and owner in Lead and Deal Quick Entry Quick Entry for a CRM Lead or Deal opens with the first status and the creating user as owner.
- fix Don't check read permission when notifying agents of incoming messages Incoming WhatsApp messages linked to a Lead or Deal no longer fail with a 403 that rolls back the message and its log.
- fix Publish whatsapp_message to the reference doc room Sends WhatsApp message events to the reference document's room instead of every Desk user on the site.
- fix Publish whatsapp_message to the reference doc room Sends WhatsApp message events to the reference document's room instead of every Desk user on the site.
- fix Publish whatsapp_message to the reference doc room Sends WhatsApp message events to the reference document's room instead of every Desk user on the site.
- fix Follow the framework version scheme (v15) fix: follow the framework version scheme (v15)
- fix Follow the framework version scheme (v16) fix: follow the framework version scheme (v16)
- fix Limit version-16 to frappe v16 fix: limit version-16 to frappe v16
- fix Check permissions before bulk delete Bulk delete checks delete permission before it processes linked documents.
- fix Validate CRM invitations in the controller Invitation validation moves into the doctype, and access to its fields is restricted.
- fix Resolve marketplace semgrep findings Resolves the marketplace Semgrep findings that blocked the check.
- fix Auto-complete setup on Frappe Cloud v2 sites Setup completes automatically on Frappe Cloud v2 sites.
- fix Send call events and event reminders only to the user they are for Call and reminder realtime events went to every connected user. They now go only to the agent or user they belong to.
- fix Check access when a ToDo edit assigns a lead or deal Desk-v2 cherry-pick of the same ToDo access check.
- fix Check access when a ToDo edit assigns a lead or deal A ToDo edit that changes the referenced record or assignee, or reopens a cancelled ToDo, now needs write access on the CRM Lead or Deal, as new ToDos already do.
- fix List only the deals the user can read on a contact The linked-deals list on a contact now applies CRM Deal's permission rules, so users see only the deals they can read.
- fix Keep the exchange-rate access key in the password store Moves the exchange-rate access key into the password store so no read of FCRM Settings returns it in plain text. A patch migrates existing values.
- fix Turn Twilio off with revoked credentials An admin with revoked Twilio credentials can now turn Twilio off and save.
- fix Call Twilio on save only when credentials change Saving Twilio Settings without changing credentials no longer calls Twilio, so non-credential edits don't fail with revoked credentials.
- fix List product sync status before the integration is enabled The ERPNext pane's Products block no longer shows OperationalError before the ERPNext integration has been enabled.
- refactor Use the shared window handle and shell.realtime Moves CRM's call window onto the shared window handle, so a call no longer fails with "The call window is still loading".
- refactor Limit version-15 to frappe v15 ci: limit version-15 to frappe v15
- refactor Stop publishing assets for version-15 ci: stop publishing assets for version-15
- refactor Patch release v15 chore: patch release v15
- refactor Patch release v15 chore: patch release v15
- refactor Patch release v16 chore: patch release v16
- refactor Patch release v16 chore: Patch release v16
- refactor Patch Release v16 chore: Patch Release v16
- refactor Build v15.x.y and v16.x.y tags on their own lines ci: build v15.x.y and v16.x.y tags on their own lines
- refactor Run workflows on version-15 lanes ci: run workflows on version-15 lanes
- refactor Run workflows on version-16 lanes ci: run workflows on version-16 lanes
- refactor Release version-15 ci: release version-15
- refactor Release version-16 ci: release version-16
- refactor Release version-15 and version-16 ci: release version-15 and version-16
- refactor Remove the marketplace release PR merge job Removes the marketplace merge job, since the marketplace now keeps a rolling release PR per branch.
- refactor Minor Release chore: Minor Release
- refactor Patch Release chore: Patch Release
- refactor Fix the Form Scripts guide's gaps from the walk Corrects the Client Script steps in the Form Scripts guide and adds the guard that each rewrite needs.
- refactor The guide from CRM Form Scripts to desk v2 Client Scripts Adds the guide that maps each CRM Form Script call to its desk v2 Client Script equivalent, with worked examples.
- fix Truncate list titles and shorten length errors Long quiz titles are truncated in the Quizzes list, and the title length error is shorter.
- feat Play audio from a link and show Cloudflare Images links A pasted link to an mp3, m4a, wav, ogg or aac file becomes an audio player.
- feat Settings rewrite and in-app Frappe Cloud billing to version-16 Brings the rewritten Settings and in-app Frappe Cloud billing to version-16.
- feat Show frappe cloud billing and trial inside lms settings Adds a Frappe Cloud group to LMS Settings, with Billing, Marketplace, Domains and Advanced tabs, and a trial card in the sidebar.
- feat Fix(lms) align app sidebar and Getting Started scrollbars Uses a thin scroll area for the app navigation and Getting Started panel, keeping the user menu and footer fixed.
See all 13 changes
- fix Keep the desk pages' lists consistent when a request fails Keeps list contents unchanged when a page request fails, and clears stale search results before a new search lands.
- fix Add submit button loading state and guard submission beacon The Submit buttons show a loading state, so repeated clicks no longer create duplicate quiz submissions.
- fix Lesson videos with non-Latin file names, same-day class reminders and OAuth sign-in Original of the lesson video fix.
- fix Don't lose a submit pending when the page closes A quiz submit pending when the tab closes is still saved, instead of being lost.
- refactor Merge 'version-16-hotfix' into 'version-16' chore: merge 'version-16-hotfix' into 'version-16'
- refactor Find the marketplace release PR by its branch name ci: find the marketplace release PR by its branch name
- refactor Run the server and UI suites hourly on develop and version-16, not on every pull request Runs the heavy server and UI suites hourly on develop and version-16, and skips them on pull requests into those branches.
- refactor Call the GitHub API from the branch status helper without a subprocess Calls the GitHub API directly, so develop publishes pass the marketplace check.
b
Builder
7 new features · 1 speed-ups · 10 fixes · 7 refactors
- feat Bring your website into Builder from onboarding Adds a "Bring your website" onboarding option that copies an existing site's pages, text and images into Builder.
- feat AI credits from Frappe Cloud in Builder Builder uses the AI credits from Frappe Cloud through the site's AI gateway key, with no setup.
- feat Trial card in the dashboard sidebar on Frappe Cloud v2 Adds a Billing pane in settings and a trial card in the dashboard sidebar on Frappe Cloud v2.
- feat Undo and redo token edits Adds undo and redo for design token edits.
- feat Show and set block visibility conditions as bind.visible Lets Bob read and set block visibility through `bind.visible`.
See all 25 changes
- feat Show Cloud Settings' Domains panel on Frappe Cloud v2 sites Shows the Cloud Settings Domains panel in Builder's settings on Frappe Cloud v2 sites.
- feat Page markup for Bob's reads, edits and generation Switches Bob's block reads, edits and generation to a compact page markup in place of YAML.
- perf Fewer rounds per turn and a leaner fixed prompt for Bob Cuts Bob's rounds per edit turn and trims the fixed prompt, which cuts per-turn cost and latency.
- fix Upgrade LiteLLM past CVE-2026-114612 Upgrades LiteLLM from 1.95.1 to 1.100.4 to clear a CVE flagged on every PR.
- fix Redact credentials from tool arguments saved in the trace Redacts values for keys such as `api_key`, `api_secret` and `password` before tool arguments are saved to the chat trace.
- fix Say when query_records stopped before the last record Tells Bob when query_records stopped before the last matching record, so it stops treating partial results as the whole.
- fix Take scripts off a page instead of blanking them Lets Bob remove a script from a page, instead of saving it as an empty body that broke the live page.
- fix Keep markup in chat messages as written Stops the sanitizer from rewriting markup in saved chat messages, so pasted SVG and code survive.
- fix Preview pages from a real viewport height Renders previews in a real viewport height, so `100vh` layouts no longer show as huge blocks.
- fix Name the refs inside a block add_block created Lists the child refs created inside a new block, so follow-up edits do not need a read or guess refs.
- fix Pass the marketplace app check Pins LiteLLM so Builder installs on Frappe v15 and develop.
- fix Pass the marketplace app check Same change as #1051, backported to v1.37.1.
- fix Let a page data script set the page language A dynamic-route page can set its own html lang from the record's language, so regional pages no longer all say lang="en".
- refactor For patch release chore: For patch release
- refactor For patch release chore: For patch release
- refactor Match the settings pages to the Cloud Settings panels Makes Builder's settings pages match the spacing and background of the Cloud Settings panels.
- refactor Load page and editor-plugin skills on demand Moves Bob's page and editor-plugin guidance into skills that load on demand.
- refactor For v1.37.0 release Merges develop into master for the v1.37.0 release, with editor plugins, Bob's two-step provider setup and related changes.
- refactor Rewrite the readme features, set up with Pilot docs: rewrite the readme features, set up with Pilot
- refactor Open the marketplace release PR for each release ci: open the marketplace release PR for each release
- feat Category description and more category icons Adds a description field to knowledge base categories and grows the icon picker from 5 to 295 icons.
- feat Integrate cloud v2 sdk for in app fc experience Shows Frappe Cloud v2 settings panels in the app and hides the old trial banner on v2 sites.
- fix Add theme submenu to the desk and portal menus, and home for guests Adds a theme submenu to the desk and portal menus, and a Home link for guests in the logo menu.
- fix Remove a workday's break and default its end to an hour later Adds a Remove break button and defaults Break end to an hour after Break start.
- refactor Share one icon picker between categories and views refactor: share one icon picker between categories and views
See all 15 changes
- feat Use the shared Email Accounts panel Settings > Email Accounts uses the shared panel, so Outlook mailboxes can be added in one click on Frappe Cloud V2 sites.
- feat Lunch break in SLA working hours Lets each SLA workday have a break that stops the clock for due dates, elapsed times and analytics.
- fix Clear the remaining marketplace semgrep findings Replaces formatted SQL in the install code with query builder calls and removes a debug print, clearing the last blocking Semgrep findings.
- fix Use the query builder for the ticket summary and response patch Replaces string-formatted SQL in the ticket summary and response patch with query builder calls, and limits the update to tickets that need it.
- fix Pass exception text, not the object, to translated strings Passes only the exception message into translated strings, so an edited translation cannot read attributes of the exception object.
- refactor Fake the mail server connect in the parked mail test test: fake the mail server connect in the parked mail test
- refactor Release and test version-15 on Frappe v15 Adds version-15 releases and tests on Frappe v15.
- refactor Publish version-16 releases to the marketplace Opens a marketplace PR for each version-16 release.
- refactor Backport and release on version-15 and version-16 Sets up backport labels and release flow for the version-15 and version-16 branches.
- refactor Release and test version-16 on Frappe v16 Adds version-16 releases and tests on Frappe v16.
- perf Keep request cleanup from loading the data-source stack Moves the request cleanup hook into a lightweight module, so every request no longer loads the data-source stack.
- fix A comparison reads a period, a target owns the fixed number Makes a card's target and comparison mean one thing each, so a constant comparison no longer skews the measurement.
- fix Preserve anchored weeks in date filters Converts "N weeks ago" into a date range that respects the site's configured week start.
- fix Answer busy, not a connection error, when a source's slot is full A busy data store slot is reported as busy, so charts retry instead of recording a connection error.
- fix Prevent browser auto-translation of app Stops the browser from auto-translating the app, so only real translations are shown.
p
Press
9 new features · 11 fixes · 1 refactors
- feat Let users remove a region from a bench group Adds a Remove Region action on a bench group's Regions tab, behind a confirmation dialog.
- feat Let a site turn off its offsite backups Adds a switch in the Backup Schedule dialog that stops a site's offsite backup copies.
- fix Point the servers breadcrumb to the servers list Points the Servers breadcrumb at `/servers`, which fixes a 404 after clicking it.
- fix Show a spinner on the bench and server refresh buttons Shows a spinner on the bench and server refresh buttons while the list loads, and disables them until it does.
- feat Admin tool to move resources between teams Adds an admin tool to move sites and benches between teams. Backport of #7962.
See all 21 changes
- feat Read apt dependencies from [tool.frappe-cloud] Reads apt packages from a `[tool.frappe-cloud]` key, since `[deploy.dependencies.apt]` is not valid pyproject.toml.
- feat Hide sites, benches and servers in archived regions Sites in archived regions are hidden and no longer charged, since their actions can't run there.
- feat Add a stop button for a running migration Adds a Stop Migration button that stops the running step and fails the action, so a stuck migration can be ended from the dashboard.
- feat Add server ownership transfer Customers can transfer a dedicated server, with its database servers, virtual machines and subscriptions, to another team in one save.
- feat Grove AI key for Product Trial sites Product Trial sites get a Grove AI key, which is written to site config when the site is created.
- feat Add report of customer emails by region Adds a System Manager-only Customer Emails report that lists customer emails by region for subprocessor notices, exportable as CSV.
- fix Versioning constrains and better deploy errors Matches Frappe versions by the lower bound of the spec, and skips the dependency lookup instead of crashing when nothing matches.
- fix Make Setup On-Prem Failover retries work Firewall attach and detach are idempotent, so a failed setup can be retried.
- fix Fix(agent-job): Tell the team to remove folders from private/backups backport(master): fix(agent-job): Tell the team to remove folders from private/backups
- fix Blank new site page and undefined region The new site page no longer renders blank and no longer shows an undefined region.
- fix Show the site name in the trial plan deactivate error Shows the site name in the error when a trial site cannot be deactivated.
- fix Fix(deploy-candidate): Save duplicate deploy candidate on redeploy Saves the duplicate deploy candidate on redeploy, instead of the old one. Backport of #7933.
- fix Save duplicate deploy candidate on redeploy Saves the duplicate deploy candidate on redeploy, so a redeploy builds with the apps it was running instead of the latest releases.
- fix Skip Increase Disk Size reaction when it would do nothing A disk-full alert no longer creates an Increase Disk Size job when auto storage increase is off, since that job could only warn the team.
- fix Describe draft invoice items in the CSV download The description column is filled for the current month's draft invoice items in the CSV.
- refactor Fetch server metrics through press.api.server.analytics docs(agents): Fetch server metrics through press.api.server.analytics
o
Other
56 new features · 8 speed-ups · 48 fixes · 21 refactors
- feat Record ssh and tty console access to a server Each SSH or TTY console URL writes an Activity Event showing who opened it, on which server, and when.
- feat Show requester on events without actor Events with no person attached, such as a snapshot ready report, show who requested them, read at display time.
- feat Show a site's own server billing in the app Cloud Settings can show a site's own next bill, its server's invoice share, and its invoice PDF and checkout, scoped to that server.
- feat Name the app a trial is for in the in-app status The in-app trial status includes the product's signup app, so Cloud Settings keeps it installed until the trial converts.
- feat Open a server's terminate dialog from a link `/servers?pilot=&action=terminate` opens the terminate dialog for that server, with the same permission check as the server list.
See all 133 changes
- feat Allow opting out of wkhtmltopdf Adds an INSTALL_WKHTMLTOPDF build option so builders can skip the wkhtmltopdf download.
- feat A Suite shortcuts dialog with packed columns, consistent keycaps and Drive letter chords A shortcuts dialog opened with ? lays out groups in packed columns, with one keycap style and one search.
- feat Fix editing, show comments at once, and make panels and mentions follow each role Rewrites the Writer toolbar and bubble menu, shows comments immediately, and makes mentions and panels follow each user's role.
- feat Background downloads, multi-select, previews and small actions Adds background downloads, bulk download and star for a selection, and several small file actions.
- feat Scan outbound mail of signed-in senders with Rspamd Scans outbound mail from signed-in senders with Rspamd as a milter, and refuses spam at DATA.
- feat Subdomain support in one-click images One-click images accept a subdomain, which is mapped to the server once provisioning succeeds.
- feat Adjust a team's credit from the desk team form System Managers can add or take back team credit from the Team form, with a confirmation step.
- feat Explain billing alerts and mute known ones from billing settings Explains each billing alert and lets operators mute known alerts from Billing Settings with a reason.
- feat Servers list view feat(ui): Servers list view
- feat Remove cloud init generation from cargo Removes cloud-init generation from cargo.
- feat Add support for grafana and prometheus Adds Grafana and Prometheus one-click templates.
- feat Advertise aa2f0f25 from master feat(builder): advertise aa2f0f25 from master
- feat Advertise 1016067b from master feat(builder): advertise 1016067b from master
- feat Advertise 006f9464 from develop feat(lms): advertise 006f9464 from develop
- feat Advertise bab30db8 from version-16 feat(lms): advertise bab30db8 from version-16
- feat Add rescue mode controls Adds rescue mode controls to the server dashboard, using existing Start and Restart actions.
- feat Show plan names on server plan cards and the map Shows plan names on server plan cards, the resize dialog and the servers map.
- feat Enable usage alerts and map Central event names Turns on CPU, memory and disk alerts by default, and sends Central the event names it accepts.
- feat Move object storage & telemetry out of atlas proxy Moves object storage and telemetry traffic from the Atlas proxy to its own Caddy proxy.
- feat Show certificate state and alert on failures Shows each custom domain's certificate state and raises an alert when issue or renewal fails.
- feat Stream update backups to and from S3 Streams database backups taken before an update to and from the bench's S3 bucket, so updates no longer need local disk space.
- feat Send bench events to signed webhooks Sends bench events to configured webhooks, with a token and an HMAC signature header when a token is set.
- feat Dismiss failed updates and harden restore Adds a Dismiss action for failed updates and makes Restore skip apps and sites that were removed.
- feat Edit common site config from Admin Adds a Common site config editor in Settings, with type checks and refusal of keys Pilot manages itself.
- feat Configure host listen ports Lets the host set nginx's HTTP and HTTPS ports in `common_config.toml`, for hosts where another proxy owns 80 and 443.
- feat Manage daily automatic Pilot updates from About Adds an Automatic updates switch in Settings > About that runs Pilot updates daily at 00:00 UTC by default.
- feat Seed a Northwind Labs company for user testing Adds a seed and reset command that fill a Suite site with the fictional Northwind Labs company.
- feat Steady name box, 28 px toolbar controls and a font size stepper Gives the Sheets name box one fixed width, sets toolbar controls to 28 px and adds a font size stepper.
- feat Advertise 9d750b7b from master feat(builder): advertise 9d750b7b from master
- feat Advertise 3eeb8f87 from version-16 feat(helpdesk): advertise 3eeb8f87 from version-16
- feat Advertise 9cfa4a24 from develop feat(lms): advertise 9cfa4a24 from develop
- feat Advertise e3269863 from version-16 feat(helpdesk): advertise e3269863 from version-16
- feat Advertise 0bddeebf from version-16 feat(lms): advertise 0bddeebf from version-16
- feat Advertise 27f21293 from version-16 feat(lms): advertise 27f21293 from version-16
- feat Advertise 1efa6b52 from main feat(lms): advertise 1efa6b52 from main
- feat Advertise 25952cb4 from version-16 feat(crm): advertise 25952cb4 from version-16
- feat Advertise c587a42b from version-16 feat(crm): advertise c587a42b from version-16
- feat Skip frontend work for test jobs feat: skip frontend work for test jobs
- feat Add US Sales Tax print formats for Quotation and Sales Order Adds US Sales Tax print formats for Quotation and Sales Order, based on the Sales Invoice template, with Valid Till and Delivery Date.
- feat Give each cargo node its own datum token Central issues each cargo node its own Datum token from a signed machine token, replacing the shared token.
- feat Add one click image logos feat: Add one click image logos
- feat Give each cargo node its own datum token Each Garage and Datum node fetches its own token daily, before Vector is installed.
- feat App logos App logos
- feat One click images feat: One click images
- feat One click templates feat: One click templates
- feat Record uncaught browser errors in the Error Log Uncaught browser errors are recorded in the site's Error Log, alongside server errors.
- feat Redesign and organize settings dialog (wip) Work in progress: a redesigned and reorganised settings dialog.
- feat OpenAI embedding models, pooling runner, openai-only dialects Adds OpenAI's text-embedding-3 models to the catalog, priced on prompt tokens, and launches self-hosted embedders with the pooling runner.
- feat Revoke by age, not at the trial's end Assigned trial keys are revoked after a configurable number of days (default 30) since assignment, so an extended trial keeps its key.
- feat A vendor serves /v1/embeddings, held to what its model gives Vendors can serve /v1/embeddings for the OpenAI dialect, and routing rejects chat models for embeddings and the reverse.
- feat Product level model catalog for trials Adds a product-level model catalog for trials. The description is empty.
- perf Stop the status-bar sum at the last used row Selecting a whole column no longer makes the status bar read every empty row, which removes a delay on each selection.
- perf Batch network quality refresh rendering Batches network-quality updates that arrive within 16ms so the meeting grid re-renders once instead of repeatedly, reducing viewer CPU in a 50-person test by about 8.6%.
- perf Remove unused platform binaries from SFU image Keeps only the ONNX Runtime binaries for the image's target platform and architecture.
- perf Avoid duplicating SFU files when setting ownership Sets file ownership during the copy instead of in a later recursive chown, so the application files are not stored in a second layer.
- perf Remove development dependencies from SFU image Removes development dependencies after the build, cutting node_modules from 609 MB to 401 MB in the runtime image.
- perf Avoid compiling Mediasoup in SFU image builds Moves both SFU image stages to Debian Trixie so the published Mediasoup worker runs, instead of compiling it from source.
- perf Avoid compiling Mediasoup workers on Linux 7 Upgrades Mediasoup to 3.32.1, which publishes the Linux 7 worker binary, so installs no longer compile it.
- perf Reduce SFU image cache upload time Exports only the cache layers the SFU image needs, cutting the cache upload time in the CI trial.
- fix Deductor type select and stop polling Sandbox jobs that never finish Deductor Type becomes a Select of the 16 ITD types, defaulting to `K - Company`, and a patch maps existing codes.
- fix Skip the console onboarding for a trial funnel's team A new team created by the trial funnel starts with its onboarding steps skipped.
- fix Upgrade Go dependencies for govulncheck findings Upgrades Metal and WG Mesh Go dependencies and moves the Metal API to Echo v5 to fix nine reachable vulnerabilities.
- fix Drop grafana password from image & add CSRF for site domain Removes the Grafana password from the image and sets the admin password on first boot.
- fix Use loan cost center in loan journal entries NPA suspense journal entries use the loan's cost center instead of the company default, which failed when the default was blank.
- fix Set default collection offset sequence when moving from v15 to v16 A migration patch sets the collection offset sequence, so repayments no longer stop after the v15 to v16 move.
- fix Write off only what no gateway can charge Billing writes off only amounts below the smallest gateway charge (INR 1 or USD 1), and no longer cancels issued invoices for being small.
- fix Show payment and form errors in full Long payment and form error messages in the dashboard show in full instead of being cut to one line.
- fix Undo and redo step through every recent change on a live sheet Undo and redo on a live sheet step through each recent change, and the toolbar stays in sync.
- fix Plot dates in a scatter chart's X column Scatter charts read date cells as their day serial, so date X values plot instead of producing an empty chart.
- fix No stray gridline inside frozen rows or columns after a small scroll fix(sheets): no stray gridline inside frozen rows or columns after a small scroll
- fix Keep cell text in place when the in-cell editor opens and closes fix(sheets): keep cell text in place when the in-cell editor opens and closes
- fix Convert opened sheets while paused, explain refused ones, and restore Versions actions fix(sheets): convert opened sheets while paused, explain refused ones, and restore Versions actions
- fix Font size on a whole column or row changes every cell in it fix(sheets): font size on a whole column or row changes every cell in it
- fix Let the Drive migration finish with accepted skips, refuse records after a database-only restore, and copy S3 in parallel Lets the Drive migration finish when skips are accepted, and refuses stale progress records after a database-only restore.
- fix Configure the system Chromium for PDF generation fix(devcontainer): configure the system Chromium for PDF generation
- fix Remove backup metadata when the backup fails Deletes the leftover `physical_backup_meta.json` when a backup step fails, so a later `DROP DATABASE` cannot delete table files.
- fix Open and download uploaded Word files Opens uploaded Word files on the Drive file page and lets them download, instead of sending them to Writer.
- fix Show every name on a shared cell, in Writer's colours Shows all names on a shared cell in one label, using the same colours as Writer.
- fix Make an imported spreadsheet editable within seconds Creates the collaborative document at import, so an imported sheet is no longer read-only until the scheduled conversion runs.
- fix Keep dark-mode header separators and repaint the grid on a theme change Fixes the dark-mode header separators and repaints the grid when the theme changes.
- fix Preserve in-place progress output Keeps carriage returns in migration output so progress bars update in place instead of repeating log lines.
- fix Keep the settings dialog out of browser history Treats the Settings modal as one layer on top of its page, so Back no longer walks through its tabs.
- fix Keep sizing values and unlimited sizes readable Stops the buffer pool suffix from hiding typed values, and shows MariaDB's no-limit values as "No limit".
- fix Stop truncate from cutting off descenders Makes `truncate` clip only horizontally, so the bottom of letters like "g" and "y" are no longer cut off.
- fix Offer unsent edits as a download when edit access goes When edit access is removed while changes are unsent, the user is offered their edits as a file, including text still being typed in a cell.
- fix Handle leftover tables in loan security pledge and unpledge rename The v15 to v16 rename patch no longer fails on a leftover table, so migrate can finish after a failed or restored run.
- fix Use text links in the digest and match link underlines Digest actions are text links instead of solid and bordered buttons, and email link underlines match their text colour.
- fix Resolve team, server and billing ux bugs Fixes several console and desk flows, including the role change notice, removed team members keeping the team open, and duplicate billing setup buttons.
- fix Separate app picker from image cards Separates the app picker from the image cards.
- fix Trial pooling Fixes trial pooling for AI.
- fix Add embedding model endpoint and format subcent values Adds the embedding model endpoint and formats subcent values.
- fix Keep pivot output out of the collab doc Pivot output is derived and no longer written into the shared doc, so stale values no longer remain after a pivot shrinks.
- fix Ctrl+wheel zooms the page over the grid; outline row, column and sheet selections Ctrl plus the wheel zooms the page over the grid, and whole row, column and sheet selections get the same outline as cell ranges.
- fix Sheets and Slides fixes from the Drive layer test round Sort menus, format fixes and other Sheets and Slides issues found while testing the Drive layer.
- fix Preserve remote custom background orientation Custom backgrounds are no longer mirrored for remote participants, and the local preview explains the mirroring.
- fix Drive, Admin, Mail and Calendar fixes from the Drive layer test round Fixes Drive, Admin, Mail and Calendar issues found in the Drive layer test round, including the grant rules that decide who can read or edit items.
- fix Install Stalwart v0.16.27 on new clusters New clusters install Stalwart v0.16.27, so the web admin signs in on new installs.
- fix Compact pinned tiles after participant departures Remaining tiles move together to fill gaps left by departures in the pinned strip.
- fix Keep the last ingress node in DNS while it upgrades Keeps the last node in DNS during an upgrade so a single-node cluster stays reachable and its check can run.
- fix Fix(taxjar) check the invoice advance against the total with TaxJar tax A Sales Invoice with an allocated advance can submit when the TaxJar tax is included in its total.
- fix Build the payment schedule again after the TaxJar tax changes The payment schedule is rebuilt after TaxJar changes the tax, so it matches the grand total on submit.
- fix Filter the ledger pickers by root type The Sales Tax Ledger Account picker shows only Liability accounts, and the Shipping Ledger Account picker shows only Income and Expense accounts.
- fix Drop deleted pages from recent pages When the command palette opens, deleted or unreadable pages are removed from the Recent list.
- fix Show Central alert delivery as its own note, not under webhooks Notifications settings now explain at the top that alerts also go to Central, instead of hiding that under Webhook endpoints.
- fix A bare listener line carries no timing groups Access log lines for probes and admin calls no longer carry misleading zero timing groups.
- fix Copy shared types into recorder image build Copies the shared types into the recorder frontend build stage, which the bundle imports from.
- fix Include shared types in recorder Docker context Includes the shared types directory in the Docker build context, so the recorder image builds again.
- refactor Separate vendor per file refactor: separate vendor per file
- refactor Make the repo root one pnpm package, and add oxlint to the frontend checks The JS side becomes one pnpm package at the repo root, with oxlint added to the frontend checks.
- refactor Protect prometheus with admin with nginx only and add show setup export script Prometheus is protected only by nginx authentication, with separate push and admin passwords.
- refactor Not found site page refactor(ui): not found site page
- refactor Refine deployment documentation classification docs: refine deployment documentation classification
- refactor Update letter head check for new company letterhead test: update letter head check for new company letterhead
- refactor Share test setup across backend, mail, calendar and Meet E2E jobs ci: share test setup across backend, mail, calendar and Meet E2E jobs
- refactor Update Actions runner to 2.338.2 Moves the runner image to 2.338.2, since GitHub refused 2.336.0 and left E2E jobs queued.
- refactor Format page actions telemetry spec for biome Reformats a spec so the biome lint check passes on pull requests into develop.
- refactor Fix the three test bugs that keep forge/drive-layer red test(suite): fix the three test bugs that keep forge/drive-layer red
- refactor Fix migration typing and Central notification failures ci: fix migration typing and Central notification failures
- refactor Skip checks for draft pull requests chore(ci): Skip checks for draft pull requests
- refactor Remove the old save path (Collab 6) Removes the old Sheets save path, so every edit goes through the collaboration room.
- refactor Add a header and an overview image to the README Adds a header, badges and an overview image to the README.
- refactor Fix two Sheets tests that could time out on CI Removes a timeout workaround and loads ECharts modules before the tests run, so the tests no longer time out on CI.
- refactor Refresh stars daily ci: refresh stars daily
- refactor Show all models assigned to the team Shows every AI model assigned to the team. The description is empty.
- refactor Misc Miscellaneous refactor. The description is empty.
- refactor Rearrange stuff in ai settings doctype Rearranges the AI Settings doctype. The description is empty.
- refactor Upgrade mediasoup-client to 3.26.0 Upgrades the browser Mediasoup client to 3.26.0, which includes transport cleanup and Firefox ICE fixes.
- refactor Use Pilot for Suite test setup Sets up Backend, Mail and Calendar CI with Pilot-managed MariaDB and Redis, and reuses published Frappe assets when available.