Frappe and ERPNext changes, 26 Oct to 1 Nov 2026
881 changes merged: 2 breaking, 230 new features, 44 speed-ups, 485 fixes, 120 refactors.
This week brought 881 changes across Frappe products, and two of them are breaking changes.
In Helpdesk, customers can no longer read ticket fields that are for agents only.
Pathway responses now carry only the Request-Id header, so clients that read X-Request-Id must change.
Frappe apps can now ship saved views and view types as files, and renamed views keep their links.
ERPNext adds ten report print formats, such as Statement of Account, and a BOM Creator design view.
CRM gets a sales hierarchy editor, and LMS staff can enroll many students in one dialog.
Breaking changes
Read these before you update. They can change how your site or app works.
- breaking Fix!: field-level permissions for agent-only ticket fields Agent-only ticket fields get field-level permissions, so customers cannot read them. This is a breaking change.
- breaking Fix(request-id)!: the answer carries Request-Id alone Responses carry only Request-Id, not X-Request-Id too. This is a breaking change for clients that read X-Request-Id.
Highlights
A Button field runs its handler when clicked
frappe · feat
Read the app layer's view files
frappe · feat
View Type records, and List through them
frappe · feat
Open a doctype's default view at its bare address
frappe · feat
A Form Layout row can name an app
frappe · feat
Address a saved view by its key
frappe · feat
- feat A Button field runs its handler when clicked A Button field on a desk v2 record page runs the script handler named by its fieldname when clicked.
- feat Read the app layer's view files Apps can ship saved views as JSON files, which the desk opens beside the site's and users' views.
- feat View Type records, and List through them View types become View Type records that apps can ship, so an app can add a view type without changing frappe.
- feat Open a doctype's default view at its bare address A doctype's bare address opens the person's default view, then the site's default view.
- feat A Form Layout row can name an app Form Layout rows can name an app, so an app can give a foreign doctype its own layout.
See all 280 changes
- feat Address a saved view by its key Saved views get a stable key, so renaming a view no longer breaks links and stars.
- feat Assignment Rule's record page does what its v1 form script does Assignment Rule's record page gets the Field, Due Date and Document Type pickers it had in desk v1.
- feat Duplicate a record from its record page Adds Duplicate to the record page's menu, copying the record and its child rows.
- feat Rename a record from its record page Adds Rename to the record's menu, with an option to merge into an existing record.
- feat Render markdown attachments in the timeline preview Markdown attachments render in the preview dialog instead of showing raw text.
- feat Render an unplaced field on the record page Fields missing from a Form Layout row appear in an automatic "More fields" section.
- feat Render a custom field at its anchor in a layout Custom fields render next to their insert_after anchor field.
- feat Read Form Layout in the row dialog and a Single's generated block Child-table row dialogs and Single blocks use the DocType's Details layout.
- feat Translate container labels on the record page Tab, section, column and side-panel labels are translated on the record page.
- feat An app ships Form Layout rows as files; Contact ships Create layouts Apps can ship form layouts as files, and Contact gets email and phone on its Create layouts.
- feat A Data field honours its options Email, URL, Phone and IBAN fields get their proper input type, and IBANs are shown in groups of four.
- feat Shell.dialog with confirm and danger Shell scripts, including app acts, can ask the user to confirm an action.
- feat A form script sets cannot_add_rows and cannot_delete_rows on a grid A form script can stop users adding or deleting rows in a grid.
- feat Open a new chat with desk v2's palette text The palette's "Ask Flow" row opens a new Flow chat with the text in its box on desk v2.
- feat Run an app page's handler file and the Client Scripts that name it App pages run their own handler file and the Client Scripts that target them.
- feat A replacement page can name the apps it applies in A pages.json entry can name the apps where a replacement page applies.
- feat Color control with v1's swatches, a hex input and the browser's color dialog feat(ui): Color control with v1's swatches, a hex input and the browser's color dialog
- feat Color control, with a swatch in the panel and read-only views feat(desk-v2): Color control, with a swatch in the panel and read-only views
- feat Component blocks declare the fields they own Component blocks in settings list the fields they own, so one block's save no longer carries another's refused field.
- feat Fast data entry in the grid: arrow keys, paste, insert above or below, duplicate The grid supports arrow-key navigation, spreadsheet paste, insert above or below, and duplicate.
- feat A record row shows the title field, with the name in gray feat(palette): a record row shows the title field, with the name in gray
- feat Open places and records under the current app's prefix Go to and Recent rows stay inside the current app's prefix, so they no longer open a second document on another app's route.
- feat Send a user with no desk role from /apps to /me A Website User who opens /apps is redirected to /me instead of landing on a "Not permitted" page.
- feat A field the user cannot edit shows its formatted value Read-only fields show their formatted value in a borderless box in the form, grid and row dialog, while Link, Attach and similar fields keep their own read views.
- feat Assign to… in the record menu, opened at the palette's argument step The record's ⋯ menu has an Assign to… item that opens the command palette at its Users step, and the palette's options now show icons or avatars.
- feat Star a list or a saved view as a favourite A star beside the list title marks a list or a saved view as a favourite, using the same star as the record header.
- feat Recent reads Route History; the localStorage recents go The palette's Recent list now comes from server-side Route History, so it matches across devices and is removed on logout.
- feat The filter box searches like the palette, with results under the tiles The /apps filter box also searches Desk, Go to, Create and Records results beneath the app tiles.
- feat Places in the palette, with Go to, Create and Tab to narrow to a doctype The palette reaches any doctype, app, sidebar row or settings pane the person can see, starts a New record, and narrows to one doctype with Tab.
- feat The acts.js contribution kind for an app's global acts An app can ship a `frontend/acts.js` file to add global acts to the shell surface, lazily loaded.
- feat The shell surface, its acts, and the menus drawn from them The rail's app menu, avatar menu and sidebar toggle become named acts, so scripts, keys and the palette can run them.
- feat The command palette in the shell, on Mod+K and the rail Desk v2 gets a command palette on Mod+K listing the page's acts, the shell's acts, and recently opened places and records.
- feat Arrange and hide the index tiles The /apps index tiles can be reordered by drag or keyboard, and hidden, with Reset to clear the choice.
- feat V2 writes Route History, and the index shows Recent Desk v2 records visits to Route History and the index lists recently opened items.
- feat Bind act keys through useKeyboardShortcut An act's key binding runs the act through the dispatcher, with the same checks a click gets.
- feat The list surface and the list page's named acts Create, Customize Quick Filter and Delete on the list page become named acts that scripts and keys can run.
- feat The index shows Favourites The /apps index shows the person's eight latest favourite records as chips, skipping any they can no longer read.
- feat Component blocks and the after-save registry A settings component block loads its app's Vue file, and saves refresh the rail and page.
- feat Search the settings dialog The settings dialog gets a search box that matches pane, block and field labels and descriptions.
- feat The index page at /apps /apps becomes a full-page launcher with a filter box over one tile per app.
- feat The act runtime — dispatcher, page.run, ActDenied and the act fields Scripts can run any header item, quick action or tab entry by name with `page.run`, and every click goes through one act dispatcher that checks the act first.
- feat The settings dialog, its address, page.openSettings and the rail menu entries The settings dialog opens at a shareable address, and `page.openSettings()` opens it.
- feat Generated settings blocks that load, edit and save a Single or Record binding Settings blocks load, edit and save a Single or Record binding in settings rows.
- feat The not found state offers the app's home The not found state gets a "Go to app home" action, or "Go to all apps" on the /apps index.
- feat One set of page states with a retry for home, list and record Home, list and record pages share one set of states, including offline and failed with Try again.
- feat The index boot lists one tile per app The /apps index shows one tile per app that declares an `add_to_apps_screen` hook.
- feat Vue Component fieldtype A display-only Vue Component fieldtype puts an app's island into a form and keeps it in step with the doc.
- feat A Text Editor upload honours make_attachments_public Images added to a Text Editor field become public on save when the doctype sets `make_attachments_public`.
- feat A Text Editor control on frappe-ui/editor, sharing the composer's kit Text Editor fields show a rich-text editor with a toolbar, instead of raw HTML in a one-line input.
- feat The record page marks the fields a save refused A refused save marks each empty mandatory field, including child rows, with a "required" message.
- perf Draw saved comments as sanitised HTML and load the editor only to edit Saved comments render as sanitised HTML, so record pages no longer load the 277 KB rich-text editor.
- perf Link searches when its picker opens, not when it mounts Link fields search only when the picker opens or the user types, not on every page load.
- perf Load the list's drag panels when they open The list's sort, column and quick filter panels load their drag code on first open, which brings the list page under its size budget.
- perf Keep every cold-load module in one chunk beside the entry Cold-load modules go into one shell chunk beside the entry, cutting about 30 KB gzip of split chunks per desk page.
- perf Paint the page frame within 100 ms of a click A route change redraws only what the new address changes, so the page frame paints quickly after a click.
- fix InviteUser works for an app inviter who is not System Manager An app inviter without System Manager now gets user suggestions, pending invitation reads, and cancel and resend actions without a 403.
- fix An empty JSON field is null, so a new row or a cleared field saves A new child row or a cleared JSON field saves instead of failing with a database error.
- fix One row per act in This page, and Save gets an icon The palette's This page group shows each act once.
- fix Edit full form and new-record acts open in the doctype's own app Edit full form and new-record actions from the Create dialog open in the doctype's own app instead of failing.
- fix Hide the desk v2 fields on v1's Sidebar form while desk v2 is off Desk v1's Sidebar form no longer shows four desk v2 fields when desk v2 is off.
- fix Hide Client Script's Record option in v1 while desk v2 is off Desk v1 Client Script no longer offers the Record option, whose scripts do nothing in v1.
- fix A Link's redirectable prop is kept for Studio A Studio app that sets redirectable on a Link gets the arrow to the linked record back on desk-v2.
- fix Compact cell padding in default report print Wide reports fit the printed page, since cell padding is reduced from 10px to 4px.
- fix A field set back is no conflict, and the button names what it takes A settings field set back to its saved value no longer raises a false "Saved by someone else" conflict.
- fix A component block shows a refusal on a field no block claims A refused save shows its reason instead of a bare "Did not save".
- fix Keep a required field's message after the field is left "Field is required" stays on a cleared typed field after the user leaves it, instead of only showing Not saved.
- fix Three draft edge cases in the settings dialog Fixes a stale Not saved mark on a field set back to its saved value, a refused autosave insert caused by a required field in another block, and a lost hold after a save.
- fix Keep other blocks' unsaved edits when a conflict reloads Reload on a conflict resets only the fields the other save changed and keeps the binding's other unsaved edits.
- fix A table another save only restamped no longer counts as changed Unsaved table edits no longer trigger a "Saved by someone else" prompt when another save only changed row timestamps and owners.
- fix An autosave waits only on its own block's required fields An empty required field now holds only its own block, so the other blocks on the same record keep autosaving.
- fix Ask for a reload when the site language changes Saving a language change in System Settings now shows the "Reload to apply" toast.
- fix One Go to row per place, and tell near places apart A sidebar row and a doctype row pointing to the same address now show once, so "gen" no longer lists Gender twice.
- fix Hide an item whose act right fails, on every surface Header, quick action and composer menu items are hidden for users who lack the act's right, instead of showing and then toasting a permission error.
- fix Leave print format empty instead of Standard on the print page The report print page starts with a blank print format instead of a "Standard" option that is not a real format.
- fix Keep Arrange mode on the logos' edges and show the selected chip Arrange mode on /apps fits the drag grid's width and the selected Favourites chip is easier to see.
- fix Land an app's and a module's address on the first sidebar row Opening an app or module's bare address redirects to its first sidebar row instead of a developer page of tiles.
- fix The new record page draws the shared page states The new record page shows the standard not found, no permission, offline and failed states, with a retry, instead of raw error text.
- fix Change the address and the page frame at once Clicks update the address, sidebar and page frame immediately, with a skeleton while the page loads (under Refactors & Performance).
- refactor Search_records moves to frappe/shell and returns the owner's address Record search moves into the shell module, and each record links to its owning app.
- feat Expose gunicorn's web tier settings, and log no error for a busy answer Adds web_tier_settings() so apps can read gunicorn's resolved workers, threads and timeouts, and busy answers from concurrent_limit no longer write Error Log rows.
- feat Limit a settings block to roles A settings block can be shown only to users with listed roles.
- feat Read your own email accounts on desk v2 Users can read their own email accounts through a new endpoint, which the desk v2 Profile pane needs.
- feat One read that lists the views a person can open Adds a single endpoint that lists the views a person can open, for the view switcher and palette.
- feat Give record scripts the current app as page.app Record scripts can read page.app to tell whether they run on the desk or on CRM.
- feat The shell hook Apps can attach to the desk v2 shell through a shell.js file, starting with a per-tab setup call.
- feat Let apps ship triggers Apps can ship Flow triggers that are installed locked and switched on at migrate.
- feat Make the list view and Kanban board work on phones and tablets Lists and Kanban fit mobile screens, and menus open as bottom sheets on phones.
- feat Block Variants Studio blocks can hold named variants, and one variant is rendered at a time.
- feat Report the deferred export's result to the saving user Export failures in developer mode reach the saving user.
- feat Return the reason for each refused property change Customize Form returns which field and property was refused, and why.
- feat Pick fields when reading one document in API v2 and MCP Document reads and writes accept a fields list, so callers receive only what they ask for.
- feat Web search and helper model settings in /flow and the harness GUI System Managers set the web search provider and helper model in Flow settings, and the harness GUI gets the same options.
- feat Web_search tool, DuckDuckGo by default or Brave, Tavily and Exa with a key Flow agents get a web_search tool that returns the top 10 results, using DuckDuckGo by default.
- feat Save a tool result too big to show, for read and grep to open Large tool results are saved to the chat folder so the agent can page or search them.
- feat Web_fetch tool, reading a public page as markdown Flow agents can read a public page as markdown. Private and local addresses are refused.
- feat Suggest replies after a run, and a small model for titles After each run, Flow offers 2–4 suggested replies, and a small model writes chat titles.
- feat Chrome is the default pdf generator on version 16 New sites use Chrome for PDFs, and new print formats follow Print Settings.
- feat Validate query report filters on the server Reports can opt in to server-side filter validation, covering mandatory filters, options, links, and types.
- feat Refuse desk v2 shell methods while enable_desk_v2 is off Desk v2 shell server methods answer with a 403 while desk v2 is switched off in System Settings.
- feat ... GroupBy reads its grouped rows over API v2 The GroupBy hook reads its grouped rows through API v2, which desk v2 allows.
- feat Refuse two component blocks without fields on one binding feat(settings): refuse two component blocks without fields on one binding
- feat Global variables for html blocks in the print format editor Print format editors get a Global variables box, so values set once are reused by every HTML block.
- feat Insert field values in the text block Typing / in a Text block opens a field picker, so a line can mix text with field values, including values from linked documents.
- feat Custom paper size on print formats Print formats get a Custom paper size with width and height in mm, used by Chrome and PlutoPrint PDFs.
- feat Export askReload on the app import list Apps can import askReload from the shell to show the same "Reload to apply" toast as desk's own after-save handlers.
- feat Load the cloud settings UI as an ES module Same change as the backport, falling back to the classic script when the import fails.
- feat The settings pane-list endpoint, its permission filter, label index and cache One GET returns the settings panes and blocks a user may see, with a search label index.
- feat The Settings Dialog DocType and the settings component path Apps can declare settings panes and blocks in a Settings Dialog record, which the server merges into one pane list.
- feat One-click Gmail, Yahoo and Yandex, shown only when Frappe Cloud has them on Add Email Account shows one-click sign-in only for providers that Frappe Cloud has turned on.
- perf Support pypika terms in permission_query_conditions Permission hooks can return a query builder term as well as a SQL string.
- perf Build without source maps or test tools in production Production builds drop source maps and test tools, cutting the shell from 21 MB to 6 MB.
- perf Skip the desk v2 shell build for --app runs that add nothing to it Build runs that add nothing to the desk v2 shell skip the 13-second shell build.
- perf Keep the sidebar panel built across sidebars The sidebar panel stays built when switching sidebars, and only its rows change.
- perf Reuse island builds whose inputs have not changed Island builds whose inputs are unchanged reuse their output, so installing several apps no longer recompiles them each time.
- perf Smaller pdfs and fewer queries per print (backport) Chrome PDFs with headers and footers are much smaller, and printing reads settings from the cache.
- perf Emails rebuild the attached pdf for every recipient Emails build the attached PDF once and reuse it for every recipient, so a three-person email renders once.
- perf Typst pdfs build an html print view they never use Typst formats skip the HTML print view and go straight to the builder renderer. One PDF drops from 13 to 4 queries.
- perf Every print reloads print settings and the letter head Print settings, letter head and print style use the document cache, cutting queries per print.
- perf Large pdfs recompress the same logo once per page Images are recompressed once each, not once per page, which cuts an 810-page PDF from 13s to 0.41s.
- perf Bulk pdf downloads have no concurrency limit Bulk PDF download uses the same concurrency limit as single and report downloads.
- perf A header or footer makes pdfs several times larger Pages are compressed before saving, so a 810-page text report drops from 35.3MB to 3.9MB.
- fix Omit unreadable fields from document write responses Create, update, submit and workflow responses no longer return values of fields the user cannot read, and masked fields are masked.
- fix Omit unreadable fields from write responses Backport of #45832 to version-16-hotfix, with the same response masking.
- fix Update a single doctype field only when it holds the file Switching a file between private and public now updates a single doctype field only when that field still points at the file.
- fix Update a single doctype field only when it holds the file Backport of #45943 to version-16-hotfix, which also adds the check for regular doctype fields.
- fix Update a single doctype field only when it holds the file Backport of #45943 to version-15-hotfix, which also adds the check for regular doctype fields.
- fix Omit unreadable fields from write responses Backport of #45832 to version-15, with the same response masking.
- fix Bump pypdf to 6.21.4 on desk-v2 Upgrades pypdf from 6.21.2 to 6.21.4 to fix CVE-2026-119203 to 119209.
- fix Feat(data-store)... / fix: read the web tier's size from gunicorn's own settings Concurrency limits now read gunicorn's workers and threads from its config file, so benches configured that way no longer allow only one request at a time.
- fix Translate Add Column dialog options and new column label The From Document Type options and the new column header now show in the user's language.
- fix Chart custom options only change the chart they belong to Custom options saved on a dashboard chart now change only that chart, not others.
- fix Hold each view key with a unique index Two saved views saved at the same moment can no longer get the same key.
- fix Bracket and escape rendered permission criteria A top-level OR in a permission hook no longer lets rows skip the other conditions, and values are escaped before they reach raw SQL.
- fix Limit desk metadata endpoints to desk users The doctype, versions and installed-apps helpers now require a System User, and the roles helpers require read access on Role.
- fix Bracket and escape rendered permission criteria The same permission-criteria fix for the version-16 hotfix branch.
- fix Filter versions based on user's permitted fields Activity timeline versions are filtered by the user's field permissions before they are sent, so hidden field changes no longer reach the client.
- fix Keep the caller's Node heap limit The frappe build keeps a NODE_OPTIONS heap limit set by the caller instead of overriding it.
- fix Read snapshot reports from the latest complete DuckDB sync Snapshot reports skip incomplete syncs instead of showing partial data.
- fix Restore the statement timeout after counting dashboard links The 1-second execution timeout is removed after the count, so later ALTER TABLE statements no longer fail.
- fix Show title in links to users with select permission Users with only select permission see link titles in forms, reports and pickers.
- fix Show Link titles for child table columns in Report Builder Report Builder shows the full name instead of the email for child-table Link columns.
- fix Return 404 when a page raises PageDoesNotExistError while rendering Missing pages return a real 404 instead of the 404 page with HTTP 200.
- fix Shortening a field length raises AttributeError Customize Form no longer crashes when a field length is made shorter.
- fix Name the agents, skills and tools apps ship after their app Apps shipping the same agent or tool name no longer make migrate fail.
- fix Stack dialogs opened over other dialogs A dialog opened over another dialog now appears on top and dims the one below.
- fix Hide column resize handle when the user cannot save the width Users who cannot save a column width no longer see the resize handle, which raised a permission error.
- fix Show the Flow sidebar only to Flow users and System Managers Desk users without Flow access no longer see an empty Flow workspace.
- fix Skip form builder mount if form changed while bundle loads Web form builder changes are no longer saved to the wrong form when you switch forms during load.
- fix List virtual DocTypes through their own get_list in API v2 API v2 and MCP list calls work for virtual and log DocTypes such as Error Log.
- fix Build the API discovery cache on the default queue Discovery returns quickly when the long queue is busy, and the cache lasts 24 hours.
- fix Route connection badge by field once linked names exceed the cap The connection badge filters by field when more than 100 names are linked.
- fix User update_password Calling update_password without a reset key or old password returns a validation error instead of a 500.
- fix Treat SQL comments as whitespace The export check missed `INTO OUTFILE`/`DUMPFILE` when SQL comments sat between the keywords. Comments are now stripped before matching.
- fix Apply email account scope to single Communication access Open, delete, export and print of a single Communication now respect the email account scope, not just list queries.
- fix Keep dashboard cards and charts private for users who cannot create them Users without create permission can no longer publish a card or chart, mark it standard, or create settings for other users.
- fix Reject File URLs with dot or empty path segments Paths like `/private/files/./x.txt` are rejected so one file cannot be reached under a second spelling that skips the access check.
- fix Match File rows on the exact file_url when serving a private file Private file lookup compares the URL exactly, since the database matches case-insensitively but files on disk do not.
- fix Keep a saved not-equals filter out of the quick filter box A saved "not equals" Kanban filter no longer fills the quick filter box with its value, which had flipped it to "equals".
- fix Typst pdfs cut the row lines short in bordered sections Row and column lines in bordered Typst PDF sections run edge to edge.
- fix Read a phone's chat at one 15px text size Flow chat uses one readable text size on phones, and the composer no longer zooms on iPhone Safari.
- fix Steady list, instant clear and desk fonts The combobox list stays steady while searching, Link fields get a clear button, and menu text uses the desk font.
- fix Mock the imap connect in email receive test helpers Email receive test helpers mock the IMAP connect, which fixes eight failing tests.
- fix User permission on a deleted doctype blocks login A user permission that points at a deleted doctype no longer blocks login. The row is skipped and kept, so restoring the doctype brings the restriction back.
- fix Normalize file_url to prevent private-file access-check bypass File URLs are normalised before the access check, so a private file cannot be reached through another spelling of its path.
- fix Reject `..` in file_url instead of collapsing it File URLs with a .. segment are refused instead of being collapsed.
- fix Require read access to a document to see its submission status Background submission status is returned only to users who can read the document, and the form banner looks the same for everyone who can open it.
- fix Search records only in doctypes Go to lists Records and Tab-to-narrow search only doctypes the person can read, have an address for, and can enter in their owner app.
- fix Attach Text Editor files only on a desk v2 save A desk v1 save no longer adopts loose Files shown in a Text Editor field as attachments, and no longer makes them public.
- fix Read a never-saved Single with include=users A Single that was never saved opens on the v2 record page instead of returning a 500.
- fix V2 `include=users` skips a missing `modified_by` Same 500 on never-saved Singles, fixed where the users list is built.
- fix Store blank JSON as NULL and refuse invalid JSON as a field error Blank JSON is stored as NULL, and invalid JSON gives a field error instead of a 500.
- fix Keep a scoped app not on the bench and report no clash on the index A scoped pages.json entry for an app not yet on the bench is kept, so it applies once that app is installed.
- fix Records survives a title field the person may not read One doctype with an unreadable title field no longer empties Records for every doctype.
- fix One of two chrome pdfs started at once hangs forever When two Chrome PDFs start together, the second waits for Chrome's address and reuses the first one's, instead of hanging.
- fix Read the frappe prefix by app, and ARCHITECTURE.md follows the apps index The return-visit and view-restore walks no longer crash before their first step.
- fix Excel export fails on standard query reports with no .py Excel export works for standard query reports that have no Python file, using the default styles.
- fix Error log hides the real error when imap connection fails The real IMAP connection error is logged instead of a generic attribute error, and the mail pull stops.
- fix Show background tasks on the rail when the dock is pinned With a pinned dock, Background Tasks sits on the rail with Search, Notifications and Flow instead of alone at the top of the sidebar.
- fix Print view pdfs of editor formats skip on_print_pdf PDFs downloaded from the print view of Print Format Editor formats run the on_print_pdf hooks, as emailed and bulk prints already do.
- fix Skip live shared docinfo updates in desk v1 forms Desk v1 forms no longer change share rights live, which matches develop and refreshes them on reload.
- fix Keep Contact's flat values only for desk v2's create With desk v2 off, a Contact insert no longer keeps flat email, phone or mobile values as primary rows.
- fix General tab fails to load when a mapped field is a table fix(settings): general tab fails to load when a mapped field is a table
- fix Pass the desk v2 server tests on Postgres Grouped counts and star lookups work on Postgres, with MariaDB and SQLite results unchanged.
- fix A held field's older refusal gives way to the new one fix(settings): a held field's older refusal gives way to the new one
- fix Remove tags with one bulk delete again Removing a tag is one bulk DELETE again, instead of running every app's on_trash hooks per tag.
- fix Expect the App Page view in the Apply To spec fix(client_script): expect the App Page view in the Apply To spec
- fix Change_settings leaves the setting changed when a test fails fix: change_settings leaves the setting changed when a test fails
- fix Check write in Data Import start_import and User Invitation resend_invite Data Import start and User Invitation resend now check write permission on the document themselves, so a read-only user can no longer trigger them through the generic method endpoint.
- fix Publishing a page deleted non-JSON files from studio_components Publishing no longer deletes hand-written .vue, .ts, .js or .css files in studio_components; only unused exported component JSON is cleaned up.
- fix Download private files whose file name is an html-like type Private files whose File name has an html-like extension are forced to download instead of rendering inline.
- fix An insert's added required fields count as sent In the settings dialog, a refused insert no longer leaves a stale error mark on a field or overwrites a hold's message.
- fix Publishing a standard app with a hyphenated name built no assets Publishing a standard Studio app whose name has hyphens now builds its assets to the folder the renderer reads.
- fix Print images of files served by storage apps Images stored by a storage app such as S3 now print in PDFs when the user can read the File; unreadable files stay blocked.
- fix Build desk v1 before the v2 shell A failed desk v2 shell build no longer stops bench build before desk v1's assets are written.
- fix The index's notices read the setup state themselves The index notices call the setup check themselves instead of reading a value from core boot, which fixes a failing boot budget test.
- fix Add wait_for_job to the v16 test utils Adds wait_for_job to the v16 test utils so server tests run again on v16.
- fix Reset the stub request after the resend and import permission tests Test cleanup resets a stub request that broke the server tests' teardown.
- fix Keep the OIDC `sub` claim immutable after user creation A signed-in user with write access to their own User record could change their OIDC `sub` and be seen as another account. The `sub` is now re-asserted from the stored value on every save and can no longer be changed once generated.
- fix Let nothing but the shell serve a path under /apps After migrate, a Studio App route can no longer take over /apps and the desk address.
- fix Check only website routes against the /apps reservation A Studio page routed to /apps can be saved again; only real website routes reserve the path.
- fix In-document links break with a header, footer or bulk print Internal PDF links point to their target page and position after a header, footer or bulk print merge.
- fix Typst pdfs leave out the draft and cancelled heading Typst PDFs now print the DRAFT and CANCELLED heading the way Chrome does.
- fix Saving a builder print format as custom format fails Ticking custom format on a builder print format and saving it no longer raises an AttributeError.
- fix Print the label of an attach image field on the standard format An Attach Image field prints its label beside the image on the Standard print format.
- fix Footer page numbers and print access logs (backport #45084, #45170) Chrome footers that wrap keep correct page numbers, and emailed and bulk prints run the on_print_pdf hooks and write access logs.
- fix Match the text spacing of other inputs Link, Autocomplete and multiselect text uses the same letter spacing and font as Data and Select fields.
- fix Show disable report button on standard reports The Disable Report and Enable Report button appears again for users who can edit reports.
- fix Action result columns, centered loaders, Espresso buttons, lucide icons Flow action results show as table columns, loaders sit at the top, and icons are Lucide.
- fix Type-check the desk with tsc and fix every error it reports The desk v2 frontend type-checks cleanly with tsc, and CI now runs it.
- fix Skip Studio Cypress binary installation outside tests fix: skip Studio Cypress binary installation outside tests
- fix Raise PermissionError when a non-manager edits a public workspace A non-manager editing a public workspace now gets a PermissionError, matching the private-workspace check, and a test covers it.
- fix Dashboard view fixes from v16 Clears the page when a dashboard fails to load, shows the dashboard name in the title, escapes action labels, and adds a no-access message.
- fix Bulk print leaves out failed documents without saying so A bulk print that skips a failed document now ends with a red message that links each missing document.
- fix Approval emails fail when drafts can't be printed Workflow approval emails go out without the PDF when the draft can't be printed, instead of failing.
- fix Emailed and bulk pdfs skip the access log and on_print_pdf Emailed and bulk PDFs now run the `on_print_pdf` hooks and write the access log, as the print view does.
- fix Pdf with a password fails for typst print formats Typst PDFs are now encrypted with the password, the same way Chrome PDFs are.
- fix Typst prints a rating as a number instead of stars Typst print formats draw rating fields as stars, with the same rounding as Chrome prints.
- fix Footer skips some pages and shows the wrong page number Header and footer are measured at the width they print at, so a footer that wraps fits its space.
- fix Chrome errors come back as a TypeError or no error at all Chrome failures now raise a clear RuntimeError, instead of a NoneType error or a silent timeout.
- fix Large reports fail to download as PDF Query report PDF downloads now run on the server, which avoids the 413 error on reports over about 14k rows.
- fix Align the filter row with the header and body columns In tables with 20 or more rows, the filter row now lines up with the header and body columns.
- fix Keep each layout's own column widths when switching layouts Switching list layouts no longer carries over the previous layout's column widths.
- fix Skip property setters that have not changed Migrate no longer deletes and re-adds unchanged property setters, so Deleted Document stops growing on every run.
- fix Reset column width, sticky and added columns without a reload "Reset to default" in a child table's column settings now restores widths, sticky columns and added columns.
- fix Honour print settings pdf generator for standard printing (backport) Standard printing follows Print Settings > PDF Generator, so Chrome formats work on servers without wkhtmltopdf.
- fix Retry a slow chromium start once (backport) Chrome PDFs wait up to 10 seconds for a slow Chromium start and retry once. Crashes still fail immediately.
- fix Honour landscape in the chrome renderer (backport) Landscape print formats come out landscape from the Chrome renderer.
- fix Beta print PDFs drop overflowing table rows (backport) Beta print format PDFs print every table row, including rows that overflow the page.
- fix Allow the pinned pypdf past the uv package age cutoff Lets CI install the pinned pypdf, which uv had refused because it was under 7 days old.
- refactor Drop registerAfterSave from @shell Removes registerAfterSave from the shell's public exports; apps now register through their shell hook.
- refactor Expect the view key on Recent rows Updates a palette test to expect the view key on Recent rows.
- refactor Fix the flaky workflow field level read teardown Rolls back at the start of a test teardown, so cleanup no longer fails on a Workflow Action row.
- refactor Vouch for itsdaveit Adds a vouch entry for itsdaveit.
- refactor Remove the List View ADRs and fold them into component docs The List View ADRs are merged into the component docs and removed.
- refactor Container in the desk glossary Adds a Container term to the desk glossary.
- refactor Sharpen the default view in the glossary Updates the default view definition in the desk glossary.
- refactor Views vocabulary in the desk glossary Adds a Views section to the desk glossary.
- refactor Retry a failed uninstall without --force Test-only: the uninstall retry tests now check the app is still installed after a failure.
- refactor Retry a failed GitHub API call in the develop status script The develop status script retries a failed GitHub call up to three times.
- refactor Keep a branch failing while its failed run is re-running The status check stays red during a re-run, so a branch cannot merge while it is still failing.
- refactor Fix the flaky account unlock and phone list scroll tests Makes two flaky tests wait for the state they depend on.
- refactor Vouch trustedcomputer Adds a contributor to the vouched list.
- refactor One rule for a record's title and one for an app's title Recent, Favourites and Records title records through one helper.
- refactor Let the dashboard decide automatic reviews chore(guard): let the dashboard decide automatic reviews
- refactor Add print format skill for agents docs: add print format skill for agents
- refactor Skip generator-filled values in the canvas parity check test(print): skip generator-filled values in the canvas parity check
- refactor Forward get_hooks arguments untouched in the acme gate stub test(palette): forward get_hooks arguments untouched in the acme gate stub
- refactor Patch desk v2 in TestContactFlatValues test(contacts): patch desk v2 in TestContactFlatValues
- refactor Pin desk v1 output of shared code refactored on desk-v2 test: pin desk v1 output of shared code refactored on desk-v2
- refactor Realtime non blocking progress bar for bulk actions and prepared reports Bulk submit, cancel and update run in the background with a live progress bar, and prepared reports update their status in the background jobs sidebar.
- refactor One exported page-engine builder; the record page builds on it Moves the page engine into one exported builder that app pages can use, and the record page is built on it with no change for readers.
- refactor One cache key for DocType owners and the address table The shell's DocType owners and address table share one cache key, so each lookup reads the metadata version once.
- refactor Add Guard review config Adds a .guard config with review rules and context files for the Frappe repo.
- refactor Bump Pillow to 13.0.0 on v15 Reverts the Pillow bump on v15, which needs Python 3.11 and broke installs on the supported Python 3.10.
- refactor A missing Record binding reads as new and logs nothing Adds a test that a missing Record binding opens as a new draft without console errors.
- refactor Add page-JS and API-call baselines for the new record page Adds size and API-call baselines for the new record page and the list's Create dialog.
- refactor Point the page.openSettings example at a block its pane holds Corrects the page.openSettings example in the scripting guide.
- refactor Say the Enable Desk v2 setting is a preview The Enable Desk v2 setting's description now says it is a preview.
- refactor Run the page-JS check and the server tests on every desk-v2 PR Runs the page-JS size check and server tests on every desk-v2 pull request that touches frontend files.
- refactor Skip the docs check on pull requests with the no-docs label The docs check now also honours the no-docs label, not only the description text.
- refactor Import @framework/ui only through named subpaths The desk imports the UI library only through named subpaths, which lint now enforces.
- refactor The concept check counts internal ui/ names apart from gaps The desk structure check separates internal names from real gaps.
- refactor The router gets every page by registration The router no longer imports any page; standard pages register at boot.
- refactor Shell browser memory uses the per-user helper Shell sidebar and composer state use the per-user browser memory helper.
- refactor Test desk-v2 like develop ci: test desk-v2 like develop
- refactor Run only linters on desk-v2 prs ci: run only linters on desk-v2 prs
- refactor Bring the desk-v2 status changes to desk-v2 ci: bring the desk-v2 status changes to desk-v2
- refactor Add a desk-v2 status check for desk-v2 prs ci: add a desk-v2 status check for desk-v2 prs
- refactor Wait for the cancelled run to stop before re-running it ci: wait for the cancelled run to stop before re-running it
- refactor Remove the server and UI test impact maps Removes the impact-map test selection, and server and UI suites run in full again.
- refactor Merge develop into desk-v2 Eighth sync of develop into the desk-v2 branch.
- refactor Rename the develop status workflow to develop tests Renames the workflow so its jobs no longer look like the required check.
- refactor Ignore cancelled develop runs in the develop status A cancelled develop run no longer turns the Develop status red.
- refactor Turn develop green as soon as a passing fix merges Develop status now reflects passing fix merges, and its link opens the failed job.
- refactor Fix flaky grid Link dropdown test The test clicks a static cell, so it no longer matches an element that becomes editable a moment later.
- feat Tally-style report print formats Adds ten report print formats, such as Statement of Account, bill-wise pending, and balance confirmation letters.
- feat Rebuild BOM Creator with CAD import, revisions and operations BOM Creator gets a design view with CAD import, revisions and operations.
- fix Account bug review fixes Fixes eight Account bugs, including a merge into a grandchild group that broke the account tree.
- fix POS Invoice bug review fixes Fixes ten POS Invoice bugs, including how a POS Invoice gets its change amount.
- feat Proforma Invoice against Sales Order (backport to v16) Ports the Proforma Invoice feature against Sales Orders, with its permission and print fixes, to version 16.
See all 204 changes
- feat Expose method source in API discovery feat: expose method source in API discovery
- feat Scope the Note list replacement page to erpnext Same scoping as CRM, so the page applies only under the ERPNext app.
- perf Build warehouse tree in linear time in Warehouse Wise Stock Balance The original develop change for the same report speedup.
- perf Return query terms from company restriction permission hooks Company restriction hooks return query builder terms, matching frappe's permission hook change.
- fix POS Settings bug review fixes Sales User and Accounts User can no longer change POS Settings, which controls the document and GL entries of every POS sale.
- fix Keep packed item warehouses on bundle returns and amendments Bundle returns and amended bundle orders keep each component's own warehouse instead of putting every component in the bundle row's warehouse.
- fix Derive purchase amount from linked purchase row An Asset created from a Purchase Receipt or Invoice can no longer be saved with a purchase amount that differs from its linked row.
- fix Sales Order reservation, returns and status hardening (v15) Blocks closing a Sales Order while stock is reserved, keeps reservations on a rate-only Update Items, records returned qty without a reload, and validates status in the update_status endpoint.
- fix Cap job card material requests at required qty Material Requests from a Job Card are checked against that Job Card's own required qty, and duplicated requests keep their Job Card link.
- fix Record only applied payment term discounts Late payments no longer record an early-payment discount that was not taken, and the next Payment Entry no longer includes an already settled amount.
- fix Round bank reconciliation amount matches Bank Reconciliation compares amounts at the configured currency precision, so floating-point differences no longer cause false mismatches.
- fix Skip serial nos reserved for other vouchers in pick list Pick List no longer picks serial nos reserved for another voucher, which made its submit fail.
- fix Request material qty from work order Request Material and Pick List use the summed transferred qty across rows, and whole-number UOM raw material qty is rounded.
- fix POS Closing Entry bug review fixes Invoices left off a closing entry are now consolidated, and four other POS Closing Entry bugs are fixed.
- fix Payment Request bug review fixes Fixes five Payment Request bugs, including schedule-based requests that ignored other requests and credit notes.
- fix Do not allow Deduct for taxes with category Valuation The server now refuses Deduct for taxes with category Valuation, which only the form refused before.
- fix POS Invoice Merge Log bug review fixes Fixes five POS Invoice Merge Log bugs found in the bug review.
- fix Promotional Scheme bug review fixes A removed slab's Pricing Rule is now deleted or disabled, and a second Promotional Scheme bug is fixed.
- fix Pricing Rule bug review fixes Fixes ten Pricing Rule bugs, including saved pricing rules being re-applied without checks on server save.
- fix Cost Center Allocation bug review fixes Split rows now add up to the original ledger amount, and four other Cost Center Allocation bugs are fixed.
- fix Period Closing Voucher bug review fixes A partly closed or skipped earlier year now blocks the next closing, and seven other Period Closing Voucher bugs are fixed.
- fix Accept template BOM for variant finished goods in sales order and update items Subcontracted Sales Orders and Update Items accept the template BOM for a variant finished good.
- fix Refresh blanket orders of rows removed by Update Items Update Items now refreshes the Blanket Orders of rows it removes, so their ordered qty is no longer stale.
- fix Convert item last purchase rate to row UOM and currency The Last Purchase Rate fallback is converted to the row's UOM and currency, so it is no longer too low.
- fix Exempt Communication from company restriction check Sending an email, logging a call or adding an Event participant no longer fails on Company Restrictions.
- fix Clear stale customer before party specific item validation A Purchase Material Request built from several customers' Sales Orders can be saved again.
- fix Remove Standard Cost code that isn't on version-16 Removes a Bin branch and a dashboard link to a DocType that does not exist on version-16, which broke the Item connection counts.
- fix Read only synced dimension columns in Stock Balance snapshot The Stock Balance snapshot report no longer fails when an Inventory Dimension was added after the last sync.
- fix Customer hold blocks POS closing and returns A held customer no longer blocks POS closing or returns, and the hold ends on its release date.
- fix Stop escaping % twice in item and BOM search Items and BOMs are no longer hidden from users restricted to a company with a % in its name.
- fix Link subcontracting inward reports from the workspace Adds the three subcontracting inward reports to the Manufacturing workspace, since they were in no sidebar or workspace.
- fix Restrict state-changing whitelisted endpoints to POST Whitelisted methods that change data now accept only POST requests.
- fix Restrict state-changing whitelisted endpoints to POST The same POST-only change for version 15.
- fix Apply company restriction in Items To Be Requested and Serial No and Batch Traceability Users restricted to one company no longer see items from other companies in these two reports.
- fix Honour POS Opening Entry cashier restrictions The POS Opening Entry now checks that its cashier is in the profile's allowed list.
- fix Show no contracts when none of the user's party types exist The Contract list no longer shows every contract to a user whose party types were removed from the options.
- fix Asset-level access on Opportunity status Manual Opportunity status changes are allowed unless they contradict the linked quotations. (Listed under notable bugs too; see below.)
- fix Enforce item limits for amount discounts The Item Maximum Discount limit now applies to discount amounts and manually reduced rates, not only to discount percentages.
- fix Prevent duplicate and invalid period closing processing Closed periods can't be processed again, and draft vouchers can't post closing entries, which stops duplicate GL and balance entries.
- fix Do not regenerate a fully booked depreciation schedule A reschedule starts after the last booked row, so it no longer adds rows for dates that already have journal entries.
- fix Apply deduction signs to item valuation Deduct valuation charges are now allocated with the right sign, so item costs and stock ledger values are correct.
- fix Use booked journal exchange rates Payment Entries against a Journal Entry use the rate booked on it, so exchange gains and losses are no longer wrong.
- fix Post standard cost for zero-price purchases Zero-price purchases with standard-cost valuation now post GL entries, so the stock ledger and inventory account agree.
- fix Use base currency for BOM costs Foreign-currency BOM service and operating costs are converted to company currency during manufacture, fixing finished-goods valuation.
- fix Value rejected receipts in company currency Fully rejected foreign-currency Purchase Receipts are valued in company currency, so the stock valuation and Stock Received But Not Billed balance are correct.
- fix Sales Order bundle over-delivery limit and return_qty Product bundle parents are now checked against the over-delivery limit, and server-built returns get their return_qty set.
- fix Set deferred revenue on sales order invoices Invoices made from a Sales Order now get deferred revenue set.
- fix Align portal payments with endpoint permissions The portal Pay button shows only where the checkout endpoint allows it, so drafts, cancelled documents and staff users no longer see it.
- fix Set deferred revenue on sales order invoices Manual backport of the same deferred revenue fix.
- fix Update default Egypt VAT rate to 14% The setup wizard's Egypt tax template now uses the 14% VAT rate.
- fix Compare BOM cost allocation total at field precision Percentage-based BOM cost allocations no longer fail the exact-100 check because of float rounding.
- fix Count job card transfers and consumption in stock UOM Job Card transfers in another UOM are converted to stock UOM, so a card is no longer stuck at Partially Transferred.
- fix Make print logo and website optional The print setup dialog saves without a company logo or website.
- fix Honor profile discount controls for invoice discounts The POS Add Discount control is hidden when the POS Profile disables discount editing.
- fix Distribute inclusive net rounding Inclusive tax rounding is spread across items so the tax table total matches the invoice Grand Total.
- fix Reset bank transaction status on amend An amended or duplicated Bank Transaction starts as a draft instead of inheriting Cancelled or Reconciled.
- fix Ledger Health bug review fixes The General and Payment Ledger comparison now checks account-currency amounts.
- fix Item Tax Template bug review fixes Six fixes, including newer tax template rows replacing older ones on later transactions.
- fix Keep loyalty points without expiry when Expiry Duration is 0 Points no longer expire the next day when Expiry Duration is 0.
- fix Payment Order bug review fixes Three Payment Order fixes, plus one Payment Request bug caused by the same code.
- fix Round unallocated amounts in account currency Foreign-currency Payment Entries round the unallocated amount in account currency, so no fractional cents are left on party GL entries.
- fix Allow negative increment in numeric item attribute Numeric Item Attributes reject a zero or negative increment on save.
- fix Web form customer issue Fix for the customer issue web form (title only; body empty).
- fix Restore salvage value and depreciation schedule on cancel Cancelling an Asset Value Adjustment restores the salvage value and keeps the depreciation rows.
- fix Report permission error for users without System Manager role The same report permission fix on the develop branch.
- fix Whitelist split_issue again The Split action on Issue timelines works again, since the whitelist decorator had moved to a helper.
- fix Let customers pay their orders from the portal Portal customers can pay an order: the Pay button uses POST, and the request no longer needs staff permissions.
- fix Let portal customers submit their own payment request The submit permission check is skipped only for portal payments, so the portal Pay button no longer raises PermissionError.
- fix Fix portal payment tests on develop Test-only: fixes two portal payment tests that broke the develop merge queue. (Moved to chores.)
- fix Backport asset bug fixes from develop Batch of asset fixes from develop, including the Asset Activity permission fix.
- fix Backport financial statement report bug fixes from develop Financial statement report fixes rewritten for version 16.
- fix Backport CRM bug fixes from develop Appointment slots, Email Campaign unsubscribes and sending, and Contract fixes from develop.
- fix Enforce asset activity document permissions Direct document and API access to Asset Activity now respects the linked Asset's company restriction, matching the list and report.
- fix Check permission on every consolidated company Permission is checked for each consolidated company, not only one.
- fix Check company, party and account access in payment reconciliation Payment reconciliation enforces company, party and account access.
- fix Check submit permission when submitting a new request Submitting a new Payment Request checks the user's submit permission.
- fix Store currency exchange access key as a password The exchange-rate API key is stored in an encrypted password field.
- fix Store Plaid access token of Bank as a password The Plaid access token on a Bank is stored in an encrypted password field.
- fix Remove All role from Import Supplier Invoice permissions Every user no longer gets import access to Supplier Invoices through the All role.
- fix Render item description as text in item details and cart Item descriptions in POS show as plain text, not as HTML.
- fix Prevent cheque print format collisions Creating a cheque format no longer overwrites an unrelated Print Format that shares the bank's name.
- fix Prevent over-allocation of invoice and dunning payments Payment Entry checks combined allocations across all reference rows, and dunning stops collecting amounts that are already paid.
- fix Reject enclosing share issue ranges Share Transfer rejects an issue range that contains an already-issued range, so the same share numbers cannot be issued twice.
- fix Remove advisory locks that don't serialize on postgres Four advisory locks are removed because Postgres REPEATABLE READ keeps each transaction on its first snapshot, so the lock never shows the other writer's commit.
- fix Set payment term outstanding when invoice portion is zero Manually added Payment Schedule rows keep their outstanding amount, so Payment Entry can allocate against them.
- fix Split actual tax over applicable items only The item-wise tax breakup matches the Actual tax total when the net total is zero or when some items are exempt.
- fix Correct coupon discounts, ownership and validity checks Coupons are removed cleanly, shared Pricing Rules apply the right coupon, Gift Cards are limited to their customer, and Quotations respect coupon validity and usage.
- fix Backport 28 bug fixes from develop Brings 28 develop bug fixes to version-16-hotfix, mostly in stock.
- fix Backport 21 stock fixes from develop (v15) Brings 21 stock fixes from develop to version-15-hotfix.
- fix Preserve discounts when fetching payment schedules Fixed-amount payment-term discounts and their dates survive when a schedule is fetched from an Order or Quotation.
- fix Reconcile employee journals by account type Employee receivable journals appear only under Payments, and exchange-rate differences post in the right direction.
- fix Sales Order closed/drop-ship row handling and endpoint hardening Closed and drop-ship bundle rows are left out of Work Orders and Pick Lists, and the status and delivery-schedule endpoints validate on the server.
- fix Sales Order stock-reservation correctness (close, bundle qty, update items) Closing an order is blocked while stock is reserved, bundle reservations count in component units, and rate-only edits keep existing reservations.
- fix Map only undelivered bundles from a pick list and ask about drafts before creating the delivery note A second Delivery Note from a partly delivered Pick List maps only the bundles still undelivered, and the draft check runs before a draft is created.
- fix Skip voucher repost on cancel when no stock ledger entries exist Cancelling a Purchase Receipt with only non-stock items no longer fails in a closed period.
- fix Fetch bom raw materials for manufacture entries without a work order Get Items on a Manufacture entry with no Work Order no longer crashes when backflush is set to material transferred.
- fix Post an invoice's stock at the unrounded valuation rate The invoice uses the full valuation rate, so its stock value matches the stock ledger and large quantities no longer fail to submit.
- fix Post an invoice's stock at the unrounded valuation rate (backport #62935) Manual backport of #62935 to a release branch.
- fix Post an invoice's stock at the unrounded valuation rate (backport #62935) Manual backport of #62935 to another release branch.
- fix Use receivable currency for dunning payments Dunning amounts are taken in the receivable currency, so a foreign-currency invoice no longer gets a much smaller payment.
- fix Allocate transaction currency amounts by cost center Cost Center Allocation splits transaction-currency amounts across cost centers instead of copying the full amount into each entry.
- fix Allow selecting another batch in POS Adding a batch-tracked item again in POS lets the cashier pick another batch.
- fix Correct statement email scheduling and ageing Statements are not emailed before their start date, missed scheduled runs are recovered, and ageing uses the statement end date.
- fix Send closing notice only to the cashier The POS closing notice goes only to the cashier who closed the session.
- fix Take selected schedule amounts from the reference document Payment Request amounts for a chosen schedule row come from the reference document.
- fix Send ledger merge and bank statement import updates to the open document Ledger merge and bank statement import progress updates reach the document that is open.
- fix Pass report row data to link handlers without ampersands Report links with ampersands in their data open the right record.
- fix Fix Balance Sheet for employee and related journals Test-only fix for the price list test. Listed under chores.
- fix Link exchange gain loss journals to payments Exchange gain and loss journals are linked to the payments that created them.
- fix Fix a rounding issue in Payment Entry Not listed in the input. Skipped.
- fix Need user write access to re-enable a user from employee status An HR user can no longer re-enable a User that a System Manager disabled by toggling the Employee status. Re-enabling requires user write access, or that the status change disabled the user.
- fix Require ledger read access for ledger previews Accounting and Stock Ledger previews on draft transactions now also need read access to the ledger doctype, and the Preview buttons are hidden without it.
- fix Apply data masking in ledger previews Masked fields on Stock Ledger Entry and GL Entry are masked in the ledger previews too, as they already are in the ledger reports.
- fix Update posting datetime of serial and batch bundle in batches (backport #62661) The posting-datetime patch updates Serial and Batch Bundles in batches of 10,000, so migrate no longer fails on large Stock Ledger tables.
- fix Return packed items with serial / batch fields Sales returns of product bundles work after a v14 to v15 upgrade, when packed items hold serial or batch numbers without a bundle.
- fix Ask for incoming rate on standalone returns Standalone returns get a rate field on POS returns, and the error message points to a place where the rate can be entered.
- fix Quotation revision lifecycle — block revising ordered quotes, reactivate on cancel, one active version Partially Ordered quotations can no longer be revised, and cancelling a revision reactivates the latest remaining version.
- fix Use remaining sub assembly stock across production plan rows Two assembly rows that share a sub assembly now use the remaining stock, so the planned quantity no longer depends on row order.
- fix Use row direction for batch filter in serial batch selector The batch list in the Serial and Batch selector follows the row's direction, so new empty batches can be picked for incoming rows.
- fix Clear manufacturing links hidden by stock entry purpose Work Order and BOM links are cleared when a Stock Entry becomes a plain transfer, so the list no longer shows a Finished Good Quantity on it.
- fix Evaluate pricing rule conditions before precedence A pricing rule whose condition is false no longer blocks another eligible rule from applying.
- fix Keep normalised transaction type for price list rows fix(stock): keep normalised transaction type for price list rows
- fix Job card planned start and stale actual dates With capacity planning on, Planned Start Time comes from the first working-hour slot, not the last.
- fix Keep normalised transaction type for price list rows fix(stock): keep normalised transaction type for price list rows
- fix Quotation Update Items status, alternative-set status, and lost/expired guards (v15) Quotation status guards are fixed for Update Items, alternative sets, and lost or expired quotes.
- fix Quotation Update Items status, alternative-set status, and lost/expired guards (v16) fix: quotation Update Items status, alternative-set status, and lost/expired guards (v16)
- fix Guard against missing quotation in validate_quotation_expiry A Sales Invoice that names a missing quotation fails with a clean message instead of an AttributeError.
- fix Update posting datetime of serial and batch bundle in batches Updates Serial and Batch Bundles in batches of 10,000 so `bench migrate` no longer fails with "Index is corrupted" on large Stock Ledger Entry tables.
- fix Update posting datetime of serial and batch bundle in batches Same batching fix for the version-15-hotfix branch.
- fix Validate cost center allocation child company Cost Center Allocation now rejects child cost centers from another company, which API calls could previously save.
- fix Fix(accounts): print cheques in bank account currency Cheques for foreign-currency bank accounts print the amount in the bank account's currency, in words and figures.
- fix Print the cheque bank account number Cheque templates read the bank account number from the Bank Account No field, so it prints on the cheque.
- fix Select chart defaults in company currency The Chart of Accounts Importer picks default receivable and payable accounts in the company's currency, so imports no longer fail.
- fix Block manual selection of Adjustment Entry purpose in Stock Reconciliation (backport #62675) Backport of the Adjustment Entry fix.
- fix Block manual selection of Adjustment Entry purpose in Stock Reconciliation The Adjustment Entry purpose can no longer be picked by hand on a new Stock Reconciliation; it is reserved for the Stock Valuation Comparison report.
- fix Web form customer issue - Backport #62660 Backport of the web form customer fix.
- fix Web form customer issue Fixes a web form customer issue (no description given).
- fix Check read permission on outgoing stock entry in set_items_for_stock_in Reading the items of an outgoing Stock Entry now requires read permission on that entry, so a user fenced out by User Permissions cannot read it by name.
- fix Apply user permissions to cost centers, projects and dimensions Cost Centers, Projects and Accounting Dimension values shown in the report are limited to what the user can read.
- fix Cancel return exchange journals on unreconciliation Fully unreconciling a system Credit or Debit Note now cancels its Exchange Gain or Loss Journal Entry, so the exchange difference is not booked twice on re-reconciliation.
- fix Apply user permissions in party balance reports Trial Balance for Party and the Customer/Supplier Ledger Summary check company permission and apply GL Entry user permissions.
- fix Refresh invoice status after returns A linked Credit or Debit Note with Update Outstanding for Self now refreshes the original invoice's status, so a paid invoice shows Credit Note Issued instead of Paid.
- fix Check opening stock reconciliation per company The opening-stock check looks only at the company being reconciled, so another company's transactions can no longer let a Profit and Loss account be used for opening stock.
- fix Round cost center allocation percentage total Percentages that total 100 after floating-point rounding now pass validation.
- fix Stale quotation ordered_qty on SO Update Items & cross-party Get Items Sales Order Update Items now recomputes the source Quotation's ordered quantity, and Get Items From Quotation no longer overwrites a non-empty customer, currency or company on the header.
- fix Quotation status recompute, alternative-set status, and lost/expired guards Quotation status is recomputed after Update Items, and the server now refuses edits on Lost, Ordered, inactive or expired quotations.
- fix Count coupons once across linked invoices Coupons consumed by a Sales Order are no longer validated and counted again on its Sales Invoice, which had blocked single-use coupons.
- fix Let HR users set the image of an employee linked to a user HR Users can set an employee image without User write access, because the User save attaches the image instead of a separate File insert.
- fix Reject duplicate Sales Order lines in a Proforma Invoice A Proforma Invoice refuses two rows for the same Sales Order line, which had been dropped from the PDF but still counted in totals.
- fix Restore finished good qty on job card transfers made from a material request A patch sets the Finished Good Qty on submitted transfers made from a Job Card's Material Request, then recomputes the Job Card's transferred qty and status.
- fix Invalidate Fiscal Year boot cache The Accounting dashboard no longer shows a stale "Start Year and End Year are mandatory" message after a Fiscal Year is deleted or recreated.
- fix Fix Exchange Gain or Loss direction for journal-settled foreign currency payables Exchange gain or loss is posted in the correct direction when a foreign-currency payable created by Journal Entry is settled at a different rate.
- fix Prevent incorrect rebilling and invoice generation past subscription end date A Bill-N-days-before subscription no longer rebills its last period, and it stops generating invoices past the end date.
- fix Keep service dates on rows where deferred accounting is off Saving a Sales or Purchase Invoice no longer clears service start and end dates on rows without deferred accounting.
- fix Translate accounting dimension validation labels fix(accounts): translate accounting dimension validation labels
- fix Keep zero rate quoted by supplier on portal A zero rate quoted on the RFQ portal stays zero, and a buying pricing rule no longer overrides the supplier's rate.
- fix Keep zero rate quoted by supplier on portal (backport 62269) fix: keep zero rate quoted by supplier on portal (backport 62269)
- fix Keep zero rate quoted by supplier on portal (backport v16 62269) fix: keep zero rate quoted by supplier on portal (backport v16 62269)
- fix Exclude delivered serials from historical availability Stock Reconciliation no longer counts serial numbers already delivered at the same posting time, which had set the quantity above the ledger.
- fix Validate UOM constraints in documents Fractional quantities are rejected for subcontracted Finished Goods with a whole-unit UOM, and related UOM merge defects are fixed.
- fix Carry opening balance in Stock Analytics (backport #60967) Periods without movements show the opening balance from before the report range, not zero.
- fix Validate asset when fetching capitalization asset details fix(assets): validate asset when fetching capitalization asset details
- fix Reinstate duplicate entry check for manufacture entries (backport #58004) The duplicate Manufacture entry check honours the overproduction allowance again.
- fix Validate target asset when fetching WIP composite asset items (backport #61974) The target asset is validated before its tagged Purchase Receipt items are fetched.
- fix Reinstate duplicate entry check for manufacture entries (backport #58004) fix: reinstate duplicate entry check for manufacture entries (backport #58004)
- fix Backport accounts ledger and register report bug fixes from develop (rewritten for v16) A batch of Accounts Payable, Receivable and register report fixes from develop, rewritten for v16's code.
- fix Backport support, telephony and utilities bug fixes from develop Support Hour Distribution counts each issue in exactly one slot and respects user permissions, along with telephony and utilities fixes from develop.
- fix Protect shareholder registers from direct changes Blocks direct API edits to share register balances, stops deleting a company shareholder that has submitted transfers, and corrects report valuation.
- fix Preserve links when replacing chart of accounts Chart of Accounts Importer no longer deletes accounts directly. Links from warehouses, bank accounts, item defaults and tax templates are kept intact.
- fix Validate chart imports before replacing accounts Rejects blank or incomplete rows, circular parent references and charts missing mandatory account types before any account is replaced.
- fix Reject duplicate account names in Chart of Accounts Importer Duplicate account names no longer overwrite each other silently. The importer now shows an error in the preview and on import.
- fix Include all items in budget commitments Budget checks on Purchase Orders and Material Requests now count open commitments for every item on the same account and cost center, not just the current document's items.
- fix Preserve asset purchase row links Assets keep their correct Purchase Receipt or Purchase Invoice row link instead of matching the first row with the same quantity and amount.
- fix Protect payment reconciliation log allocations Blocks API edits to read-only allocations and checks the current invoice balance, so an invoice cannot go negative.
- fix Let HR roles link employees to any user except admins HR User and HR Manager can no longer link, unlink or change admin accounts through an Employee. Only a System Manager can touch those users.
- fix Let HR roles link employees to any user except admins Same change as #61894, on the version branch.
- fix Let HR roles link employees to any user except admins Same change as #61894, on the version branch.
- fix Include child cost centers in fixed asset register filter Selecting a parent cost center in the Fixed Asset Register now shows assets under its child cost centers.
- fix Validate target asset when fetching WIP composite asset items Checks the target asset before loading its tagged Purchase Receipt items.
- fix Show ledger balance as account opening balance Bank Reconciliation Tool's opening balance now shows the ledger balance, not a figure that is zero or negative when nothing is cleared.
- fix Set bank accounts on internal transfer Internal Transfer Payment Entries now record the paid-from and paid-to Bank Accounts.
- fix Drop unsupported "Stock Delivered But Not Billed" type from Belgian charts Company creation from the four Belgian charts no longer fails silently on v15 and v16, because one account type is not supported there.
- fix Validate Party Types and allow manager setup Payment Entries now check party types and account types. Accounts managers can set up party types.
- fix Validate Sales Person assignments and submitted team edits Sales Team edits on submitted documents are validated, and Sales Person assignments are checked.
- fix Validate account mappings and supplier membership Supplier Group rows must point to the matching company's accounts, and supplier membership is validated.
- fix Require lost reasons and let sales roles create them A Quotation can no longer be declared Lost with an empty reason list. Sales roles can create missing lost reasons.
- fix Harden sales target variance reports Territory target achievements are scoped by company, and the variance reports are corrected.
- fix Use company currency in cheque amount in words Cheque print formats now write the amount in words in the company currency, not the system's default currency.
- fix Value a transfer's inward leg at what left the source on repost On repost, the inward leg of a transfer keeps the source's outgoing rate, so the two legs no longer differ by 0.01 in Stock Adjustment.
- fix Multiple Product Bundle correctness bugs (backport) Manual backport of #62149.
- fix Multiple Product Bundle correctness bugs Fixes packed UOM conversion, rejects self-referencing and nested bundles, keeps repeated components in sync, and makes Pick List count bundles correctly.
- fix Backport accounts ledger and register report bug fixes from develop Cherry-picks several develop fixes into the hotfix branch, covering Inactive Sales Items, Item-wise Sales Register and related reports.
- fix Backport support, telephony and utilities bug fixes from develop Re-implements telephony and support fixes on the hotfix branch, including saving call summaries and transferring calls to the new agent.
- fix Backport regional, EDI and other bug fixes from develop Backports regional fixes to the hotfix branch, including Electronic Invoice Register company checks and UAE VAT 201 corrections.
- fix Print each company's currency on the dashboards Dashboard amounts show each company's own currency symbol instead of the site currency.
- fix Make untranslatable dialog labels and tour titles translatable Wraps about 20 dialog labels, descriptions and tour titles in `__()` so translators can reach them.
- refactor Import make_sales_return from sales invoice mapper Fixes an import path in a test that failed with ImportError on develop.
- refactor Remove unused repo files and fix PR labeler chore: remove unused repo files and fix PR labeler
- refactor Add Guard review config ci: add Guard review config
- feat Expose method source in API discovery Sets the expose_discovery_source hook so API discovery shows the source of whitelisted methods.
- fix Salary slip preview with the standard print formats Salary slip preview works on v16 sites where the standard print formats had been pinned to WeasyPrint.
- fix Apply document permissions to interview feedback and salary structure assignment Interview feedback requires read access on the interview, and assigning from a Salary Structure applies User Permissions to the employees picked.
- fix Fix the Shift Request overlap check (ignore rejected requests) Rejected Shift Requests no longer block a new request for the same dates.
- fix Print each company's currency on the HR boards and drop the advance cells from Expense Claims HR boards print each company's currency, and Expense Claims drops the unclaimed advance cells.
- feat SLA policies and holiday lists on desk v2's standard pages SLA Policies and Holiday Lists get CRM's own jobs and checks on the desk v2 standard pages.
- feat Sales hierarchy block in CRM's Users pane Adds a tree editor for the CRM sales hierarchy in the Users pane, with add, move and remove.
- feat Invite users to CRM on User Invitation Adds an invite block to the Users pane so Sales Managers and System Managers can invite users by email.
- feat WhatsApp and ERPNext panes for managers Adds WhatsApp and ERPNext settings panes to CRM settings, visible only to managers.
- feat Build Assignment Rule conditions on desk v2's standard page Assignment Rule conditions are built with the condition builder, and the matching Python is kept in step.
See all 53 changes
- feat Your email accounts in the Profile pane Shows each CRM user's own email accounts in the desk Profile pane, read-only.
- feat Rename an organization from its record page Editing the organization name renames the CRM Organization.
- feat Choose or add an email or phone in CRM's Contact side panel Sales users can pick the primary email or mobile from a contact's own values, or add a new one.
- feat CRM's Users settings pane Adds a Users pane to CRM settings for changing roles, removing CRM roles and adding existing users.
- feat The CRM Form Script list as the desk v2 migration report Each CRM Form Script row shows its v1 shape and migration status, with the calls it makes.
- feat List an organization's deals and contacts on its record page An organization's record page gets Deals and Contacts tabs, each row opening its record.
- feat A Deals tab on Contact's record page in CRM A contact in CRM shows its deals in a new Deals tab.
- feat Ask for the lost reason when a lead or deal is marked lost Marking a lead or deal lost asks for the reason first, and the side panel shows it.
- feat List, add, remove and set a deal's primary contact from its side panel A deal's side panel lists, adds, removes and sets the primary contact.
- feat Convert a lead to a deal from the lead's record header Adds a Convert to Deal button in a lead's record header.
- feat Enrich a lead, deal or organization from its record header Adds Enrich from website to the record menu of leads, deals and organizations.
- feat Hide Convert on a converted lead; Save and Cancel on the lost reason dialog A converted lead no longer offers Convert to Deal, and the lost reason dialog uses Save and Cancel labels.
- feat Change a lead's or deal's status from the record header Sales users change a Lead or Deal status from the record header.
- feat Frappe Cloud v2 billing and trial card Adds a billing and trial card with urgent states for trials and spending limits.
- feat Telephony block shows a provider's number only when it is on The Twilio and Exotel number rows show only while that provider is on.
- feat CRM's General settings pane and a Telephony block in Profile CRM gets a General settings pane on FCRM Settings and a Telephony block in desk's Profile pane.
- fix Open the contact email and phone picker with an empty search The contact email and phone picker opens with an empty search, so typing starts a new value.
- refactor Register CRM's after-save through its shell hook CRM's after-save handlers register through its shell hook instead of a side-effect import.
- refactor One linked-records list for the Contact and Organization tabs Contact and Organization tabs share one linked-records list component.
- refactor Delete CRM's Organization proof page Removes the proof page that replaced the Organization record page in every app.
- feat Exchange rates and a manager-only General pane Adds an exchange rates block to the General settings pane, visible only to managers.
- feat CRM's Telephony settings pane on the Twilio and Exotel Singles Adds a Telephony pane to CRM settings for setting up Twilio and Exotel.
- feat Analyse a CRM Form Script's v1 shape and calls Analyses a CRM Form Script's v1 shape and calls, reporting each call's desk v2 equivalent or its gap.
- feat The setup lists on the Setup sidebar Adds Email, Automation and Lead Syncing sections to the CRM Setup sidebar.
- feat CRM's Contact and Address layouts on /apps/crm Create Contact, the Contact side panel and Create Address use CRM's layouts on the CRM app.
- feat Quick Entry for every CRM doctype a person creates Create opens a Quick Entry dialog for each CRM doctype a person creates.
- feat Mirror CRM Fields Layout to Form Layout for desk v2 Copies each CRM Fields Layout to the Form Layout that desk v2 reads.
- feat CRM's rail and the Setup sidebar Leads, Deals, Contacts and Organizations open directly from the rail, and setup lists move into a Setup sidebar.
- feat Telephony block declares the fields it owns CRM's Telephony block in the Profile pane declares its fields.
- feat Scope the Note list replacement page to crm The Note list replacement page applies only under the CRM app.
- feat Open command palette from the sidebar A Search item in the sidebar opens the command palette, and it keeps the typed query when the input loses focus.
- feat Search comments, notes and emails from the command palette The palette also searches comments, notes and emails on Leads and Deals, and selecting a match scrolls to it.
- feat Log a call from the desk v2 palette CRM adds a global "Log a call" act, so a Sales User can log a call from any desk v2 page with Ctrl or Cmd+K.
- feat Allow form scripts to contribute tabs on lead and deal pages Form Scripts can add, relabel and hide tabs on the Lead and Deal pages.
- fix Check access before assigning a lead or deal via ToDo (desk-v2) A user who cannot write a CRM Lead or Deal can no longer create a ToDo for it, which stops them from taking over or clearing its owner.
- fix Let comment owners edit without Comment write permission Same fix on the main branch.
- fix Load all sales hierarchy nodes in settings Same fix on the main branch.
- fix Handle dict field entries in enrichment layout patch Same fix on the main branch.
- fix Brand logo cropped in safari The sidebar brand logo no longer renders wide and cropped in Safari.
- fix Permlevel activity test failing on develop Fixes a test that failed on develop because of a cached meta race between processes.
- fix Search the full comment text in the Comments list filter The Comments filter searches the full Comment doctype text, not the truncated cache on the parent doc.
- fix Scroll fields inside create lead and deal modals The create modals on iPad scroll their fields inside the dialog, so all fields are reachable.
- refactor Pin the lead/deal owner sync through assign_to Adds tests that pin how the lead and deal owner syncs through the assign_to path.
- refactor Publish main releases to the marketplace CI change to publish main releases to the marketplace.
- refactor Turn off automatic Guard reviews Guard stops reviewing PRs automatically. It can still be requested.
- refactor Patch Release A release merge with no description.
- refactor Add Guard and frappe-pr-bot reviews Adds Guard review and frappe-pr-bot configs to CRM.
- refactor Patch Release chore: Patch Release
- fix Quiz access message, card enroll message and upcoming batches for students A student without access to a shared quiz sees a clear message instead of a blank page, and a retry option appears for other load failures.
- feat Enroll many students at once from course and batch dashboards Staff can enroll many students in a course or batch in one dialog, with optional payment records.
- fix Duplicate certificates Concurrent requests can no longer create two certificates for the same member and course.
- fix Let frappe build and schedule the learning index The LearningSearch override is removed so frappe's own build_index runs.
- refactor Let the dashboard decide automatic reviews chore(guard): let the dashboard decide automatic reviews
- feat Bob writes editor plugins Bob writes an editor plugin on request and loads it into the open editor.
- feat Ask for high reasoning effort on Bob's agent and page tiers Bob's agent and page tiers request high reasoning effort, which gives better answers for design questions.
- feat Send the Bob prompt with Enter Enter sends the prompt in the Bob AI panel and Shift+Enter adds a line, and the slash menu and IME composition keep their own Enter behaviour.
- feat Expose method source in API discovery feat: expose method source in API discovery
- feat Connect a provider in two steps, with its models discovered Connecting an AI provider takes two steps, and the models are discovered and selected automatically.
See all 14 changes
- fix Read builder_path per site instead of at hooks import The builder route is read for each site, so one site's editor path no longer applies to every site on the same worker.
- fix Read builder_path per site instead of at hooks import Backport of #1012 to master, which clears a marketplace multitenancy finding.
- fix Keep the published page's default colors light A published page keeps a white background and black text by default, even when the visitor's OS is in dark mode.
- fix Support Frappe v15 again Lowers the Frappe floor to 15.121.3 so v15 benches can install and update Builder again.
- fix Support Frappe v15 again Backport of #1007 to master; merging cuts v1.36.3, the first release that installs on Frappe v15.
- fix Run migrate without importing litellm (backport #1000) fix(ai): run migrate without importing litellm (backport #1000)
- fix Run migrate without importing litellm The upgrade_ai_models patch no longer imports litellm, so bench migrate passes on sites where litellm cannot import.
- fix Keep the sign when stepping negative values with arrow keys or drag Arrow keys and drag no longer turn -10px into 10px when stepping style values.
- refactor Build prebuilt assets for the release commit The release workflow builds prebuilt assets for the version commit, so Pilot benches don't have to build them.
- feat Clear a status after a set time An agent who sets Away or Lunch can choose when that status clears, and it then returns to the default agent status.
- fix Filter count badge shadow and red disable agent action The filter count badge's shadow is no longer clipped, and the disable agent action is shown in red.
- fix Show email under the name on profile The profile page shows the user's email under the name, as develop does.
- fix UI fixes Fixes a set of small UI bugs, including Copy link in the ticket timeline, which showed "Link copied" without copying.
- breaking Fix!: field-level permissions for agent-only ticket fields Agent-only ticket fields get field-level permissions, so customers cannot read them. This is a breaking change.
See all 13 changes
- fix Serve HD Ticket meta to customers Customers on the portal ticket list can read HD Ticket meta again, which restores the Subject filter and extra columns.
- fix Count the period up to the site's today Preset dashboard ranges end on the site's date, not the browser's.
- fix Get UI tests passing on frappe v16 UI tests run against Frappe v16, which fixes 15 failing Playwright tests.
- fix Let MCP clients through block_endpoints With block_endpoints on, MCP clients and the OAuth discovery and registration paths are let through, so MCP clients can connect.
- fix Match inline images pasted with the site's absolute URL Images pasted with the site's absolute URL are attached to the ticket, so agents can open them instead of getting a 403.
- refactor Close pull requests from people who are not vouched Adds a workflow that closes pull requests from authors who are not vouched.
- refactor Hotfix to main A release merge from the hotfix branch to main.
- refactor Refresh screenshots and portal dev steps docs(readme): refresh screenshots and portal dev steps
- feat Expose method source in API discovery feat: expose method source in API discovery
- feat Keep failed, lock-refused and cached runs in the execution log The query execution log records failed, lock-refused and cached runs, not only successful ones.
- feat A webhook alert needs no token and sends its text as content A webhook alert no longer needs a token and sends its text as content, so Raven incoming webhooks can receive Insights alerts.
- feat Profile where a warehouse query spends time and memory Warehouse queries record how many rows they read and how much SQL planning they cost, so slow queries can be told apart.
- perf Run identical queries once, and stop a query its reader left Identical data store queries run once at a time, and a query whose reader has left is stopped.
See all 16 changes
- perf Bound data store work by the server's cores and memory Limits data store work per process to the server's cores and memory, so a heavy dashboard cannot exhaust memory.
- perf Keep small servers' dashboards within memory Limits DuckDB memory and spill files per process so dashboards on small servers do not run out of memory.
- perf Compile each chart query once per request and cache the drill menu Each chart query is compiled once per request instead of three times, and the drill menu is cached.
- perf Take the warehouse profiler out of the app Removes the profiler from the app and moves the CPU investigation to a shell on a copy of the store.
- fix Write no Error Log row for a busy answer A data store busy response no longer writes an Error Log row.
- fix An alert runs its query once per window and at most twice per send An alert runs its query once per window instead of up to three times, and an alert that was due is no longer re-run on every tick.
- fix Wait out readers in the same process before a write A DuckDB write waits for dashboard readers in the same process instead of failing at once with a connection configuration error.
- fix Keep a table import within its memory limit Large table imports stay within their memory limit, so workers are no longer killed and left as Failed logs with no reason.
- refactor Read gunicorn's settings from frappe's web_tier_settings Insights drops its own gunicorn config parser and reads the settings from frappe's new web_tier_settings().
- refactor Take fewer runners per pull request push Cuts the Actions runners per push from six to three for code pushes, and one for docs-only pushes.
- refactor Apply review follow-ups to the agent docs Follow-up docs fixes for the agent docs.
- feat Show private bench support on plan cards Plan cards show which plans include a private bench on each provider.
- feat Explain prepaid credits beside the credit balance The original version of the same billing explanation.
- feat Rotate a site's communication secret from desk Staff can rotate a site's communication secret from the Site form, so a leaked secret no longer needs System Console.
- feat Add public IP button for private hetzner servers Private Hetzner database servers get a button to add a public IP.
- feat Save UTM and ad click params on account request Signups keep UTM and ad click parameters, so campaigns can be tracked without cookies.
See all 28 changes
- fix Ignore empty Prometheus slots in disk space checks Site migration no longer crashes with a TypeError when a Prometheus disk-space sample is missing for the last time slot.
- fix Fix Build Server Stats chart colours and durations Each name keeps one colour across charts, and the report plots median durations.
- fix Show a clear error for orders above the gateway limit Orders above the Razorpay or Stripe limit show a readable error instead of an Internal Server Error.
- fix Read disk usage as KiB in lsyncd wait estimate The initial sync wait is computed correctly, so the production database is no longer stopped for long rsync runs.
- fix Preserve confirmation for function callbacks A confirmation prompt is kept when a button calls a function.
- fix Handle function callbacks in custom buttons Custom buttons on database servers can call functions.
- fix Call Resolver.query, which dnspython 1.x has Custom domain DNS checks were failing on production's dnspython 1.x, which also broke TLS renewals for custom domains. The calls now use `query`, which both 1.x and 2.x support.
- fix Pass source names to branches in version options Publishers can add a new Frappe version to their Marketplace app again. The version dialog was passing whole rows where a name was expected.
- fix Skip pool sites claimed at signup in the daily audit Standby pool sites claimed at signup are no longer listed as missing a backup.
- fix Count only scheduled backups and use a 24h day window in the daily audit The daily backup audit counts only scheduled backups, so failing manual backups no longer flag sites and successful manual backups no longer hide a stopped schedule.
- fix Check backup URLs before Press fetches them Restore-from-site and Remote File now fetch URLs through the same SSRF checks webhooks use, including each redirect target.
- fix Check partner owns the team in partner customer list The partner customer invoice list now confirms the requested team is one of the current partner's customers before querying.
- fix Check partner owns the team in partner customer list fix(invoice): Check partner owns the team in partner customer list
- fix Bump vulnerable dependencies within fc-prod pins Clears pip-audit's 116 known vulnerabilities by removing python-telegram-bot and bumping dependencies inside the production pins.
- fix Prefer IPv4 when the endpoint host is dual-stack Webhook delivery prefers the IPv4 address on dual-stack hosts so a control plane without IPv6 egress does not fail.
- fix Warn before a backup restore with a red confirm button Restore dialogs on the Backups tab now warn that the restore overwrites the site and use a red Confirm button.
- fix Use the stored database name without the file walk Creating a database user no longer walks all site files, which timed out on large sites.
- fix Read the database name without the file walk (backport) Backport of #6765.
- fix Quote the bench group title in the access mail SSH access emails put the group name in quotes, so "Support Stuffs" no longer reads like a typo.
- refactor Watch the uptime highlight from inside the browser Test-only: fixes the Press Tests uptime assertion that was failing on every PR.
- refactor Ignore new advisories blocked by existing pins The dependency audit ignores advisories that existing version pins block from fixing.
- refactor Load each guideline file only for its task AGENTS.md lists which guideline to read for each task, instead of importing them all.
- refactor Publish draft security advisories after 30 days A daily workflow publishes draft security advisories older than 30 days, skipping triage ones and continuing past failures.
- feat Show days and hide seconds with largestUnit and smallestUnit The Duration component gets `largestUnit` and `smallestUnit` props to show days or hide seconds.
- breaking Fix(request-id)!: the answer carries Request-Id alone Responses carry only Request-Id, not X-Request-Id too. This is a breaking change for clients that read X-Request-Id.
- feat Name clusters by their Mail Region and place tenants by it Adds a Mail Region DocType, names clusters by their region, and uses the cluster hostname as the default domain.
- feat Rescue mode (backport #309) The same rescue mode feature for master.
- feat Rescue mode Boots a rescue image with the VM disk attached as /dev/vdb so a guest that cannot boot can be repaired.
See all 259 changes
- feat Sheets collaboration on the content layer Sheets can open as a live shared document with several editors when collaboration is on.
- feat Register Sheets on the content layer Sheets content is stored on the content layer, so the server can keep and convert it.
- feat Two-row top area with a menu bar, bigger cells, browser zoom The Sheets header shrinks to two rows with a menu bar, and the browser handles zoom.
- feat Add tags to buckets Object storage buckets accept tags.
- feat Add the jmap command-line client Adds a `jmap` command with accounts, OAuth sign-in, mail commands and a shell.
- feat Bundle a capped cargo bucket with each new pilot server Each new Pilot server gets a backup bucket with a per-region size cap.
- feat Rename the user menu item to settings The "My profile" menu item is renamed to "Settings".
- feat Add plan notes to products Products can add a short note to each plan, and the in-app plan list shows it.
- feat Title the profile settings tab profile Follow-up that renames the Profile tab heading.
- feat Show product plan notes in the plan list The in-app plan list shows each product's plan note as a tag.
- feat Suppress site-down during maintenance and enable downloading audit events Site-down alerts are suppressed during maintenance, and audit events can be downloaded as CSV.
- feat Preview a local docs folder before you push A developer-mode command syncs a local docs folder into a wiki space, with a watch mode.
- feat Reload synced pages after a sync in developer mode Synced reader pages reload themselves after a sync in developer mode only.
- feat Pathway access fields Adds access fields to the log.
- feat Spent cap message A key whose cap is spent answers with the message pushed by the control plane.
- feat Team cap message A team can name the 402 text shown when its cap is spent.
- feat Cloudflare settings, fix 525 and client IP behind Cloudflare Adds a Cloudflare setting, fixes a 525 TLS error, and trusts `CF-Connecting-IP` only from Cloudflare networks.
- feat Require send limits with cluster caps and tenant defaults Mail accounts get daily and monthly send limits capped by their cluster. A limit of 0 used to mean unlimited sending.
- feat Wire up the regional gateway Teams can add WireGuard devices and reach their servers through the regional gateway.
- feat Go back between steps and open the web console from desk The setup dialog gets Back and a single Skip, and operators can open a server's web console from Desk.
- feat Record every payment failure and add a first payment dashboard Every failed card setup or payment is recorded with the gateway's code, and a first-payment dashboard is added.
- feat Pause the trial pool refill and key assignment Trial pool refill and key assignment can be paused from AI settings.
- feat Verify a custom domain through the proxy's pre-authorize path Custom domains are verified by reaching the region's proxy, which works behind Cloudflare and on apex domains.
- feat Add a site deletion command and handle missing folders during restore Adds a `pilot drop-site` command with a confirmation step, and restore recreates missing folders.
- feat Show alert checks as Markdown tables (backport #517) Insights alerts show each check as a Markdown table, which reads better in Raven.
- feat Cut the indicator gap out of the avatar Status dots on avatars cut their gap out of the avatar, so they no longer show a halo in popovers and dialogs.
- feat Advertise builder Adds the latest Builder commit to the Marketplace listing.
- feat Advertise gameplan Adds the latest Gameplan release to the Marketplace listing.
- feat Trial card in the sidebar on Frappe Cloud v2 System Managers see days left, a warning near the end, and the deletion date in the channel sidebar during a trial.
- feat Expose method source in API discovery feat: expose method source in API discovery
- feat Send infra reports to their own Raven channel Infra reports go to a separate Raven webhook from alerts, so alerts stay easy to see.
- feat Expose method source in API discovery feat: expose method source in API discovery
- feat Tell the agent the current time The investigator gets a tool that returns the current time in UTC and in the site time zone.
- feat Read the Atlas dashboards of a region The investigator reads a region's Atlas dashboards directly from the telemetry data source.
- feat Send infra alerts to Raven The investigator can post an infra alert in Markdown to a Raven channel set in Central Settings.
- feat Wait between regional investigation polls A new wait tool lets the agent pause up to 300 seconds between polls of a regional investigation.
- feat Add BMC and wait tools to the investigation agents Investigation agents can read and change a host's BMC through Redfish and IPMI, and wait between tool calls.
- feat Investigate and support servers with a Flow agent Operators can ask the Central Investigator why a server or site is slow, and it proposes a Desk fix that runs only after approval.
- feat Show alert checks as Markdown tables Insights alerts show each failing check as a Markdown table, which reads better in Raven.
- feat Load the investigator knowledge base on migrate An after_migrate hook refreshes the Atlas knowledge base, so operators no longer run the load command after each deploy.
- feat Investigate problems with Flow agents Two Flow agents find the cause of a regional problem from telemetry and Atlas records, and Central reads the report.
- feat Poll regional investigations by status only Polling returns only id, status and error, and the full report is read once at the end.
- feat Mail Telemetry Alerts from a template Telemetry Alert mails use the Suite email layout, with the node details and a button to open the alert.
- feat Add gpt-6.1-sol feat(catalog): add gpt-6.1-sol
- feat Sending limits per Mail Account and per-cluster Agent credentials Each Mail Account gets daily and monthly sending limits, enforced by the Suite Cloud Agent on the same node.
- feat Generate the Admin API reference from the routes Generates docs/admin-api-reference.md from the Admin API routes, with a test that fails when the reference is stale.
- feat Advertise 3.2.0 Advertises Raven 3.2.0 on the marketplace.
- feat Advertise fcdae4c0 Advertises the latest Gameplan build on the marketplace.
- feat Add optional Metal server hostname setup Adds an optional setting that sets a Metal server's hostname to its Atlas title, off by default.
- feat Add Insights alerts and service node telemetry Atlas sends host, platform and service node alerts through Insights, and collects system metrics and logs from proxy, WireGuard and IPv6 nodes.
- feat Choose the Insights data source in update_workbook A new --data-source option sets the Insights data source for every workbook query; the default stays datum.
- feat Convert a trial onto the paid plan it picks A free trial picks a paid plan before adding a payment method, and the trial plan is kept out of every paid plan list.
- feat Send Insights alerts to a webhook URL without a token The update_workbook script takes only the alert webhook URL, without a separate bearer token.
- feat Load the settings UI from Pilot at runtime The Cloud SDK loads the Cloud Settings UI from the site's Pilot server, so a Pilot update changes it in every app without a new release.
- feat Pick a paid plan before a trial pays A trial site's billing panel now upgrades like a SaaS signup: choose a paid plan, add billing details if needed, then add a payment method.
- feat Develop an app from its own repository with pilot dev Adds pilot dev setup and pilot dev start so an app repository works as its own development bench.
- feat Unified content layer Adds a content layer between Drive and apps that keeps the content of each file, its schema, its editor and its conversions.
- feat Add drawings to Suite Home and Drive Drawings open from Home and Files with Drive-owned access, titles and versions, and stale saves are rejected.
- feat Bring back This page and All pages tabs in version history Version history can show only the versions that changed the open page, or the whole space.
- feat Filter the change requests panel by status The change requests panel gets a status filter, and the header button is icon-only.
- feat Browse page and space versions in a history panel Adds a Version history panel for each page and for the whole space.
- feat Show open change requests on the page they change A change requests button and a notice show which open change requests touch a page.
- feat Show change requests as rendered page diffs inside their space Change requests show each changed page as rendered output, with side by side, inline and markdown views.
- feat Merge stacked space and history changes into develop Brings the stacked change request and version history work (#893 to #896) into develop.
- feat Start a change request with Edit, not on open Opening a space no longer creates a change request; the Edit button asks for a title and starts one.
- feat Give AI assistants a Gameplan guide and method descriptions Adds a short Gameplan guide and method descriptions so AI assistants use the right methods for moves and updates.
- feat Mark writable profiles in auth list The auth list marks writable profiles instead of read-only ones, since new profiles are read-only by default.
- feat Render read mode from server HTML, load the editor on Edit Read mode shows server-rendered HTML and loads the editor only when the user clicks Edit, so reading a page no longer downloads about 1 MB of editor JavaScript.
- feat Skip the chart check in update_workbook A --skip-chart-check option updates the workbook without loading every chart, avoiding about 200 ClickHouse queries.
- feat A pool of trial keys minted ahead Free trial servers get a Grove key from a pool that Central keeps ready.
- feat Create a template from an uploaded PDF in one call One whitelisted call creates a template from an uploaded PDF and returns its detected fields and page images.
- feat Block reserved customer domains Operators can reserve exact or prefix domain names so customers cannot claim infrastructure names.
- feat Prefer images with time for host caching Signup prefers the newest Pilot image at least 30 minutes old, so hosts have time to cache it.
- feat Offer a bigger plan when a trial converts After a trial converts, the Billing panel offers a bigger plan.
- feat Explain that adding a card only sets up billing The payment method form says a card bills at the next cycle, not now.
- feat Integrate Razorpay checkout functionality Fixes Razorpay checkout click-blocking by adjusting z-index.
- feat Key cap windows Trial keys are minted as one-shot keys with spend tracked in pathway, and the central team is renamed to the Grove team.
- feat Stock, a frappe-ui style catalogue Adds a Stock store catalogue template in the frappe-ui visual style.
- feat The line says where the time went, and what the vendor said of the hop Access logs break down time per stage and per network hop.
- feat Advertise 3.1.0 at c2d6011a and 5c0b031e feat(raven): advertise 3.1.0 at c2d6011a and 5c0b031e
- feat Alert operators when a signup fails An hourly job lists signups that failed or timed out and sends the list to the operator alert channel.
- feat Feat/persistence logs subpath Lets `persistence.worker` and `persistence.logs` point at an existing PVC, so both volumes can share one claim.
- feat Mark skipped reviews on the commit Guard sets its check to "skipped" with the reason when it does not review a commit, so waiting bots know to stop.
- feat Redesign marketplace on dashboard and app-embed Redesigns the marketplace cards with a hovercard and updates the app-embed domain view.
- perf Stop uploading unused simulcast camera layers Simulcast cameras stop uploading higher quality layers that no active receiver requests.
- perf Restore Frappe UI doctype lookup in one pass The Vite doctype search reads each app once and skips node_modules, cutting startup CPU time.
- perf Speed up setup by installing system packages together The installer collects host packages and installs them in one step.
- perf Delete a space's content in bulk Deleting a space runs one bulk delete per DocType instead of queuing thousands of jobs.
- perf Redesign and clean billing pages Refactors and restyles the billing pages.
- perf Decode a request once, with sonic Requests are decoded once with sonic, which cuts the gateway's time on a 3.87 MB chat body from 81 ms.
- perf Merge cost scales with the change, not the space Merges write only the pages that changed, with bulk inserts, so a one-page edit on a 1,000-page space is much faster.
- perf Save drawn boxes a second after the last change Drawn boxes save one second after the last change, so they appear in the field list sooner.
- perf Replace Mermaid with Pele Docs diagrams use Pele instead of Mermaid, with zoom, fullscreen and downloads.
- perf Align DocType indexes with their queries Drops unused unique indexes, replaces single-column indexes with composites that the queries use.
- perf Claim public IPs without snapshot isolation errors Public IP claims no longer fail with QueryDeadlockError on MariaDB 11.8; a benchmark with 64 workers gave no failures or duplicate addresses.
- perf Render the sidebar tree once with plain rows The space sidebar tree renders once with plain rows instead of twice, cutting the HTML sent before an article by most of its size.
- perf Rebuild the nested set once per merge A merge renumbers the space's tree once from the parent links, instead of once per page.
- perf Load the people list in one pass so large sites open The people list reads the role rows once instead of searching them for every user, so a 21k-user site loads in about 2 seconds instead of over 80.
- perf Speed up app validation by scanning imports in one Python process App import validation starts the bench Python once instead of once per file.
- perf Speed up hook validation by scanning each module once Hook validation parses each module once instead of once per referenced function.
- perf Reuse the Frappe checkout when validating apps Validation installs the existing Frappe checkout in editable mode instead of building a full wheel.
- perf Raise reconciler concurrency limits Same concurrency change on the main branch.
- perf Faster used-cells scan and marching ants The used-cells scan stops at the last used row, and marching ants animate 20 times a second.
- perf Avoid file-tree walk when only database usage is needed The `/info` endpoint skips the recursive file walk when only database usage is needed, so web workers stop timing out.
- fix Ignore replies to the guest in the idle check Sleepy VMs go back to sleep when only replies to their outbound traffic arrive, because only requests now count as activity.
- fix Fix the rescue disk repair and Enter in SSH consoles Repair disk errors now runs a full e2fsck that fixes damage the safe mode could not, and Enter works again in SSH consoles.
- fix Read versions from the modules so guests can add the site Guests can add a site in the Raven native app again, because the version is read without an API call that now requires login.
- fix Read versions from the modules so guests can add the site (backport) Guests can add a site in the Raven native app again, because the version is read without an API call that now requires login.
- fix Collect credit first and debit UPI mandates for every team Credit is applied before the invoice is issued, and every team with a UPI mandate is now debited; before this, Razorpay debits failed and were recorded as failed.
- fix Ping sites on the local app server The uptime monitor pings sites locally, so it no longer keeps Sleepy VMs awake.
- fix Keep the docs folder in a local preview's paths A local wiki preview no longer deletes pages in a space that syncs a docs folder from GitHub.
- fix Stop dimming the dark version of an image Dark versions of theme-aware images are no longer dimmed by the dark-mode filter.
- fix Import images from HTML img and source tags Git sync imports repo images referenced by HTML img and source tags.
- fix Do not dim the dark version of an image in the image viewer The image viewer shows the dark file as it is.
- fix Fix Sheets selection tint and active cell The selection tint is see-through, so it no longer covers the active cell or gridlines.
- fix Fix Sheets grid text, selection frame and fill handle Grid text is centred and the selection frame and fill handle are crisp.
- fix Make network warnings and camera adaptation reliable Meet network warnings are more accurate and cameras adapt to bandwidth.
- fix Send the bundled bucket tag as a string Pilot server creation with a bundled bucket no longer fails the Object storage request.
- fix Fix sidebar change request count The Change Requests sidebar count is removed, which also saves a call on every page load.
- fix Move Stop all servers back to billing The destructive Stop all action moves off the Servers header to the Billing overview.
- fix Complete gateway coverage and harden billing operations Refunds not yet paid out are no longer marked Completed, disputes outside Stripe are handled, uncertain Stripe errors no longer count as declines, and one bad row no longer stops the daily billing job.
- fix Show default rules and stop allowing every WireGuard VPN device WireGuard devices no longer reach every port of a server. The firewall shows only the rules the customer can see, and WireGuard devices get their own rule.
- fix Resubscribe the push token on every launch so a dropped server row comes back The native app re-registers its push token on each launch, so a server row that was dropped comes back.
- fix Remove Raven Bot link from channels when deleting a bot Deleting a bot also removes its link from channels.
- fix Keep a download link's query when opening or sharing a file Shared and opened download links keep their query, so iOS previews load.
- fix API for documents supports integer and icon sprite issue in Frappe v15 The documents API accepts integers and fixes an icon sprite issue on v15.
- fix Youtube playlist link preview YouTube playlist links show a preview on iOS.
- fix Disable snapshot isolation by default MariaDB snapshot isolation is off in the bundled compose files, which avoids error 1020 in Contact background jobs.
- fix Retry the trial sign-in every second for a minute A new Pilot that refuses sign-in briefly no longer adds 10 seconds or more to signup.
- fix Set the cap from settings The trial AI key's spend cap comes from settings.
- fix Let resolved finding threads pass the check Resolved Guard finding threads pass the check, even when the resolver is a collaborator and not an org member.
- fix Serve site embeds from the site origin Cloud Settings embeds load from the site's own path, so HTTPS sites no longer hit mixed-content failures.
- fix Require First Name when a Loan Application creates a new Customer Same fix on the main branch.
- fix Apply Employee Loans setting on every Loan Application refresh Same fix on the main branch.
- fix Sync mixed GST orders (zero-rated + taxed items) Shopify orders that mix zero-GST and taxed items sync without the "No GST" error.
- fix Fix(editor) Text alignment is kept in discussion posts, so centered headings stay centered after an edit.
- fix Keep drawn boxes on screen after they sync A drawn box stays visible after save, and drawing again no longer stacks copies.
- fix Prevent stale screen-share tiles A screen share that ends during setup no longer leaves an empty tile.
- fix Stop merges in different spaces from deadlocking Structural merges and space deletes take a site-wide lock, so concurrent merges wait instead of failing with a deadlock.
- fix Renumber the tree from current rows after waiting on the lock After a merge waits for the lock, it renumbers from current rows, so pages stay inside their parent's range.
- fix Manage devices and server access from WireGuard VPN settings WireGuard devices and server access are managed from one Settings page.
- fix Time out site pings quickly Site pings time out after about 1 second, so a ready site appears sooner on the signup page.
- fix Alert repeated service node errors in P2 Platform Service node errors get their own alert, grouped by error, so host alerts show only host problems.
- fix A named range on a deleted sheet no longer blocks the others One named range on a deleted sheet no longer stops every other name from working in the spreadsheet.
- fix Return dashboard rows that contain NaN fix(investigator): Return dashboard rows that contain NaN
- fix Keep reconnecting and catch up on missed unread counts The live connection keeps reconnecting instead of giving up after about 15 seconds, and unread counts missed while it was down are caught up.
- fix Do not reschedule an advance payment that only covers dues (backport #1549) fix: do not reschedule an advance payment that only covers dues (backport #1549)
- fix Allow approval of submitted loan applications A Loan Manager can approve a submitted loan application and create a Loan from it.
- fix Search only stored Virtual Machine fields in find_resources The investigator's find_resources tool works on new sites, and it still finds a VM by IP address.
- fix Build alert counter values without a nested lambda The workbook update succeeds again on the Insights site, because Insights can parse the counter growth SQL.
- fix Count alert counter growth per metric and across restarts Alert counter growth is counted per metric and handles counter restarts, so the NIC errors alert names only the hosts that had errors.
- fix Skip interfaces without ethtool statistics The ethtool collector skips interfaces whose driver has no statistics, so the dropped-telemetry alert stops firing on them.
- fix Clear Ubuntu build outputs after publication Build files are removed after every target site commits, and kept if publication or the commit fails.
- fix Explain Razorpay's mandate limit before checkout The payment step explains the spending limit before Razorpay opens, so the charge limit is not a surprise.
- fix Open, save and enable disabled accounts without a 403 Disabled mail accounts can be opened, saved and enabled without a 403 from the mail server's master-user login.
- fix Include other members' files when moving, trashing or deleting a folder Folder move, trash and delete now act on every file inside the folder, not only the files the current user uploaded.
- fix Refuse to cancel a pledge whose shares a release already took Cancelling a pledge that an approved release already drew shares from is refused, so the Pledged Security Summary stays correct.
- fix Rotate the OpenResty logs Logrotate now rotates the proxy's nginx logs daily or at a size limit, so access.log can no longer grow past 15 GiB and fill the disk.
- fix Bucket tab in the url and spacing The Bucket tab is kept in the URL and the spacing is corrected.
- fix Keep in-app card setup chargeable for INR teams INR teams are no longer offered Stripe for in-app card setup, since Stripe India refused the validation charge.
- fix Hide central panels on a server without central On a self-hosted Pilot with no Central link, the Billing and Advanced panels no longer fail; the proxy answers at once.
- fix Run custom queues and set a job timeout per worker group Custom worker queues such as guard-review now start and run jobs, and each worker group gets its own job timeout.
- fix Pick billing country from lists and handle a failed card The billing form offers country and GST state lists, and a card that fails verification shows the reason and lets the user try another card.
- fix Lock the public IP allocation before a server move A public IP move re-reads and locks the allocation first, so a second move to the same server does nothing instead of failing with TimestampMismatchError.
- fix Generate the Insights workbook on Python 3.10 The workbook generates on Python 3.10 again, because the nested f-string that needed 3.12 is now a separate constant.
- fix Render Insights alert lists on their own lines Raven alerts put each check's hosts on their own lines, with a blank line between checks.
- fix Store reported VM states in READ COMMITTED Host sync stores reported VM states at READ COMMITTED, which stops a QueryDeadlockError from dropping them.
- fix Form-template printing on Frappe 17 Form-template printing works again on Frappe 17, after the preview and PDF button stopped working on develop.
- fix Do not reschedule an advance payment that only covers dues An advance payment that only covers existing dues no longer rebuilds the schedule, which had been adding an extra instalment that never reduced the balance.
- fix Show the release version in the About dialog The About dialog shows the release version from the package metadata instead of a git tag that production never fetches.
- fix Each installed app is notified of its own Each installed app gets its own push subscription, so Mail notifications no longer arrive through the Calendar app and open the wrong one.
- fix Read everything again only after a while away, not on every window focus Mail stops refetching every read on each window focus, which had caused dozens of requests per click out of an iframe.
- fix Migrate from httpx to httpx2 Moves frappectl from httpx to httpx2, which avoids an Authlib deprecation warning at import.
- fix Check backup URLs before the agent downloads them The agent accepts only http and https URLs and connects only to public addresses, using the address it checked.
- fix Settle a payment only against the intent Central stored Every payment must match a record Central stored before the payer acted, and Razorpay retries can no longer charge twice.
- fix Stop a refused mandate from crashing the billing job A card that a gateway refuses is marked Failed instead of crashing the billing job, which had blocked every Indian Stripe card trial conversion.
- fix Price only what a team can buy, and enforce payment standing Pricing, plan choice, payment standing and output tax are now decided by Central from stored data, and a team that does not pay is stopped from buying more.
- fix Bound execution and recover interrupted workflows Task execution is time-bounded and recovery state survives worker crashes, so an interrupted update or site rename can resume safely.
- fix Fixes from the 100-team billing day simulation Servers bill from their start time, mid-day starts and stops bill by the hour, and dunning retries are corrected.
- fix Show the breadcrumb trail in the browser tab title The browser tab shows the page's breadcrumb trail instead of "Frappe Cloud" alone.
- fix Fall back to token hosts for single-site cloud registration A single-site Frappe Cloud bench with a lazy rename can register with Raven Cloud using a host from its team identity token.
- fix Sync tokens for the hostname Raven Cloud actually registered Push token sync uses the hostname that registration actually used, so a new site's push notifications work right after signup.
- fix Restore frappe.local.sites_path instead of deleting it Fixes a test-run cleanup crash in the push tests.
- fix Keep shared stage and pinned tiles stable Meeting tiles keep their slots when speaker activity or room membership changes.
- fix Wait for receiver readiness before sending video A camera that becomes visible waits until its receiver is ready, avoiding black tiles.
- fix Synchronize the shared stage and camera subscriptions The default shared stage stays consistent across participants, and hidden cameras stop receiving video.
- fix Link loan disbursement to repayment schedules made in v15 fix: link loan disbursement to repayment schedules made in v15
- fix Close go-live gaps for trial signups Free trial teams can no longer create paid LLM keys or buckets. Atlas logs are tied to the Central request, failure tracebacks are kept beyond Error Log's 14-day clearing, and support contact is shown on signup errors.
- fix Retry incomplete warmup and verify site login A failed guest warmup now keeps its pending marker and fails, so systemd retries it. Warmup checks site login and no longer resets Administrator's password.
- fix Publish command output at most every two seconds Output is now sent to Redis at most every two seconds. This stops the append-only file from growing with the square of the output and filling the disk.
- fix Publish command output at most every two seconds (backport) Backport of #614 to master.
- fix Stop the builder before capturing its disk The builder stops and its disk is flushed before the image is captured. Services can no longer write during capture and leave empty files in the image.
- fix Keep trial handoff independent of hostname changes Trial handoff no longer waits on the optional Admin hostname claim. The customer's domain is attached while the internal site name stays the same.
- fix Remove permission expiry job that queries a missing field Removes the hourly job that failed every run because the Drive Permission DocType has no `valid_until` field.
- fix Keep a replaced request's abort out of error and onError A request replaced by a newer one no longer sets an AbortError on `useList` or `useCall`.
- fix JSON-encode object and array params in GET query strings Object and array params in GET calls are sent as JSON, so filters no longer arrive as `[object Object]`.
- fix Focus a prompt's first text field and submit it on Enter A prompt dialog focuses its first text field, and pressing Enter in a single-line field submits it.
- fix Correct disabled background colors for switch toggle component A disabled "on" switch and a disabled "off" switch now have different colors.
- fix A pill over a declined event cuts against it Calendar events laid over a declined event now get the same cut as over any other event.
- fix Show unmatched value in button mode A Combobox in button mode shows a saved value even when it isn't in the loaded options.
- fix Report a failed review on the check before the reaction A failed review sets the error status on the check before adding the reaction, so the check no longer stays pending.
- fix Keep frappe's header and footer template for other formats Print Format Editor formats keep their letter head header and footer when Print Designer is installed.
- fix Keep frappe's header and footer template for other formats Same change as #568, for the main branch.
- fix Forward the query string in the agent relay The relay on proxies drops query strings. Its database_only flag never reached the agent.
- fix Wrap moves a whole word to the next line Text wrap moves a whole word to the next line instead of splitting it mid-word.
- fix Underline and strike every line of wrapped text Underline and strikethrough now apply to every wrapped line, and hyperlinks are fixed the same way.
- fix Formula bar arrows move the caret; F2 switches to picking Arrow keys move the text caret in the formula bar. F2 switches to picking cell references.
- fix Readable range highlight; formula results show without waiting on a sheet scan The formula range highlight no longer hides the numbers under it, and formula results show without waiting on a sheet scan.
- fix Accept a hotfix branch as a product's frappe version A product can now use a `version--hotfix` branch as its Frappe Version, so trials can use hotfix images.
- refactor List the unsupported version-13 and version-14 branches Adds a collapsed block under Compatibility listing version-13 and version-14 as unsupported.
- refactor Add the Frappe Wiki user guide Adds a 52-page user guide to the wiki's docs folder, with sidebar order.
- refactor Revert feat(catalog): add gpt-6.1-sol Reverts the gpt-6.1-sol catalog entry.
- refactor Run server tests on SQLite Adds a weekly SQLite test run and fixes two tests that assumed MariaDB.
- refactor Use the new Frappe Wiki logo Replaces the logo, favicon and app icon with the new Frappe Wiki logo.
- refactor Format theme-aware images spec Formatting only, to fix the lint failure.
- refactor Advertise crm 1.90.0 Advertises the CRM 1.90.0 release.
- refactor Advertise builder 1.36.5 Advertises the Builder 1.36.5 release.
- refactor Remove the P3 report alert The P3 alert is removed, since the daily report covers its checks and the heartbeat cannot detect a broken pipeline.
- refactor Remove the P3 report alert (backport #530) Backport of #530.
- refactor Add version compatibility table Adds a README table that maps Wiki branches to Frappe versions.
- refactor Merging develop into main A branch merge with no description.
- refactor Return investigations without the tool log Investigation responses no longer include the audit log, which keeps the Central investigator's context small.
- refactor Always set the Metal server hostname during setup Setup always sets the host's hostname to the Metal Server title, and the opt-in option is removed.
- refactor Trial keys take their models from the grove team refactor(investigator): Trial keys take their models from the grove team
- refactor Send infra alerts in a read-only session docs(investigator): Send infra alerts in a read-only session
- refactor Shorten DocType field descriptions chore: Shorten DocType field descriptions
- refactor Group related DocType fields together chore: Group related DocType fields together
- refactor Release v16 Automated release.
- refactor Release v1 Automated release.
- refactor Raven 3.2.0 release: Raven 3.2.0
- refactor Quieter page header, one place for open change requests The page header is quieter, and open change requests are listed in one place.
- refactor Bump cloud-sdk to 0.5.0 Bumps the Cloud SDK so Raven loads the Cloud Settings dialog from Pilot.
- refactor Detect image size regressions using automatic main baselines Compares compressed layer sizes of the core images against a main baseline, so image growth is caught in CI.
- refactor Use a UUID migration in the sleep selection test The sleep selection test stores a UUID migration ID, since the column is a uuid.
- refactor Add Guard review config Adds a Guard review config with context files to the frappe-ui repo.
- refactor Automated release published Automated release published
- refactor Automated release published Automated release published
- refactor Ask for tests only on features and non-trivial fixes docs(frappe-code-review): ask for tests only on features and non-trivial fixes
- refactor Add review config ci(guard): add review config
- refactor Add review config chore(guard): add review config
- refactor Add review config ci(guard): Add review config
- refactor Sync package-lock.json to 0.4.4 build(cloud-sdk): sync package-lock.json to 0.4.4
- refactor Bump cloud-sdk to 0.4.4 build(web): bump cloud-sdk to 0.4.4
- refactor Update Raven nightly to latest develop commit chore: Update Raven nightly to latest develop commit
- refactor Merging develop into main Merging develop into main
- refactor Add zdr for baseten provider chore: add zdr for baseten provider
- refactor Misc Misc
- refactor Push the release PR with the barista app token The release PR is pushed with the app token, so its checks run without manual approval.
- refactor Drop the fix and additive tags from release notes Removes the redundant "(fix)" and "(additive)" tags from changeset release notes.
- refactor Add the Frappe Cloud v2 docs Adds a 33-page customer documentation site for Frappe Cloud v2.
- refactor Run fewer jobs per pull request push Each push starts 4 Tests jobs instead of 6, and a new push cancels the older run.
- refactor Migrate remaining reference content Moves the remaining reference docs into the task, reference and concept structure.
- refactor Update readme README update with no description.
- refactor [Docs] Vitepress improvements and package manager update Updates the docs site package manager, enables in-browser search, and moves overrides into the workspace file.